数学いらずの医科統計学PART7 CHAPTER38で、重回帰分析における過剰適合について説明しているのをみて、変数選択のシミュレーションをした。
今回は分散拡大係数 (VIF)について。
決定係数を用いて、を計算した時、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)