我目前正在嘗試使用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
所以它似乎該模型攔截在得分變化值數據。任何想法爲什麼發生這種情況(爲什麼截距是不同的),將不勝感激。
可以是這是http://stats.stackexchange.com/ – Ananta
的事實一個問題,一個結果是-1 *另一個結果是沒有意義的。從'?prcomp':旋轉矩陣的列的符號是任意的,因此PCA的不同程序之間甚至不同程序之間可能有所不同。 –
另外,請查看「prcomp」與「 princomp'。他們使用不同的方法。一個快速測試是從'princomp'更改爲'prcomp'並查看結果是否與SAS版本匹配。但這些細節技術性很強,你可能無法解決問題。 –