2018年6月8日金曜日

多重共線性(multicolinearity)への対処方法

係数矛盾現象・多重共線性(multicolinearity)への対処方法

    • 多重共線性があると、逆行列の計算の部分で、いわゆる「ゼロ割」(分母に0が来る)問題が発生
    • モデルから相関している変数を取り除くべきか?いや、以下、2パターンの場合は問題ない。
      • 1. 相関をしている変数の効果を分析すること自体には意味がなく、ほかの変数のパラメーターに興味があるとき。
      • 2. 予測モデルを作っているとき。(+パラメーターの解釈に特に興味がないとき)
    • 問題になるときは相関しているパラメーターのどれかに興味があるとき。
      • サンプルサイズを増やす。(micronumerosityの問題として対処する)
      • 相関している変数のどれかをモデルから外す。(モデルに制約の仮定を置く)
    • 現場では前者のアプローチをとるのは現実的に難しく、何らかの仮定を置いて変数を落とす方が良く使われていました。

    多重共線性の確認

    • VIF(Variance Inflation Factor(VIF))統計量
    • t検定

    多重共線性への対処

    1. 説明変数相互で相関の高い変数を探し、どちらかの変数を落とします。
      1. 具体的には相関が0.7以上のときは、どちらかを落とします。この値も1つの目安です。落とし方は、落とす候補になった変数と目的変数との相関をそれぞれ調べて、相関の低い方を落とします。
    2. Ridge回帰は、多重共線性の問題を回避できる

    Ridge回帰・Lasso回帰・Elastic netの使い分け

    Ridge回帰

    • 回帰係数の二乗和を罰則項
    • メリット
      • 予測因子(独立変数)がアウトカム(従属変数)と関連がある場合には、分散が小さく誤差も小さくなるという
    • デメリット
      • 一方で、回帰係数を0の方向に縮小するのみであり、説明変数が非常に多いモデルではモデルの解釈が複雑になる

    Lasso回帰

    • 回帰係数の絶対値の和を正則化項にした推定法です
    • メリット
      • モデルの選択と同時に変数選択を行える点
    • デメリット
      • 複数の相関が強い説明変数が存在する場合にはそのグループの中で一つの変数のみを選択。
      • データ数n, 特徴量の数をpとした場合に、p>nのときは高々n個の変数までしか選択できない。
      • 変数選択の一致性が必ずしも保証されていないため、「正しい」変数選択が行われていない可能性があります。変数選択の一致性を担保したい場合は、Adaptive Lassoといった理論保証があるスパースモデリングの手法を使う必要があり

    Elastic net

    • lasso回帰におけるモデル内に取り込める説明変数の数に制限がある問題点を対処できる推定法
    • 相関の高い係数はどちらも0になるか、0にならないなら同じ値になる、といったGrouping効果を持つ。

    glmnetの便利な補助ツール

    • library(glmnetUtils)
    • library(ggfortify)

    • Lasso2

    • # Lasso回帰(glmnetUtilsを併用)
    • Lasso <- .="" data="Boston.new)</li" glmnet="" medv="">
    • # ggfortifyで可視化
    • autoplot(Lasso, xvar = "lambda")

broom パッケージ

    • モデルの学習結果を tidy 形式にしてくれます。

    tidyverse

    • 現在のところ、以下のパッケージがtidyverseに含まれています。
    • データの読み込み
      • readr: CSV, TSVファイル
      • readxl: Excelファイル
      • haven: SPSS, SAS, Stataのデータ
      • httr, rvest: ウェブAPI、ウェブスクレイピング
      • xml2: XMLファイル
      • jsonlite: JSONファイル
      • DBI: データベース
    • データの前処理・変形
      • tibble: data.frameを扱いやすくする
      • tidyr: データをtidyにする
      • dplyr: データを変形する
      • forcats: factorを扱いやすくする
      • lubridate, hms: 時刻型を扱いやすくする
      • stringr: 文字列を扱いやすくする
    • 可視化
      • ggplot2
    • 関数型プログラミング
      • purrr: 関数型プログラミング
      • magrittr: %>%
      • lazyeval: 非標準評価
    • モデリング
      • modelr: モデリング
      • broom: モデルをtidyに

Rのmodel.matrixの説明

glmnetrandomForestといったパッケージで教師有り学習(回帰)を行う際に、Rのformulaを直接与えると、 data.frameでは変数の数が多い場合にオーバーヘッドがでかくなる場合がある。
あらかじめ前処理としてmodel.matrix(どの列が説明変数で、どの列が応答変数なのかの情報をmatrixに含ませたもの)に変換しておくと、各列の変数の型がそろうのでメモリ使用量が大幅に減る場合がある。
data.matrixというものもあるが、こういった場合には使用するべきでない。なぜならfactorが整数値になってしまい、互いに独立であるはずのfactor間に大小関係が生まれてしまうため

対してmodel.matrixを使用するとfactorを自動でダミー変数化(別々の列に分解)してくれる。

print(model.matrix(as.formula(~0+x+y), # x, y共に説明変数のデザイン行列を作る
                   data=df)
     )

これは以下のような出力を出す。

##   xa xb xc y
## 1  1  0  0 1
## 2  0  1  0 2
## 3  0  0  1 3
## attr(,"assign")
## [1] 1 1 1 2
## attr(,"contrasts")
## attr(,"contrasts")$x
## [1] "contr.treatment"

xxaxbxcの3列に分解されていることがわかる。
なんのためにformula0+を加えているかというと、これを加えない場合Rxaxbxcのうち一つを省略するため。 (xbxcがともに0ならばxaは必ず1になるため2列あれば3列目の内容は必ずしも必要ない)
だが、話をややこしくしないためにとりあえず0+を加えておいた方がよいと思う。

    その他メモ

    • ypred <- as.matrix="" coefs="" li="">
    • @P値
      • p値が5.0×10-8のレベル:GWASでの有意レベルにあることを示している。
      • p値が1.0×10-5のレベル:suggestive level(すなわち示唆を与えるレベル=有意ではないが、なんらかの関連がありそうなグレーゾーン)で

    参考文献

    • http://tekenuko.hatenablog.com/entry/2017/11/18/214317
    • http://jojoshin.hatenablog.com/entry/2016/07/06/180923
    • http://jojoshin.hatenablog.com/entry/2017/05/01/011132
    • http://jojoshin.hatenablog.com/entry/2017/05/01/011132

0 件のコメント:

コメントを投稿