多重共線性とVIF統計量の求め方

多重共線性

説明変数間の関係に、線形従属の関係が成り立つとき、これを「完全な多重共線性がある」という。

説明変数間に高い関連性がある時、多重共線性があるという。

完全な多重共線性でなくても、高い関連性が認められたときは、多重共線性に配慮しなければならない。

多重共線性がある場合、回帰係数を正しく計算できなくなります

多重共線性がある場合、推定偏回帰係数の分散が大きくなる。

一般的にVIF統計量が10以上であれば、多重共線性が存在している可能性があります。
なので、VIFが10以上になるかどうかチェックします。

VIFとは

VIFは、Variance Inflation Factorの略です。
日本語でいうと、分散拡大要因です。

統計学における分散拡大係数(variance inflation factor, VIF) とは、最小二乗回帰分析における多重共線性の深刻さを定量化する。推定された回帰係数の分散(推定値の標準偏差の平方)が、多重共線性のためにどれだけ増加したかを測る指標を提供する。
分散拡大係数-Wikipedia

VIFの求め方

VIFの求め方は、何通りかあります。

VIFの求め方は、2つ目で紹介する「決定係数を使ったVIFの求め方」が一般的です。

1つ目の「説明変数間の相関係数を使ったVIFの求め方」では、各説明変数間の相関について調べています。
組み合わせが
$$\begin{eqnarray}{}_n \mathrm{ C }_k = \frac{ n! }{ k! ( n – k )! }\end{eqnarray}$$
と、増加するため、説明変数間のグルーピング(変数の選択)が、かなり複雑になります。

1つは、説明変数間の相関係数を使ったVIFの求め方

2つは、決定係数を使ったVIFの求め方

説明変数間の相関係数を使ったVIF


$$VIF=\frac{ 1 }{ 1 – r^2 }$$
$$rは、相関係数です。r = \frac{ \sigma_{x1x2} }{ \sigma_{x1} \sigma_{x2} }$$
$$\sigma_{x1x2}は、共分散$$

$$\sigma_{x1}と\sigma_{x2}は、標準偏差(分散の平方根)です。$$

計算例

今回は、多重共線性とVIF統計量で説明変数間での相関を調べるのデータを使ってVIF統計量を計算します。
使用するデータは、変数が3つです。
変数をそれぞれx1,x2,x3とします。
比較する組み合わせは、下図のように3通りです。

これは、高校数学でやった組み合わせで計算します。
nは、変数の数です。kは、2となります。
$$\begin{eqnarray}{}_n \mathrm{ C }_k = \frac{ n! }{ k! ( n – k )! }\end{eqnarray}$$

Excel(Numbers)で相関係数VIF

相関係数を求めるには、CORREL(列1,列2)を使います。
Numbersについても同じ関数です。

C++で相関係数VIF

C++のプログラムは、以下のリンクにあります。

C++でVIFを計算する

練習問題として、
多重共線性とVIF統計量で説明変数間での相関を調べる
の問題を解いています。

Pythonで相関係数VIF

Pythonのコードは以下のリンクにあります。

PythonでVIFを求める-ライブラリを使わない編

決定係数を使ったVIF

以下の計算アルゴリズムは、分散拡大係数-wikiを参照しました。

分かりやすいので、ぜひ参照してほしいです。

以下の k 個の独立変数を持った線形モデル(linear model)を考える。

Y = β0 + β1 X1 + β2 X 2 + … + βk Xk + ε

ステップ1

最初に、Xiを目的変数とし、他の変数を説明変数とした最小二乗回帰を行う。 i = 1 であれば、以下のような等式となる。

$${\displaystyle X_{1}=\alpha _{2}X_{2}+\alpha _{3}X_{3}+\cdots +\alpha _{k}X_{k}+c_{0}+e}$$

ここで、c0 は定数であり、e は誤差である。

ステップ2

次式により、 $${\displaystyle {\hat {\beta }}_{i}}$$に対する VIF ファクターを計算する。

$${\displaystyle \mathrm {VIF_{i}} ={\frac {1}{1-R_{i}^{2}}}}$$
ここで、R2i はステップ1における回帰の決定係数である。

ステップ3

$${\displaystyle VIF ({\hat {\beta }}_{i})}$$の大きさを考慮し、多重共線性の程度を分析する。

決定係数の求め方

決定係数の求め方は、決定係数-wikiを参照しました。

$${\displaystyle R^{2}\equiv 1-{\sum _{i}(y_{i}-f_{i})^{2} \over \sum _{i}(y_{i}-{\bar {y}})^{2}}}$$

説明変数が多い場合の自由度調整済みの決定係数

$${\displaystyle R’^{2}\equiv 1-{{\sum _{i}(y_{i}-f_{i})^{2}/(N-p-1)} \over {\sum _{i}(y_{i}-{\bar {y}})^{2}/(N-1)}}}$$

Pythonの場合

PythonでVIFを確認するには、ライブラリを使うと便利です。

Pythonでライブラリを使ったVIFの求め方

予測と分析における多重共線性

予測と分析では、多重共線性の捉え方が違うのではないかと思っています。
(論理的な・理論的な話ではありませんが)

多重共線性が認められるデータを使って、重回帰分析をしたとします。

この場合、経験として、

  1. 多重共線性が認められたデータのまま重回帰分析を行ったときの予測誤差
  2. 多重共線性を除去したデータで重回帰分析を行ったときの予測誤差

では、多重共線性が認められたデータのまま重回帰分析を行ったときの予測誤差の方が、小さい印象です。

予測の場合では、予測誤差が小さい方が良いので、「多重共線性が認められたデータ」でも良いのではないかと思います。
ただし、オーバーフィッティング気味という話を聞いた気がします。。。

分析の場合は、推定偏回帰係数の検定(t検定やF検定など)をする必要があるので、多重共線性が認められたデータを使うのは問題があると思います。

また、機械学習の参考書では、多重共線性の話が出てくるものが少ない印象です。
機械学習では、予測に重きを置くというイメージです。

一方、統計学の参考書では、多重共線性の話が出てきます。
(多重共線性までの話が出てくるが、詳しく書いている本は少なめな印象)

統計学は、分析に重きを置くというイメージです。

このように、予測と分析では、多重共線性における捉え方が違うのかなと思っています。

参考