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

Posted

技术标签:

【中文标题】主成分分析 - 如何获得每个参数对 Prin.Comp. 的贡献 (%)?【英文标题】:Principal Components Analysis - how to get the contribution (%) of each parameter to a Prin.Comp.? 【发布时间】:2012-09-27 10:15:59 【问题描述】:

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

真实世界的描述:

    我为一个物种的地理分布提供了五个气候参数 我使用这五个参数执行了 PCA PC1 与 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)

我的信息隐藏在哪里?

【问题讨论】:

您可能应该注意?princomp 中的注释,该注释指示PCA 的首选算法(通过SVD),由prcomp() 函数提供。 【参考方案1】:

你想要返回对象的$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

【讨论】:

正是我想要的!非常感谢(它实际上让我说一个美国人的“真棒”!)。 现在贡献是在主成分级别创建的。但是,我们如何为每个观察创建一个贡献图。这样,对于每一行,应该能够得出哪一列即a,b,c,e实际上负责对于 PC1 数据点。应相应地进行排名。请指导我。 @克鲁格尔,

以上是关于主成分分析 - 如何获得每个参数对 Prin.Comp. 的贡献 (%)?的主要内容,如果未能解决你的问题,请参考以下文章

pca(主成分分析)

R语言使用psych包的principal函数对指定数据集进行主成分分析PCA进行数据降维(输入数据为原始数据)计算每个样本(观察)的主成分的分数计算得分与特定变量的相关性并解读结果

R语言使用psych包的principal函数对指定数据集进行主成分分析PCA进行数据降维(输入数据为相关性矩阵)计算主成分评分系数每个样本(观察)的主成分得分由主成分分数系数构建的公式得到

主成分分析(PCA)

9主成分分析

机器学习——09主成分分析