0

現在、SAS の proc princomp コマンドと R の princomp() コマンド (stats パッケージ内) を使用して、同等の結果を得ようとしています。得られる結果は非常によく似ており、これは 2 つのコマンドのオプション設定が異なることによる問題ではないと思われます。ただし、出力も十分に異なるため、各データ行のコンポーネント スコアは著しく異なります。それらも符号反転されていますが、これはもちろん問題ではありません。

この分析の最終目標は、PCA ルーチンの外部でデータをスコアリングするための PCA から一連の係数を作成することです (つまり、スコアリングされたデータを簡単に作成するために新しいデータセットに適用できる式)。

すべてのデータを投稿することなく、これら 2 つのコマンドが計算でどのように異なるかについて誰かが情報を提供できることを願っています。これがプロセスの概念的な違いなのか、内部の丸めの違いのようなものなのかを判断するのに十分な 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 に答える