2013-03-14 83 views
2

给定一个数据矩阵M,pc = prcomp(M)提供pc $ rotation(特征向量矩阵)和pc $ x,即pca空间中原始变量的分数。但是,我获得的分数与“手工计算”的内部产品不匹配。R中的意外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: 
      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 

现在,变量1上PCA轴比分2(例如)应该是pctest $ rotation [,2]上的m1 [1,]的内积,即

 m1[1,]%*%pctest$rotation[,2] 
     [,1] 
     [1,] -0.09852071 

而不是pctest $ x [1,2],这是-1.3265

这只是一个缩放问题,或者是$ x将原始变量的投影以外的东西返回到PCA轴上?

+0

1为具有可重复码的清楚和简明的问题。 – 2013-03-14 22:40:13

回答

3

阅读?prcomp文档回答你的问题:计算由(居中并可能缩放)数据矩阵的奇异值分解完成...

您需要到中心之前规模m1[1,]您可以将其与相应的PCA矢量相乘。这可以通过设置centerscale参数可以容易地观察到FALSE之后:

all.equal(m1 %*% pctest$rotation, pctest$x) 
[1] TRUE 
+0

如果您将此作为答案,更为恰当的答案将更合适。像这样的一个更模糊的提示最适合作为评论,就像你已经做过的那样。 – 2013-03-14 22:23:20

+0

这并不能真正回答我的问题。每个变量的分数仍然应该是它对PCA向量的投影。当我把变量m(比如m1 [1,])和相应的PCA向量(不管它是一个特征向量还是从SVA分解计算出来的)中的内积乘以pca $ x得到的分数时, – user1815498 2013-03-14 22:24:06

+0

@ user1815498:重点是计算是在_centered和可能缩放的数据矩阵上完成的。在将它与相应的PCA矢量相乘之前,必须居中并缩放m1 [1,]'。 – 2013-03-14 22:29:18