【问题标题】:prcomp and ggbiplot: invalid 'rot' valueprcomp 和 ggbiplot:无效的“腐烂”值
【发布时间】:2015-01-16 22:59:25
【问题描述】:

我正在尝试使用 R 对我的数据进行 PCA 分析,我发现 this nice guide,使用 prcompggbiplot。我的数据是两个样本类型,每个样本类型有三个生物学重复(即 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 的所有列。第一个子集仍然给我scale错误,但不是那些删除了任何 0 的列的错误。为什么是这样?这对我的 PCA 有何影响?

另外,我尝试对上面的原始数据(未缩放)和子集数据使用普通的biplot 命令,并且在这两种情况下都有效。所以这和ggbiplot有关?

[编辑 2] 我上传了我的数据子集,当我不删除所有零时,它给了我错误,而当我这样做时,它会工作。我以前没有使用过 gist,但我认为this 是它。或this...

【问题讨论】:

  • 您有什么方法可以在gist 上为您提供数据集的dput 等数据吗?或者如果它很大,一个仍然产生错误的子集?很难尝试诊断我们无法重现的问题。
  • 我现在添加了一些数据,感谢任何帮助!
  • 您在 gist 上提供的数据不会重现该错误。我下载了文件,prcompggbiplot 运行没有错误。
  • 我现在意识到我上传的数据没有被转置(因为我在我的脚本中这样做了),而且我也可以按原样在这些数据上运行prcomp。我感兴趣的是具有 10k 个变量(或者我子集的许多变量)和 20 种左右不同样本类型的 PCA。转置数据集的prcomp 是否适合您?

标签: r bioinformatics pca ggbiplot


【解决方案1】:

转置您的数据后,我能够复制您的错误。第一个错误是主要问题。 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)

【讨论】:

  • 好的,太好了!不过,我不完全理解您的代码...您删除了没有差异的列 (var)?如果有一个零,这与删除所有列有什么不同? (我明白显然有区别,但不完全是如何)。我删除零的代码如下所示:nonzero = data[ , apply(data, 2, function(x) all(x &gt; 0))]
  • 不同之处在于,我要删除 variance 为 0 的列,而不是那些包含 0 的列。零可能很重要,但没有方差的变量在 PCA 中没有价值。
猜你喜欢
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
相关资源
最近更新 更多