R言語で分散拡大係数(VIF)を求める

分散拡大係数 (VIF)

統計学における分散拡大係数(variance inflation factor, VIF) とは、最小二乗回帰分析における多重共線性の深刻さを定量化する。推定された回帰係数の分散(推定値の標準偏差の平方)が、多重共線性のためにどれだけ増加したかを測る指標を提供する。 (Wikipedia)

$$VIF_j = \frac{1}{1-R_j ^2}$$

多重共線性 (multicollinearity)

通称「マルチコ」。独立変数間に非常に強い相関があったり,一次従属な変数関係がある場合には,解析が不可能(「逆行列が求まりません」というエラーメッセージが出力される)であったり,たとえ結果が求まったとしてもその信頼性は低い。このような場合に多重共線性があると言われる。 (Weblio: 統計学用語辞典)

olsrrで求める

内臓されているmtcarsのデータを利用します。

> head(mtcars)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

適当な回帰モデルを作成します。

model <- lm(mpg ~ cyl + disp + drat + wt + gear + carb, data = mtcars)

VIFを求めます。

library(olsrr)
ols_vif_tol(model)
> ols_vif_tol(model)
  Variables  Tolerance       VIF
1       cyl 0.09193010 10.877829
2      disp 0.07957868 12.566181
3      drat 0.30871945  3.239187
4        wt 0.11657930  8.577852
5      gear 0.22010765  4.543231
6      carb 0.20944382  4.774550

左から変数、許容誤差、分散拡大係数です。

ソフトウェアによっては、VIFの逆数である許容誤差を計算する。 (Wikipedia)

$$VIF_j = \frac{1}{1-R_j ^2} = \frac{1}{tolerance}$$

carで求める

library(car)
vif(model)
> vif(model)
      cyl      disp      drat        wt      gear      carb 
10.877829 12.566181  3.239187  8.577852  4.543231  4.774550 

olsrrで求めたVIFと一致しています。