読者です 読者をやめる 読者になる 読者になる

東京に棲む日々

データ分析、統計、ITを勉強中。未だ世に出ず。

まとめ - 主成分分析、PLS関連

本業でPLSに関してちょっとまとめる必要があるので、計算を主成分分析から始めてたどってみた。

 

以下、過去記事のまとめ。

 

主成分分析を計算してみる

http://highschoolstudent.hatenablog.com/entry/2013/04/20/101836

主成分分析を、固有値問題、スペクトル分解で解いた。

Rのprcomp()関数を使ってみた。

 

主成分分析と特異値分解

http://highschoolstudent.hatenablog.com/entry/2013/04/21/125222

特異値分解とそのプロパティ。

主成分分析を特異値分解で解いた。

 

主成分分析をNIPALSアルゴリズムで解いてみる

http://highschoolstudent.hatenablog.com/entry/2013/04/23/192356

その他主成分分析に関する関連事項。

主成分分析を1主成分ずつ取り出す繰り返し計算で解いた。

 

主成分分析とPLS

http://highschoolstudent.hatenablog.com/entry/2013/04/29/144826

主成分分析とPLSモデルの比較。

PLSモデルの定義。

 

PLSの計算

http://highschoolstudent.hatenablog.com/entry/2013/04/30/191405

PLSをNIPALSアルゴリズムで解いた。

Rのchemometricsパッケージのpls2_nipals()関数を使ってみた。

また、pls2_nipals()での予測値がよくわからなかったので、plsパッケージのmvr()関数で予測値の確認を行った。

 

PLSは登場する成分が非常に多く、複雑である。誤り、追加情報などあれば、都度修正追加を行う。

 

PLSであるが、エンジニアリングの分野での需要は多いと思う。

PLSは線形モデルである。線形モデルは、基本的な回帰モデル、次に主成分回帰モデル、そしてPLSモデルへとだんだん複雑になって行く。

2次項など含めれば別であるが、これらはすべて変数間の直線関係をとらえる兄弟モデルである。

あてはまりの良さだけを考えるのであれば、非線形モデルであるニューラルとかの方があてはまりは良くなる。

ただし、ニューラルは変数間の関係性が不鮮明ということで、線形モデルのPLSがエンジニアリングの分野では好まれる場合があると思う。

PLSに関する文献であるが、日本語のものはあきらめた方が良いかもしれない。

英語の文献で読みやすいお勧めは以下。

Introduction to Multivariate Statistical Analysis in Chemometrics

Introduction to Multivariate Statistical Analysis in Chemometrics

タイトルにあるように、PLSはChemometrics(計量化学、ケモメトリックス)の分野で発展した手法である。横長で変数間の相関が強いデータに適用される。

他にも同様なデータを扱う官能評価系の研究者にも利用される。Sensometrics(センソメトリックス)と呼ばれる分野。

例えば、plsライブラリのoliveoilデータなどよくある例ではないだろうか。

head(oliveoil)

  
   chemical.Acidity chemical.Peroxide chemical.K232 chemical.K270 chemical.DK
G1             0.73              12.7           1.9         0.139       0.003
G2             0.19              12.3         1.678         0.116      -0.004
G3             0.26              10.3         1.629         0.116      -0.005
G4             0.67              13.7         1.701         0.168      -0.002
G5             0.52              11.2         1.539         0.119      -0.001
I1             0.26              18.7         2.117         0.142       0.001
   sensory.yellow sensory.green sensory.brown sensory.glossy sensory.transp sensory.syrup
G1           21.4          73.4          10.1           79.7           75.2          50.3
G2           23.4          66.3           9.8           77.8           68.7          51.7
G3           32.7          53.5           8.7           82.3           83.2          45.4
G4           30.2          58.3          12.2           81.1           77.1          47.8
G5           51.8          32.5             8           72.4           65.3          46.5
I1           40.7          42.9          20.1           67.7           63.5          52.2

str(oliveoil)

  
'data.frame':   16 obs. of  2 variables:
 $ chemical: AsIs [1:16, 1:5] 0.73 0.19 0.26 0.67 0.52 0.26 0.24  0.3 0.35 0.19 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr  "G1" "G2" "G3" "G4" ...
  .. ..$ : chr  "Acidity" "Peroxide" "K232" "K270" ...
 $ sensory : AsIs [1:16, 1:6] 21.4 23.4 32.7 30.2 51.8 40.7 53.8 26.4 65.7   45 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr  "G1" "G2" "G3" "G4" ...
  .. ..$ : chr  "yellow" "green" "brown" "glossy" ...