2013-10-31 25 views
0

我目前正在嘗試使用SAS中的proc princomp命令和R中的princomp()命令(在統計數據包中)獲得等效的結果。我得到的結果非常相似,導致我懷疑這對兩個命令中的不同選項設置不是問題。然而,這個結果也是不同的,以至於每個數據行的組件得分顯着不同。它們也是符號顛倒的,但這當然不重要。SAS中的proc princomp與R中的princomp命令之間的區別?

此分析的最終目標是從PCA生成一組係數,以計算PCA例程之外的數據(即可應用於新數據集以便輕鬆生成評分數據的公式)。

沒有發佈我的所有數據,我希望有人可以提供一些信息,說明這兩個命令的計算方式可能會有所不同。我不太瞭解PCA數學,以確定這是一個概念上的差異,還是像內部四捨五入差異。爲了簡單起見,我只會發布PC1和PC2的特徵向量。

在SAS:

proc princomp data=climate out=pc_out outstat=pc_outstat; 
var MAT MWMT MCMT logMAP logMSP CMI cmiJJA DD_5 NFFD; 
run; 

返回

Eigenvectors 
     Prin1 Prin2 Prin3 Prin4 Prin5 Prin6 Prin7 Prin8 Prin9 
MAT 0.372 0.257 -.035 -.033 -.106 0.270 -.036 0.216 -.811 
MWMT 0.381 0.077 0.160 -.261 0.627 0.137 -.054 0.497 0.302 
MCMT 0.341 0.324 -.229 0.046 -.544 0.421 0.045 0.059 0.493 
logMAP -.184 0.609 -.311 -.357 -.041 -.548 0.183 0.183 0.000 
logMSP -.205 0.506 0.747 -.137 -.040 0.159 -.156 -.266 0.033 
CMI -.336 0.287 -.451 0.096 0.486 0.499 0.050 -.318 -.031 
cmiJJA -.365 0.179 0.112 0.688 -.019 0.012 0.015 0.588 0.018 
DD_5 0.379 0.142 0.173 0.368 0.183 -.173 0.725 -.282 0.007 
NFFD 0.363 0.242 -.136 0.402 0.158 -.351 -.637 -.264 0.052 

在R:

PCA.model <- princomp(climate[,c("MAT","MWMT","MCMT","logMAP","logMSP","CMI","cmiJJA","DD.5","NFFD")], scores=T, cor=T) 
PCA.model$loadings 

返回

Eigenvectors 
     Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 Comp.8 Comp.9 
MAT -0.372 -0.269   0.126  -0.250   0.270 0.789 
MWMT -0.387  -0.171   0.675    0.494 -0.325 
MCMT -0.339 -0.332 0.250 0.164 -0.500 -0.414    -0.510 
logMAP 0.174 -0.604 0.309 0.252   0.619 -0.213 0.125  
logMSP 0.202 -0.501 -0.727 0.223  -0.162 0.175 -0.268  
CMI  0.334 -0.293 0.459 -0.222 0.471 -0.495  -0.271  
cmiJJA 0.365 -0.199 -0.174 -0.612 -0.247    0.590  
DD.5 -0.382 -0.143 -0.186 -0.421    -0.695 -0.360  
NFFD -0.368 -0.227  -0.487   0.309 0.655 -0.205 

正如您所看到的,這些值是相似的(符號顛倒),但不完全相同。的差異在得分數據關係,在第一行,其看起來像這樣:

 Prin1 Prin2 Prin3 Prin4 Prin5 Prin6 Prin7 Prin8 Prin9 
SAS -1.95 1.68 -0.54 0.72 -1.07 0.10 -0.66 -0.02 0.05 
R  1.61 -1.99 0.52 -0.42 -1.13 -0.16 0.79 0.12 -0.09 

如果我使用一個GLM(在SAS)或流明()(在R)從所述得分數據計算係數,我得到非常相似的數字(反符號),除了攔截。像這樣:

在SAS

proc glm order=data data=pc_out; 
model Prin1 = MAT MWMT MCMT logMAP logMSP CMI cmiJJA DD_5 NFFD; 
run; 
R中

scored <- cbind(PCA.model$scores, climate) 
pca.lm <- lm(Comp.1~MAT+MWMT+MCMT+logMAP+logMSP+CMI+cmiJJA+DD.5+NFFD, data=scored) 

回報

Coefficients: 
    (Int) MAT MWMT MCMT logMAP logMSP CMI  cmiJJA DD.5  NFFD 
SAS 0.42 0.04 0.06 0.03 -0.65 -0.69 -0.003 -0.01 0.0002 0.004 
R -0.59 -0.04 -0.06 -0.03 0.62 0.68 0.004 0.02 -0.0002 -0.004 

所以它似乎該模型攔截在得分變化值數據。任何想法爲什麼發生這種情況(爲什麼截距是不同的),將不勝感激。

+0

可以是這是http://stats.stackexchange.com/ – Ananta

+0

的事實一個問題,一個結果是-1 *另一個結果是沒有意義的。從'?prcomp':旋轉矩陣的列的符號是任意的,因此PCA的不同程序之間甚至不同程序之間可能有所不同。 –

+0

另外,請查看「prcomp」與「 princomp'。他們使用不同的方法。一個快速測試是從'princomp'更改爲'prcomp'並查看結果是否與SAS版本匹配。但這些細節技術性很強,你可能無法解決問題。 –

回答

3

再次感謝所有評論。令人尷尬的是,我在SAS proc princomp和R princomp()程序之間發現的差異實際上是我所做的數據錯誤的產物。對那些花時間幫忙解答的人很抱歉。

但是,不要讓這個問題變成浪費,我會提供我在運行主成分分析(PCA)時發現的與SAS和R在統計上等效的程序。

以下過程在統計學上是等效的,數據名爲'mydata',變量名爲'Var1','Var2'和'Var3'。

在SAS:

* Run the PCA on your data; 
proc princomp data=mydata out=pc_out outstat=pc_outstat; 
var Var1 Var2 Var3; 
run; 
* Use GLM on the individual components to obtain the coefficients to calculate the PCA scoring; 
proc glm order=data data=pc_out; 
model Prin1 = Var1 Var2 Var3; 
run; 

在R:

PCA.model <- princomp(mydata[,c("Var1","Var2","Var3")], scores=T, cor=T) 
scored <- predict(PCA.model, mydata) 
scored <- cbind(PCA.model$scores, mydata) 
lm(Comp.1~Var1+Var2+Var3, data=scored) 
相關問題