SIMULACIÓN Y OPTIMIZACIÓN DE PROCESOS 5º INGENIERÍA QUÍMICA CURSO 2004-05 ANÁLISIS DE DISEÑOS FACTORIALES EN R A continuación se describen los comandos básicos para analizar los datos de un diseño factorial completo replicado con el paquete R. Instrucciones para descargar R Usar, por ejemplo, http://www.stats.bris.ac.uk/R/ (Bristol, UK). Después pinchar en Windows y base. Finalmente, descargar el fichero rw2000.exe (unos 20 Mb.). Ejecutar este fichero de instalación y el programa quedará listo para ser utilizado. Como siempre, el fichero README puede ser útil en caso de duda. Para abrir una sesión en R, invocar el comando desde el menú de inicio; se abrirá una ventana marco y, dentro de ésta, una ventana de comandos: todas las operaciones en R se realizan introduciendo los comandos apropiados desde esta ventana (no hay menús como en S-PLUS). Lo primero de todo es introducir los datos; para ello, usar el comando scan(), a continuación teclear los datos (separados por espacios). Concluir con una línea en blanco. Ejemplo: guardando datos en la variable data. Terminar con una línea en blanco e INTRO. > data <- scan() 12.1 12.3 12.1 13.5 15.3 15.0 10.0 10.1 10.1 13.5 13.3 13.8 14.2 15.7 16.1 15.4 14.2 12.1 10.1 10.9 10.1 11.2 11.4 11.1 9.1 9.5 9.1 12.3 11.5 14.3 12.5 13.3 13.8 12.8 10.8 11.2 10.8 10.3 9.6 12.1 11.3 10.7 11.8 11.1 12.9 8.1 9.6 9.1 9.2 9.6 9.9 10.6 10.7 10.2 En el siguiente paso se introducen los niveles de los factores en juego en el mismo orden en el que se acaban de introducir los datos. Al introducir comillas, se pueden reemplazar las etiquetas que se muestran a continuación por cualquier otra cadena de texto (como “alto”, “incluido”, “Madrid”, etc.). > ruedas <- factor(c("145", "145" ,"145", "145", "145", "145", "145", "145", "145", "145", "145", "145", "145", "145" ,"145", "145" ,"145" ,"145", "165", "165", "165", "165" ,"165", "165", "165", "165", "165", "165", "165" ,"165" ,"165" ,"165", "165", "165", "165", "165" ,"185", 1 "185" ,"185", "185", "185" ,"185", "185" ,"185", "185", "185", "185", "185" ,"185", "185", "185", "185", "185", "185")) > conductor <- factor(c("1", "1", "1", "1", "1", "1", "1", "1", "1", "2", "1", "1", "2", "2", "1", "1", "2", "2", "2", "2", "2", "2", "2", "2", "1", "1", "1", "1", "1", "1", "1", "2", "2", "2", "2", "2", "2", "2", "2", "2", "1", "1", "1", "1", "1", "1", "1", "2", "2", "2", "2", "2", "2", "2")) > automóvil <- factor(c("Nissan", "Ford", "VW", "Nissan", "Ford", "VW", "Nissan", "Ford", "Ford", "VW", "Nissan", "Nissan", "Ford", "VW", "VW", "Nissan", "Ford", "Ford", "VW", "Nissan", "Nissan", "Ford", "VW", "VW")) "VW", "Nissan", "Ford", "Ford", "VW", "Nissan", "Nissan", "Ford", "VW", "VW", "Nissan", "Ford", "Ford", "VW", "Nissan", "Nissan", "Ford", "VW", "VW", "Nissan", "Ford", "VW", "Nissan", "Ford", "VW", "Nissan", "Ford", "VW", "Nissan", "Ford", Así que se trata de un diseño con tres factores, dos de ellos tienen 3 niveles y el otro 2. Hay, por tanto, 18 tratamientos en total, y tenemos 54 datos o tres réplicas completas. De esta forma, R “sabe” que el dato 12.3 (segundo de la lista) corresponde a la combinación ruedas=“145”, conductor=“1” y automóvil=“Ford”. Evidentemente, los cuatro vectores introducidos deben tener la misma longitud. El siguiente paso es integrar toda esta información en una estructura interna: > datos.df <- data.frame(ruedas, conductor, automovil, data) Aunque no se produce respuesta, ya estamos listos para proceder. El siguiente comando produce la salida del análisis para el modelo especificado y para la estructura recién creada: > aov.data <- aov(data ~ ruedas + conductor + automovil + ruedas:conductor + ruedas:automovil + conductor:automovil + ruedas:conductor:automovil, datos.df) Tampoco se devuelve nada de momento. La especificación del modelo es muy intuitiva. Los efectos que intervienen se separan mediante signos “+”, los efectos principales llevan el nombre del factor y las interacciones se definen mediante signos “:”. Una manera equivalente (y más compacta) de definir el mismo modelo es mediante el comando > aov.data <- aov(data ~ ruedas*conductor*automovil, datos.df) Los asteriscos expanden pues todos los efectos que involucran a los factores en cuestión. Ahora podemos extraer la información útil. Por ejemplo, para hallar la tabla ANOVA, tecleamos: > summary(aov.data) 2 Df ruedas 2 conductor 1 automovil 2 ruedas:conductor 2 ruedas:automovil 4 conductor:automovil 2 ruedas:conductor:automovil 4 Residuals 36 --Signif. codes: 0 `***' 0.001 Sum Sq Mean Sq F value Pr(>F) 75.308 37.654 18.9093 2.435e-06 *** 10.845 10.845 5.4463 0.0253101 * 0.116 0.058 0.0291 0.9713342 39.255 19.627 9.8566 0.0003857 *** 0.763 0.191 0.0958 0.9831622 0.305 0.152 0.0765 0.9264692 4.079 1.020 0.5120 0.7272323 71.687 1.991 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1 Como vemos, se calculan los p-valores en la columna Pr(>F), luego no es necesario siquiera consultar las tablas. La interpretación es inmediata: a más asteriscos, menor pvalor y mayor significación. En este caso, se observa que esencialmente importan los factores ruedas y conductor (y además parecen interaccionar). Podemos ahora reanalizar los datos sin tener en cuenta automovil (pasando a un factorial 2x3 replicado 9 veces): > aov.data2 <- aov(data~ ruedas + conductor + ruedas*conductor, datos.df) > summary(aov.data2) Df Sum Sq Mean Sq ruedas 2 75.308 37.654 conductor 1 10.845 10.845 ruedas:conductor 2 39.255 19.627 Residuals 48 76.949 1.603 --Signif. codes: 0 `***' 0.001 `**' F value Pr(>F) 23.4883 7.709e-08 *** 6.7651 0.01232 * 12.2434 5.053e-05 *** 0.01 `*' 0.05 `.' 0.1 ` ' 1 Debido a la ortogonalidad del diseño, las sumas de cuadrados de los efectos que permanecen son las mismas que antes, mientras que las de los efectos omitidos pasan a engrosar la suma de cuadrados del error. Curiosamente, el estimador del error ha decrecido (1.603 frente a 1.991). Esto se debe naturalmente a que el número de grados de libertad del error también ha aumentado. Observamos que aumenta la significación de los tres efectos en el modelo simplificado. Para comprender la naturaleza de estos efectos, el siguiente comando extrae los coeficientes ajustados en el modelo: > model.tables( aov.data2) Tables of effects ruedas 145 165 185 1.574 -0.3037 -1.270 rep 18.000 18.0000 18.000 conductor 1 2 -0.4481 0.4481 rep 27.0000 27.0000 ruedas:conductor conductor ruedas 1 2 145 -0.541 0.541 rep 9.000 9.000 165 -0.663 0.663 rep 9.000 9.000 185 1.204 -1.204 rep 9.000 9.000 3 Supongamos que la variable respuesta es resistencia (mejor cuanto más grande). Entonces, atendiendo a los efectos principales por separado, las mejores ruedas son las de 145 y el conductor1 tiende a producir más desgaste en general. Podemos visualizar gráficamente estos efectos. Por ejemplo, para verificar el efecto principal del factor ruedas, construimos los vectores de medias oportunos y los dibujamos con el comando plot: > meanr <- c(mean(data[ruedas=="145"]), mean(data[ruedas=="165"]), mean(data[ruedas=="185"])) > nivruedas <- c("145","165","185") > plot(nivruedas, meanr, type="l") Esto produce una nueva ventana con el gráfico correspondiente --- hemos optado por unir los tres puntos mediante líneas gracias a la especificación type=”l”; para ver otras opciones, teclear help(plot). En cuanto a la interacción, podemos analizar el gráfico de medias. La siguiente secuencia de comandos produce dicho gráfico. Primero calculamos las medias implicadas: > rporc1 <- c(mean(data[ruedas=="145"&conductor=="1"]), + mean(data[ruedas=="165"&conductor=="1"]), + mean(data[ruedas=="185"&conductor=="1"])) > rporc1 [1] 12.27778 10.27778 11.17778 > rporc2 <- c(mean(data[ruedas=="145"&conductor=="2"]), + mean(data[ruedas=="165"&conductor=="2"]), + mean(data[ruedas=="185"&conductor=="2"])) > rporc2 [1] 14.255556 12.500000 9.666667 También se puede obtener la misma información invocando directamente el comando model.tables(type="means", aov.data2). Ahora procedemos a dibujar estas trayectorias: > plot(nivruedas,rporc1, type="o",pch="1",ylim=c(9,15),ylab="Media de cada conductor") > par(new=T) > plot(nivruedas,rporc2, type="o",pch="2",ylim=c(9,15),ylab="Media de cada conductor") Hemos especificado un rango común para la respuesta en los dos gráficos (ylim), un mismo título para este eje (ylab) y hemos pedido que el segundo gráfico no borre el primero (par). Además hemos empleado distintos símbolos para caracterizar a los dos conductores (pch). La opción type=”o” dibuja símbolo y línea de conexión. El resultado debería parecerse a: 4 Observamos ahora que la interacción se manifiesta ante todo en las ruedas de 185. Allí, y sólo allí, encontramos que el conductor2 produce más desgaste que el conductor1. Por supuesto, esto era ya patente en la salida de model.tables(aov.data2). Los valores provenientes de los coeficientes y las medias calculadas deben coincidir, así por ejemplo, la predicción para el conductor1 con las ruedas de 185 sería, a partir de los coeficientes listados anteriormente, 11.69259 - 0.4481 - 1.270 + 1.204, lo que coincide con la media calculada 11.17849. Finalmente, también es útil validar la corrección de las hipótesis realizadas. Para ello, producimos el gráfico de valores ajustados frente a los residuales: > plot(fitted(aov.data2), residuals(aov.data2)) Hay seis predicciones distintas correspondientes a las 6 combinaciones de ruedas y conductores. Aunque hay dos valores con residuales excepcionalmente grandes para predicciones entre 12 y 13, no se observa ningún efecto sistemático de aumento de la dispersión. Por tanto, el modelo parece correcto. 5
Puede agregar este documento a su colección de estudio (s)
Iniciar sesión Disponible sólo para usuarios autorizadosPuede agregar este documento a su lista guardada
Iniciar sesión Disponible sólo para usuarios autorizados(Para quejas, use otra forma )