多重共線性って,そんなに単純なものじゃない
「独立変数間の相関係数に 0.8 を超えるものがあると多重共線性が生じる」というのは誤り
例1
相関係数の高いものばかりが含まれるデータで,重回帰分析を行う。
この記事では R による分析例を示すが,生データも書いておくので,各自常用の言語,パッケージで解析することもできよう。
サンプルサイズは,各自大きくしたり小さくしたり,自由に。
使用するデータは以下の通り。
# install.packages("MASS")
library(MASS)
set.seed(123)
n <- 20
r <- matrix(runif(16, 0.8, 0.9), 4, 4)
r <- (r+t(r))/2
diag(r) <- 1
d3 <- data.frame(matrix(mvrnorm(n, mu=rep(0, 4), Sigma=r, empirical=TRUE), n))
colnames(d3) <- c("y", "x1", "x2", "x3")
d3
y | x1 | x2 | x3 |
---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> |
0.24152986 | 0.1854138 | 1.09801413 | 0.44562475 |
-1.70064629 | -1.6065555 | -1.26849517 | -0.80832842 |
-0.38424687 | -0.3328059 | -0.65521817 | -1.03108541 |
1.49096538 | 1.5364718 | 0.70189981 | 0.55469928 |
-1.16413391 | -1.1880668 | -1.09971270 | -1.01307712 |
-0.59137327 | 0.5902655 | -0.14799097 | -0.31125523 |
0.21926504 | 0.4992306 | -0.18259741 | 0.39057030 |
-2.04857497 | -1.4414423 | -1.22440642 | -2.22134547 |
0.29697801 | -0.6306919 | -0.89631508 | -0.38353204 |
1.25180225 | 2.0644996 | 1.44783824 | 1.90761241 |
-0.08223516 | -0.3935205 | -0.09738636 | -0.60527762 |
0.49245136 | 0.4906709 | 0.60713542 | 0.46425254 |
0.74447075 | 0.8205551 | 1.10849439 | 0.97363820 |
0.25951883 | -0.2605998 | 0.05020793 | 0.09203959 |
1.56644642 | 1.0228624 | 1.43988937 | 1.32080174 |
-1.06160259 | -0.9369158 | -1.63791262 | -0.28235486 |
0.03160193 | -0.1332552 | -0.76061651 | 0.24399015 |
1.06027006 | 0.9957936 | 1.59730171 | 1.49777128 |
-0.70075739 | -1.0113302 | -0.26520287 | -1.03764900 |
0.07827055 | -0.2705792 | 0.18507329 | -0.19709507 |
このデータにおいて,相関係数行列は以下のようになる。
相関係数は 0.8 以上のものばかりである。
cor.d3 <- cor(d3)
colnames(cor.d3) <- rownames(cor.d3) <- c("$y$", "$x_1$", "$x_2$", "$x_3$")
cor.d3
$y$ | $x_1$ | $x_2$ | $x_3$ | |
---|---|---|---|---|
$y$ | 1.0000000 | 0.8864386 | 0.8480206 | 0.8780294 |
$x_1$ | 0.8864386 | 1.0000000 | 0.8492360 | 0.8732526 |
$x_2$ | 0.8480206 | 0.8492360 | 1.0000000 | 0.8278129 |
$x_3$ | 0.8780294 | 0.8732526 | 0.8278129 | 1.0000000 |
重回帰分析の結果は,以下のようになる。回帰係数の符号,大きさも特に問題はない。
ans = lm(y~., d3)
summary(ans)
Call:
lm(formula = y ~ ., data = d3)
Residuals:
Min 1Q Median 3Q Max
-0.67161 -0.22903 -0.03286 0.27028 0.88072
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.347e-17 9.605e-02 0.000 1.000
x1 3.805e-01 2.281e-01 1.669 0.115
x2 2.323e-01 1.981e-01 1.173 0.258
x3 3.535e-01 2.146e-01 1.647 0.119
Residual standard error: 0.4295 on 16 degrees of freedom
Multiple R-squared: 0.8446, Adjusted R-squared: 0.8155
F-statistic: 28.99 on 3 and 16 DF, p-value: 1.052e-06
VIF はやや大きいとはいえ,通常のクライテリアである 10 以下なので,問題はない。
cbind(diag(solve(cor(d3[2:4]))))
x1 | 5.355946 |
---|---|
x2 | 4.040539 |
x3 | 4.744538 |
例2
次に示すデータは,独立変数間で一組だけ相関の高いものがある例である。
set.seed(1423)
n <- 20
r <- matrix(runif(16, 0.5, 0.59), 4, 4)
r <- (r+t(r))/2
r[2,3] <- r[3,2] <- 0.95
diag(r) <- 1
d4 <- data.frame(matrix(mvrnorm(n, mu=rep(0, 4), Sigma=r, empirical=TRUE), n))
colnames(d4) <- c("y", "x1", "x2", "x3")
d4
y | x1 | x2 | x3 |
---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> |
-0.04417034 | -0.05110081 | -0.07778910 | -0.611334549 |
-0.36938932 | -0.34734935 | 0.08725501 | 0.968410637 |
-1.65051133 | -1.63201389 | -1.53973371 | -1.339277828 |
-0.83279846 | 0.48069002 | 0.40686139 | -0.636926474 |
-0.16670322 | -0.46021522 | -0.31228385 | -0.248167050 |
0.38356948 | 1.19951521 | 1.15267954 | 1.436098744 |
1.01133688 | 0.92044682 | 1.07041272 | 1.062552908 |
1.11297614 | -0.37441684 | 0.02080774 | 0.150847475 |
-0.16072762 | -0.59408086 | -0.71035126 | -0.856467559 |
2.54408585 | 0.67598672 | 0.83318513 | 2.289325197 |
0.21255632 | -0.33400810 | -0.16829297 | -1.836658272 |
-1.40031829 | 0.87759090 | 0.78562350 | -0.103083820 |
-0.86499677 | -1.36952499 | -1.88246868 | 0.004228016 |
-0.18685383 | 1.22315678 | 0.66978445 | 0.422698040 |
0.04680101 | -0.79276816 | -1.29405246 | -1.126643140 |
0.33649025 | 0.74073761 | 1.23176473 | 0.536696498 |
1.20031722 | 1.84228121 | 1.33264003 | -0.184979306 |
-1.24677544 | -0.90958645 | -0.92813270 | 0.054627418 |
-0.51315616 | -1.61594569 | -1.33445271 | -0.726316946 |
0.58826762 | 0.52060510 | 0.65654321 | 0.744370011 |
相関係数行列以下のようになるが,0.8 以上の相関係数は一対しかない。
cor.d4 <- cor(d4)
colnames(cor.d4) <- rownames(cor.d4) <- c("$y$", "$x_1$", "$x_2$", "$x_3$")
cor.d4
$y$ | $x_1$ | $x_2$ | $x_3$ | |
---|---|---|---|---|
$y$ | 1.0000000 | 0.5073331 | 0.5556027 | 0.5540237 |
$x_1$ | 0.5073331 | 1.0000000 | 0.9500000 | 0.5202550 |
$x_2$ | 0.5556027 | 0.9500000 | 1.0000000 | 0.5845927 |
$x_3$ | 0.5540237 | 0.5202550 | 0.5845927 | 1.0000000 |
重回帰分析の結果は,以下のようになる。
3 個の独立変数はすべて,従属変数と正の相関関係なのに,$x_1$ の偏回帰係数は負で,その絶対値も他より小さい。
要するに,多重共線性の疑いがあるということだ。
ans = lm(y~., d4)
summary(ans)
Call:
lm(formula = y ~ ., data = d4)
Residuals:
Min 1Q Median 3Q Max
-1.63223 -0.55392 0.05295 0.50464 1.45189
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -9.458e-18 1.904e-01 0.000 1.000
x1 -8.642e-02 6.318e-01 -0.137 0.893
x2 4.368e-01 6.651e-01 0.657 0.521
x3 3.436e-01 2.432e-01 1.413 0.177
Residual standard error: 0.8516 on 16 degrees of freedom
Multiple R-squared: 0.3892, Adjusted R-squared: 0.2747
F-statistic: 3.399 on 3 and 16 DF, p-value: 0.04362