Chapter 3

Principal Component Analysis

3.1 Introduction

El Principal Component Analysis (PCA) es una técnica utilizada para resumir y visualizar información en conjuntos de datos con múltiples variables interrelacionadas. Permite reducir los datos a través de la creación de componentes principales que capturan la mayor variación en los datos. Con PCA, es posible representar gráficamente conjuntos de datos multivariados en dos o tres dimensiones, facilitando su interpretación, explicamos tambien cómo calcularlo y visualizarlo, y se muestra cómo identificar las variables más importantes que explican las variaciones en los datos.

3.2 Basics

Esta explicación nos limitaremos a los conceptos básicos y utilizaremos una representación gráfica simple de los datos. En la Gráfica A, los datos se representan en un sistema de coordenadas XY. La reducción de la dimensionalidad se logra identificando las direcciones principales, conocidas como componentes principales, en las que los datos varían.

PCA asume que las direcciones con las mayores variaciones son las más “importantes” o principales. En la figura, el eje PC1 representa la primera dirección principal a lo largo de la cual las muestras muestran la mayor variación. El eje PC2 es la segunda dirección más importante y es ortogonal al eje PC1.

La dimensionalidad de nuestros datos bidimensionales se puede reducir a una sola dimensión proyectando cada muestra en el primer componente principal (Gráfico B), Esto nos permite simplificar la representación de los datos sin perder una cantidad significativa de información.

3.3 Computation

Varias funciones de diferentes paquetes están disponibles en R para computación PCA:

  • prcomp() and princomp()

  • PCA() del paquete FactoMineR

  • dudi.pca() del paquete ade4

  • epPCA() del paquete ExPosition

Independientemente de la función que decida utilizar, puede extraer y visualizar fácilmente los resultados de PCA utilizando el paquete factoextra. Aquí, usaremos los dos paquetes FactoMineR (para el análisis) y factoextra (para la visualización basada en ggplot2).

3.3.1 R packages

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

3.3.2 Data format

Usaremos los conjuntos de datos decathlon2 del paquete factoextra :

Los datos utilizados aquí describen el desempeño de los atletas durante dos eventos deportivos (Dectar y OlympicG). Contiene 27 individuos (atletas) descritos por 13 variables.

data(decathlon2) 
head(decathlon2)
##           X100m Long.jump Shot.put High.jump X400m X110m.hurdle Discus
## SEBRLE    11.04      7.58    14.83      2.07 49.81        14.69  43.75
## CLAY      10.76      7.40    14.26      1.86 49.37        14.05  50.72
## BERNARD   11.02      7.23    14.25      1.92 48.93        14.99  40.87
## YURKOV    11.34      7.09    15.19      2.10 50.42        15.31  46.26
## ZSIVOCZKY 11.13      7.30    13.48      2.01 48.62        14.17  45.67
## McMULLEN  10.83      7.31    13.76      2.13 49.91        14.38  44.41
##           Pole.vault Javeline X1500m Rank Points Competition
## SEBRLE          5.02    63.19  291.7    1   8217    Decastar
## CLAY            4.92    60.15  301.5    2   8122    Decastar
## BERNARD         5.32    62.77  280.1    4   8067    Decastar
## YURKOV          4.72    63.44  276.4    5   8036    Decastar
## ZSIVOCZKY       4.42    55.37  268.0    7   8004    Decastar
## McMULLEN        4.42    56.37  285.1    8   7995    Decastar

  • Variables activas : Variables que se utilizan para el análisis de componentes principales.

  • Variables suplementarias: Como individuos suplementarios, también se predecirán las coordenadas de estas variables estas pueden ser:

    • Variables cuantitativas suplementarias (rojo)

    • Variables cualitativas complementarias (verde)

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

3.3.3 Data standardization

3.3.4 R code

Se puede utilizar la función PCA() de paquete FactoMineR .

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"
  • Decalthon2 es un marco de datos.

  • scale.unit es un valor lógico. Si es VERDADERO

  • ncp: número de dimensiones mantenidas en los resultados finales.

  • graph: un valor lógico. Si es VERDADERO, se muestra un gráfico.

calculamos el análisis de componentes principales en las variables/individuos

library ("FactoMineR") 
res.pca <- PCA(decathlon2.active, graph = FALSE)
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"

3.4 Visualization and Interpretation

Usaremos el paquete factoextra para ayudar en la interpretación de PCA, Independientemente de la función que se decida utilizar podemos extraer y visualizar fácilmente los resultados de PCA usando las funciones del paquete factoextra. Estas funciones son:

  • get_eigenvalue(res.pca): la cual extrae los valores propios/varianzas de los componentes principales

  • fviz_ eig( res. pea): visualizamos los valores propios

  • getpca_ind(res.pca), getpca_var(res.pca): extraemos los resultados para individuos y variables , respectivamente.

  • fviz_pca_ind(res.pca), fviz_pca_var(res.pca): Visualiza los resultados individuos y respectivamente.

  • fviz_pca_biplot(res.pca): Realiza un biplot de individuos y variables.

3.4.1 Eigenvalues / Variances

Como se describió anteriormente, 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. En otras palabras, las primeras PC corresponden a las direcciones con la máxima cantidad de variación en el conjunto de datos.

Para determinar el número de componentes principales a considerar, examinamos los valores propios y la proporción de varianza retenida por cada PC. La proporción de varianza indica cuánta información se conserva al considerar cada componente principal.

podemos visualizar esto con la funcion get_eigenvalue:

library ("factoextra") 
eig.val <- get_eigenvalue(res.pca) 
print(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, y podemos ver la variación explicada por cada valor propio en la segunda columna, así funcio; Por ejemplo, 4,124 dividido entre 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.

podemos ver los valores propios ordenados de mayor a menor con fviz_eig

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

3.4.2 Graph of variables

3.4.2.1 Results

extraemos los resultados de una salida PCA con la función get_pca_var()

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 la función get_pca_var() se pueden usar en la gráfica de variables:

  • var$coord: coordenadas de variables para crear un diagrama de dispersión

  • var$cos2: representa la calidad de representación de las variables en el mapa de factores, y se calcula como (var$coord)^2

  • var$contrib: contiene las contribuciones (en porcentaje) de las variables a los componentes principales, y es calculada con (var.cos2 * 100) / (cos2 total del componente).

# Coordinates 
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: quality on the factore map 
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
# Contributions to the principal components 
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

En esta sección describimos cómo visualizar variables y sacar conclusiones sobre sus correlaciones.

3.4.2.2 Correlation circle

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

# Coordinates of 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

visualizamos las variables con el siguiente codigo:

fviz_pca_var(res.pca, col.var ="black")

Este gráfico se conoce como gráficos de correlación de variables y muestra las relaciones entre todas las variables, para interpretarlo mejor tenemos lo siguiente:

  1. Las variables correlacionadas positivamente se agrupan.

  2. Las variables correlacionadas negativamente se colocan en los cuadrantes opuestos a los positivos

  3. La distancia entre las variables y el origen nos dice la calidad de las variables en el mapa de factores.

3.4.2.3 Quality of representation

La calidad de representación de las variables en el mapa de factores se llama cos2

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

Visualizamos 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 podemos crear un diagrama de barras de variables cos2 usando la función fviz_cos2()

# Total cos2 of variables on Dim.1 and Dim.2 
fviz_cos2(res.pca, choice = "var", axes = 1:2) 

Tenemos las siguientes afirmaciónes:

  1. Un cos2 alto indica una buena representación de la variable en el componente principal, o sea, está cerca de la circunferencia del círculo de correlación .
  2. Un cos2 bajo indica totalmente lo contrario a un cos2 alto, en el circulo de correlación lo encontramos cerca del centro del circulo.
  3. 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 se representa en el mapa de factores

Tambien podemos colorear las variables del circulo de correlación usando col.var = “cos2”.

fviz_pca_var(res.pca, col.var = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel =TRUE# Avoid text overLapping 
) 

3.4.2.4 Contributions of variables to PCs

Las contribuciones de las variables para explicar un componente principal determinado se expresan en porcentaje, estas variables están correlacionadas con PCl (Dim.1) y PC2 (Dim.2), cuanto mas grandeen porcentaje, mas contribuye la variables al componente.

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

Con la función corrplot resaltamos las variables que mas contribuyen.

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

La función fviz_contrib() se puede utilizar para dibujar un gráfico de barras de contribuciones variables.

# Contributions of variables to PC1 
fviz_contrib(res.pca, choice = "var", axes = 1, top = 10)

# Contributions of variables to PC2 
fviz_contrib(res.pca, choice = "var", axes = 2, top = 10)

El total de las dos contribuciones lo vizualizamos con el axes = 1:2 y la línea discontinua roja en el gráfico anterior indica la contribución promedio esperada.

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

Las variables más importantes (o contribuyentes) se pueden resaltar en el gráfico de correlación con el siguiente codigo:

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

3.4.2.5 Color by a custom continuous variable

# Create a random continuous variabLe of Length 10 
set.seed(123) 
my.cont.var <- rnorm(10) 

# CoLor variabLes by the continuous variabLe 
fviz_pca_var(res.pca, col.var = my.cont.var,gradient.cols = c( "blue", "yellow", "red") , legend.title = "Cont.Var")

3.4.2.6 Color by groups

También podemos cambiar el color de las variables por grupos definidos por una variable cualitativa/categórica, también llamada factor en la terminología.

# Create a grouping variable using kmeans 
# Create 3 groups of variables (centers = 3) set. seed(123) 
res.km <- kmeans(var$coord, centers = 3, nstart = 25)
grp <- as.factor(res.km$cluster) 

# Color variables by groups 
fviz_pca_var(res.pca, col.var = grp,palette = c("#0073C2FF", "#EFC000FF", "#868686FF"), legend.title = "Cluster")

3.4.3 Dimension description

res.desc <- dimdesc(res.pca, axes = c(1,2), proba = 0.05) 
# Description of dimension 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
# Description of dimension 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

3.4.4 Graph of individuals

3.4.4.1 Results

Podemos extraer los resultados con la función get_pca_ind() junto a la función get_pca_var() contienen una lista de matrices que contienen todos los resultados de los individuos (coordenadas, correlación entre variables y ejes, coseno al 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"
# Coordinates of individuaLs 
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
# QuaLity of individuaLs 
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
# Contributions of individuaLs 
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

3.4.4.2 Plots: quality and contribution

Usamos la función fviz_pca_ind() para producir el gráfico de individuos

fviz_pca_ind(res.pca)

Podemos colorearlo tambien, teniendo en cuenta que los individuos similares se agrupan en el grafico:

fviz_pca_ind(res.pca, col.ind = "cos2", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), 
repel =TRUE #Avoid text overLapping (sLow if many points) 
)

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

fviz_pca_ind(res.pca, pointsize = "cos2", pointshape = 21, fill = "#E7B800", 
repel =TRUE# Avoid text overLapping (sLow if many points) 
) 

y si le aplicamos color:

fviz_pca_ind(res.pca, col.ind = "cos2", pointsize = "cos2", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), 
repel = TRUE# Avoid text overlapping (slow if many points) 
)

Para crear un diagrama de barras de la calidad de representación (cos2) de los individuos en el mapa de factores, usamos la función fviz_cos2()

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

la contribución de las personas a los dos primeros componentes principales seria:

# Total contribution on PC1 and PC2
fviz_contrib(res.pca, choice = "ind", axes = 1:2)

3.4.4.3 Color by a custom continuous variable

En cuanto a las variables, los individuos lo podemos colorear por cualquier variable continua personalizada especificando el argumento col.ind

# Create a random continuous variable of length 23, 
# Same length as the number of active individuals in the PCA 
set.seed(123) 
my.cont.var <- rnorm(23) 

# Color variables by the continuous variable 
fviz_pca_ind(res.pca, col.ind = my.cont.var, gradient.cols = c( "blue", "yellow", "red") , legend.title = "Cont.Var")

3.4.4.4 Color by groups

Coloreamos los individuos por grupo. Además, mostramos cómo agregar elipses de concentración y elipses de confianza por grupos.

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 “Species” se utilizará como variable de agrupación. Comenzamos calculando el análisis de componentes principales

# The variabLe Species (index = 5) is removed 
# before PCA anaiysis 
iris.pca <- PCA(iris[,-5], graph = FALSE)

Agregamos una elipse de concentración alrededor de cada grupo, especifique el argumento addEllipses = TRUE.

fviz_pca_ind(iris.pca, 
             geom.ind = "point", # show points oniy (nbut not "text") 
             col.ind = iris$Species, # coior by groups 
             palette = c("#00AFBB", "#E7B800", "#FC4E07"), addEllipses = TRUE, # Concentration eLLipses 
             legend.title = "Groups"
)

#Add confidence ellipses 
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" 
)

3.4.5 Graph customization

fviz_pca_ind() y fviz_pca_var() y las funciones relacionadas se envuelven alrededor de la función principal fviz()

3.4.5.1 Dimensions

las variables/individuos se representan en las dimensiones 1 y 2, si las queremos visualizar en las dimensiones 2 y 3, por ejemplo, debe especificar el argumento ejes = c(2, 3).

#variables on dimensions 2 and 3
fviz_pca_var(res.pca, axes = c(2,3))

#Individuals on dimensions 2 and 3
fviz_pca_ind(res.pca, axes = c(2,3))

3.4.5.2 Plot elements: point, text, arrow

Utilizamos el argumento geom y derivados para especificar los elementos geométricos o los elementos gráficos que se utilizarán para el trazado.

geom.var: un texto que especifica la geometría que se utilizará para trazar variables.

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.

# Show individuals text labels only 
fviz_pca_ind(res.pca, geom.ind = "text")

3.4.5.3 Size and shape of plot elements

Personalizamos con:

  • labelsize: tamaño de fuente para las etiquetas de texto

  • pointize: el tamaño de los puntos

  • arrowsize: el tamaño de las flechas, y establece el grosor de las flechas

  • pointshape: la forma de los puntos

# Change the size of arrows an labels 
fviz_pca_var(res.pca, arrowsize = 1, labelsize = 5, repel = TRUE)

# Change points size, shape and fil l color # Change labelsize 
fviz_pca_ind(res.pca, 
             pointsize=3, pointshape = 21,fill = "lightblue", labbelsize = 5, repel = TRUE)

3.4.5.4 Ellipses

El argumento ellipse.level también está disponible para cambiar el tamaño de la elipse de concentración .

# Add confidence ellipses 
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" 
) 

# Convex hull 
fviz_pca_ind(iris.pca, geom.ind = "point",
             col.ind = iris$Species, # color by groups
             palette = c("#00AFBB", "#E7B800", "#FC4E07"), addEllipses = TRUE, ellipse.type = "convex", legend.title = "Groups" 
)

3.4.5.5 Group mean points

Los puntos medios de los grupos (baricentros) también los podemos eliminar los puntos medios, utilice el argumento mean.point = FALSE.

fviz_pca_ind(iris.pca,
             geom.ind = "point", # show points only (but not "text")
             group.ind = iris$Species, # color by groups 
legend.title = "Groups", 
mean.point = FALSE)

3.4.5.7 Graphical parameters

Para cambiar fácilmente el gráfico de cualquier ggplots usamos la función ggpar() , los parametros que podemos cambiar son:

  • Main titles: etiquetas en los ejes y títulos de leyenda

  • Legend position: “top”, “bottom”, “left”, “right”, “none”.

  • Color palette:

  • Themes: (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"
)

3.4.6 Biplot

Para hacer el biplot con individuos y variables usamos el siguiente codigo:

fviz_pca_biplot(res.pca, repel = TRUE,
                col.var = "#2E9FDF", # VariabLes coLor 
                col.ind = "#696969" # IndividuaLs coLor 
                )

  • un individuo que está del mismo lado de una variable dada tiene un valor alto

  • un individuo que está en el lado opuesto de una determinada variable tiene un valor bajo

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

fviz_pca_biplot(iris.pca,
                # FiLL individuaLs by groups 
geom.ind = "point", 
pointshape = 21, 
pointsize = 2.5, 
fill.ind = iris$Species, 
col.ind = "black", 
# CoLor variabLe by groups 
col.var = factor(c("sepal", "sepal", "petal", "petal")),
legend.title = list(fill = "Species", color = "Clusters"),
repel = TRUE)+  # Avoid LabeL overpLotting
ggpubr::fill_palette("jco")+ # IndiviuaL fiLL coLor
ggpubr::color_palette( "npg") # VariabLe coLors 

coloreamos los 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

fviz_pca_biplot(iris.pca,
                # Individuais
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")
)

3.5 Supplementary elements

3.5.1 Definition and types

3.5.2 Specification in PCA

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

  • decathlon2 : los datos

  • ind.sup : un vector numérico que especifica los índices del ind suplementario individuos

  • quanti.sup, quali.sup : un vector numérico que especifica, respectivamente, los índices de las variables cuantitativas y cualitativas

PCA(decathlon2, ind.sup = 24:27, 
    quanti.sup = 11:12, quali.sup = 13, graph = FALSE)
## **Results for the Principal Component Analysis (PCA)**
## The analysis was performed on 27 individuals, described by 13 variables
## *The results are available in the following objects:
## 
##    name               
## 1  "$eig"             
## 2  "$var"             
## 3  "$var$coord"       
## 4  "$var$cor"         
## 5  "$var$cos2"        
## 6  "$var$contrib"     
## 7  "$ind"             
## 8  "$ind$coord"       
## 9  "$ind$cos2"        
## 10 "$ind$contrib"     
## 11 "$ind.sup"         
## 12 "$ind.sup$coord"   
## 13 "$ind.sup$cos2"    
## 14 "$quanti.sup"      
## 15 "$quanti.sup$coord"
## 16 "$quanti.sup$cor"  
## 17 "$quali.sup"       
## 18 "$quali.sup$coord" 
## 19 "$quali.sup$v.test"
## 20 "$call"            
## 21 "$call$centre"     
## 22 "$call$ecart.type" 
## 23 "$call$row.w"      
## 24 "$call$col.w"      
##    description                                              
## 1  "eigenvalues"                                            
## 2  "results for the variables"                              
## 3  "coord. for the variables"                               
## 4  "correlations variables - dimensions"                    
## 5  "cos2 for the variables"                                 
## 6  "contributions of the variables"                         
## 7  "results for the individuals"                            
## 8  "coord. for the individuals"                             
## 9  "cos2 for the individuals"                               
## 10 "contributions of the individuals"                       
## 11 "results for the supplementary individuals"              
## 12 "coord. for the supplementary individuals"               
## 13 "cos2 for the supplementary individuals"                 
## 14 "results for the supplementary quantitative variables"   
## 15 "coord. for the supplementary quantitative variables"    
## 16 "correlations suppl. quantitative variables - dimensions"
## 17 "results for the supplementary categorical variables"    
## 18 "coord. for the supplementary categories"                
## 19 "v-test of the supplementary categories"                 
## 20 "summary statistics"                                     
## 21 "mean of the variables"                                  
## 22 "standard error of the variables"                        
## 23 "weights for the individuals"                            
## 24 "weights for the variables"

3.5.3 Quantitative variables

Resultados pronosticados (coordenadas, correlación y cos2) para las variables suplementarias cuatitativas

res.pca$quanti.sup
## NULL
fviz_pca_var(res.pca)

Al utilizar fviz_pca_var(), las variables complementarias cuantitativas se muestran automáticamente en el diagrama circular de correlación.

# Change color of variables 
fviz_pca_var(res.pca,
             col.var = "black", # Active variab Les 
col.quanti.sup = "red" # SuppL. quantitative variables 
)

# Hide active variables on the pLot, 
# show onLy suppLementary variables 
fviz_pca_var(res.pca, invisible = "var") 

# Hide suppLementary variables 
fviz_pca_var(res.pca, invisible = "quanti.sup")

# PLot of active variables 
p <- fviz_pca_var(res.pca, invisible = "quanti.sup")
p

3.5.4 individuals

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

  • Visualizar a todos los individuos (activos y suplementarios)

  • Las variables cualitativas suplementarias (quali.sup) cuyas coordenadas son visibles usando res.pca$quali.supp$coord.

res.pca$ind.sup
## NULL
p <- fviz_pca_ind(res.pca, col.ind.sup = "blue", repel = TRUE)
p

3. 6 Filtering results

Si tenemos muchos individuos/variables, es posible visualizar solo algunos de ellos usando la selección de argumentos.

  • select.ind, select.var: individuos/variable a graficar. Los valores permitidos son NULL o una lista que contiene los argumentos name, cos2 o contrib:
# VisuaLize variabLe with cos2 >= 0.6
fviz_pca_var(res.pca, select.var = list(cos2 = 0.6))

# Top 5 active variabLes with the highest cos2
fviz_pca_var(res.pca, select.var= list(cos2 = 5))

# SeLect by names 
name <- list(name = c("Long.jump", "High.jump", "X100m")) 
fviz_pca_var(res.pca, select.var = name) 

# top 5 contributing individuais and variabLe 
fviz_pca_biplot(res.pca, select.ind = list(contrib = 5),select.var = list(contrib = 5), ggtheme = theme_minimal()) 

3. 7 Exporting results

3. 7.1 Export plots to PDF /PNG files

# Print the pLot to a pdf fiLe 
pdf("myplot.pdf") 
dev.off ()
## png 
##   2
# Scree pLot 
scree.plot <- fviz_eig(res.pca) 


# PLot of individuais 
ind.plot <- fviz_pca_ind(res.pca) 


# PLot of variabLes 
var.plot <- fviz_pca_var(res.pca) 
pdf("PCA.pdf") # Create a new pdf device 
print(scree.plot) 
print(ind.plot) 
print(var.plot) 
dev.off() # CLose the pdf device 
## png 
##   2
# Print scree pLot to a png fiLe 
png("pca-scree-plot.png11" ) 
print(scree.plot) 
dev.off ()
## png 
##   2
# Print individuaLs pLot to a png fiLe 
png("pca-variables.png" ) 
print(var.plot) 
dev.off() 
## png 
##   2
# Print variabLes pLot to a png Ji Le 
png("pca-individuals.png") 
print(ind.plot) 
dev.off() 
## png 
##   2

3.7.2 Export results to txt/csv files

# Export into a TXT file 
write.infile(res.pca, "pca.txt", sep = "\t")
             
# Export into a CSV Ji Le 
write.infile (res.pca, "pca. csv", sep = ";") 

3.8 Summary

En conclusión, describimos cómo realizar e interpretar el análisis de componentes principales (PCA), Calculamos PCA usando la función PCA() [FactoMineR]. Luego, usamos el paquete factoextra para producir una visualización basada en ggplot2 de los resultados de PCA.

Hay otras funciones del paquete FactoMineR para calcular PCA en R:
1) Using prcomp(

res.pea <- prcomp(iris[, -5], scale. = TRUE)
  1. Using princomp(
res.pea <- princomp(iris[, -5], cor = TRUE)
  1. Using dudi.pca(
library("ade4") 
## 
## Attaching package: 'ade4'
## The following object is masked from 'package:FactoMineR':
## 
##     reconst
res.pea <- dudi.pca(iris[, -5], scannf = FALSE, nf = 5)
  1. Using epPCA(
library("ExPosition") 
## Loading required package: prettyGraphs
res.pea <- epPCA(iris[, -5], graph = FALSE)