重回帰分析において、説明変数をやみくもに増やすと多重共線性という問題が生じることがあります。これは、説明変数間に相関がある場合に起こり、多重共線性が生じると回帰式の係数が不安定になります。重回帰分析を行うときには、これに気を配る必要があります。
まず、乱数を使って仮想的なデータを生成します。以下の例では、もちろんx1〜x3とyの間に線形の関係がありますが、さらにx1とx3の間にも相関があるデータを作成していることに注意してください。
x1 <- rnorm(100, 10, 1) x2 <- rnorm(100, 10, 2) x3 <- x1 * 2 + rnorm(100, 10, 0.01) y <- x1 + 2 * x2 + 3 * x3 + rnorm(100, 0, 1)
ここで散布図行列を書きます。x1とx3の間に相関があるのがわかります。
data <- data.frame(y,x1,x2,x3) pairs(data)
lm関数で回帰を行い、summary関数で回帰の結果の概要を見ます。
result <- lm(formula = y ~ x1 + x2 + x3) summary(result)
以下のように出力されます。
Call: lm(formula = y ~ x1 + x2 + x3) Residuals: Min 1Q Median 3Q Max -2.33112 -0.82727 -0.06202 0.88366 2.30364 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -124.64723 119.91432 -1.039 0.301 x1 -23.70632 23.94031 -0.990 0.325 x2 1.96392 0.05202 37.757 <2e-16 *** x3 15.40270 11.97863 1.286 0.202 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 1.07 on 96 degrees of freedom Multiple R-squared: 0.9842, Adjusted R-squared: 0.9837 F-statistic: 1993 on 3 and 96 DF, p-value: < 2.2e-16
仮想的なデータを作った方法によれば、回帰式は y = x1 + 2 * x2 + 3 * x3 に近いものとなるはずですが、全く異なる係数が得られてしまっています。これが多重共線性の影響です。各係数の有意確率も小さくなく、回帰がうまくいっていないことが示唆されます。
説明変数の中で多重共線性を生じている可能性がある場合には、VIF(Variance Inflation factor:分散拡大係数)を計算します。10を越えると多重共線性の目安になります。まず、デフォルトのRではVIFは計算できませんので、パッケージをインストールします。
install.packages("fmsb") library(fmsb)
インストールしたら、以下のようにコマンドを入力すればVIFが計算できます。
VIF(lm(x1~x2+x3)) VIF(lm(x2~x1+x3)) VIF(lm(x3~x1+x2))
以下のような出力が得られます。
[1] 44614.76 [1] 1.03132 [1] 44621.33
x1とx3のVIFが10を超えているのは多重共線性の生じていることを示しています。