假设我有以下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 ....
想帮助解决这个棘手的问题......
答案 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 Proportion
和lag.cp
之间。因为它们是平等的(Cumulative Proportion
等同于>=
而lag.cp
等同为<=
),所以如果Cumulative proportion = .75
,它可能是双重计算。我们在if
声明中解决了这个问题。最终结果是基于pcdf
的5行表或&#34; n&#34;基于pcdf.i ~ .75
时间的行。