【问题标题】:How to use princomp () function in R when covariance matrix has zero's?当协方差矩阵为零时如何在R中使用prcomp()函数?
【发布时间】:2012-01-23 15:21:06
【问题描述】:

在 R 中使用 princomp() 函数时,遇到以下错误:"covariance matrix is not non-negative definite"

我认为,这是由于协方差矩阵中的某些值为零(实际上接近零,但在舍入期间变为零)。

当协方差矩阵包含零时,是否可以继续使用 PCA?

[仅供参考:获取协方差矩阵是princomp() 调用中的一个中间步骤。可以从这里下载重现此错误的数据文件 - http://tinyurl.com/6rtxrc3]

【问题讨论】:

  • 添加示例输入以使问题可重现对回答者很有用。
  • 如果您查看stats:::princomp.default,您会发现当协方差矩阵中有负特征值时会发生错误。
  • @Richie Cotton:我希望我能提供。我的数据很大(10K x 10K),我还没有弄清楚导致错误的部分。我很高兴知道是否有一种方法可以提取令人不安的部分数据并将其发布在这里!
  • cv <- matrix(c(1, 2, 2, 1), nrow = 2); princomp(covmat = cv) 重现错误。不知道它与您的数据集有多相关。
  • 谢谢!我可以从原始矩阵的一小部分复制它,1K x 1K(文件大小 5.5 MB)。我想知道如何发布它。我确信协方差矩阵的某些元素将为零(或接近零),因为我的输入数据具有大量相同的值。

标签: r statistics pca eigenvector princomp


【解决方案1】:

第一个策略可能是减少容差参数。在我看来,princomp 不会传递公差参数,但 prcomp 确实接受“tol”参数。如果无效,这应该识别出协方差接近于零的向量:

nr0=0.001
which(abs(cov(M)) < nr0, arr.ind=TRUE)

这将识别具有负特征值的向量:

which(eigen(M)$values < 0)

使用 help(qr) 页面上的 h9 示例:

> which(abs(cov(h9)) < .001, arr.ind=TRUE)
      row col
 [1,]   9   4
 [2,]   8   5
 [3,]   9   5
 [4,]   7   6
 [5,]   8   6
 [6,]   9   6
 [7,]   6   7
 [8,]   7   7
 [9,]   8   7
[10,]   9   7
[11,]   5   8
[12,]   6   8
[13,]   7   8
[14,]   8   8
[15,]   9   8
[16,]   4   9
[17,]   5   9
[18,]   6   9
[19,]   7   9
[20,]   8   9
[21,]   9   9
> qr(h9[-9,-9])$rank  
[1] 7                  # rank deficient, at least at the default tolerance
> qr(h9[-(8:9),-(8:9)])$ take out only the vector  with the most dependencies
[1] 6                   #Still rank deficient
> qr(h9[-(7:9),-(7:9)])$rank
[1] 6

另一种方法可能是使用alias 函数:

alias( lm( rnorm(NROW(dfrm)) ~ dfrm) )

【讨论】:

  • 不错。我之前没有遇到过alias
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 2013-02-01
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多