【问题标题】:PCA analysis using Correlation Matrix as input in R使用相关矩阵作为 R 中的输入进行 PCA 分析
【发布时间】:2014-02-17 14:56:04
【问题描述】:

现在我有一个 7000*7000 的相关矩阵,我必须在 R 中对此进行 PCA。 我用了

CorPCA <- princomp(covmat=xCor)

, xCor 是相关矩阵 但它出来了

“协方差矩阵不是非负定的”

这是因为我在那个矩阵中有一些负相关。 我想知道我可以使用 R 中的哪个内置函数来获得 PCA 的结果

【问题讨论】:

  • 对相关矩阵进行 PCA 似乎是一个奇怪的想法。我认为你不应该这样做。
  • stats.stackexchange.com 上是关于这个问题的一些讨论。
  • 您可以使用使用 SVD 的 prcomp(),而不是使用协方差矩阵的特征值的 princomp()

标签: r pca


【解决方案1】:

执行 PCA 的一种方法是执行协方差矩阵的特征值分解,请参阅wikipedia

特征值分解的优点是您可以看到哪些方向(特征向量)是显着的,即具有由相关特征值表示的显着变化。此外,您可以通过负特征值检测协方差矩阵是否为正定(所有特征值都大于零),而不是负定(没关系),如果特征值等于 0 或者它是不定的(这是不好的)。有时,由于数值不准确,非负定矩阵也会变成负定矩阵。在这种情况下,您会观察到几乎为零的负特征值。在这种情况下,您可以将这些特征值设置为零以保留协方差矩阵的非负确定性。此外,您仍然可以解释结果:贡献重要信息的特征向量与最大的特征值相关联。如果排序后的特征值列表快速下降,则有很多方向没有显着贡献,因此可以删除。

内置的R函数是eigen

如果你的协方差矩阵是A 那么

eigen_res <- eigen(A)
# sorted list of eigenvalues
eigen_res$values
# slightly negative eigenvalues, set them to small positive value
eigen_res$values[eigen_res$values<0] <- 1e-10
# and produce regularized covariance matrix
Areg <- eigen_res$vectors %*% diag(eigen_res$values) %*% t(eigen_res$vectors)

【讨论】:

  • 感谢您的回答!我认为这是一种绝对需要尝试的方式。首先,我应该检查特征值以查看值的样子:)
  • 好吧,我发现我的特征值中有很多复数..所以我也需要将它们更改为零?
  • 如果你的协方差矩阵是对称的(它应该是对称的!)从数学的角度来看,你应该只得到真正的特征值。您可以通过例如检查对称性最大值(A-t(A))。但是,如果它应该有机会成为有效的协方差矩阵,那么复数的虚部应该很小(我猜,不是 100% 肯定)。
  • 是的,我检查了矩阵是对称的。而且复数非常小..你是对的:)可能是因为矩阵的规模很大..
  • 补充一点小提示:如果知道矩阵是对称的,可以在对eigen的调用中设置symmetric=TRUE,加快计算速度,去除复数。
【解决方案2】:

not non-negative definite 并不意味着协方差矩阵具有负相关。这是一个线性代数,相当于试图取负数的平方根!您无法通过查看矩阵的一些值来判断它是否是正定的。

尝试在princomp 调用中调整一些默认值,例如容差。检查此线程,例如:How to use princomp () function in R when covariance matrix has zero's?

另一种方法是编写一些您自己的代码来执行所谓的 n NIPLAS 分析。看看 R 邮件列表上的这个线程:https://stat.ethz.ch/pipermail/r-help/2006-July/110035.html

我什至会问你从哪里获得相关矩阵?你自己建造的吗?它有 NA 吗?如果你用自己的数据构造了xCor,你认为你可以对数据进行采样,构造一个更小的xCor矩阵吗? (比如 1000X1000)。所有这些替代方案都试图通过“快乐路径”来驱动您的 PCA 算法(即所有矩阵运算都可以在内部执行而不会在对角化等方面遇到困难......即不再有“非负确定错误消息”)

【讨论】:

  • 感谢您的回答,我想我弄错了。好吧,相关矩阵是一些内部模型的结果,我无法获得原始数据......而且 7000*7000 很难分析。我现在正努力从这个矩阵中得到一些东西:(好吧..没什么到目前为止..我认为应该是一些降维技术,PCA只是一种方法,我也尝试在R中进行因子分析。但是结果仍然不是那么好。
猜你喜欢
  • 2012-11-15
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多