2012-10-06 20 views
23

Quiero saber en qué medida una medida/parámetro contribuye a uno de los componentes principales calculados.Análisis de componentes principales: cómo obtener la contribución (%) de cada parámetro en un Prin.Comp.?

Una descripción del mundo real:

  1. Tengo cinco parámetros climáticos de la distribución geográfica de una especie
  2. He realizado un PCA con estos cinco parámetros
  3. la trama de la 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 se compone de 30% de parameter1, a 50% de parameter2, a 20% de parameter3, 0% de parameter4 y 0% de parameter5. PC2 se compone ...

Un ejemplo ficticias con 5 parámetros:

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 se oculta la información de mi?

+1

Probablemente debería prestar atención a la nota en '? Princomp' que indica el algoritmo preferido para PCA (a través de SVD), como lo proporciona la función' prcomp() '. –

Respuesta

36

desea que 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 print() que suprime la impresión de pequeñas cargas.

Si desea esto como una contribución relativa, sume las cargas por columna y exprese cada carga como una proporción de la columna (carga) suma, teniendo cuidado de usar 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 último paso produce entonces la contribución proporcional a la 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 se utiliza el prcomp() preferido entonces las cargas pertinentes 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 
+0

¡Exactamente lo que estaba buscando! Muchas gracias (de hecho, ¡me dejó decir un estadounidense "increíble"!). – Chrugel

Cuestiones relacionadas