重回帰分析で、変数選択において、考慮しないといけないのが、多重共線性。
多重共線性のチェックは統計ソフトRでどうやるのか?
多重共線性とは何か?
生まれた西暦年と年齢は、どのくらい相関するだろうか?
全く一致するといっても言い。
生まれた月によって同じ年に生まれた人でも、尋ねた日によって年齢が1歳違うだけだ。
生まれた西暦年と年齢と病気との関係を同時に見ようとすると見られるだろうか?
答えは、見られない。
全く同じかものすごく相関が強い変数同士では、同時に関係性を見ることはできない。
なぜなら、どちらか一方で事足りるからだ。
同時に見ようとすると、同じ関係を持っているのに、真逆の結果が出たりする。
多変量モデル内で、バランスをとるためだ。
このように非常に高い相関があって、同時に同じ多変量モデルではぶつかりあって、間違った答えを導き出してしまうのが、多重共線性だ。
多重共線性のチェックはRでどうやるか?
分散拡大係数 Variance Inflation Factor (VIF)を計算する。
$$ VIF = \frac{1}{1 – R_j^2} $$
$ R_j^2 $ は、説明変数 j を目的変数とみなし、他のすべての説明変数で予測したときの決定係数である。
これが5より大きいと多重共線性が疑われる。
10より大きいと多重共線性が確定的だ。
対処は、VIFが大きい変数を多変量モデルからはずすこと。
RにVIFを計算する関数
carパッケージにvif()という関数がある。
重回帰分析 lm() やロジスティック回帰分析 glm() の結果を投入するだけで、多重共線性のチェック結果を返してくれる。
vif()のすごいところは、連続量だけでなく、カテゴリも同時に扱えること。
Duncanというデータセットの、incomeとeducationのVIFは2超で、多重共線性の恐れはない。
library(car) #使うときに毎回
lm.res1 <- lm(prestige ~ income + education, data=Duncan)
vif(lm.res1)
1/(1-cor(Duncan[,2:3])^2)
連続変数2つだけの場合、決定係数は、相関係数の2乗と一致するので、1/(1-cor()2) で計算できる。
> vif(lm.res1)
income education
2.1049 2.1049
> 1/(1-cor(Duncan[,2:3])^2)
income education
income Inf 2.1049
education 2.1049 Inf
typeというカテゴリ変数を入れるとどうなるか?
> summary(Duncan)
type income education prestige
bc :21 Min. : 7.00 Min. : 7.00 Min. : 3.00
prof:18 1st Qu.:21.00 1st Qu.: 26.00 1st Qu.:16.00
wc : 6 Median :42.00 Median : 45.00 Median :41.00
Mean :41.87 Mean : 52.56 Mean :47.69
3rd Qu.:64.00 3rd Qu.: 84.00 3rd Qu.:81.00
Max. :81.00 Max. :100.00 Max. :97.00
Generalized VIF (GVIF)が計算される。
lm.res2 <- lm(prestige ~ income + education + type, data=Duncan)
vif(lm.res2)
連続量は自由度1。
カテゴリはカテゴリ数に応じて自由度が決まる。typeは3カテゴリで、自由度2。
自由度で調整した GVIF^(1/(2*Df))
を見るべき。
> vif(lm.res2)
GVIF Df GVIF^(1/(2*Df))
income 2.209178 1 1.486330
education 5.297584 1 2.301648
type 5.098592 2 1.502666
VIFの基準の10はどのくらいの相関レベルか?
そもそもVIFが10の場合、相関係数だと、いくつになるか?
これを確認することで、VIFの基準がイメージしやすくなるはずだ。
10 = 1/(1-r2)
1/10 = 1-r2
r2 = 0.9
r ≒ ±0.95
0.95ということはほとんどぴったり一致している状態。
カテゴリとの相関の場合は、カテゴリごとに含まれる数字が全然違うような場合か。
例えば、カテゴリ
1,2,3,4,5が、
10代、20代、30代、40代、50代と、
ほぼ各年代に分かれてしまうような場合、不適切ということだろう。
それ以外なら、まず問題にならないと考えればいいと思う。
ちなみにVIF=5の場合は、r2 = 0.8 つまり r ≒ ±0.89 で、相関係数はだいたい0.9くらい。
VIF = 3の場合は、r2 = 0.67 つまり r ≒ ±0.82 で、相関係数はだいたい0.8くらい。
閾値(しきいち)候補として、3, 5, 10の相関係数のイメージをもっておけばいいのではないか。
まとめ
重回帰分析やロジスティック回帰分析で、多変量モデルを解析する場合、独立変数同士の相関が強すぎると、適切な結果が得られない。
独立変数同士の相関が強すぎる状態を多重共線性があると言う。
この多重共線性を避けるためにVIFのチェックが必要である。
VIFが5を超えた場合は、多重共線性を疑う必要がある。
10を超えた場合は、多重共線性が確定的と考えたほうが良い。
その場合は、モデルへの同時投入を諦めたほうが良い。
コメント
コメント一覧 (3件)
[…] R で多重共線性をチェックするために VIF を計算する方法 […]
[…] R で多重共線性をチェックするために VIF を計算する方法 […]
[…] R で多重共線性をチェックするために VIF を計算する方法 […]