我目前正试图使用SAS中的proc princomp命令和R中的princomp()命令(在stats包中)获得等效的结果。我得到的结果非常相似,这使我怀疑这不是两个命令中不同选项设置的问题。但是,outpus也有很大的不同,以至于每个数据行的组件分数都有明显的不同。它们也是相反的,但这当然不重要。
此分析的最终目标是从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中)或lm() (在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因此,模型拦截似乎改变了得分数据中的值。任何想法,为什么会发生这种情况(为什么拦截是不同的),将不胜感激。
发布于 2013-11-01 16:08:02
再次感谢所有发表评论的人。令人尴尬的是,我发现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)https://stackoverflow.com/questions/19712532
复制相似问题