統計ER

統計ソフトRの使い方を中心に、統計解析方法の解説をするブログ。ありそうでなかなか見つからないサンプルサイズ計算などニッチな方法について紹介しています。

多重共線性をチェックするVIFを計算するには?

complete pack banner

text data complete pack banner

重回帰分析で、変数選択において、考慮しないといけないのが、多重共線性。

多重共線性のチェックは統計ソフトRでどうやるのか?

多重共線性とは何か?

生まれた西暦年と年齢は、どのくらい相関するだろうか?

全く一致するといっても言い。

生まれた月によって同じ年に生まれた人でも、尋ねた日によって年齢が1歳違うだけだ。

生まれた西暦年と年齢と病気との関係を同時に見ようとすると見られるだろうか?

答えは、見られない。

全く同じかものすごく相関が強い変数同士では、同時に関係性を見ることはできない。

なぜなら、どちらか一方で事足りるからだ。

同時に見ようとすると、同じ関係を持っているのに、真逆の結果が出たりする。

多変量モデル内で、バランスをとるためだ。

このように非常に高い相関があって、同時に同じ多変量モデルではぶつかりあって、間違った答えを導き出してしまうのが、多重共線性だ。

多重共線性のチェックはどうやるか?

分散拡大係数 Variance Inflation Factor (VIF)を計算する。

VIF =  \displaystyle \frac{1}{1-R_{j}^{2}}

 R_{j}^{2} は、説明変数  j を目的変数とみなし、他のすべての説明変数で予測したときの決定係数である。

これが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

GVIFの判断基準は、調べたが、見つからない。

VIFと同じ10でいいとは書いていない。

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なら10がおおよその基準で、10以上の場合は、どれかを多変量モデルに同時投入するのをあきらめる必要がある。

カテゴリを含めたGVIFは特に基準がないが、VIF=3, 5, 10の相関係数を覚えておくことで、だいたいの目安にする。

参考サイト

多重共線性 - Wikipedia