2013-03-14 34 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