如何根据动态解释的变化比例选择主成分

时间:2017-01-16 05:30:18

标签: r pca

假设我有以下PC数据框

pcdf
   PrinComp Standard deviation Proportion of Variance Cumulative Proportion
1       PC1         2.09181795                0.27348               0.27348
2       PC2         1.45030065                0.13146               0.40494
3       PC3         1.19493344                0.08924               0.49418
4       PC4         1.02857740                0.06612               0.56031
5       PC5         1.00286501                0.06286               0.62317
6       PC6         0.98925935                0.06116               0.68433
7       PC7         0.95393902                0.05687               0.74121
8       PC8         0.93883040                0.05509               0.79629
9       PC9         0.89496910                0.05006               0.84635
10     PC10         0.80537287                0.04054               0.88689
11     PC11         0.71167409                0.03166               0.91855
12     PC12         0.69485069                0.03018               0.94872
13     PC13         0.64756330                0.02621               0.97493
14     PC14         0.49804019                0.01550               0.99044
15     PC15         0.38854373                0.00944               0.99987
16     PC16         0.04552681                0.00013               1.00000

现在我想根据标准选择PC: I should have atleast have 5 PCs and Cumulative Proportion should be >0.75(应该动态完成阈值的削减)

我的意思是,无论何时我在任何数据集上运行PCA并获得PC,我都可以将更少的PC子集,这些PC的变化比例不低于75%,但也要注意不要个人电脑不低于5 ....

想帮助解决这个棘手的问题......

1 个答案:

答案 0 :(得分:0)

要动态执行此操作,我首先考虑使用lag包中的dplyr函数。

pcdf.I <- pcdf %>%
          mutate(lag.cp  = lag(`Cumulative Proportion`, 1)) %>%
          mutate(I.75    = ifelse(`Cumulative Proportion` >=.75 & lag.cp <= .75, 1, 0)

if(min(which(pcdf.I[I.75 == 1])) < 5){

     pcdf.I <- pcdf.I[1:5,]

} else {

     pcdf.I[1:(which(pcdf.I[1:pcdf.i$I.75 == 1)), ]

}

这组步骤首先创建了一种方法,通过先Cumulative Proportion ~ .75 lag之间确定两个行索引之间的Cumulative Proportion,然后创建一个确定哪个点的指标.75在Cumulative Proportionlag.cp之间。因为它们是平等的(Cumulative Proportion等同于>=lag.cp等同为<=),所以如果Cumulative proportion = .75,它可能是双重计算。我们在if声明中解决了这个问题。最终结果是基于pcdf的5行表或&#34; n&#34;基于pcdf.i ~ .75时间的行。