主成分分析 - 如何获得每个参数对Prin.Comp的贡献(%)。

时间:2012-10-06 13:14:15

标签: r statistics princomp

我想知道测量/参数对计算出的主成分之一的贡献程度。

真实世界的描述:

  1. 我有一个物种地理分布的五个气候参数
  2. 我使用这五个参数执行了PCA
  3. PC1与PC2的关系图显示了一个有趣的模式
  4. 问题:如何获得每个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 个答案:

答案 0 :(得分:47)

您需要返回对象的$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