2012年12月24日月曜日

R で主成分分析

R をインストールし、主成分分析を試してみました。

最初はEXCELでもできるかな?と思い、分散共分散行列まで作りました。が、固有値・固有ベクトルを簡単に出す方法が分かりませんでした。HPを探してみるとソルバーやマクロなど、繰り返し計算で解決している例がりありましたが、それなら最初からRを使った方がミスがなく正確だと思い、トライしました。(一応、EXCELでも答えはRと同じでしたが。)

基本CUIですが、コマンドの修正(打ち直し)やコピペができたり、クリップボード経由でEXCELからデータを読み込めたりします。DOSに比べると雲泥の差(EXCELシートを直接読めるパッケージもあるそうです)。さすが有名なオープンソース。
使ったコマンドは以下の通り。備忘録です。


クリップボードからの読み込み        
> sui <- read.delim("clipboard")
> sui

     pH 温度 電気伝導度mS.m
1  7.70 11.4           88.5
2  8.19 10.7           21.8
3  7.65  9.4           21.3
・  ・  ・       ・
・  ・  ・       ・

標準化                      
 
> sui.scale <- scale(sui) 
> sui.scale
              pH         温度 電気伝導度mS.m
 [1,] -0.6883099 -0.182747450     3.17019503
 [2,]  1.2956421 -0.856027531    -1.40223461
 [3,] -0.8907540 -2.106404823    -1.43651069
 ・      ・       ・        ・
 ・      ・       ・        ・
attr(,"scaled:center")
            pH           温度 電気伝導度mS.m
         7.870         11.590         42.255
attr(,"scaled:scale")
            pH           温度 電気伝導度mS.m
     0.2469818      1.0396862     14.5874306

主成分分析                       
> sui.sc.pc=princomp(sui.sc)
> summary(sui.sc.pc)
Importance of components:
                          Comp.1    Comp.2    Comp.3
Standard deviation     1.3646128 0.7299083 0.6745857 #固有値の平方根
Proportion of Variance 0.6533923 0.1869355 0.1596722
Cumulative Proportion  0.6533923 0.8403278 1.0000000

> sui.sc.pc$loadings #固有ベクトル(空白≒0)

Loadings:
               Comp.1 Comp.2 Comp.3
pH              0.568  0.731  0.379
温度           -0.571  0.681 -0.458
電気伝導度mS.m -0.593         0.804

> sui.sc.pc$scores #主成分得点
            Comp.1      Comp.2       Comp.3
 [1,] -2.166246269 -0.48843793  2.371942062
 [2,]  2.055847666  0.30255612 -0.244302505
 [3,]  1.549110746 -2.14863233 -0.526860394
 ・       ・       ・        ・
 ・       ・       ・        ・

生データを主成分分析にかけると、それぞれの測定項目の桁が同等に評価されるのか、圧倒的に電気伝導度のばらつきで規制されます。得られた固有ベクトルを使って主成分得点をEXCELで検算しても、結果は合いません。上記ト関連し、固有ベクトルの桁数が影響しているのでしょうか?詳細は分かりませんが。 標準化後に主成分分析を行うと、検算もあいました。OKです。データ項目の数値、桁の価値を見ることも大事なんでしょうね。あるいは適切な前処理が必要ということかな?

続きは後日。



           

0 件のコメント:

コメントを投稿