分散膨張因子 VIF
定義 1
多重回帰分析 $Y \gets X_{1} , \cdots, X_{p}$ を行うとき、$i$ 番目の独立変数に対する多重回帰係数を $R_{i}^2$ としよう。以下を$X_{i}$の分散膨張因子variance Inflation Factorという。 $$\displaystyle \text{VIF}_{i}: = {{1} \over {1 - R_{i}^{2} }}$$
説明
まず、多重共線性について読むことをお勧めする。
VIF は 分散拡大指数 と訳されることもあるが、通常は長すぎるので単に VIF と呼ぶ。
分析者の直感だけでは見つけ出しにくい多重共線性を見つけ出すための数値的指標として広く使われている。回帰分析では、説明力は必ず $0 < R^{2} < 1$ で求められるため、VIF は常に $1$ より大きい。$R_{i}^2$ が高いということは、$X_{i}$ を除く他の独立変数が $X_{i}$ をよく説明するという意味なので、多重共線性が強ければ強いほど $\displaystyle \text{VIF}_{i} = {{1} \over {1 - R_{i}^{2} }}$ の値は大きくなるだろう。
$i$ 番目の独立変数に対する $\text{VIF}_{i}$ が $3$ もしくは $5$ もしくは $10$ より大きい場合、多重共線性を持つ可能性が高いと見なされる。数学に慣れ親しんでいる学習者にとっては、これらの基準は経験的に求められたものなので、誰が正しくて誰が間違っているかが明確ではない。また、データによっては、見逃せない多重共線性が見つかっても、対処できない場合も少なくない。しかし、これは逆に言えば、データを理解し、分析者自身が納得できる正当化が可能であれば、やや寛大な基準を適用できるという意味でもある。
実践
(多重共線性を見つける方法の続き)
前のポストで collgeGrad
を従属変数とした多重回帰分析を行い、white
が多重共線性を強く持っていると推測した。実際に VIF を計算した結果、white
の VIF は $10$ を超えるほどの強い多重共線性を持っていたということだった。
しかし、VIF を計算するたびにこのような方法は不便なので、単純に car
パッケージの vif()
関数を使って計算してみよう。
回帰分析の結果が直感とかけ離れて多重共線性が疑われる中で、white
の VIF が $10$ を超えるということは、ほぼ間違いなく white
変数に問題があるということだ。black
も簡単ではないが、まずは white
から除外してみよう。
white
を除外して再分析した結果は非常に良く、white
が消えることによって black
の相関関係も改善されたことが確認できる。モデル診断に特に問題がなければ、この回帰モデルは変数を $3$ 個しか使わずにもかかわらず、説明力が $70 \%$ を超えるので、かなり使えると言えるだろう。
コード
以下が例のコードだ。
install.packages('car')
library(car)
DATA=MplsDemo; head(DATA)
win.graph()
plot(DATA[,-1])
out<-lm(population~.-collegeGrad-neighborhood,data=DATA)
print(paste("population의 VIF : ",(1-summary(out)$r.squared)^{-1}))
out<-lm(white~.-collegeGrad-neighborhood,data=DATA)
print(paste("white의 VIF : ",(1-summary(out)$r.squared)^{-1}))
out<-lm(black~.-collegeGrad-neighborhood,data=DATA)
print(paste("black의 VIF : ",(1-summary(out)$r.squared)^{-1}))
out<-lm(foreignBorn~.-collegeGrad-neighborhood,data=DATA)
print(paste("foreinBorn의 VIF : ",(1-summary(out)$r.squared)^{-1}))
out<-lm(hhIncome~.-collegeGrad-neighborhood,data=DATA)
print(paste("hhIncome의 VIF : ",(1-summary(out)$r.squared)^{-1}))
out<-lm(poverty~.-collegeGrad-neighborhood,data=DATA)
print(paste("poverty의 VIF : ",(1-summary(out)$r.squared)^{-1}))
out0<-lm(collegeGrad~.-neighborhood,data=DATA)
summary(out0); vif(out0)
out1<-lm(collegeGrad~.-neighborhood-white,data=DATA)
summary(out1); vif(out1)
Hadi. (2006). Regression Analysis by Example(4th Edition): p236. ↩︎