ESTADíSTICA INDUSTRIAL Prof: Mathieu Kessler Componentes principales con R En esta práctica, utilizaremos un paquete adicional de R, llamado rgl que sirve para representaciones 3d. Instalaremos además el paquete R-cmdr, que sirve de interfaz gráfica para muchos de los comandos estadísticos más comunes de R., para explorar un poco sus posibilidades... 1.Instalar el paquete R-cmdr Si disponemos de un ordenador con una conexión de banda ancha a Internet, resulta de lo más fácil el instalar un paquete adicional de R: En el menú Paquetes, seleccionamos la instrucción Instalar paquete(s). Empezamos por escoger el repositorio más cercano. Podemos escoger un repositorio en España. A continuación, aparece una lista de paquetes: De donde escogemos el paquete Rcmdr. Varios paquetes adicionales son requeridos, aceptamos su instalación y en seguida está todo instalado… En el caso en que no tenemos aceso a Internet de banda ancha, necesitamos descargar previamente los paquetes requeridos de la página de R CRAN (http://cran.r-project.org/) en su formato .zip. Éstos se pueden encontrar en la sección “Contributed”. y utilizar la instrucción del menú Paquetes titulada “Instalar paquete(s) a partir de ficheros locales. 2.Cargar el paquete rgl Al instalar el paquete R-cmdr, hemos automáticamente instalado también el paquete rgl que permite representar nubes de puntos tridimensionales. Para poder utilizar los comandos de este paquete, es necesario cargarlo previamente, lo que se hace desde la instrucción Cargar paquete(s) del menú Paquetes, o bien usando la instrucción library(rgl). 3.Primer ejemplo ilustrativo: nube de datos 3d. Para entender la estructura de nubes de puntos a través de sus componentes principales, empezamos por estudiar un conjunto simulado de tres variables, que se encuentra en el fichero de datos: datos3d.txt, especificando que vamos a llamar sus variables X, Y y Z. Hacemos las variables X, Y y Z accesibles attach. utilizando el comando Representamos la nube de puntos tri-dimensionales con la instrucción plot3d de la librería rgl. En la línea de comandos, o en nuestro editor R, escribimos plot3d(X,Y,Z) Al mantener el botón izquierdo del ratón pulsado y moverlo, podemos ver la nube desde distintas perspectivas. Como siempre, la instrucción plot3d admite un gran número de opciones, de momento podemos aumentar el tamaño de los puntos con el argumento size, mientras que cambiamos el color con el argumento col. plot3d(X,Y,Z,size=2,col=”red”) Observamos que la nube de puntos tridimensional tiene forma de tabla de surf: admite claramente una dirección con la mayor variabilidad (el eje principal de la tabla de surf), una segunda dirección con menos variabilidad (el ancho de la tabla), mientras que presenta muy poco variabilidad en la tercera dirección (lo grueso de la tabla). Por consiguiente, al realizar un análisis en componentes principales, debemos encontrar estos ejes, dados por los vectores propios de la matriz de covarianza o de correlación (ver apéndice sobre cuándo usar la matriz de covarianzas y cuándo la matriz de correlación) con sus correspondientes valores propios que representan las varianzas de los componentes principales… Para llevar a cabo un análisis en componentes principales, usamos la instrucción prcomp, cuyo argumento principal es un dataframe. En su versión más simple usamos: datos3d.acp=prcomp(datos3d) (notar aquí que he escogido el nombre datos3d.acp, pero podría haber utilizado cualquier otro nombre para el objeto resultado del análisis en componentes principales. Para visualizar los resultados podemos utilizar la instrucción print: print(datos3d.acp) obteniendo: Standard deviations: [1] 5.0267428 1.0438927 0.1005436 Rotation: PC1 X 0.5045960 Y 0.5033131 Z 0.7014691 PC2 PC3 0.4933159 0.708535323 0.4987079 -0.705667378 -0.7126920 -0.003353648 Deducimos que la expresión de los componentes principales son: PC1 = 0.50459X+0.5033131Y+0.701469Z PC2 = 0.4933159X+0.49870Y-0.71269Z PC3 = 0.7085353X-0.705667378Y-0.0033536Z Vamos a darles nombres a estos autovectores que corresponden a los componentes principales: (la matriz de cambio de base, también llamada de rotación, cuyas columnas corresponden a los autovectores se puede obtener como datos3d.acp$rotation) v1=datos3d.acp$rotation[,1] v2=datos3d.acp$rotation[,2] v3=datos3d.acp$rotation[,3] Podemos comprobar que son vectores unitarios y que mutuamente ortogonales, es decir que su producto escalar es 1: son sum(v1*v1); sum(v1*v2); etc..... Para visualizar mejor lo que representan estos ejes, vamos a añadirlos en la nube tridimensional: A partir de de aquí, se pueden ejecutar las instrucciones sin entender todos los detalles. Las instrucciones están en el script de soluciones. Empezamos por calcular los dos puntos extremos del primer eje: Para ello, obtenemos el mínimo y el máximo de la primera nueva componente (la que corresponde al primer componente principal): c1min=min(datos3d.acp$x[,1]);c1max=max(datos3d.acp$x[,1]) ¿Cuánto valen estas dos constantes? Por lo tanto las coordenadas en el antiguo sistema de los dos puntos extremos del eje principal se pueden obtener como: extremomin1=mean(datos3d)+cmin*v1 extremomax1=mean(datos3d)+cmax*v1 respectivamente... Vamos a construir una matriz que contenga estos dos puntos: eje1=cbind(extremomin1,extremomax1) Ahora sólo nos queda añadir una línea en el scatter plot entre los dos puntos extremos del eje principal: Volvemos a dibujar la nube (he añadido los xlim, ylim, zlim, para obligar a que los ejes tengan la misma escala) plot3d(X,Y,Z,size=2,col="red",xlim=c(-12,12),ylim=c(-12,12),zlim=c(-12,12)) y añadimos una línea entre los dos puntos definidos por las columnas de eje1, en verde por favor... plot3d(eje1[1,],eje1[2,],eje1[3,],type=”l”,col="green",add=T) (El argumento add=T indica que se añada los puntos a la gráfica anterior, mientras que el argumento type=”l”, indica que queremos puntos conectados por una línea). Podemos proceder de manera parecida para añadir los otros dos ejes, para ir más rápido, los comandos correspondientes están el script solución. *****Final de la parte que se puede ejecutar sin entender todos los detalles************ Finalmente, también podemos extraer del objeto datos3d.acp las desviaciones típicas de los componentes principales (es decir de las coordenadas de los puntos en el nueve sistema de coordenadas). datos3d.acp$sdev ¿Sabríais la relación entre estas desviaciones y los autovalores de la matriz de covarianza? Si utilizamos la instrucción summary(datos3d.acp) Obtenemos además de las desviaciones típicas, la proporción de varianza explicada etc... Finalmente, mencionar que podemos pedir un diagrama de codo asociado al análisis en componentes principales, con la instrucción plot(datos3d.acp) que admite el argumento type=”line” Ejercicios: Ejemplo: Encuesta de presupuestos familiares. (Peña, 2002, Análisis de datos multivariantes, p140) En el fichero epf.txt, La encuesta de presupuestos familiares en España para el año 1990/1991, recoge los gastos medios de las familias españolas para las 51 provincias (Ceuta y Melilla aparecen unidas como una provincia). Las variables son: X1= alimentación, X2= vestido y calzado, X3= vivienda, X4= mobiliario doméstico, X5= gastos sanitarios, X6= transporte, X7= enseñanza y cultura, X8= turismo y ocio, X9= otros gastos. 1. Empezar por ordenar el conjunto de datos según X1, después según X2, etc... (se usa la instrucción order: dado un vector x , order(x) devuelve los índices de x ordenados de manera que los valores de x[order(x)] sean crecientes.) 2. Realizar el análisis en componentes principales para los logaritmos de las variables (para simetrizarlas), interpretar los coeficientes de los dos primeros componentes principales 3. Clasificar las provincias según la primera componente. (para ello, se puede usar la instrucción order) Ejemplo: Medidas. En el fichero medidas.txt se encuentran las medidas en inches del pecho, cintura y caderas correspondientes a 20 personas1. Vamos a intentar interpretar la variabilidad presente en los datos. 1. Un primer paso consiste en examinar las inter-relaciones entre las variables utilizando la matriz de correlación. Calcular a continuación la matriz de covarianzas. Observamos que las varianzas son del mismo orden de magnitud, lo que, junto con el hecho de que las unidades de medidas de las tres variables son las mismas, nos lleva a realizar el análisis en componentes principales con la matriz de covarianzas. 2. Realizar un análisis en componentes principales. ¿Cómo podemos interpretar los componentes? ¿Cuántos componentes retendremos? 1 Conjunto nº 79 de Hand, Daly Lunn, Mc Conway & Ostrowski, (1994) A handbook of small datasets, Chapman & Hall. Ejemplo: Consumo de proteinas en Europa En el fichero proteinas.txt, podeis encontrar los datos correspondientes al consumo de proteinas en 25 paises europeos2 correspondientes a nueve grupos de alimentos. Los datos datan de 1973. Los nombres de las variables son las siguientes: 1. Country: País 2. RdMeat: Carne roja 3. WhMeat: Carne Blanca 4. Eggs: Huevos 5. Milk: Leche 6. Fish: Pescado 7. Cereal: Cereales 8. Starch: Feculentes 9. Nuts: Frutos secos, y aceites 10. Fr&Veg: Frutas y verduras Realizar un análisis de componentes principales. Apéndice: Matriz de covarianzas o Matriz de correlaciones? scale=F o scale=T Uno de los argumentos de la instrucción prcomp es scale que puede tomar el valor T (true) o F (false). En el caso en que las variables tengan ordenes de magnitud muy distintos, y en particular ordenes de dispersión muy distintos, las variables no aportan la misma contribución a la variabilidad total, y esto nos puede llevar a descartar una variable importante en la estructura de variabilidad sólo porque su orden de magnitud es menor que el de otra. Las variables con una dispersión con orden de magnitud grande dominarían por completo el análisis. En particular, si cambiamos las unidades de variables por separado, los resultados podrían cambiar completamente: se trata de una característica muy poco afortunada del análisis en componentes principales. En el caso en que las variables son de orden de magnitud distintos, podemos transformarlas para obtener nuevas variables que sí se puedan comparar. Esto se consigue tipificando las variables, es decir restándoles su media y dividiéndoles por su desviación típica: Definición: Sea X una variable asociada a un conjunto de datos, se obtiene la versión tipificada de X a través de la transformación: Y=(X-media(X)/(Desv. Típica(X)) La variable Y en el conjunto es centrada (de media cero) y tiene una desviación típica igual a 1. Si tipificamos todas las variables X1, X2, X3, … del conjunto y formamos las variables Y1, Y2, Y3,… es posible comprobar que la matriz de covarianza de Y1, Y2, Y3, … es igual a la matriz de correlación de X1, X2, X3, … Por lo tanto, realizar un análisis en componentes principales sobre la matriz de correlación de X1, X2, X3, 2 Conjunto nº 360 de Hand, Daly Lunn, Mc Conway & Ostrowski, (1994) A handbook of small datasets, Chapman & Hall. … es equivalente a realizarlo con la tipificadas Y1, Y2, Y3… matriz de covarianzas de las variables Los argumentos center (cuyo defecto es T) y scale (cuyo defecto es F) permiten la tipificación de las variables del conjunto. Seleccionamos en general analizar las variables tipificadas, indicando el argumento scale=T, … en el caso en que sus desviaciones típicas son de ordenes de magnitud distintos.