2012-10-06 25 views
23

我想知道測量/參數對計算出的主要分量之一有何貢獻。主成分分析 - 如何獲得每個參數對Prin.Comp的貢獻(%)?

一個真實世界的描述:

  1. 我已經有五個氣候參數一個物種
  2. 我進行了PCA與這五個參數
  3. 的PC1的情節VS的地理分佈PC2顯示一個有趣的模式

問題:如何獲得每個PC的貢獻百分比(每個參數)?我期望:PC1由參數1的30%到參數2的50%到參數3的20%,參數4的0%和參數5的0%組成。 PC2由...

5僞參數的一個例子:

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) 

哪裏是隱藏我的信息?

+1

您應該注意'princomp'中的註釋,該註釋指出了由'prcomp()'函數提供的PCA(通過SVD)的首選算法。 –

回答

36

您希望返回對象的$loadings組件:

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 

注意,這有一個特殊的print()方法,抑制小負荷的打印

如果您希望將此作爲相對貢獻,請總結每列的裝載量,並將每個裝載量表示爲列(裝載)總和的比例,並注意使用絕對值來計算負值裝載量。

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 

然後,這個最後步驟產生的每個主成分

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 

比例貢獻如果使用優選prcomp()那麼相關載荷處於$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 

現在有關的咒語是:

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

正是我在找什麼!非常感謝(實際上讓我說美國「真棒」!)。 – Chrugel