統計ER

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

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

ブログランキングに参加しています。
まずはぽちぽちっとお願いします。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
にほんブログ村 科学ブログ 数学へ

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

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

エクセルでもできるようにしたので、よかったらどうぞ(2020年4月9日追記)

多重共線性とは何か?

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

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

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

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

答えは、見られない。

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

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

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

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

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

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

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

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

VIF =  \displaystyle \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超で、多重共線性の恐れはない。

library(car) #使うときに毎回

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。

自由度で調整した 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の相関係数のイメージをもっておけばいいのではないか。

まとめ(2020年12月8日文章に加筆)

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

独立変数同士の相関が強すぎる状態を多重共線性があると言う。この多重共線性を避けるためにVIFのチェックが必要である。

連続量だけのVIFなら10がおおよその基準で、10以上の場合は、どちらかの変数を多変量モデルに同時投入するのをあきらめる必要がある。

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

多重共線性をチェックするVIFを統計ソフトRで計算するには?【動画】(2020年12月9日追記)

youtu.be

エクセルでVIFを計算する(2020年4月9日追記)

統計ソフトRで計算したlongleyのデータによるVIFをエクセルで計算させてみようと思う。手順は以下の通り。

  1. 統計ソフトRの組み込みデータlongleyをcsvファイルに書き出す。
  2. エクセルに読み込む。
  3. エクセルシート上で相関係数を計算する。
  4. VIFをエクセルのシート上で計算する。

エクセルで計算するために例題のデータを統計ソフトRから書きだす

統計ソフトRのスクリプトは以下の通り。

write.csv(longley, file="C:/data/longley.csv")

エクセルでCSVファイルを開く

Office 365で開いているけど、基本的には普通のエクセルと同じ。

f:id:toukeier:20200409202958p:plain

エクセルシート上で相関係数を計算する

=correl(配列1, 配列2)を使用して計算する。

f:id:toukeier:20200409212410p:plain

VIFを計算する

=1/(1-相関係数2)で計算できる。計算結果は整数にまとめている。

f:id:toukeier:20200409212240p:plain

エクセルファイルは以下のリンクから。よかったらどうぞ。

VIF 計算機【エクセル計算機】 | HHA SHOP