RとPythonでVIFが一致しない件、Pythonにてadd_constant(定数列を追加)で一致

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:viflm()が引数で、Pythonのvariance_inflation_factorはデータセットと列番号が引数だから「そこで気づけよ」という話ではあるかもしれないけど、ミスってる人たくさんいるでしょこれ…。Statsmodelsのドキュメントにも注釈とかで記載無いし。