R中意外的PCA分数
给定数据矩阵M,pc=prcomp(M)提供pc$旋转(特征向量矩阵)和pc$x,即pca空间中原始变量的分数。然而,我获得的分数与“手工”计算的内积不匹配 例如,如果我有矩阵R中意外的PCA分数,r,pca,R,Pca,给定数据矩阵M,pc=prcomp(M)提供pc$旋转(特征向量矩阵)和pc$x,即pca空间中原始变量的分数。然而,我获得的分数与“手工”计算的内积不匹配 例如,如果我有矩阵 m1=matrix(c(1,2,3,4,4,8,7,9,5,3,2,11),byrow=TRUE,nrow=3) pctest=prcomp(m1)分别为pctest$x和pctest$rotation返回以下内容: Rotation: PC1 PC2 PC3 [
m1=matrix(c(1,2,3,4,4,8,7,9,5,3,2,11),byrow=TRUE,nrow=3)
pctest=prcomp(m1)
分别为pctest$x和pctest$rotation返回以下内容:
Rotation:
PC1 PC2 PC3
[1,] -0.3751603 0.3133237 -0.5240612
[2,] -0.5810952 -0.4802203 0.5681371
[3,] -0.3471051 -0.5836868 -0.6211215
[4,] -0.6333255 0.5749142 0.1295694
pctest$x
PC1 PC2 PC3
[1,] 5.11167 -1.326545 -1.110223e-16
[2,] -4.05543 -2.728072 -1.942890e-15
[3,] -1.05624 4.054616 2.831069e-15
现在,PCA轴2上变量1的分数(例如)应该是pctest$rotation[,2]上m1[1,]的内积,即
m1[1,]%*%pctest$rotation[,2]
[,1]
[1,] -0.09852071
而不是pctest$x[1,2],它是-1.3265
这只是一个缩放问题,还是$x返回的不是原始变量在PCA轴上的投影?阅读
的文档?prcomp
回答您的问题:计算是通过(居中且可能缩放)数据矩阵的奇异值分解完成的
在将其与相应的PCA向量相乘之前,您需要居中并缩放m1[1,]。通过将中心
和比例
参数设置为FALSE
可以很容易地观察到这一点,之后:
all.equal(m1 %*% pctest$rotation, pctest$x)
[1] TRUE
如果你把这一点变成答案,一个更切题的答案会更合适。像你已经做过的那样,像这样一个更模糊的提示最适合作为评论。这并不能真正回答我的问题。每个变量的得分仍应为其在PCA向量上的投影。当我取m中变量的内积(比如,m1[1,])和相应的PCA向量(不管它是特征向量还是通过SVA分解计算的),我不会得到PCA$x中的分数。@user1815498:关键是计算是在居中且可能缩放的数据矩阵上进行的。在将其与相应的PCA向量相乘之前,您必须居中并缩放
m1[1,]
。我同意@PaulHiemstra的答案,尤其是FASLE
:)@JoshuaUlrich我们能分享这个代表吗?我应该得到至少23.1%的东西编辑:)。还有什么比使用FASLE
表示FALSE
更好的方法,比如使用vault表示错误。+1表示具有可复制代码的清晰简洁的问题。