主成分スコアからのデータの逆算

主成分分析では、データを主成分空間 (主成分平面)にプロットするが、これとは逆に主成分空間中のあるデータを示す点 (または任意の点)から本来のデータそのものを復元 (または新規導出)することもできる。そもそもの主成分分析とは、極めて簡単にいうと、あるデータ"X" (1 x a 行列: aはデータ項目数)の主成分スコア"S"を (正規化した)"X"と軸の固有ベクトル"A" (a x 1 行列)を掛け合わせることで求めているに過ぎない。ということは、当然ながら元のデータ"X"はその主成分スコアにAの逆行列 (転置)を掛けることで復元することができることが容易に想像できる。実際にはこの掛け算の結果を、正規化した分だけ補正する。実際には、主成分分析に使用した各変数の標準偏差 (pc$scale)を各々の要素に掛け (対角行列化した標準偏差を掛けることと同義)、さらに各変数の平均値 (pc$center)を加える。式で表すと以下のようになる。"t(A)"は"A"の転置行列である。相関行列から主成分分析を行った場合、つまり、"prcomp"にて"scale=T"で計算した場合は"pc$scale"を対角行列化したものを使用する必要がある。分散共分散行列から行った場合 (scale=F)は以下の"%*% diag(pc$scale)"は削除して考える (X= S * t(A) + pc$center)。しかし、分散共分散行列から主成分分析を行うのは限られた場合のみであるので一般には以下の式を考えれば良い。

X= S * t(A) %*% diag(pc$scale) + pc$center

主成分分析の項目にて行った結果より、アミノ酸"K"の各項目の値を復元する。まずは下準備として、固有ベクトルの準備をする。固有ベクトルは主成分分析の結果を格納した変数"pc"のpc$rotationに格納されているので、それを取り出し以下のようにeigenXXに納める。このときの主成分分析は20種類のアミノ酸が各々10個の項目を持っていたので、固有ベクトルは10個存在する。

1|$eigen01=as.matrix(pc$rotation[,1])
2|$eigen02=as.matrix(pc$rotation[,2])
3|$eigen03=as.matrix(pc$rotation[,3])
4|$eigen04=as.matrix(pc$rotation[,4])
5|$eigen05=as.matrix(pc$rotation[,5])
6|$eigen06=as.matrix(pc$rotation[,6])
7|$eigen07=as.matrix(pc$rotation[,7])
8|$eigen08=as.matrix(pc$rotation[,8])
9|$eigen09=as.matrix(pc$rotation[,9])
10|$eigen10=as.matrix(pc$rotation[,10])

以上で準備は整ったので、以下のコマンドにてアミノ酸"K"の各項目の値を復元する。

1|$( pc$x[12,1]*t(eigen01) + pc$x[12,2]*t(eigen02) + pc$x[12,3]*t(eigen03) + pc$x[12,4]*t(eigen04) + pc$x[12,5]*t(eigen05) + pc$x[12,6]*t(eigen06) + pc$x[12,7]*t(eigen07) + pc$x[12,8]*t(eigen08) + pc$x[12,9]*t(eigen09) + pc$x[12,10]*t(eigen10) ) %*% diag(pc$scale) + pc$center

最初の"("から"%*%"の直前までの")"にてアミノ酸"K"の各軸の主成分スコアと主成分各軸の固有ベクトルを掛けたものを合計している。例えば、pc$x[12,3]は12番目のアミノ酸 (K)の主成分3軸の主成分スコアを表している。次の"%*%"は行列の掛け算の記号である。次の"diag"は与えられたベクトル (pc$scale)を対角行列に変換する関数である。最後にpc$centerを加える。構造的には、最初の"("から"%*%"の直前までの")"は (1 x10)の行列、diag(pc$scale)は (10 x 10)の行列、pc$centerは (1 x10)の行列である。以上のコマンドの結果は以下のようになる。

1.15  0.466  105.1  0.219  146.19  4.27  11.3  9.74  224  6.1

用いたデータは以下なので、完全に復元できていることが分かる。

主成分分析開始データ

以上では主成分全軸、10軸を用いて復元したが、以下のようにすることで主成分2軸の値のみからデータを復元することができる。

1|$(pc$x[12,1]*t(eigen01) + pc$x[12,2]*t(eigen02)) %*% diag(pc$scale) + pc$center

主成分1軸と2軸の累積寄与率 (2軸によるデータの説明量)は67%と高くないので再現率は酷く悪い。また、以下のように新たなアミノ酸"J"を (PC1, PC2) = (4, -3)のと定義し、その性質を求めたい場合も上と同様に主成分1軸と2軸のみ使って以下のように新規導出することができる。

新規導出アミノ酸J
1|$(4*t(eigen01) + (-3)*t(eigen02)) %*% diag(pc$scale) + pc$center
このエントリーをはてなブックマークに追加

Site search

ページのトップへ戻る