En los tiempos modernos es usual tener gran cantidad de datos y es necesario contar con herramientas para manejarlos. Una de las formas para manejar gran cantidad de variables es análisis de componentes principales.
2 Análisis de componentes principales
Es una herramienta que sirve:
para reducir el numero de variables originales por nuevas variables o componentes “incorrelacionadas”.
como insumo para otros métodos como análisis de regresión, análisis de cluster, entre otros.
La siguiente figura ilustra el objetivo de PCA.
Supongamos que \([X_{1}, X_{2}, \dots, X_{p}] = \boldsymbol{X}^\top\) es un conjunto de \(p\) variables aleatorias, con un vector medio \(\boldsymbol{\mu}\), matriz de varianza-covarianza \(\boldsymbol{\Sigma}\) y matriz de correlaciones \(\boldsymbol{\rho}\).
Queremos definir \(p\) combinaciones lineales de \(\boldsymbol{X}^\top\) que representen la información en \(\boldsymbol{X}^\top\) de forma más parsimoniosa.
Específicamente, queremos encontrar \(\boldsymbol{a}_{1}, \ldots, \boldsymbol{a}_{p}\) tal que \(\boldsymbol{a}_{1}^\top \boldsymbol{X}, \ldots, \boldsymbol{a}_{p}^\top \boldsymbol{X}\) nos entreguen la misma información que \(\boldsymbol{X}^\top\) pero de una forma mejor.
Sean \(\lambda_{1} \geq \lambda_{2} \geq \cdots \geq \lambda_{p} \geq 0\) los \(p\) valores propios de la matriz \(\boldsymbol{\Sigma}\) y sean \(\boldsymbol{a}_{1}, \ldots, \boldsymbol{a}_{p}\) los vectores propios correspondientes.
Si algunas raíces no son distintas, se pueden elegir los vectores propios correspondientes para que sean ortogonales.
El vector propio \(\boldsymbol{a}_{i}\) se puede modificar para que \(\boldsymbol{a}_{i}^\top \boldsymbol{a}_{i} = 1\), es decir, un vector propio normalizado.
La componente principal se denota por \(PC_i\) y se calcula como \(PC_i = \boldsymbol{a}_{i}^\top \boldsymbol{X}\).
\(Tr(\boldsymbol \Sigma) = \lambda_{1} + \cdots + \lambda_{p}\) = suma de las varianzas para todos los componentes principales de \(p\) y para \(X_{1}, \ldots, X_ {p}\).
La importancia de \(PC_i\) es \(\lambda_{i}/\sum_{k=1}^{k=p}\lambda_k\).
4 Ejemplo
Supongamos que tenemos dos variables cuantitativas \(X_1\) y \(X_2\) como se muestra en la figura de abajo. Queremos explorar sobre cual de los ejes (1, 2 o 3) los puntos al ser proyectados tienen la mayor variabilidad.
Eje 1: \((1, 0)^\top\)
Eje 2: \((0, 1)^\top\)
Eje 3: \((1/\sqrt{2}, 1/\sqrt{2})^\top\)
mu <-c(0,0) # Mean vectorSigma <-matrix(c(1, 0.5, 0.5, 1), ncol=2) # Covariance matrix# Generate sample from N(mu, Sigma)library(MASS)dt <-mvrnorm(100, mu=mu, Sigma=Sigma)plot(dt, xlab=expression(x[1]), pch=19, ylab=expression(x[2]))
Solución
Vamos a proyectar los puntos sobre tres vectores \((1, 0)^\top\), \((0, 1)^\top\) y \((1/\sqrt{2}, 1/\sqrt{2})^\top\).
De la figura anterior vemos que la mayor variabilidad se obtiene cuando el eje coincide con el vector \((1/\sqrt{2}, 1/\sqrt{2})^\top\). Este vector coincide con uno de los vectores propios de la matriz Sigma definida antes.
A continuación una base de datos sobre medidas corporales a 36 estudiantes de la universidad el año pasado. El objetivo es conseguir las componentes principales para este conjunto de datos.
Abajo la forma de leer los datos y una muestra de las primeras observaciones.
myurl <-'https://raw.githubusercontent.com/fhernanb/datos/master/medidas_cuerpo'datos <-read.table(file=myurl, header=T, sep='')rownames(datos) <-1:36# Para tener los nombres de las personashead(datos)
Los eigen-vectores son los coeficientes de las componentes principales.
Nota
Un valor propio > 1 indica que las PC explican más varianza que la explicada por una de las variables originales en los datos estandarizados. Esto se usa comúnmente como un punto de corte para el cual se retienen las PC. Esto es cierto solo cuando los datos están estandarizados.
Es posible obtener los coeficientes usando la funcion prcomp del paquete stats. La ventaja es que no es necesario escalar antes los datos, se pueden escalar dentro de la función.
Para obtener una tabla informativa con la importancia y la variabilidad de cada una de las componentes hacemos lo siguiente.
summary(mod)
Importance of components:
PC1 PC2 PC3 PC4
Standard deviation 1.8460 0.61629 0.36764 0.2779
Proportion of Variance 0.8519 0.09495 0.03379 0.0193
Cumulative Proportion 0.8519 0.94691 0.98070 1.0000
Para hacer representaciones gráficas de PCA podemos usar el paquete factoextra.
library(factoextra)
Warning: package 'factoextra' was built under R version 4.2.3
Loading required package: ggplot2
Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
Para ver el porcentaje de variabilidad explicada por cada PC podemos hacer lo siguiente.
fviz_eig(mod, addlabels =TRUE, ylim =c(0, 100))
La función get_pca_var del paquete factoextra nos entrega los resultados útiles de las variables X’s en PCA.
var <-get_pca_var(mod)var
Principal Component Analysis Results for variables
===================================================
Name Description
1 "$coord" "Coordinates for the variables"
2 "$cor" "Correlations between variables and dimensions"
3 "$cos2" "Cos2 for the variables"
4 "$contrib" "contributions of the variables"
El contenido de var es el siguiente:
var$coord: coordenadas de variables para crear un diagrama de dispersión.
var$cor: correlación entre las X’s y las PC’s.
var$cos2: representa la calidad de representación de las variables en el mapa de factores. Se calcula como las correlaciones al cuadrado, var.cos2 = var.coord ^ 2.
var$contrib: contiene las contribuciones (en porcentaje) de las variables a los componentes principales. La contribución de una variable (var) a un componente principal dado es (en porcentaje) es (var.cos2 * 100) / (cos2 total del componente).
En la siguiente figura podemos ver las correlaciones entre las X’s y las PC’s. .
fviz_pca_var(mod,col.var ="tomato",repel =TRUE# Avoid text overlapping )
El gráfico anterior también se conoce como gráficos de correlación entre variables. Se puede interpretar de la siguiente manera:
Las variables correlacionadas positivamente se agrupan.
Las variables correlacionadas negativamente se colocan en lados opuestos del origen del gráfico (cuadrantes opuestos).
La distancia entre las variables y el origen mide la calidad de las variables en el mapa de factores. Las variables que están alejadas del origen están bien representadas en el mapa de factores.
La función get_pca_ind del paquete factoextra nos entrega los resultados útiles de las variables X’s en PCA.
ind <-get_pca_ind(mod)ind
Principal Component Analysis Results for individuals
===================================================
Name Description
1 "$coord" "Coordinates for the individuals"
2 "$cos2" "Cos2 for the individuals"
3 "$contrib" "contributions of the individuals"
En la siguiente figura podemos ver la ubicación de los 36 estudiantes en el sistema PC1 y PC2.
fviz_pca_ind(mod,col.ind ="cos2", # Color by the quality of representationgradient.cols =c("#00AFBB", "#E7B800", "#FC4E07"),repel =TRUE# Avoid text overlapping )
En la siguiente figura podemos ver la contribución de las variables originales a cada PC y la ubicación de los 36 estudiantes en las dos PC.
A continuacion las componentes obtenidas con \(\Sigma\).
summary(princomp(covmat=Sigma), loadings=TRUE)
Importance of components:
Comp.1 Comp.2
Standard deviation 10.0080644 0.915776619
Proportion of Variance 0.9916966 0.008303434
Cumulative Proportion 0.9916966 1.000000000
Loadings:
Comp.1 Comp.2
Var 1 0.999
Var 2 0.999
A continuacion las componentes obtenidas con \(\rho\).
summary(princomp(covmat=rho), loadings=TRUE)
Importance of components:
Comp.1 Comp.2
Standard deviation 1.183216 0.7745967
Proportion of Variance 0.700000 0.3000000
Cumulative Proportion 0.700000 1.0000000
Loadings:
Comp.1 Comp.2
Var 1 0.707 0.707
Var 2 0.707 -0.707
Importante
Es mejor usar la matriz de correlaciones y no la matriz de covarianzas para aplicar PCA. Si no se hace así, la variable que tenga la mayor varianza se roba el protagonismo de la primera CP.
7 Ejemplo 2 de Torsten & Hothorn (2011)
El conjunto de datos frets del paquete boot contiene las longitudes y anchuras de cabeza (mm) para cada uno de los dos primeros hijos adultos en 25 familias. Usando solo las longitudes de cabeza (l1 y l2), aplicar la técnica PCA.
Solución
require(boot) # Paquete donde estan los datoshead(frets)
library(factoextra)fviz_pca_ind(hep_pca,col.ind ="cos2", # Color by the quality of representationgradient.cols =c("#00AFBB", "#E7B800", "#FC4E07"),repel =TRUE# Avoid text overlapping )
Variables en el plano factorial usando.
fviz_pca_var(hep_pca,col.var ="tomato",repel =TRUE# Avoid text overlapping )
Descomposición espectral que examina las covarianzas/correlaciones entre variables.
Descomposición de valores singulares que examina las covarianzas/correlaciones entre individuos
La función princomp() utiliza el método de descomposición espectral. Las funciones prcomp() y PCA() de FactoMineR utilizan la descomposición en valores singulares (SVD).
Nota
De acuerdo con la ayuda de R, SVD tiene una precisión numérica ligeramente mejor. Por lo tanto, se prefiere la función prcomp( ) en comparación con princomp( ).
prcomp(formula, data, subset, na.action, x, center, scale)
La interpretación de las componentes principales sigue siendo un tema muy investigado en estadística, y aunque las componentes pueden interpretarse fácilmente en la mayoría de los entornos, no siempre es así (Joliffe, 2002).
11 PCA como input a otras técnicas
Se le recomienda a los lectores revisar este enlace para ver cómo usar PCA con un modelo de regresión.
12 Respuestas a preguntas interesantes
De clic sobre el enlace para consultar las respuestas.
Why do the R functions princomp and prcomp give different eigenvalues? enlace
What is the difference between R functions princomp and prcomp? enlace
5 functions to do Principal Components Analysis in R. enlace
13 Recursos adicionales
Datos de las olimpiadas: https://www.olympic.org/rio-2016
Factoextra R Package: Easy Multivariate Data Analyses and Elegant Visualization: http://www.sthda.com/english/wiki/factoextra-r-package-easy-multivariate-data-analyses-and-elegant-visualization
Ejemplo de PCA para clasificación: https://rpubs.com/JanpuHou/278584