我尝试使用R对我的数据进行PCA分析,然后使用prcomp
和ggbiplot
找到this nice guide。我的数据是两种样品类型,每种样品具有三个生物重复(即6行)和约20000个基因(即变量)。首先,使用指南中描述的代码获取PCA模型并不起作用:
>pca=prcomp(data,center=T,scale.=T)
Error in prcomp.default(data, center = T, scale. = T) :
cannot rescale a constant/zero column to unit variance
但是,如果我删除scale. = T
部分,它可以正常工作,我会得到一个模型。为什么会这样,这是否是下面错误的原因?
> summary(pca)
Importance of components:
PC1 PC2 PC3 PC4 PC5
Standard deviation 4662.8657 3570.7164 2717.8351 1419.3137 819.15844
Proportion of Variance 0.4879 0.2861 0.1658 0.0452 0.01506
Cumulative Proportion 0.4879 0.7740 0.9397 0.9849 1.00000
其次,绘制PCA。即使只使用基本代码,我也会得到一个错误和一个空图:
> ggbiplot(pca)
Error: invalid 'rot' value
这是什么意思,我该如何解决?是否与制作PCA的(非)规模有关,还是有所不同?我认为它必须与我的数据有关,因为如果我使用标准示例代码(下面),我会得到一个非常好的PCA图。
> data(wine)
> wine.pca=prcomp(wine,scale.=T)
> print(ggbiplot(wine.pca, obs.scale = 1, var.scale = 1, groups = wine.class,
ellipse = TRUE, circle = TRUE))
[编辑1]我尝试以两种方式对数据进行子集化:1)删除所有行,所有行都为0,以及2)删除所有列,任何行都为0.第一个子集仍然给我{{1错误,但没有删除任何0的列的那些错误。为什么是这样?这对我的PCA有何影响?
另外,我尝试对原始数据(非缩放)和上面的子集化数据使用普通scale
命令,并且它在两种情况下都有效。那么它与biplot
有什么关系?
[编辑2]我已经上传了我的数据子集,当我没有删除所有零并在我这样做时,我会发现错误。我之前没有使用过gist,但我认为this就是这样。或this ......
答案 0 :(得分:7)
转置数据后,我能够复制您的错误。第一个错误是主要问题。 PCA寻求最大化每个组件的方差,因此重要的是它不仅仅关注可能具有非常高的方差的一个变量。第一个错误:
Error in prcomp.default(tdf, center = T, scale. = T) :
cannot rescale a constant/zero column to unit variance
这告诉你,你的一些变量的方差为零(即无可变性)。看看PCA如何通过最大化方差来对事物进行分组,保留这些变量毫无意义。可以通过以下调用轻松删除它们:
df_f <- data[,apply(data, 2, var, na.rm=TRUE) != 0]
执行此过滤后,其余调用将正常运行
pca=prcomp(df_f,center=T,scale.=T)
ggbiplot(pca)