備忘ログ

チラシの裏的備忘録&メモ

Rで重回帰分析を行ったときにSPSSの共線性の診断と同じ(だと思う)結果を得る方法のメモ(多重共線性の確認)

重回帰分析を行ったときに多重共線性がありそうかどうかを確認するときにVIFに加え、条件指数(Condition Index)と分散の比率(Variance Propotions)を参照して多重共線性を確認する手法がある。

SPSSだと重回帰分析をするときにオプションから共線性の診断(Collinearity Diagnostics)にチェックを入れると計算してくる模様(手元に資金がSPSSがないのでわからない)。条件指数と分散の比率を参照するとどの独立変数が多重共線性が疑われるのかわかる(本稿では見方については触れない)。

RでこのSPSSの共線性の診断と同じ(だと思う、手元にSPSSが無いのでわからない)結果を得るためパッケージを使用して簡単に求める方法をメモしておく。

{olsrr}パッケージのols_coll_diag()を使って求める。

{olsrr}パッケージのols_coll_diag()を使う。多分olsrrはOrdinary Least Squares regression、ols_coll_diagはols collinearity diagnosticsの略だと思う。覚えやすい。

CRANからインストールできる。

install.packages("olsrr")

パッケージのvignettesにあった例で実行してみる。

mtcarsデータのmpg(燃費)を従属変数として、独立変数をdisp(エンジンの排気量)、hp(馬力)、wt(重量)、qsec(1/4マイルの時間)とした重回帰分析のモデルで確認してみる。

とりあえず上記の重回帰分析のモデルをmodelとして求めて中身を見てみる。

model <- lm(mpg ~ disp + hp + wt + qsec, data = mtcars)
summary(model)
## 
## Call:
## lm(formula = mpg ~ disp + hp + wt + qsec, data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.8664 -1.5819 -0.3788  1.1712  5.6468 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)   
## (Intercept) 27.329638   8.639032   3.164  0.00383 **
## disp         0.002666   0.010738   0.248  0.80576   
## hp          -0.018666   0.015613  -1.196  0.24227   
## wt          -4.609123   1.265851  -3.641  0.00113 **
## qsec         0.544160   0.466493   1.166  0.25362   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.622 on 27 degrees of freedom
## Multiple R-squared:  0.8351, Adjusted R-squared:  0.8107 
## F-statistic: 34.19 on 4 and 27 DF,  p-value: 3.311e-10

ということで、重回帰分析ができた。ここでこのモデルの共線性の診断の結果を{olsrr}パッケージのols_coll_diag()を使って求める。

olsrr::ols_coll_diag(model)
## Tolerance and Variance Inflation Factor
## ---------------------------------------
##   Variables Tolerance      VIF
## 1      disp 0.1252279 7.985439
## 2        hp 0.1935450 5.166758
## 3        wt 0.1445726 6.916942
## 4      qsec 0.3191708 3.133119
## 
## 
## Eigenvalue and Condition Index
## ------------------------------
##    Eigenvalue Condition Index   intercept        disp          hp           wt
## 1 4.721487187        1.000000 0.000123237 0.001132468 0.001413094 0.0005253393
## 2 0.216562203        4.669260 0.002617424 0.036811051 0.027751289 0.0002096014
## 3 0.050416837        9.677242 0.001656551 0.120881424 0.392366164 0.0377028008
## 4 0.010104757       21.616057 0.025805998 0.777260487 0.059594623 0.7017528428
## 5 0.001429017       57.480524 0.969796790 0.063914571 0.518874831 0.2598094157
##           qsec
## 1 0.0001277169
## 2 0.0046789491
## 3 0.0001952599
## 4 0.0024577686
## 5 0.9925403056

Eigenvalue and Condition IndexがSPSSで求められる条件指数(Condition Index)と分散の比率(Variance Propotions)にあたるもよう。VIF(Variance Inflation Factor)も一緒に求められる。SPSSが手元にないので確認できない(しつこい)が、諸サイトを見るかぎりSPSSの表示と似たようになるように調整されている様子。

一応、VIFを確認する(個人的に)定番(だと思っている){car}パッケージのvif()の結果も見てみる。

car::vif(model)
##     disp       hp       wt     qsec 
## 7.985439 5.166758 6.916942 3.133119

VIF同じ(当たり前)。

雑感

共線性の診断って入力しにくい。google 日本語入力では多重共線性は変換できるが、共線性は一発で変換できない。

SPSSでもCollinearity Diagnosticsってなっており、これの訳で共線性の診断になっているのだと思う。Multicollinearity Diagnosisじゃないんだ、と思った。多重じゃない(単回帰分析とか?)の場合でもいいようにしているのだろうか?勉強不足でちょっとわからない。