バイオ・データ・マイニング/Rで主成分分析する
をテンプレートにして作成
開始行:
*はじめに [#l1e65d6c]
ここでは,Rを使って主成分分析を行います.
『Rによるバイオインフォマティクスデータ解析』にも載ってい...
#html{{
<iframe style="width:120px;height:240px;" marginwidth="0"...
}}
*準備 [#j4c98aa4]
Rのインストールについては,次のページを見てください.
-[[MacでRを使う>機械学習/MacでRを使う]]
-[[WindowsでRを使う>機械学習/WindowsでRを使う]]
*主成分分析 [#o8b5e7da]
主成分分析 (Principal Component Analysis, PCA) は,''多変...
この合成成分のことを''主成分''といい,次のように表されま...
\[ \begin{array}{c@{}c@{}c} z_1 &=& a_{1,1} x_{1} + a_{1,...
ここで,[math]z_1[/math] を第1主成分,[math]z_2[/math] を...
次元数が [math]p[/math] のとき,主成分は [math]p[/math] ...
このうちの第1主成分からいくつかだけを使ってデータを表現で...
例として,次のような2次元のデータを考えてみます((一つ右上...
#ref(pca_0.png,nolink,50%)
2次元の場合,主成分(合成成分)は次のようになります.
(図では変数が [math]x[/math], [math]y[/math] になってい...
\[ \begin{array}{c@{}c@{}c} z_1 &=& a_{1,1} x_{1} + a_{1,...
このデータは2変数で表現されていますが,これを第1主成分だ...
合成成分である第1主成分だけでデータを表現するということは...
下の図のように,データから第1主成分である直線に垂線を下ろ...
#ref(pca_2.png,nolink,50%)
逆に,下の図のように,データから第1主成分である直線に垂線...
#ref(pca_1.png,nolink,50%)
そこで,垂線を下ろしたときに分散が最も大きくなる直線を第1...
第2主成分は,第1主成分と直行する直線の中で,データから垂...
最後の主成分である第 [math]p[/math] 主成分は,選ぶことが...
今回の例は2次元なので,第2主成分は第1主成分に直行する直線...
#ref(pca_3.png,nolink,50%)
主成分を求めるには,まず各変数を平均0,標準偏差1に正規化...
分散共分散行列とは、行列の [math]i[/math] 行 [math]j[/mat...
対角要素は分散になるので、分散共分散行列と呼ばれます。
分散共分散行列は [math]p \times p[/math] 正方行列なので,...
これを大きい順に [math]\lambda_1[/math], [math]\lambda_2[...
このとき,[math]i[/math] 番目の固有値 [math]\lambda_i[/ma...
''固有ベクトル''は,その主成分と元の変数との''相関係数''...
''固有値''は,その主成分の''分散''を表しています.
上の図の例では,最も大きい固有値が約1.96で,それに対応す...
したがって,第1主成分が約 [math]\left(\begin{array}{r}0.7...
第1主成分は,[math]x_1[/math], [math]x_2[/math] との相関...
第2主成分は,[math]x_1[/math] との相関係数が約-0.707,[ma...
データを正規化して,第 [math]i[/math] 主成分に垂線を下ろ...
図の一番左下のデータは,約 (0.107, 0.008) です.
[math]x_1[/math] の平均は約0.46,標準偏差は約0.27ですから...
[math]x_2[/math] の平均は約0.47,標準偏差は約0.33ですから...
おおよそ (-1.29, -1.38) から第1主成分と第2主成分に垂線を...
第1主成分の主成分スコアは,0.707 * -1.29 + 0.707 * -1.38 ...
ある固有値を固有値全部の合計で割った値を''主成分寄与率''...
つまり,第 [math]i[/math] 主成分の寄与率は以下の式で表さ...
\[ \frac{\lambda_i}{\sum_{j=1}^{p} \lambda_{j}} \]
固有値は分散を表していますから,寄与率は主成分全体の分散...
また,主成分全体の分散のうち第1主成分から第 [math]i[/math...
\[ \frac{\sum_{j=1}^{i} \lambda_j}{\sum_{j=1}^{p} \lambda...
この累積寄与率が0.8あればいいとか,0.9あればいいというよ...
上の例では,第1主成分の分散は約1.96,第2主成分の分散は0.0...
したがって,第1主成分の寄与率は約0.98,第2主成分の寄与率...
また,累積寄与率は,第1主成分までで約0.98,第2主成分まで...
ここで,累積寄与率が0.9まででいいとするなら,第2主成分は...
当然のことですが,情報量は落ちるので注意が必要です.
*主成分分析を行う [#xcf07f9a]
標準で使える''irisデータセット''に対して,主成分分析を行...
#geshi(rsplus){{
> data(iris)
}}
このデータセットは,アヤメの種類(Species)をがく片の長さ...
長さと幅は連続値,種類はsetosa, versicolor, virginicaのい...
このデータセットには,setosa, versicolor, virginicaという...
ランダムに10個のデータを選択して,見てみましょう.
#geshi(rsplus){{
> iris[sort(sample(1:150,10)),]
Sepal.Length Sepal.Width Petal.Length Petal.Width ...
4 4.6 3.1 1.5 0.2 ...
22 5.1 3.7 1.5 0.4 ...
65 5.6 2.9 3.6 1.3 ver...
97 5.7 2.9 4.2 1.3 ver...
100 5.7 2.8 4.1 1.3 ver...
108 7.3 2.9 6.3 1.8 vi...
116 6.4 3.2 5.3 2.3 vi...
122 5.6 2.8 4.9 2.0 vi...
136 7.7 3.0 6.1 2.3 vi...
146 6.7 3.0 5.2 2.3 vi...
}}
Rで主成分分析を行うには,''princomp関数''を使います.
ただし,princomp関数はデータ数が次元数 [math]p[/math] よ...
そのときは,princomp関数の代わりに''prcomp関数''を使いま...
princomp関数の第1引数には''モデル式''を与え,オプションと...
#geshi(rsplus){{
> iris.pc <- princomp(~Sepal.Length+Sepal.Width+Petal.Len...
}}
モデル式は「目的変数 ~ 説明変数1 + 説明変数2 + ...」とい...
主成分分析の結果を表示してみると,次のようになります.
#geshi(rsplus){{
> iris.pc
Call:
princomp(formula = ~Sepal.Length + Sepal.Width + Petal.Le...
Petal.Width, data = iris, cor = T)
Standard deviations:
Comp.1 Comp.2 Comp.3 Comp.4
1.7083611 0.9560494 0.3830886 0.1439265
4 variables and 150 observations.
> summary(iris.pc)
Importance of components:
Comp.1 Comp.2 Comp.3 ...
Standard deviation 1.7083611 0.9560494 0.38308860 0.1...
Proportion of Variance 0.7296245 0.2285076 0.03668922 0.0...
Cumulative Proportion 0.7296245 0.9581321 0.99482129 1.0...
}}
''summary関数''の結果には,各主成分の''標準偏差'' (Standa...
第2主成分 (Comp. 2) までで累積寄与率が約0.96ありますから...
作成されたオブジェクトの''loadings変数''に''固有ベクトル'...
''unclass関数''を用いて,固有ベクトル行列だけを取り出しま...
#geshi(rsplus){{
> unclass(iris.pc$loadings)
Comp.1 Comp.2 Comp.3 Comp.4
Sepal.Length 0.5210659 -0.37741762 0.7195664 0.2612863
Sepal.Width -0.2693474 -0.92329566 -0.2443818 -0.1235096
Petal.Length 0.5804131 -0.02449161 -0.1421264 -0.8014492
Petal.Width 0.5648565 -0.06694199 -0.6342727 0.5235971
}}
第1主成分はSepal.Length, Petal.Length, Petal.Widthを同じ...
また,Sepal.Widthは他の変数に比べると半分くらいしか影響せ...
したがって,第1主成分は,主に萼(がく)片の長さ,花びらの...
第2主成分は,Sepal.Widthと強い負の相関があり,Sepal.Lengt...
したがって,第2主成分は,萼(がく)片の小ささを表している...
''固有値''あるいは各主成分の''分散''を求めるには,標準偏...
標準偏差は,作成されたオブジェクトの''sd変数''または''sde...
#geshi(rsplus){{
> iris.pc$sd^2
Comp.1 Comp.2 Comp.3 Comp.4
2.91849782 0.91403047 0.14675688 0.02071484
}}
各データの''主成分スコア''は,作成されたオブジェクトの''s...
#geshi(rsplus){{
> iris.pc$scores
Comp.1 Comp.2 Comp.3 Comp.4
1 -2.26470281 -0.480026597 0.127706022 0.024168204
2 -2.08096115 0.674133557 0.234608854 0.103006775
3 -2.36422905 0.341908024 -0.044201485 0.028377053
4 -2.29938422 0.597394508 -0.091290106 -0.065955560
5 -2.38984217 -0.646835383 -0.015738196 -0.035922813
...
}}
主成分分析の結果を第1主成分と第2主成分だけで表示するには...
#geshi(rsplus){{
> biplot(iris.pc)
}}
#ref(pca.png,nolink,50%)
データは正規化されているので,中心は原点になっています.
赤い矢印は,固有ベクトルにおける各変数の値を上軸と右軸で...
ggplot2で主成分分析の結果を表示するには、主成分分析の結果...
#geshi(rsplus){{
df <- data.frame(iris.pc$scores)
df <- transform(df, Species=iris$Species)
library(ggplot2)
ggplot(data=df, aes(x=Comp.1, y=Comp.2, color=Species, sh...
geom_point() +
theme(aspect.ratio=1)
}}
#ref(iris_pca.png,nolink)
(上のbiplotの図とは別に作り直したので、軸のスケールが違...
*まとめ [#i8f9803d]
主成分分析は,分散が大きい合成成分を求めることによって,...
主成分分析では,各次元の値がそれぞれ正規分布になっている...
したがって,正規分布でないときにはうまくいきません.
そういうときは,独立成分分析 (ICA) がうまくいくかもしれま...
*演習 [#n347200c]
irisデータを使って、自分で主成分分析をやってみよう。
*参考文献 [#n60df35d]
#html{{
<iframe style="width:120px;height:240px;" marginwidth="0"...
}}
終了行:
*はじめに [#l1e65d6c]
ここでは,Rを使って主成分分析を行います.
『Rによるバイオインフォマティクスデータ解析』にも載ってい...
#html{{
<iframe style="width:120px;height:240px;" marginwidth="0"...
}}
*準備 [#j4c98aa4]
Rのインストールについては,次のページを見てください.
-[[MacでRを使う>機械学習/MacでRを使う]]
-[[WindowsでRを使う>機械学習/WindowsでRを使う]]
*主成分分析 [#o8b5e7da]
主成分分析 (Principal Component Analysis, PCA) は,''多変...
この合成成分のことを''主成分''といい,次のように表されま...
\[ \begin{array}{c@{}c@{}c} z_1 &=& a_{1,1} x_{1} + a_{1,...
ここで,[math]z_1[/math] を第1主成分,[math]z_2[/math] を...
次元数が [math]p[/math] のとき,主成分は [math]p[/math] ...
このうちの第1主成分からいくつかだけを使ってデータを表現で...
例として,次のような2次元のデータを考えてみます((一つ右上...
#ref(pca_0.png,nolink,50%)
2次元の場合,主成分(合成成分)は次のようになります.
(図では変数が [math]x[/math], [math]y[/math] になってい...
\[ \begin{array}{c@{}c@{}c} z_1 &=& a_{1,1} x_{1} + a_{1,...
このデータは2変数で表現されていますが,これを第1主成分だ...
合成成分である第1主成分だけでデータを表現するということは...
下の図のように,データから第1主成分である直線に垂線を下ろ...
#ref(pca_2.png,nolink,50%)
逆に,下の図のように,データから第1主成分である直線に垂線...
#ref(pca_1.png,nolink,50%)
そこで,垂線を下ろしたときに分散が最も大きくなる直線を第1...
第2主成分は,第1主成分と直行する直線の中で,データから垂...
最後の主成分である第 [math]p[/math] 主成分は,選ぶことが...
今回の例は2次元なので,第2主成分は第1主成分に直行する直線...
#ref(pca_3.png,nolink,50%)
主成分を求めるには,まず各変数を平均0,標準偏差1に正規化...
分散共分散行列とは、行列の [math]i[/math] 行 [math]j[/mat...
対角要素は分散になるので、分散共分散行列と呼ばれます。
分散共分散行列は [math]p \times p[/math] 正方行列なので,...
これを大きい順に [math]\lambda_1[/math], [math]\lambda_2[...
このとき,[math]i[/math] 番目の固有値 [math]\lambda_i[/ma...
''固有ベクトル''は,その主成分と元の変数との''相関係数''...
''固有値''は,その主成分の''分散''を表しています.
上の図の例では,最も大きい固有値が約1.96で,それに対応す...
したがって,第1主成分が約 [math]\left(\begin{array}{r}0.7...
第1主成分は,[math]x_1[/math], [math]x_2[/math] との相関...
第2主成分は,[math]x_1[/math] との相関係数が約-0.707,[ma...
データを正規化して,第 [math]i[/math] 主成分に垂線を下ろ...
図の一番左下のデータは,約 (0.107, 0.008) です.
[math]x_1[/math] の平均は約0.46,標準偏差は約0.27ですから...
[math]x_2[/math] の平均は約0.47,標準偏差は約0.33ですから...
おおよそ (-1.29, -1.38) から第1主成分と第2主成分に垂線を...
第1主成分の主成分スコアは,0.707 * -1.29 + 0.707 * -1.38 ...
ある固有値を固有値全部の合計で割った値を''主成分寄与率''...
つまり,第 [math]i[/math] 主成分の寄与率は以下の式で表さ...
\[ \frac{\lambda_i}{\sum_{j=1}^{p} \lambda_{j}} \]
固有値は分散を表していますから,寄与率は主成分全体の分散...
また,主成分全体の分散のうち第1主成分から第 [math]i[/math...
\[ \frac{\sum_{j=1}^{i} \lambda_j}{\sum_{j=1}^{p} \lambda...
この累積寄与率が0.8あればいいとか,0.9あればいいというよ...
上の例では,第1主成分の分散は約1.96,第2主成分の分散は0.0...
したがって,第1主成分の寄与率は約0.98,第2主成分の寄与率...
また,累積寄与率は,第1主成分までで約0.98,第2主成分まで...
ここで,累積寄与率が0.9まででいいとするなら,第2主成分は...
当然のことですが,情報量は落ちるので注意が必要です.
*主成分分析を行う [#xcf07f9a]
標準で使える''irisデータセット''に対して,主成分分析を行...
#geshi(rsplus){{
> data(iris)
}}
このデータセットは,アヤメの種類(Species)をがく片の長さ...
長さと幅は連続値,種類はsetosa, versicolor, virginicaのい...
このデータセットには,setosa, versicolor, virginicaという...
ランダムに10個のデータを選択して,見てみましょう.
#geshi(rsplus){{
> iris[sort(sample(1:150,10)),]
Sepal.Length Sepal.Width Petal.Length Petal.Width ...
4 4.6 3.1 1.5 0.2 ...
22 5.1 3.7 1.5 0.4 ...
65 5.6 2.9 3.6 1.3 ver...
97 5.7 2.9 4.2 1.3 ver...
100 5.7 2.8 4.1 1.3 ver...
108 7.3 2.9 6.3 1.8 vi...
116 6.4 3.2 5.3 2.3 vi...
122 5.6 2.8 4.9 2.0 vi...
136 7.7 3.0 6.1 2.3 vi...
146 6.7 3.0 5.2 2.3 vi...
}}
Rで主成分分析を行うには,''princomp関数''を使います.
ただし,princomp関数はデータ数が次元数 [math]p[/math] よ...
そのときは,princomp関数の代わりに''prcomp関数''を使いま...
princomp関数の第1引数には''モデル式''を与え,オプションと...
#geshi(rsplus){{
> iris.pc <- princomp(~Sepal.Length+Sepal.Width+Petal.Len...
}}
モデル式は「目的変数 ~ 説明変数1 + 説明変数2 + ...」とい...
主成分分析の結果を表示してみると,次のようになります.
#geshi(rsplus){{
> iris.pc
Call:
princomp(formula = ~Sepal.Length + Sepal.Width + Petal.Le...
Petal.Width, data = iris, cor = T)
Standard deviations:
Comp.1 Comp.2 Comp.3 Comp.4
1.7083611 0.9560494 0.3830886 0.1439265
4 variables and 150 observations.
> summary(iris.pc)
Importance of components:
Comp.1 Comp.2 Comp.3 ...
Standard deviation 1.7083611 0.9560494 0.38308860 0.1...
Proportion of Variance 0.7296245 0.2285076 0.03668922 0.0...
Cumulative Proportion 0.7296245 0.9581321 0.99482129 1.0...
}}
''summary関数''の結果には,各主成分の''標準偏差'' (Standa...
第2主成分 (Comp. 2) までで累積寄与率が約0.96ありますから...
作成されたオブジェクトの''loadings変数''に''固有ベクトル'...
''unclass関数''を用いて,固有ベクトル行列だけを取り出しま...
#geshi(rsplus){{
> unclass(iris.pc$loadings)
Comp.1 Comp.2 Comp.3 Comp.4
Sepal.Length 0.5210659 -0.37741762 0.7195664 0.2612863
Sepal.Width -0.2693474 -0.92329566 -0.2443818 -0.1235096
Petal.Length 0.5804131 -0.02449161 -0.1421264 -0.8014492
Petal.Width 0.5648565 -0.06694199 -0.6342727 0.5235971
}}
第1主成分はSepal.Length, Petal.Length, Petal.Widthを同じ...
また,Sepal.Widthは他の変数に比べると半分くらいしか影響せ...
したがって,第1主成分は,主に萼(がく)片の長さ,花びらの...
第2主成分は,Sepal.Widthと強い負の相関があり,Sepal.Lengt...
したがって,第2主成分は,萼(がく)片の小ささを表している...
''固有値''あるいは各主成分の''分散''を求めるには,標準偏...
標準偏差は,作成されたオブジェクトの''sd変数''または''sde...
#geshi(rsplus){{
> iris.pc$sd^2
Comp.1 Comp.2 Comp.3 Comp.4
2.91849782 0.91403047 0.14675688 0.02071484
}}
各データの''主成分スコア''は,作成されたオブジェクトの''s...
#geshi(rsplus){{
> iris.pc$scores
Comp.1 Comp.2 Comp.3 Comp.4
1 -2.26470281 -0.480026597 0.127706022 0.024168204
2 -2.08096115 0.674133557 0.234608854 0.103006775
3 -2.36422905 0.341908024 -0.044201485 0.028377053
4 -2.29938422 0.597394508 -0.091290106 -0.065955560
5 -2.38984217 -0.646835383 -0.015738196 -0.035922813
...
}}
主成分分析の結果を第1主成分と第2主成分だけで表示するには...
#geshi(rsplus){{
> biplot(iris.pc)
}}
#ref(pca.png,nolink,50%)
データは正規化されているので,中心は原点になっています.
赤い矢印は,固有ベクトルにおける各変数の値を上軸と右軸で...
ggplot2で主成分分析の結果を表示するには、主成分分析の結果...
#geshi(rsplus){{
df <- data.frame(iris.pc$scores)
df <- transform(df, Species=iris$Species)
library(ggplot2)
ggplot(data=df, aes(x=Comp.1, y=Comp.2, color=Species, sh...
geom_point() +
theme(aspect.ratio=1)
}}
#ref(iris_pca.png,nolink)
(上のbiplotの図とは別に作り直したので、軸のスケールが違...
*まとめ [#i8f9803d]
主成分分析は,分散が大きい合成成分を求めることによって,...
主成分分析では,各次元の値がそれぞれ正規分布になっている...
したがって,正規分布でないときにはうまくいきません.
そういうときは,独立成分分析 (ICA) がうまくいくかもしれま...
*演習 [#n347200c]
irisデータを使って、自分で主成分分析をやってみよう。
*参考文献 [#n60df35d]
#html{{
<iframe style="width:120px;height:240px;" marginwidth="0"...
}}
ページ名: