統計ソフトRで多重共線性をチェックするVIFを計算するには?

にほんブログ村 科学ブログ 数学へ

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

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

多重共線性とは何か?

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

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

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

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

答えは、見られない。

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

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

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

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

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

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

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

統計ソフトRでは、 相関係数を計算する関数 cor()を使う。

VIF = \frac{1}{1-r^{2}}が10より大きいと多重共線性が疑われる。

対処は、どちらかを多変量モデルからはずすこと。

longleyデータセットを用いて例示する。

cor.res <- cor(longley)
vif.res <- 1/(1-cor.res^2)

VIFが10より大きい組み合わせは、 多重共線性が疑われるので、 どちらか一方だけを多変量モデルに組み込むことにする。

> round(vif.res)
             GNP.deflator GNP Unemployed Armed.Forces Population Year Employed
GNP.deflator          Inf  60          2            1         24   57       17
GNP                    60 Inf          2            1         56  106       31
Unemployed              2   2        Inf            1          2    2        1
Armed.Forces            1   1          1          Inf          1    1        1
Population             24  56          2            1        Inf   83       13
Year                   57 106          2            1         83  Inf       18
Employed               17  31          1            1         13   18      Inf

 

統計ソフトRのパッケージにVIFを計算する関数はないか?

carライブラリにvif()という関数がある。

線形回帰 lm() や一般化線形回帰 glm() の結果を投入するだけで、 多重共線性のチェック結果を返してくれる。

vif()のすごいところは、 連続量だけでなく、 カテゴリも同時に扱えること。

Duncanというデータセットの、 incomeとeducationのVIFは2超で、 多重共線性の恐れはない。

lm.res1 <- lm(prestige ~ income + education, data=Duncan)

vif(lm.res1)

1/(1-cor(Duncan[,2:3])^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。

自由度で調整したGVIF1/(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の場合、相関係数だと、いくつになるか?

 \displaystyle 10 = \frac{1}{1-r^{2}}

 \displaystyle \frac{1}{10} = 1-r^{2}

 \displaystyle r^{2} = 0.9

 \displaystyle r \fallingdotseq \pm0.95

0.95ということはほとんどぴったり一致している状態。

カテゴリとの相関の場合は、 カテゴリごとに含まれる数字が全然違う、 例えば、カテゴリ1,2,3,4,5が、 10代、20代、30代、40代、50代と、 ほぼ各年代に分かれてしまうような場合、 不適切ということだろう。

それ以外なら、まず問題にならないと考えればいいと思う。

ちなみにVIF=5の場合は、  r^{2} = 0.8 つまり r \fallingdotseq \pm0.89で、 相関係数はだいたい0.9くらい。

VIF = 3の場合は、  r^{2} \fallingdotseq 0.67 つまり  r \fallingdotseq \pm0.82で、 相関係数はだいたい0.8くらい。

閾値(しきいち)候補として、 3, 5, 10の相関係数のイメージをもっておけばいいのではないか。

まとめ

線形回帰や一般化線形回帰で、 多変量モデルを解析する場合、 独立変数同士の相関が強すぎると、 適切な結果が得られない。

連続量だけのVIFなら10がおおよその基準。

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