分散拡大係数 VIF

MikuHatsune2013-09-04

数学いらずの医科統計学PART7 CHAPTER38で、重回帰分析における過剰適合について説明しているのをみて、変数選択のシミュレーションをした。
今回は分散拡大係数 (VIF)について。
決定係数R^2を用いて、VIF=\frac{1}{1-R^2}を計算した時、10を超えているとかなり多重共線性が怪しい。
RだとVIFパッケージでできる。
データセット syn は、1000個の応答ベクトル syn$y に対して、200個の説明変数 syn$x でデータを作っている。しかし、そのうち本当に使ったのは syn$true にある6つの変数のみである。
これを回帰してみる。確かに6つがいい感じに拾われる。

library(VIF)
data(syn)
vif.sel <- vif(syn$y, syn$x, trace = FALSE)
identical(vif.sel$select, syn$true)
[1] TRUE

では200個すべての説明変数で回帰したらどうなのという話だが、有意水準0.05を下回る説明変数はいくつもあるのだが、これは図を見るとどうみても先の6つのパラメータが重要なのが分かる。

g1 <- glm(syn$y ~ syn$x)
conf1 <- confint(g1)
p <- tail(summary(g1)$coefficients[, "Pr(>|t|)"] < 0.05, -1)

library(epicalc)
odds1 <- logistic.display(g1)

# 対数スケールでオッズ比をプロットする。
# 信頼区間が0をまたがなければ有意。
matplot(log(odds1$table[, c("lower95ci", "upper95ci")], 2), type="n", xlab="parameter index", ylab="95% IC")
segments(seq(odds1$table[,"OR"]), log(odds1$table[,"lower95ci"], 2), y1=log(odds1$table[,"upper95ci"], 2), lwd=3, col=p+1)
points(seq(odds1$table[,"OR"]), log(odds1$table[,"OR"], 2), pch=16)
abline(h=0, lty=2)