多重共線性って，そんなに単純なものじゃない

# 多重共線性って，そんなに単純なものじゃない

## 「独立変数間の相関係数に 0.8 を超えるものがあると多重共線性が生じる」というのは誤り

### 例1

相関係数の高いものばかりが含まれるデータで，重回帰分析を行う。

この記事では R による分析例を示すが，生データも書いておくので，各自常用の言語，パッケージで解析することもできよう。
サンプルサイズは，各自大きくしたり小さくしたり，自由に。

使用するデータは以下の通り。


```R
# install.packages("MASS")
```


```R
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
```


<table class="dataframe">
<caption>A data.frame: 20 × 4</caption>
<thead>
	<tr><th scope=col>y</th><th scope=col>x1</th><th scope=col>x2</th><th scope=col>x3</th></tr>
	<tr><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th></tr>
</thead>
<tbody>
	<tr><td> 0.24152986</td><td> 0.1854138</td><td> 1.09801413</td><td> 0.44562475</td></tr>
	<tr><td>-1.70064629</td><td>-1.6065555</td><td>-1.26849517</td><td>-0.80832842</td></tr>
	<tr><td>-0.38424687</td><td>-0.3328059</td><td>-0.65521817</td><td>-1.03108541</td></tr>
	<tr><td> 1.49096538</td><td> 1.5364718</td><td> 0.70189981</td><td> 0.55469928</td></tr>
	<tr><td>-1.16413391</td><td>-1.1880668</td><td>-1.09971270</td><td>-1.01307712</td></tr>
	<tr><td>-0.59137327</td><td> 0.5902655</td><td>-0.14799097</td><td>-0.31125523</td></tr>
	<tr><td> 0.21926504</td><td> 0.4992306</td><td>-0.18259741</td><td> 0.39057030</td></tr>
	<tr><td>-2.04857497</td><td>-1.4414423</td><td>-1.22440642</td><td>-2.22134547</td></tr>
	<tr><td> 0.29697801</td><td>-0.6306919</td><td>-0.89631508</td><td>-0.38353204</td></tr>
	<tr><td> 1.25180225</td><td> 2.0644996</td><td> 1.44783824</td><td> 1.90761241</td></tr>
	<tr><td>-0.08223516</td><td>-0.3935205</td><td>-0.09738636</td><td>-0.60527762</td></tr>
	<tr><td> 0.49245136</td><td> 0.4906709</td><td> 0.60713542</td><td> 0.46425254</td></tr>
	<tr><td> 0.74447075</td><td> 0.8205551</td><td> 1.10849439</td><td> 0.97363820</td></tr>
	<tr><td> 0.25951883</td><td>-0.2605998</td><td> 0.05020793</td><td> 0.09203959</td></tr>
	<tr><td> 1.56644642</td><td> 1.0228624</td><td> 1.43988937</td><td> 1.32080174</td></tr>
	<tr><td>-1.06160259</td><td>-0.9369158</td><td>-1.63791262</td><td>-0.28235486</td></tr>
	<tr><td> 0.03160193</td><td>-0.1332552</td><td>-0.76061651</td><td> 0.24399015</td></tr>
	<tr><td> 1.06027006</td><td> 0.9957936</td><td> 1.59730171</td><td> 1.49777128</td></tr>
	<tr><td>-0.70075739</td><td>-1.0113302</td><td>-0.26520287</td><td>-1.03764900</td></tr>
	<tr><td> 0.07827055</td><td>-0.2705792</td><td> 0.18507329</td><td>-0.19709507</td></tr>
</tbody>
</table>



このデータにおいて，相関係数行列は以下のようになる。
相関係数は 0.8 以上のものばかりである。


```R
cor.d3 <- cor(d3)
colnames(cor.d3) <- rownames(cor.d3) <- c("$y$", "$x_1$", "$x_2$", "$x_3$")
cor.d3
```


<table class="dataframe">
<caption>A matrix: 4 × 4 of type dbl</caption>
<thead>
	<tr><th></th><th scope=col>$y$</th><th scope=col>$x_1$</th><th scope=col>$x_2$</th><th scope=col>$x_3$</th></tr>
</thead>
<tbody>
	<tr><th scope=row>$y$</th><td>1.0000000</td><td>0.8864386</td><td>0.8480206</td><td>0.8780294</td></tr>
	<tr><th scope=row>$x_1$</th><td>0.8864386</td><td>1.0000000</td><td>0.8492360</td><td>0.8732526</td></tr>
	<tr><th scope=row>$x_2$</th><td>0.8480206</td><td>0.8492360</td><td>1.0000000</td><td>0.8278129</td></tr>
	<tr><th scope=row>$x_3$</th><td>0.8780294</td><td>0.8732526</td><td>0.8278129</td><td>1.0000000</td></tr>
</tbody>
</table>



重回帰分析の結果は，以下のようになる。回帰係数の符号，大きさも特に問題はない。


```R
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 以下なので，問題はない。


```R
cbind(diag(solve(cor(d3[2:4]))))
```


<table class="dataframe">
<caption>A matrix: 3 × 1 of type dbl</caption>
<tbody>
	<tr><th scope=row>x1</th><td>5.355946</td></tr>
	<tr><th scope=row>x2</th><td>4.040539</td></tr>
	<tr><th scope=row>x3</th><td>4.744538</td></tr>
</tbody>
</table>



### 例2

次に示すデータは，独立変数間で一組だけ相関の高いものがある例である。


```R
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
```


<table class="dataframe">
<caption>A data.frame: 20 × 4</caption>
<thead>
	<tr><th scope=col>y</th><th scope=col>x1</th><th scope=col>x2</th><th scope=col>x3</th></tr>
	<tr><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th></tr>
</thead>
<tbody>
	<tr><td>-0.04417034</td><td>-0.05110081</td><td>-0.07778910</td><td>-0.611334549</td></tr>
	<tr><td>-0.36938932</td><td>-0.34734935</td><td> 0.08725501</td><td> 0.968410637</td></tr>
	<tr><td>-1.65051133</td><td>-1.63201389</td><td>-1.53973371</td><td>-1.339277828</td></tr>
	<tr><td>-0.83279846</td><td> 0.48069002</td><td> 0.40686139</td><td>-0.636926474</td></tr>
	<tr><td>-0.16670322</td><td>-0.46021522</td><td>-0.31228385</td><td>-0.248167050</td></tr>
	<tr><td> 0.38356948</td><td> 1.19951521</td><td> 1.15267954</td><td> 1.436098744</td></tr>
	<tr><td> 1.01133688</td><td> 0.92044682</td><td> 1.07041272</td><td> 1.062552908</td></tr>
	<tr><td> 1.11297614</td><td>-0.37441684</td><td> 0.02080774</td><td> 0.150847475</td></tr>
	<tr><td>-0.16072762</td><td>-0.59408086</td><td>-0.71035126</td><td>-0.856467559</td></tr>
	<tr><td> 2.54408585</td><td> 0.67598672</td><td> 0.83318513</td><td> 2.289325197</td></tr>
	<tr><td> 0.21255632</td><td>-0.33400810</td><td>-0.16829297</td><td>-1.836658272</td></tr>
	<tr><td>-1.40031829</td><td> 0.87759090</td><td> 0.78562350</td><td>-0.103083820</td></tr>
	<tr><td>-0.86499677</td><td>-1.36952499</td><td>-1.88246868</td><td> 0.004228016</td></tr>
	<tr><td>-0.18685383</td><td> 1.22315678</td><td> 0.66978445</td><td> 0.422698040</td></tr>
	<tr><td> 0.04680101</td><td>-0.79276816</td><td>-1.29405246</td><td>-1.126643140</td></tr>
	<tr><td> 0.33649025</td><td> 0.74073761</td><td> 1.23176473</td><td> 0.536696498</td></tr>
	<tr><td> 1.20031722</td><td> 1.84228121</td><td> 1.33264003</td><td>-0.184979306</td></tr>
	<tr><td>-1.24677544</td><td>-0.90958645</td><td>-0.92813270</td><td> 0.054627418</td></tr>
	<tr><td>-0.51315616</td><td>-1.61594569</td><td>-1.33445271</td><td>-0.726316946</td></tr>
	<tr><td> 0.58826762</td><td> 0.52060510</td><td> 0.65654321</td><td> 0.744370011</td></tr>
</tbody>
</table>



相関係数行列以下のようになるが，0.8 以上の相関係数は一対しかない。


```R
cor.d4 <- cor(d4)
colnames(cor.d4) <- rownames(cor.d4) <- c("$y$", "$x_1$", "$x_2$", "$x_3$")
cor.d4
```


<table class="dataframe">
<caption>A matrix: 4 × 4 of type dbl</caption>
<thead>
	<tr><th></th><th scope=col>$y$</th><th scope=col>$x_1$</th><th scope=col>$x_2$</th><th scope=col>$x_3$</th></tr>
</thead>
<tbody>
	<tr><th scope=row>$y$</th><td>1.0000000</td><td>0.5073331</td><td>0.5556027</td><td>0.5540237</td></tr>
	<tr><th scope=row>$x_1$</th><td>0.5073331</td><td>1.0000000</td><td>0.9500000</td><td>0.5202550</td></tr>
	<tr><th scope=row>$x_2$</th><td>0.5556027</td><td>0.9500000</td><td>1.0000000</td><td>0.5845927</td></tr>
	<tr><th scope=row>$x_3$</th><td>0.5540237</td><td>0.5202550</td><td>0.5845927</td><td>1.0000000</td></tr>
</tbody>
</table>



重回帰分析の結果は，以下のようになる。
3 個の独立変数はすべて，従属変数と正の相関関係なのに，$x_1$ の偏回帰係数は負で，その絶対値も他より小さい。
要するに，多重共線性の疑いがあるということだ。


```R
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