results - prcomp r tutorial
Análisis de componentes principales: cómo obtener la contribución(%) de cada parámetro en un Prin.Comp.? (1)
Quiero saber en qué medida una medida / parámetro contribuye a uno de los componentes principales calculados.
Una descripción del mundo real:
- Tengo cinco parámetros climáticos para la distribución geográfica de una especie
- realicé una PCA con estos cinco parámetros
- la trama de PC1 vs. PC2 muestra un patrón interesante
Pregunta: ¿Cómo obtengo el porcentaje de contribución (de cada parámetro) a cada PC?
Lo que espero: PC1 está compuesto por 30% de parameter1, 50% de parameter2, 20% de parameter3, 0% de parameter4 y 0% de parameter5. PC2 está compuesto ...
Un ejemplo con 5 parámetros ficticios:
a <- rnorm(10, 50, 20)
b <- seq(10, 100, 10)
c <- seq(88, 10, -8)
d <- rep(seq(3, 16, 3), 2)
e <- rnorm(10, 61, 27)
my_table <- data.frame(a, b, c, d, e)
pca <- princomp(my_table, cor=T)
biplot(pca) # same: plot(pca$scores[,1], pca$scores[,2])
pca
summary(pca)
¿Dónde está escondida mi información?
Desea el componente $loadings
del objeto devuelto:
R> class(pca$loadings)
[1] "loadings"
R> pca$loadings
Loadings:
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
a -0.198 0.713 -0.671
b 0.600 0.334 -0.170 0.707
c -0.600 -0.334 0.170 0.707
d 0.439 -0.880 -0.180
e 0.221 0.701 0.678
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
SS loadings 1.0 1.0 1.0 1.0 1.0
Proportion Var 0.2 0.2 0.2 0.2 0.2
Cumulative Var 0.2 0.4 0.6 0.8 1.0
Tenga en cuenta que esto tiene un método especial de print()
que suprime la impresión de pequeñas cargas.
Si desea esto como una contribución relativa, luego sumar las cargas por columna y expresar cada carga como una proporción de la columna (carga) suma, teniendo cuidado de utilizar los valores absolutos para tener en cuenta las cargas negativas.
R> load <- with(pca, unclass(loadings))
R> load
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
a -0.1980087 0.712680378 0.04606100 -0.6713848 0.000000e+00
b 0.5997346 -0.014945831 0.33353047 -0.1698602 7.071068e-01
c -0.5997346 0.014945831 -0.33353047 0.1698602 7.071068e-01
d 0.4389388 0.009625746 -0.88032515 -0.1796321 5.273559e-16
e 0.2208215 0.701104321 -0.02051507 0.6776944 -1.110223e-16
Este paso final produce la contribución proporcional a cada componente principal
R> aload <- abs(load) ## save absolute values
R> sweep(aload, 2, colSums(aload), "/")
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
a 0.09624979 0.490386943 0.02853908 0.35933068 0.000000e+00
b 0.29152414 0.010284050 0.20665322 0.09091055 5.000000e-01
c 0.29152414 0.010284050 0.20665322 0.09091055 5.000000e-01
d 0.21336314 0.006623362 0.54544349 0.09614059 3.728970e-16
e 0.10733880 0.482421595 0.01271100 0.36270762 7.850462e-17
R> colSums(sweep(aload, 2, colSums(aload), "/"))
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
1 1 1 1 1
Si usa el prcomp()
preferido prcomp()
entonces las cargas relevantes están en el componente $rotation
:
R> pca2 <- prcomp(my_table, scale = TRUE)
R> pca2$rotation
PC1 PC2 PC3 PC4 PC5
a -0.1980087 0.712680378 -0.04606100 -0.6713848 0.000000e+00
b 0.5997346 -0.014945831 -0.33353047 -0.1698602 -7.071068e-01
c -0.5997346 0.014945831 0.33353047 0.1698602 -7.071068e-01
d 0.4389388 0.009625746 0.88032515 -0.1796321 -3.386180e-15
e 0.2208215 0.701104321 0.02051507 0.6776944 5.551115e-17
Y el conjuro relevante es ahora:
R> aload <- abs(pca2$rotation)
R> sweep(aload, 2, colSums(aload), "/")
PC1 PC2 PC3 PC4 PC5
a 0.09624979 0.490386943 0.02853908 0.35933068 0.000000e+00
b 0.29152414 0.010284050 0.20665322 0.09091055 5.000000e-01
c 0.29152414 0.010284050 0.20665322 0.09091055 5.000000e-01
d 0.21336314 0.006623362 0.54544349 0.09614059 2.394391e-15
e 0.10733880 0.482421595 0.01271100 0.36270762 3.925231e-17