Análisis de componente principal

Introducción

En este informe, se aplican los conceptos del capítulo 3 del libro guía “Multivariate analysis II Practical guide to principal component Methods in R”, donde con la ayuda de ciertas librerías podemos estandarizar datos de manera efectiva con ejemplos didácticos, aplicando por ejemplo la personalización de variables y grupos en color y transparencia, resaltar las variables según su importancia, tener gráficos dinámicos en forma y dimensiones, elaborar elipses y parámetros gráficos y finalmente filtrar resultados.

Pasos preliminares

Se instalaron los dos paquetes (FavtoMineR y factoextra) Los cuales son necesarios para poder hacer los ejercicios del capitulo 3 ( principal component analysis ) del libro Multivariate analysis II Practical gide to prinicpal component Methods in R.

#instalación de paquetes necesarios 
library(ggplot2)
library(FactoMineR) 
## Warning: package 'FactoMineR' was built under R version 4.2.2
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.2.2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa

A continuación, se usaran los conjuntos de datos de demostración decathlon2 del paquete factoextra:

data(decathlon2)

Subsiguiente a esto, se subdividirán los individuos activos y variables activas para el análisis de componentes principales:

decathlon2.active <- decathlon2[1:23, 1:10]
head(decathlon2.active[, 1:6], 4)
##         X100m Long.jump Shot.put High.jump X400m X110m.hurdle
## SEBRLE  11.04      7.58    14.83      2.07 49.81        14.69
## CLAY    10.76      7.40    14.26      1.86 49.37        14.05
## BERNARD 11.02      7.23    14.25      1.92 48.93        14.99
## YURKOV  11.34      7.09    15.19      2.10 50.42        15.31

Estandarización de datos

El PCA permite ver la información minimizándola en conjuntos de datos con individuos/observaciones siendo múltiples variables cuantitativas haciendo una intercorrelación. Si son más de 3 variables en sus conjuntos, se complicaría visualizar un hiperespacio multidimensional. Esta información nueva se denomina “componentes principales”, que corresponden a una combinación lineal de las originales, y el objetivo del Análisis de estos nuevos componentes principales es identificar las direcciones donde la variación en los datos es máxima. La dimensionalidad de estos datos multivariados a dos o tres componentes principales, se pueden visualizar gráficamente, con una mínima pérdida de información:

PCA(decathlon2.active, scale.unit = TRUE, ncp = 5, graph = TRUE)

## **Results for the Principal Component Analysis (PCA)**
## The analysis was performed on 23 individuals, described by 10 variables
## *The results are available in the following objects:
## 
##    name               description                          
## 1  "$eig"             "eigenvalues"                        
## 2  "$var"             "results for the variables"          
## 3  "$var$coord"       "coord. for the variables"           
## 4  "$var$cor"         "correlations variables - dimensions"
## 5  "$var$cos2"        "cos2 for the variables"             
## 6  "$var$contrib"     "contributions of the variables"     
## 7  "$ind"             "results for the individuals"        
## 8  "$ind$coord"       "coord. for the individuals"         
## 9  "$ind$cos2"        "cos2 for the individuals"           
## 10 "$ind$contrib"     "contributions of the individuals"   
## 11 "$call"            "summary statistics"                 
## 12 "$call$centre"     "mean of the variables"              
## 13 "$call$ecart.type" "standard error of the variables"    
## 14 "$call$row.w"      "weights for the individuals"        
## 15 "$call$col.w"      "weights for the variables"

A continuación, se demostrará cómo calcular y visualizar PCA usando el software R. También se mostrará cómo revelar las variables más importantes que explican las variaciones en un conjunto de datos:

library("FactoMineR")
res.pca <- PCA(decathlon2.active, graph = FALSE)

La salida de la función PCA() es una lista que incluye los siguientes componentes:

print(res.pca)
## **Results for the Principal Component Analysis (PCA)**
## The analysis was performed on 23 individuals, described by 10 variables
## *The results are available in the following objects:
## 
##    name               description                          
## 1  "$eig"             "eigenvalues"                        
## 2  "$var"             "results for the variables"          
## 3  "$var$coord"       "coord. for the variables"           
## 4  "$var$cor"         "correlations variables - dimensions"
## 5  "$var$cos2"        "cos2 for the variables"             
## 6  "$var$contrib"     "contributions of the variables"     
## 7  "$ind"             "results for the individuals"        
## 8  "$ind$coord"       "coord. for the individuals"         
## 9  "$ind$cos2"        "cos2 for the individuals"           
## 10 "$ind$contrib"     "contributions of the individuals"   
## 11 "$call"            "summary statistics"                 
## 12 "$call$centre"     "mean of the variables"              
## 13 "$call$ecart.type" "standard error of the variables"    
## 14 "$call$row.w"      "weights for the individuals"        
## 15 "$call$col.w"      "weights for the variables"

En el análisis de componentes principales, las variables se escalan (es decir, se estandarizan). Esto se lleva a cabo cuando las variables se miden en diferentes escalas (por ejemplo: kilogramos, kilómetros, centímetros, …); de lo contrario, los resultados de PCA obtenidos se verán gravemente afectados. Como objetivo, se busca que las variables puedan ser comparables. En general, las variables se escalan para tener: i) desviación estándar uno y ii) media cero.

En el análisis de datos de expresión génica, se estandarizan los datos antes del PCA y el análisis de agrupamiento. Esto también aplica si se quiere escalar los datos cuando la media y/o la desviación estándar de las variables son muy diferentes

Como se describió en las secciones anteriores, los valores propios miden la cantidad de variación retenida por cada componente principal. Los valores propios son grandes para las primeras PC y pequeños para las PC posteriores. Es decir, las primeras PC corresponden a las direcciones con la máxima cantidad de variación en el conjunto de datos.

El objeto que se crea usando la función PCA() tiene demasiada información en muchas listas y matrices diferentes. Estos valores se describen en la siguiente sección. Como se vio en secciones anteriores, el Eigenvalues mide la cantidad de variación retenida por cada componente principal. Eigenvalues son grandes para las primeras PC y pequeñas para las PC posteriores. Es decir, las primeras PC corresponden a las direcciones con la máxima cantidad de variación en el conjunto de datos.

library(factoextra)
eig.val <- get_eigenvalue(res.pca) 
eig.val
##        eigenvalue variance.percent cumulative.variance.percent
## Dim.1   4.1242133        41.242133                    41.24213
## Dim.2   1.8385309        18.385309                    59.62744
## Dim.3   1.2391403        12.391403                    72.01885
## Dim.4   0.8194402         8.194402                    80.21325
## Dim.5   0.7015528         7.015528                    87.22878
## Dim.6   0.4228828         4.228828                    91.45760
## Dim.7   0.3025817         3.025817                    94.48342
## Dim.8   0.2744700         2.744700                    97.22812
## Dim.9   0.1552169         1.552169                    98.78029
## Dim.10  0.1219710         1.219710                   100.00000

Al examinar los valores propios para determinar el número de componentes principales a considerar, Los eigenvalues y la proporción de varianzas (es decir, información) retenida por los componentes principales (PC) pueden extraerse usando la función get_eigenvalue () [factoextra package].

Al sumar todos los valores propios nos arroja una varianza total de 10. En la segunda columna está la proporción de variación explicada por cada valor propio. Por ejemplo, 4,124 dividido por 10 es igual a 0,4124, o sea, alrededor del 41,24 % de la variación se explica por este primer valor propio. Para obtener el porcentaje acumulado se suman las sucesivas proporciones de variación explicadas para obtener el total acumulado. Por ejemplo, 41,242 % más 18,385 % es igual a 59,627 %, y así sucesivamente. Por lo tanto, cerca del 59,627% de la variación se explica por los dos primeros valores propios juntos.

Los componentes son suficientes. Esto dependerá del campo específico de aplicación y del conjunto de datos específico. En la práctica, hay que observar los primeros componentes principales para hallar patrones interesantes en los datos. Para este análisis, los primeros tres componentes principales explican el 72% de la variación, siendo un porcentaje aceptablemente grande.

Otro método para determinar el número de componentes principales puede ser observando un Scree Plot (gráfico de valores propios ordenados de mayor a menor).

El número de componentes se determina en el punto, más allá del cual los valores propios restantes son todos relativamente pequeños y de tamaño comparable (Jollife, 2002, Peres-Neto et al. (2005))

El scree plot se puede producir utilizando la función fviz_eig() o fviz_screeplot() [paquete factoextra].

fviz_eig(res.pca, addlabels = TRUE, ylim = c(0, 50))

Para extraer los resultados, para variables, de una salida PCA es usar la función get_pca_var() [paquete factoextra]. Esta función enlista matrices que contienen todos los resultados de las variables activas (coordenadas, correlación entre variables y ejes, coseno al cuadrado y contribuciones)

var <- get_pca_var(res.pca) 
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"

Los componentes de get_pca_var() se pueden usar en la gráfica de variables de la siguiente manera:

# Coordenadas
head(var$coord)
##                   Dim.1       Dim.2      Dim.3       Dim.4      Dim.5
## X100m        -0.8506257 -0.17939806  0.3015564  0.03357320 -0.1944440
## Long.jump     0.7941806  0.28085695 -0.1905465 -0.11538956  0.2331567
## Shot.put      0.7339127  0.08540412  0.5175978  0.12846837 -0.2488129
## High.jump     0.6100840 -0.46521415  0.3300852  0.14455012  0.4027002
## X400m        -0.7016034  0.29017826  0.2835329  0.43082552  0.1039085
## X110m.hurdle -0.7641252 -0.02474081  0.4488873 -0.01689589  0.2242200
# Cos2: calidad en el mapa factore
head(var$cos2)
##                  Dim.1        Dim.2      Dim.3        Dim.4      Dim.5
## X100m        0.7235641 0.0321836641 0.09093628 0.0011271597 0.03780845
## Long.jump    0.6307229 0.0788806285 0.03630798 0.0133147506 0.05436203
## Shot.put     0.5386279 0.0072938636 0.26790749 0.0165041211 0.06190783
## High.jump    0.3722025 0.2164242070 0.10895622 0.0208947375 0.16216747
## X400m        0.4922473 0.0842034209 0.08039091 0.1856106269 0.01079698
## X110m.hurdle 0.5838873 0.0006121077 0.20149984 0.0002854712 0.05027463
# Aportes a los componentes principales
head(var$contrib)
##                  Dim.1      Dim.2     Dim.3       Dim.4     Dim.5
## X100m        17.544293  1.7505098  7.338659  0.13755240  5.389252
## Long.jump    15.293168  4.2904162  2.930094  1.62485936  7.748815
## Shot.put     13.060137  0.3967224 21.620432  2.01407269  8.824401
## High.jump     9.024811 11.7715838  8.792888  2.54987951 23.115504
## X400m        11.935544  4.5799296  6.487636 22.65090599  1.539012
## X110m.hurdle 14.157544  0.0332933 16.261261  0.03483735  7.166193

Para extraer los resultados, para variables, de una salida PCA se usa la función get_pca_var() [factoextra package]. Al hacer una correlación entre una variable y un componente principal (PC) se utilizan las coordenadas de la variable en el PC. La representación de las variables es diferente de la gráfica de las observaciones: las observaciones se representan por sus proyecciones, pero las variables se representan por sus correlaciones (Abdi y Williams, 2010).

#Coordenadas de variables
head(var$coord, 4)
##                Dim.1       Dim.2      Dim.3      Dim.4      Dim.5
## X100m     -0.8506257 -0.17939806  0.3015564  0.0335732 -0.1944440
## Long.jump  0.7941806  0.28085695 -0.1905465 -0.1153896  0.2331567
## Shot.put   0.7339127  0.08540412  0.5175978  0.1284684 -0.2488129
## High.jump  0.6100840 -0.46521415  0.3300852  0.1445501  0.4027002
##Taza de variables:
fviz_pca_var(res.pca, col.var = "black")

El gráfico anterior es conocido como gráficos de correlación de variables, muestra las relaciones que hay entre todas las variables. Se puede interpretar de la siguiente manera: • Las variables correlacionadas positivamente tienden a agruparse. • Las variables correlacionadas negativamente se sitúan 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 lejos del origen están bien representadas en el mapa de factores Para una variable dada…

Se debe considerar lo siguiente: • Un cos2 alto indica una buena representación de la variable en el componente principal. En este caso la variable se posiciona cerca de la circunferencia del círculo de correlación. • Un cos2 bajo indica que la variable no está perfectamente representada por los PC.

head(var$cos2, 4)
##               Dim.1       Dim.2      Dim.3      Dim.4      Dim.5
## X100m     0.7235641 0.032183664 0.09093628 0.00112716 0.03780845
## Long.jump 0.6307229 0.078880629 0.03630798 0.01331475 0.05436203
## Shot.put  0.5386279 0.007293864 0.26790749 0.01650412 0.06190783
## High.jump 0.3722025 0.216424207 0.10895622 0.02089474 0.16216747

Puede visualizar el cos2 de las variables en todas las dimensiones usando el paquete corrplot:

library("corrplot") 
## Warning: package 'corrplot' was built under R version 4.2.2
## corrplot 0.92 loaded
corrplot(var$cos2, is.corr=FALSE)

También es posible crear un diagrama de barras de variables cos2 usando la función fviz_cos2():

# Cos2 total de variables en Dim.1 y Dim.2
fviz_cos2(res.pca, choice = "var", axes = 1:2)

En lo que compete a este caso, la variable está situada cerca del centro del círculo. Para una variable dada, la suma de los cos2 de todos los componentes principales es igual a uno. Si una variable está perfectamente representada por solo dos componentes principales (Dim.1 y Dim.2), la suma del cos2 en estas dos PC es igual a uno. En este caso las variables se posicionarán sobre el círculo de correlaciones. Para algunas de las variables, es posible que se requieran más de 2 componentes para representar perfectamente los datos. En este caso las variables se posicionan dentro del círculo de correlaciones. En pocas palabras:

• Los valores de cos2 se utilizan para estimar la calidad de la representación.

• Cuanto más cerca esté una variable del círculo de correlaciones, mejor será su representación en el mapa de factores y más importante será la interpretación de componentes.

• Las variables que están cerca del centro del gráfico son menos importantes para los primeros componentes.

Si una variable está perfectamente representada por solo dos componentes principales (Dim.1 y Dim.2), la suma del cos2 en estas dos PC es igual a uno. En este caso las variables se posicionarán sobre el círculo de correlaciones.

Para algunas de las variables, es posible que se requieran más de 2 componentes para representar perfectamente los datos. En este caso las variables se posicionan dentro del círculo de correlaciones. En pocas palabras: • Los valores de cos2 se utilizan para estimar la calidad de la representación. • Cuanto más cerca esté una variable del círculo de correlaciones, mejor será su representación en el mapa de factores y más importante será la interpretación de componentes. • Las variables que están cerca del centro del gráfico son menos importantes para los primeros componentes.

Es posible colorear las variables por sus valores cos2 usando el col.var = “cos2”, pudiendo degradar los colores. En este caso, el gradient.cols puede utilizar para proporcionar un color personalizado. Por ejemplo, gradient.cols = c(“white”, “blue”, “red”) significa que: • las variables con valores bajos de cos2 se colorearán en “blanco” • las variables con valores medios de cos2 se colorearán en “azul” • las variables con valores altos de cos2 se colorearán en rojo También es posible cambiar la transparencia…

# Color por valores cos2: calidad en el mapa de factores
fviz_pca_var(res.pca, col.var = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE # Evita la superposición de texto
             )

Igualmente se puede cambiar la transparencia de las variables según sus valores de cos2 usando la opción alfa.var = “cos2”. Por ejemplo:

# Cambiar la transparencia por valores cos2
fviz_pca_var(res.pca, alpha.var = "cos2")

Las contribuciones de las variables para explicar la variabilidad en un componente principal dado se expresan en porcentaje. • Las variables correlacionadas con PC1 (es decir, Dim.1) y PC2 (es decir, Dim.2) son las más importantes para explicar la variabilidad en el conjunto de datos. Si las variables no se correlacionan con ningún PC o correlacionado con las últimas dimensiones, son variables que contribuyen muy poco y podría eliminarse para simplificar el análisis general.

 head(var$contrib, 4)
##               Dim.1      Dim.2     Dim.3     Dim.4     Dim.5
## X100m     17.544293  1.7505098  7.338659 0.1375524  5.389252
## Long.jump 15.293168  4.2904162  2.930094 1.6248594  7.748815
## Shot.put  13.060137  0.3967224 21.620432 2.0140727  8.824401
## High.jump  9.024811 11.7715838  8.792888 2.5498795 23.115504

Se puede utilizar la función corrplot() [corrplot package] para resaltar las variables que más contribuyen para cada dimensión:

library("corrplot") 
corrplot(var$contrib, is.corr=FALSE)

La función fviz_contrib() [paquete factoextra] se puede utilizar para dibujar un gráfico de barras de contribuciones de las variables. Si sus datos contienen muchas variables, puede decidir mostrar solo las principales variables contribuyentes. El siguiente código R muestra las 10 principales variables que contribuyen a los componentes principales:

# Aportes de variables a PC1
fviz_contrib(res.pca, choice = "var", axes = 1, top = 10)

La contribución total a PC1 y PC2 se obtiene con el siguiente código:

 fviz_contrib(res.pca, choice = "var", axes = 1:2, top = 10)

La línea discontinua roja en el gráfico anterior indica la contribución promedio esperada. De esta manera, si la contribución de las variables fuera uniforme, el valor esperado sería 1/ longitud(variables) = 1/10 = 10%. Para un componente dado, una variable con una contribución mayor que este límite podría considerarse importante para contribuir al componente. Es importante añadir que contribución total de una determinada variable, al explicar las variaciones retenidas por dos componentes principales, digamos PC1 y PC2, se calcula como contrib = [(C1 * Eig1) + (C2 * Eig2)]/(Eig1 + Eig2), donde: • C1 y C2 son las contribuciones de la variable sobre PC1 y PC2, respectivamente

• Eig1 y Eig2 son los valores propios de PC1 y PC2, respectivamente.

Es indispensable reconocer que valores propios miden la cantidad de variación retenida por cada PC.

En este caso, la contribución promedio esperada (corte) se calcula de la siguiente manera: como se mencionó anteriormente, si las contribuciones de las 10 variables fueran uniformes, la contribución promedio esperada en una PC dada sería 1/10 = 10%. La contribución promedio esperada de una variable para PC1 y PC2 es: [(10* Eig1) + (10 * Eig2)]/(Eig1 + Eig2) Se puede ver que las variables - X100m, Long.jump y Pole.vault - son las que más contribuyen a las dimensiones 1 y 2. Las variables más importantes (o contribuyentes) se pueden resaltar en el gráfico de correlación de la siguiente manera:

También es posible cambiar la transparencia de las variables de acuerdo con sus valores de contribución usando la opción alpha.var = “contrib”. Por ejemplo:

fviz_pca_var(res.pca, col.var = "contrib",
            gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")
            )

También es posible cambiar la transparencia de las variables de acuerdo con sus valores de contribución usando la opción alpha.var = “contrib”. Por ejemplo:

# Cambiar la transparencia por valores de contribución
fviz_pca_var(res.pca, alpha.var = "contrib")

Previamente en las secciones, se muestran cómo colorear variables por sus contribuciones y su cos2. La variable de color debe tener la misma longitud que el número de variables activas en el PCA (aquí n = 10). Por ejemplo:

# Crea una variable continua aleatoria de longitud 10
set.seed(123) 
my.cont.var <- rnorm(10)
# Variables de color por la variable continua
fviz_pca_var(res.pca, col.var = my.cont.var, gradient.cols = c("blue", "yellow", "red"), legend.title = "Cont.Var")

Se puede cambiar el color de las variables por grupos definidos por una variable cualitativa/categórica, llamada factor en la terminología de R. Al no tener ninguna variable de agrupación en nuestros conjuntos de datos para clasificar variables, se crearán. En la demostración, se empieza por clasificar las variables en 3 grupos usando el kmeans de agrupamiento de algoritmo. A continuación, para colorear variables usamos kmeans.

# Crea una variable de agrupación usando kmeans
# Crea 3 grupos de variables (centros = 3)
set.seed(123)
res.km <- kmeans(var$coord, centers = 3, nstart = 25) 
grp <- as.factor(res.km$cluster)
# Variables de color por grupos
fviz_pca_var(res.pca, col.var = grp,
             palette = c("#0073C2FF", "#EFC000FF", "#868686FF"),
             legend.title = "Cluster")

Ahora, en la sección 3.4.2.4, se describe cómo resaltar las variables ordenadas por sus contribuciones a los componentes principales. La función dimdesc() [in FactoMineR], describiendo la dimensión, se utiliza para identificar las variables asociadas más significativas con un dicho componente principal. Se puede utilizar de la siguiente manera:

res.desc <- dimdesc(res.pca, axes = c(1,2), proba = 0.05)
# Descripción de la dimensión 1
res.desc$Dim.1
## 
## Link between the variable and the continuous variables (R-square)
## =================================================================================
##              correlation      p.value
## Long.jump      0.7941806 6.059893e-06
## Discus         0.7432090 4.842563e-05
## Shot.put       0.7339127 6.723102e-05
## High.jump      0.6100840 1.993677e-03
## Javeline       0.4282266 4.149192e-02
## X400m         -0.7016034 1.910387e-04
## X110m.hurdle  -0.7641252 2.195812e-05
## X100m         -0.8506257 2.727129e-07
# Descripción de la dimensión 2
res.desc$Dim.2
## 
## Link between the variable and the continuous variables (R-square)
## =================================================================================
##            correlation      p.value
## Pole.vault   0.8074511 3.205016e-06
## X1500m       0.7844802 9.384747e-06
## High.jump   -0.4652142 2.529390e-02

En el resultado anterior, $quanti significa resultados para variables cuantitativas ordenándose por el valor p de la correlación.

Los resultados, para individuos, se pueden extraer usando la función get_pca_ind() [paquete factoextra]. De forma parecida a get_pca_var(), la función get_pca_ind() da una lista de matrices que contienen completamente los resultados de los individuos (coordenadas, correlación entre variables y ejes, coseno cuadrado y contribuciones)

ind <- get_pca_ind(res.pca) 
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"

Para obtener acceso a los diferentes componentes:

# Coordenadas de individuos
head(ind$coord)
##                Dim.1      Dim.2      Dim.3       Dim.4       Dim.5
## SEBRLE     0.1955047  1.5890567  0.6424912  0.08389652  1.16829387
## CLAY       0.8078795  2.4748137 -1.3873827  1.29838232 -0.82498206
## BERNARD   -1.3591340  1.6480950  0.2005584 -1.96409420  0.08419345
## YURKOV    -0.8889532 -0.4426067  2.5295843  0.71290837  0.40782264
## ZSIVOCZKY -0.1081216 -2.0688377 -1.3342591 -0.10152796 -0.20145217
## McMULLEN   0.1212195 -1.0139102 -0.8625170  1.34164291  1.62151286
# Calidad de los individuos
head(ind$cos2)
##                 Dim.1      Dim.2       Dim.3       Dim.4        Dim.5
## SEBRLE    0.007530179 0.49747323 0.081325232 0.001386688 0.2689026575
## CLAY      0.048701249 0.45701660 0.143628117 0.125791741 0.0507850580
## BERNARD   0.197199804 0.28996555 0.004294015 0.411819183 0.0007567259
## YURKOV    0.096109800 0.02382571 0.778230322 0.061812637 0.0202279796
## ZSIVOCZKY 0.001574385 0.57641944 0.239754152 0.001388216 0.0054654972
## McMULLEN  0.002175437 0.15219499 0.110137872 0.266486530 0.3892621478
# Aportes de individuos
head(ind$contrib)
##                Dim.1      Dim.2      Dim.3       Dim.4       Dim.5
## SEBRLE    0.04029447  5.9714533  1.4483919  0.03734589  8.45894063
## CLAY      0.68805664 14.4839248  6.7537381  8.94458283  4.21794385
## BERNARD   1.94740183  6.4234107  0.1411345 20.46819433  0.04393073
## YURKOV    0.83308415  0.4632733 22.4517396  2.69663605  1.03075263
## ZSIVOCZKY 0.01232413 10.1217143  6.2464325  0.05469230  0.25151025
## McMULLEN  0.01549089  2.4310854  2.6102794  9.55055888 16.29493304

El fviz_pca_ind() se usa para producir el gráfico de individuos. Para crear una trama simple:

fviz_pca_ind(res.pca)

fviz_pca_ind(res.pca, col.ind = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE # Evita la superposición de texto (lento si hay muchos puntos)
             )

También puede cambiar el tamaño del punto según el cos2 de los individuos correspondientes:

fviz_pca_ind(res.pca, pointsize = "cos2",
             pointshape = 21, fill = "#E7B800",
             repel = TRUE # Evita la superposición de texto (lento si hay muchos puntos)
             )

Para cambiar tanto el tamaño del punto como el color por cos2:

fviz_cos2(res.pca, choice = "ind")

Para ver la contribución de las personas a los dos primeros componentes principales, hay que escribir esto: suscriba la contribución de las personas a los dos primeros componentes principales:

# Contribución total en PC1 y PC2
fviz_contrib(res.pca, choice = "ind", axes = 1:2)

En cuanto a las variables, los individuos pueden ser coloreados por cualquier variable continua personalizada especificando el argumento col.ind. Ejemplo:

# Crear una variable continua aleatoria de longitud 23,
# Misma duración que el número de personas activas en el PCA
set.seed(123) 
my.cont.var <- rnorm(23)
# Variables de color por la variable continua
fviz_pca_ind(res.pca, col.ind = my.cont.var, 
             gradient.cols = c("blue", "yellow", "red"), 
             legend.title = "Cont.Var")

En este punto, de describe cómo colorear individuos por grupo. Incluso se muestra cómo agregar elipses de concentración y elipses de confianza por grupos. Para lograr esto se usarán los datos del iris como conjuntos de datos de demostración.

Los conjuntos de datos de iris se ven así:

head(iris, 3)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa

La columna “Especies” se utilizará como variable de agrupación. Comenzamos calculando el análisis de componentes principales de la siguiente manera:

# La variable Especie (índice = 5) se elimina # antes del análisis PCA
iris.pca <- PCA(iris[,-5], graph = FALSE)

En el código R mostrado a continuación: el argumento habillage o col.ind puede usarse para especificar la variable factor para colorear los individuos por grupos.

Si se quiere agregar una elipse de concentración alrededor de cada grupo, especifique el argumento addEllipses = TRUE. La paleta de argumentos se puede utilizar para cambiar los colores del grupo.

fviz_pca_ind(iris.pca,
             geom.ind = "point", # show  points  only  (nbut  not  "text")
             col.ind = iris$Species, # color por grupos
             palette = c("#00AFBB", "#E7B800", "#FC4E07"),
             addEllipses = TRUE, # Elipses de concentración
             legend.title = "Groups"
             )

Para eliminar el punto medio del grupo, especifique el argumento punto.medio = FALSE. Si desea elipses de confianza en lugar de elipses de concentración, use ellipse.type = “confianza”.

# Agregar puntos suspensivos de confianza
fviz_pca_ind(iris.pca, geom.ind = "point", col.ind = iris$Species, 
             palette = c("#00AFBB", "#E7B800", "#FC4E07"),
             addEllipses = TRUE, 
             ellipse.type = "confidence", legend.title = "Groups"
             )

Tenga en cuenta que los valores permitidos para la paleta incluyen:

• “gris” para paletas de colores grises; • paletas de cerveza, p. “RdBu”, “Blues”,…; Para ver todo, escriba esto en R: RColor- Brewer::display.brewer.all(). • paleta de colores personalizada, p. c(“azul”, “rojo”); • y paletas de revistas científicas del paquete ggsci R, por ejemplo: “npg”, “aaas”, “lancet”, “jco”, “ucscgb”, “uchicago”, “simpsons” y “rickandmorty”.

Por ejemplo, para usar la paleta de colores jco:

fviz_pca_ind(iris.pca,
             label = "none", # Ocultar etiquetas individuales
             habillage = iris$Species, # Color por grupos
             addEllipses = TRUE, # Elipses de concentración
             palette = "jco"
             )

## Personalización de gráficos

Hay que tener en cuenta que, fviz_pca_ind() y fviz_pca_var() y las funciones relacionadas se envuelven alrededor de la función principal fviz() [de facto extra]. fviz() es una especie de envoltorio alrededor de la función ggsca- ter() [en ggpubr]. Por lo tanto, se pueden especificar más argumentos, para pasar a la función fviz() y ggscatter(), en fviz_pca_ind() y fviz_pca_var(). A continuación, se presentan algunos de estos argumentos adicionales para personalizar el gráfico PCA de variables e individuos.

Dimensiones

De manera predeterminada, las variables/individuos se representan en las dimensiones 1 y 2. Si desea visualizarlos en las dimensiones 2 y 3, por ejemplo, debe especificar los ejes de argumento = c(2, 3).

# Variables en las dimensiones 2 y 3
fviz_pca_var(res.pca, axes = c(2, 3))

# Individuos en las dimensiones 2 y 3
fviz_pca_ind(res.pca, axes = c(2, 3))

Elementos de trama, fecha y punto

El argumento geom (por geometría) y derivados se usan para especificar los elementos geométricos que se utilizarán para el trazado.

  • geom.var: un texto que especifica la geometría que se utilizará para graficar variables. Los valores permitidos son la combinación de c(“punto”, “flecha”, “texto”).
  • Use geom.var = “punto”, para mostrar solo puntos;
  • Utilice geom.var = “texto” para mostrar solo las etiquetas de texto
  • Use geom.var = c(“punto”, “texto”) para mostrar puntos y etiquetas de texto
  • Use geom.var = c(“flecha”, “texto”) para mostrar flechas y etiquetas (predeterminado).

Por ejemplo:

# Mostrar puntos variables y etiquetas de texto
fviz_pca_var(res.pca, geom.var = c("point", "text"))

geom.ind: un texto que especifica la geometría que se utilizará para graficar individuos. Los valores permitidos son la combinación de c(“punto”, “texto”). - Use geom.ind = “punto”, para mostrar solo puntos; - Use geom.ind = “texto” para mostrar solo etiquetas de texto - Use geom.ind = c(“punto”, “texto”) para mostrar las etiquetas de punto y de texto (predeterminado)

Por ejemplo:

# Mostrar solo etiquetas de texto individuales
fviz_pca_ind(res.pca, geom.ind = "text")

### Elipses

Al colorear individuos por grupos, se pueden agregar elipses de concentración de puntos usándose el argumento addEllipses = TRUE. Hay que tener en cuenta que el argumento ellipse.type se puede usar para cambiar el tipo de puntos suspensivos. Los valores posibles son:

• “convexo”: trazado de casco convexo de un conjunto de puntos. • “confianza”: trace elipses de confianza alrededor de los puntos medios del grupo como la función coord.elipse()[en FactoMineR]. • “t”: asume una distribución t multivariante. • “norma”: asume una distribución normal multivariada. • “euclid”: dibuja un círculo con el radio igual al nivel, que representa la distancia euclidiana desde el centro. Esta elipse probablemente no aparecerá circular a menos que se aplique co-ord_fixed().

El argumento ellipse.level también está disponible para cambiar el tamaño de la elipse de concentración en probabilidad normal. Por ejemplo, especifique ellipse.level = 0,95 o ellipse.level = 0,66.

# Agregar puntos suspensivos de confianza
fviz_pca_ind(iris.pca, geom.ind = "point",
             col.ind = iris$Species, # color  by  groups
             palette = c("#00AFBB", "#E7B800", "#FC4E07"),
             addEllipses = TRUE, ellipse.type = "confidence", 
             legend.title = "Groups"
             )

# Casco convexo
fviz_pca_ind(iris.pca, geom.ind = "point",
             col.ind = iris$Species, # Color por grupos
             palette = c("#00AFBB", "#E7B800", "#FC4E07"),
             addEllipses = TRUE, ellipse.type = "convex", 
             legend.title = "Groups"
             )

Puntos medios del grupo

Al colorear individuos por grupos (sección 3.4.4.4), los puntos medios de los grupos (baricentros) también se muestran por defecto.

Para eliminar los puntos medios, utilice el argumento mean.point = FALSE.

fviz_pca_ind(iris.pca,
             geom.ind = "point", # mostrar solo puntos (pero no "texto")
             group.ind = iris$Species, # color por leyenda de grupos.
             title = "Groups",
             mean.point = FALSE)

# lineas de ejes

El argumento axes.linetype se usa para especificar el tipo de línea de los ejes. Por defecto el valor es “discontinuado”. Los valores permitidos incluyen “en blanco”, “sólido”, “punteado”, etc. Para ver todos los valores posibles, escriba ggpubr::show_line_types() en R.

Para eliminar líneas de eje, use axes.linetype = “blank”:

fviz_pca_var(res.pca, axes.linetype = "blank")

Párametros gráficos

Para cambiar fácilmente el gráfico de cualquier ggplots, puede usar la función ggpar()1 [paquete ggpubr]

Los parámetros que se pueden cambiar usando ggpar() incluyen: • Títulos principales, etiquetas de eje y títulos de leyenda • Posición de la leyenda. Valores posibles: “superior”, “inferior”, “izquierda”, “derecha”, “ninguno”. • Paleta de color. • Temas. Los valores permitidos incluyen: theme_gray(), theme_bw(), theme_minimal(), theme_classic(), theme_void().

ind.p <- fviz_pca_ind(iris.pca, geom = "point", col.ind = iris$Species) 
ggpubr::ggpar(ind.p,
              title = "Principal Component Analysis", subtitle = "Iris data set",
              caption = "Source: factoextra", xlab = "PC1", ylab = "PC2",
              legend.title = "Species", legend.position = "top", ggtheme = theme_gray(),
              palette = "jco")

Biplot

Para hacer un biplot simple de individuos y variables, hay que escribir esto:

fviz_pca_biplot(res.pca, repel = TRUE,
                col.var = "#2E9FDF", # Color de las variables
                col.ind = "#696969" # Color de los individuos
                )

Ahora, usando la salida de iris.pca, hagamos lo siguiente:

• hacer un biplot de individuos y variables • cambiar el color de los individuos por grupos: col.ind = iris$Species • Mostrar solo las etiquetas de las variables: etiqueta = “var” o use geom.ind = “punto”

fviz_pca_biplot(iris.pca,
                col.ind = iris$Species, palette = "jco", 
                addEllipses = TRUE, label = "var", 
                col.var = "black", repel = TRUE, 
                legend.title = "Species")

A continuación, en el siguiente ejemplo, se quiere colorear tanto a los individuos como a las variables por grupos. El truco es usar pointshape = 21 para puntos individuales. Esta forma de punto en particular se puede rellenar con un color utilizando el argumento fill.ind. El color de la línea de borde de los puntos individuales se identifica en “negro” usando col.ind. Para colorear las variables por grupos se usa el argumento col.var.

Para personalizar individuos y colores variables, usamos las funciones auxiliares fill_palette() y color_palette() [en el paquete ggpubr].

fviz_pca_biplot(iris.pca,
                # Rellenar individuos por grupos 
                geom.ind = "point", 
                pointshape = 21,
                pointsize = 2.5, 
                fill.ind = iris$Species, 
                col.ind = "black",
                # Variable de color por grupos
                col.var = factor(c("sepal", "sepal", "petal", "petal")),
                legend.title = list(fill = "Species", color = "Clusters"), repel = TRUE
                )+ ggpubr::fill_palette("jco")+ ggpubr::color_palette("npg")

Otro ejemplo complejo es colorear individuos por grupos (colores discretos) y sus variables por sus contribuciones a los componentes principales (colores degradados). Además, cambiaremos la transparencia de las variables por sus contribuciones utilizando el argumento alpha.var.

fviz_pca_biplot(iris.pca,
                # Individuos
                geom.ind = "point",
                fill.ind = iris$Species, col.ind = "black", 
                pointshape = 21, pointsize = 2,
                palette = "jco", 
                addEllipses = TRUE, 
                # Variables
                alpha.var ="contrib", col.var = "contrib", 
                gradient.cols = "RdYlBu",
                legend.title = list(fill = "Species", color = "Contrib",
                                    alpha = "Contrib")
                )

Elementos complementarios

Definition and types

Como se estableció anteriormente (sección 3.3.2), los conjuntos de datos de decathlon2 contienen variables continuas suplementarias (quanti.sup, columnas 11:12), variables cualitativas suplementarias (quali.sup, columna 13) e individuos suplementarios (ind.sup, columna 13). filas 24:27). ### Especificación en PCA

Para especificar individuos y variables adicionales, la función PCA() se puede utilizar de la siguiente manera:

PCA(decathlon2.active, ind.sup = NULL,
quanti.sup = NULL, quali.sup = NULL, graph = TRUE)

## **Results for the Principal Component Analysis (PCA)**
## The analysis was performed on 23 individuals, described by 10 variables
## *The results are available in the following objects:
## 
##    name               description                          
## 1  "$eig"             "eigenvalues"                        
## 2  "$var"             "results for the variables"          
## 3  "$var$coord"       "coord. for the variables"           
## 4  "$var$cor"         "correlations variables - dimensions"
## 5  "$var$cos2"        "cos2 for the variables"             
## 6  "$var$contrib"     "contributions of the variables"     
## 7  "$ind"             "results for the individuals"        
## 8  "$ind$coord"       "coord. for the individuals"         
## 9  "$ind$cos2"        "cos2 for the individuals"           
## 10 "$ind$contrib"     "contributions of the individuals"   
## 11 "$call"            "summary statistics"                 
## 12 "$call$centre"     "mean of the variables"              
## 13 "$call$ecart.type" "standard error of the variables"    
## 14 "$call$row.w"      "weights for the individuals"        
## 15 "$call$col.w"      "weights for the variables"

X : un marco de datos. Las filas son individuos y las columnas son variables numéricas. • ind.sup : un vector numérico que especifica los índices de los individuos suplementarios • quanti.sup, quali.sup : un vector numérico que especifica, respectivamente, los índices de las variables cuantitativas y cualitativas • gráfico: un valor lógico. Si es VERDADERO, se muestra un gráfico.

Por ejemplo:

res.pca <- PCA(decathlon2, ind.sup = 24:27,
               quanti.sup = 11:12, quali.sup = 13, graph=FALSE)

Variables cuantitativas

• Resultados previstos (coordenadas, correlación y cos2) para las variables cuantitativas complementarias:

 res.pca$quanti.sup
## $coord
##             Dim.1       Dim.2      Dim.3       Dim.4       Dim.5
## Rank   -0.7014777 -0.24519443 -0.1834294  0.05575186 -0.07382647
## Points  0.9637075  0.07768262  0.1580225 -0.16623092 -0.03114711
## 
## $cor
##             Dim.1       Dim.2      Dim.3       Dim.4       Dim.5
## Rank   -0.7014777 -0.24519443 -0.1834294  0.05575186 -0.07382647
## Points  0.9637075  0.07768262  0.1580225 -0.16623092 -0.03114711
## 
## $cos2
##            Dim.1       Dim.2      Dim.3      Dim.4        Dim.5
## Rank   0.4920710 0.060120310 0.03364635 0.00310827 0.0054503477
## Points 0.9287322 0.006034589 0.02497110 0.02763272 0.0009701427

Visualizar todas las variables (activas y complementarias):

fviz_pca_var(res.pca)

Más argumentos para personalizar la trama:

# Cambiar el color de las variables
fviz_pca_var(res.pca,
             col.var = "black",
             col.quanti.sup = "red" 
             )

# Ocultar variables activas en el gráfico, 
# Mostrar solo variables suplementarias
fviz_pca_var(res.pca, invisible = "var")

# Ocultar variables suplementarias
fviz_pca_var(res.pca, invisible = "quanti.sup")

# Gráfico de variables activas
p <- fviz_pca_var(res.pca, invisible = "quanti.sup")

individuos

• Resultados previstos para los individuos suplementarios (ind.sup):

res.pca$ind.sup
## $coord
##              Dim.1       Dim.2      Dim.3      Dim.4       Dim.5
## KARPOV   0.7947206  0.77951227 -1.6330203  1.7242283 -0.75070396
## WARNERS -0.3864645 -0.12159237 -1.7387332 -0.7063341 -0.03230011
## Nool    -0.5591306  1.97748871 -0.4830358 -2.2784526 -0.25461493
## Drews   -1.1092038  0.01741477 -3.0488182 -1.5343468 -0.32642192
## 
## $cos2
##              Dim.1        Dim.2      Dim.3      Dim.4        Dim.5
## KARPOV  0.05104677 4.911173e-02 0.21553730 0.24028620 0.0455487744
## WARNERS 0.02422707 2.398250e-03 0.49039677 0.08092862 0.0001692349
## Nool    0.02897149 3.623868e-01 0.02162236 0.48108780 0.0060077529
## Drews   0.09207094 2.269527e-05 0.69560547 0.17617609 0.0079736753
## 
## $dist
##   KARPOV  WARNERS     Nool    Drews 
## 3.517470 2.482899 3.284943 3.655527

Visualizar a todos los individuos (activos y suplementarios). En el gráfico, puede agregar también las variables cualitativas suplementarias (quali.sup), cuyas coordenadas son accesibles usando res.pca\(quali.supp\)coord.

p <- fviz_pca_ind(res.pca, col.ind.sup = "blue", repel = TRUE) 
p <- fviz_add(p, res.pca$quali.sup$coord, color = "red")
p

# Variables cualitativas

En el sector anterior, se mostró que se pueden agregar las variables cualitativas suplementarias en la gráfica de individuos usando fviz_add().

Hay que tener en cuenta que las variables cualitativas complementarias también se pueden usar para colorear individuos por grupos. Esto puede ayudar a interpretar los datos. Los conjuntos de datos decathlon2 contienen una variable cualitativa suplementaria en las columnas 13 correspondientes al tipo de competiciones.

Los resultados referentes a la variable cualitativa suplementaria son:

res.pca$quali
## $coord
##              Dim.1      Dim.2       Dim.3      Dim.4      Dim.5
## Decastar -1.343451  0.1218097 -0.03789524  0.1808357  0.1343364
## OlympicG  1.231497 -0.1116589  0.03473730 -0.1657661 -0.1231417
## 
## $cos2
##              Dim.1       Dim.2        Dim.3      Dim.4       Dim.5
## Decastar 0.9051233 0.007440939 0.0007201669 0.01639956 0.009050062
## OlympicG 0.9051233 0.007440939 0.0007201669 0.01639956 0.009050062
## 
## $v.test
##              Dim.1      Dim.2      Dim.3      Dim.4      Dim.5
## Decastar -2.970766  0.4034256 -0.1528767  0.8971036  0.7202457
## OlympicG  2.970766 -0.4034256  0.1528767 -0.8971036 -0.7202457
## 
## $dist
## Decastar OlympicG 
## 1.412108 1.294433 
## 
## $eta2
##                 Dim.1      Dim.2       Dim.3      Dim.4      Dim.5
## Competition 0.4011568 0.00739783 0.001062332 0.03658159 0.02357972

Para colorear individuos por una variable cualitativa suplementaria, el argumento habillage nos ayuda a especificar el índice de la variable cualitativa suplementaria. El nombre de este argumento proviene del paquete FactoMineR. Es una palabra de origen francés que significa “vestir” en español. Para mantener la consistencia entre FactoMineR y factoextra, decidimos mantener el mismo nombre de argumento

fviz_pca_ind(res.pca, habillage = 13,
             addEllipses =TRUE, ellipse.type = "confidence", 
             palette = "jco", repel = TRUE)

# Filtrado de resultados

Si tiene muchos individuos/variables, es posible visualizar solo algunos de ellos usando los argumentos select.ind y select.var.

# Visualizar variable con cos2 >= 0.6
fviz_pca_var(res.pca, select.var = list(cos2 = 0.6))

# Las 5 principales variables activas con el cos2 más alto
fviz_pca_var(res.pca, select.var= list(cos2 = 5))

# Seleccionar por nombres
name <- list(name = c("Long.jump", "High.jump", "X100m"))
fviz_pca_var(res.pca, select.var = name)

# 5 principales personas contribuyentes y variable
fviz_pca_biplot(res.pca, select.ind = list(contrib = 5), select.var = list(contrib = 5),
ggtheme = theme_minimal())

Cuando la selección se hace de acuerdo a los valores de contribución, los individuos/variables suplementarias no se muestran porque no contribuyen a la construcción de los ejes.

Conclusión

Como pudimos ver a lo largo del capítulo se pudo evidenciar cómo se realizaron e interpretaron las diferentes componentes principales, usando funciones como [FactoMineR]. Permiténdonos calcular el PCA de forma eficiente con ayuda del software Rstudio.