0

我目前正在尝试使用 SAS 中的 proc princomp 命令和 R 中的 princomp() 命令(在 stats 包中)获得等效的结果。我得到的结果非常相似,这让我怀疑这不是两个命令中不同选项设置的问题。然而,输出也有很大的不同,以至于每个数据行的组件得分明显不同。它们也是符号反转的,但这并不重要,当然。

此分析的最终目标是从 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

因此,模型截距似乎正在改变评分数据中的值。任何关于为什么会发生这种情况(为什么截距不同)的想法将不胜感激。

4

1 回答 1

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)
于 2013-11-01T16:08:02.863 回答