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.
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.
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).
#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
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
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"
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.
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))
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.
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:
Las variables correlacionadas positivamente se agrupan.
Las variables correlacionadas negativamente se colocan en los cuadrantes opuestos a los positivos
La distancia entre las variables y el origen nos dice la calidad de las variables en el mapa de factores.
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:
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
)
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"))
# 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")
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")
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
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
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)
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")
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"
)
fviz_pca_ind() y fviz_pca_var() y las funciones relacionadas se envuelven alrededor de la función principal fviz()
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))
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")
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)
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"
)
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)
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"
)
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")
)
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"
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
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
Si tenemos muchos individuos/variables, es posible visualizar solo algunos de ellos usando la selección de argumentos.
# 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())
# 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
# 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 = ";")
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)
res.pea <- princomp(iris[, -5], cor = TRUE)
library("ade4")
##
## Attaching package: 'ade4'
## The following object is masked from 'package:FactoMineR':
##
## reconst
res.pea <- dudi.pca(iris[, -5], scannf = FALSE, nf = 5)
library("ExPosition")
## Loading required package: prettyGraphs
res.pea <- epPCA(iris[, -5], graph = FALSE)