现在我有一个7000 * 7000的相关矩阵,我必须在R中做这个。
CorPCA <- princomp(covmat=xCor)
,xCor是相关矩阵 但它出来了
“协方差矩阵不是非负定的”
这是因为我在那个矩阵中有一些负相关。 我想知道R中哪个内置函数可以用来获得PCA的结果
答案 0 :(得分:3)
执行PCA的一种方法是执行协方差矩阵的特征值分解,参见wikipedia。
特征值分解的优点是您可以看到哪些方向(特征向量)是重要的,即具有由相关特征值表示的显着变化。此外,你可以检测协方差矩阵是否为正定(所有特征值大于零),如果特征值等于零,或者如果它是负特征值不确定(不可行),则可以检测到否定(这是正常的)。有时也会发生由于数值不准确而导致的非负定矩阵变为负定。在这种情况下,您将观察到几乎为零的负特征值。在这种情况下,您可以将这些特征值设置为零,以保留协方差矩阵的非负定性。此外,您仍然可以解释结果:贡献重要信息的特征向量与最大特征值相关联。如果排序的特征值列表快速下降,则有很多方向没有显着贡献,因此可以被删除。
内置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)
答案 1 :(得分:1)
not non-negative definite
并不意味着协方差矩阵具有负相关。它是一个线性代数,相当于试图取负数的平方根!你不能通过查看矩阵的几个值来判断它是否是正定的。
尝试在princomp
调用中调整一些默认值,例如容差。请检查此主题,例如:How to use princomp () function in R when covariance matrix has zero's?
另一种方法是编写一些自己的代码来执行所谓的nIPLAS分析。看一下R-mail列表中的这个帖子:https://stat.ethz.ch/pipermail/r-help/2006-July/110035.html
我甚至会问你在哪里获得相关矩阵?你自己构建了吗?它有NA吗?如果您使用自己的数据构建xCor
,您认为可以对数据进行采样并构建较小的xCor
矩阵吗? (比如1000X1000)。所有这些替代方案都试图通过“快乐路径”驱动您的PCA算法(即所有矩阵运算都可以在内部执行而没有对角化等困难......即,不再有'非负明确错误消息)