2022-09-06
問題
重回帰分析を行う際、多重共線性(multi-colinearlity; マルチコ)の確認のためにVIFを算出しようとした際、RとPythonでVIFが一致しなくて困った。
※なお、Rはcar::vif
、Pythonはstatsmodels.stats.outliers_influence.variance_inflation_factor
で計算
versionは以下の通り
- car=3.0-8
- statsmodels=0.13.2
解決
結論として、Pythonのstatsmodels.stats.outliers_influence.variance_inflation_factor
に入力するデータセットに定数列(すべての値が1の列)を追加するとRと一致した。
statsmodelsの回帰分析OLSにおいても明示的にadd_constant()
しなければならないが、それと同じ。
参考
statsmodelsのIssuesでも言及あった。
↓VIFの値が一致しませんよという話とそれに対する考察・検討 github.com
↓VIF関数が入力データに定数列が存在することを前提視している。そのことをドキュメントに記載すべきではといった話 github.com
↓PythonとExcelでVIFが異なることに言及している記事もあった。ExcelもR側の方針なのかしら。調査中にこの記事も見たはずなんだけど…そのときにピンと来ていれば時間を無駄にしなかったのに。 qiita.com
感想
こういうエラーやWarning出ないでしれっと違う結果返すような罠あると結構困る。ヒヤッとする。
Rのcar::vif
とPythonのstatsmodels.stats.outliers_influence.variance_inflation_factor
、どっちが思想的に正しい or ユーザにとってミス無く使いやすいんでしょう……。
いやまあ、Rのcar:vif
はlm()
が引数で、Pythonのvariance_inflation_factor
はデータセットと列番号が引数だから「そこで気づけよ」という話ではあるかもしれないけど、ミスってる人たくさんいるでしょこれ…。Statsmodelsのドキュメントにも注釈とかで記載無いし。
https://t.co/32CbMkrOIl
— こここ🍀 (@kokokocococo555) September 6, 2022
sm.add_constant(x_noti)されてないのが原因なのでは?