###R paquetes

Se instalaron los dos paquetes (FavtoMineR y factoextra) Los cuales son necesarios para poder hacer los ejercicios del capitulo 3 del ligro guía

library(FactoMineR) 
library(factoextra)
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa

Usaré los conjuntos de datos de demostración decathlon2 del paquete factoextra:

data(decathlon2)

Comenzamos subdividiendo 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

En el análisis de componentes principales, las variables a menudo se escalan (es decir, se estandarizan). Esto es especialmente recomendable 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.

El objetivo es hacer que las variables sean comparables. En general, las variables se escalan para tener i) desviación estándar uno y ii) media cero. La estandarización de datos es un enfoque ampliamente utilizado en el contexto del análisis de datos de expresión génica antes del PCA y el análisis de agrupamiento. También podríamos querer escalar los datos cuando la media y/o la desviación estándar de las variables son muy diferentes.

Se puede utilizar la función PCA() [paquete FactoMineR]. Un formato simplificado es:

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"

El siguiente código R calcula el análisis de componentes principales en los individuos/variables activos:

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"

El objeto que se crea usando la función PCA() contiene mucha información que se encuentra en muchas listas y matrices diferentes. Estos valores se describen en la siguiente sección.

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.

Examinamos los valores propios para determinar el número de componentes principales a considerar. Los valores propios y la proporción de varianzas (es decir, información) retenida por los componentes principales (PC) se pueden extraer utilizando la función get_eigenvalue() [paquete factoextra].

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

La suma de todos los valores propios da una varianza total de 10.La proporción de variación explicada por cada valor propio se da en la segunda columna. 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.

El porcentaje acumulado explicado se obtiene sumando 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, alrededor del 59,627% de la variación se explica por los dos primeros valores propios juntos.

En nuestro análisis, los primeros tres componentes principales explican el 72% de la variación. Este es un porcentaje aceptablemente alto.

Un método alternativo para determinar el número de componentes principales es observar un Scree Plot, que es el 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))

Un método simple para extraer los resultados, para variables, de una salida PCA es usar la función get_pca_var() [paquete factoextra]. Esta función proporciona una lista de 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

La correlación entre una variable y un componente principal (PC) se utiliza como las coordenadas de la variable en el PC. La representación de las variables difiere de la gráfica de las observaciones: las observaciones están representadas por sus proyecciones, pero las variables están representadas 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 también se conoce como gráficos de correlación de variables. Muestra las relaciones entre todas las 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 calidad de representación de las variables en el mapa de factores se llama cos2 (coseno cuadrado, coordenadas cuadradas). Puede acceder a cos2 de la siguiente manera:

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") 
## 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()[de factoextra]:

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

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, se pueden requerir más de 2 componentes para representar perfectamente los datos. En este caso las variables se posicionan dentro del círculo de correlaciones. En resumen:

• 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á interpretar estos 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 argumento col.var = “cos2”. Esto produce un degradado de colores. En este caso, el argumento gradiente.cols se puede utilizar para proporcionar un color personalizado. Por ejemplo, gradiente.cols = c (“blanco”, “azul”, “rojo”) 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

# 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 # Evite la superposición de texto
             )

También es posible cambiar la transparencia de las variables según sus valores de cos2 usando la opción alpha.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 que están 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. • Las variables que no se correlacionan con ningún PC o se correlacionan con las últimas dimensiones son variables de baja contribución y podrían eliminarse para simplificar el análisis general. La contribución de las variables se puede extraer de la siguiente manera:

 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

Es posible usar 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 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)

# Aportes de variables a PC2
fviz_contrib(res.pca, choice = "var", axes = 2, 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. 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. Nótese que, la 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. Recuerde que los 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:

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")

En las secciones anteriores, mostramos cómo colorear variables por sus contribuciones y su cos2. Tenga en cuenta que es posible colorear las variables por cualquier variable continua personalizada. 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")

También es posible cambiar el color de las variables por grupos definidos por una variable cualitativa/categórica, también llamada factor en la terminología R. Como no tenemos ninguna variable de agrupación en nuestros conjuntos de datos para clasificar variables, la crearemos.

En el siguiente ejemplo de demostración, comenzamos clasificando las variables en 3 grupos usando el algoritmo de agrupamiento de kmeans. A continuación, usamos los grupos devueltos por el algoritmo kmeans para colorear variables.

# 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")

En la sección 3.4.2.4, describimos cómo resaltar las variables según sus contribuciones a los componentes principales.

Tenga en cuenta también que la función dimdesc() [en FactoMineR], para la descripción de la dimensión, se puede utilizar para identificar las variables asociadas más significativas con un componente principal dado. 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
## $quanti
##              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
## 
## attr(,"class")
## [1] "condes" "list"
# Descripción de la dimensión 2
res.desc$Dim.2
## $quanti
##            correlation      p.value
## Pole.vault   0.8074511 3.205016e-06
## X1500m       0.7844802 9.384747e-06
## High.jump   -0.4652142 2.529390e-02
## 
## attr(,"class")
## [1] "condes" "list"

In the output above, $quanti means results for quantitative variables. Note that, variables are sorted by the p-value of the correlation.

Los resultados, para individuos, se pueden extraer usando la función get_pca_ind() [paquete factoextra]. De manera similar a get_pca_var(), la función get_pca_ind() proporciona una lista de matrices que contienen todos 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)

Al igual que las variables, también es posible colorear a los individuos por sus valores de cos2:

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 visualizar la contribución de las personas a los dos primeros componentes principales, escriba 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. Por 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")

Aquí, describimos cómo colorear individuos por grupo. Además, mostramos cómo agregar elipses de concentración y elipses de confianza por grupos. Para esto, usaremos 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 siguiente código R: el argumento habillage o col.ind puede usarse para especificar la variable factor para colorear los individuos por grupos.

Para 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

Tenga 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 un 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(). Aquí, presentamos algunos de estos argumentos adicionales para personalizar el gráfico PCA de variables e individuos.

#Dimensiones

Por defecto, 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 la trama: punto, texto, flecha

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

  1. 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"))

  1. 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

Como describimos en la sección anterior 3.4.4.4, al colorear individuos por grupos, puede agregar elipses de concentración de puntos usando el argumento addEllipses = TRUE. Tenga 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)

#Líneas de eje

El argumento axes.linetype se puede usar para especificar el tipo de línea de los ejes. El valor predeterminado 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")

#Parámetros gráficos

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

Los parámetros gráficos 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")

En el siguiente ejemplo, queremos 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 establece en “negro” usando col.ind. Para colorear variables por grupos se utilizará 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 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 describió 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 la sección anterior, mostramos que puede agregar las variables cualitativas suplementarias en la gráfica de individuos usando fviz_add().

Tenga 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 se usa para especificar el índice de la variable cualitativa suplementaria. Históricamente, este nombre de argumento proviene del paquete FactoMineR. Es una palabra francesa que significa “vestir” en inglés. 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.