多変量の、量的データの変量の合成に用いられる主成分分析。
計算の中身を追ってみました。
(1)相関行列の算出
もとデータより、相関行列を算出します。
Statistics: 分散共分散行列と相関行列
主成分分析の入力データには、
分散共分散行列と、相関行列の2種があります。
今回は標準化済みの相関行列を用います。
標準化が不要な場合は、
分散共分散行列を用いるのがよいでしょう。
(2)固有値・固有ベクトルの算出
相関行列を対象に、固有値・固有ベクトルを算出します。
固有値、固有ベクトルについては、こちらを参照。
Statistics: 固有ベクトルと固有値
固有ベクトルが、主成分(軸)の方向に対応します。
固有値は、主成分の分散に対応しており、
主成分が保持している情報の大きさを示しています。
なお、主成分分析は、多次元の分布を想定した際、
最も分散の大きい方向を探す分析ですが、
「分散の大きい方向を探す」 ことは、
「固有値問題を解く」 ことと、等しくなります。
その説明については、こちらに示されています。
http://racco.mikeneko.jp/Kougi/10s/AS/AS06pr.pdf
(3)主成分得点の算出
サンプルのプロットに用いる、主成分得点を算出します。
主成分得点は主成分軸上での、座標を意味します。
そのため、もともとの基底から、
固有ベクトルを基底と取るように、基底変換を行います。
基底変換については、こちら。
Statistics: 基底変換
なお、今回は相関行列を対象としているため、
データについても、標準化を行います。
R での計算例
上記の主成分分析の手続きを、Rで処理してみます。
今回はRのデータセット、attitude を使用します。
1.相関行列の算出を行います。
c<-cor(attitude);
2.固有値・固有ベクトルの算出を行います。
e<-eigen(c);
3.主成分得点の算出を行います。
固有ベクトルを用いて、基底変換を行います。
基底変換についてはこちらを参照。
Statistics: 基底変換
また、列方向にデータが並んでしまうため、転置します。
なお、attitude は scale 関数で標準化しています。
s<-solve(e$vectors) %*% t(scale(attitude));
s<-t(s);
4.結果の比較
主成分分析のライブラリ prcomp の結果と比較します。
p<-prcomp(attitude, scale=T);
cbind(s[,1], p$x[,1]);
なお、3の主成分得点の算出については、
リンク先の基底変換の式にあわせて、転置を行いました。
しかし、以下のように、かける順番を入れ替えることで、
転置が不要になります。
s<-scale(attitude) %*% t(solve(e$vectors));
また、今回は相関行列を用いましたが、
分散共分散行列を用いた例は、こちらになります。
attitude に対し、標準化ではなく中心化をしており、
また prcomp も同様にscale=F を指定しています。
c<-cov(attitude);
e<-eigen(c);
s<-scale(attitude, scale=F) %*% t(solve(e$vectors));
p<-prcomp(attitude, scale=F);
cbind(s[,1], p$x[,1]);
ほか、今回は prcomp の計算結果と一致するように、
「主成分得点の不偏分散が固有値と一致する」 例を
挙げました。
R には他に主成分分析のための関数として、
princomp、また FactoMineR の PCA があります。
これらからは、
「主成分得点の標本分散が固有値と一致する」
結果が得られます。
これら、主成分分析の出力結果の違いについては、
こちらにまとめました。
Statistics: Rでの主成分分析の結果の違いについて
以上です。
参考資料
F.4.31. 主成分分析
http://www.wakayama-u.ac.jp/~wuhy/am12.pdf
http://www.jaist.ac.jp/~t-yama/K116/MA09-05.pdf
http://www.macromill.com/landing/words/b007.html
http://www5.ocn.ne.jp/~shinya91/csm/331csm_multi.html