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

VIFとは

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

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

多重共線性

説明変数間に高い関連性がある時、多重共線性があるという。
多重共線性がある場合、回帰係数を正しく計算できなくなります

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

VIFの求め方

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

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の求め方

参考