Rで 分散拡大係数(VIF) を確認します。
1. 分散拡大係数(VIF)とは
分散拡大係数(Variance Inflation Factor, VIF)は、重回帰分析において、説明変数間の多重共線性(Multicollinearity)の深刻度を測るための指標です。
多重共線性(マルチコ)とは?
重回帰分析では、複数の説明変数(\(x_1, x_2, ...\))を使って1つの目的変数(\(y\))を予測します。このとき、説明変数同士の相関が非常に高い状態を「多重共線性がある」と言います。
多重共線性があると、以下のような問題が発生します。
- 回帰係数(各説明変数の影響度合いを示す値)の推定値が不安定になり、少しデータが変わっただけで値が大きく変動する。
- 回帰係数の標準誤差が大きくなり、係数が統計的に有意であるかどうかの判断が難しくなる(本来は重要なはずの変数が、重要でないと判断されてしまう可能性がある)。
- 回帰係数の符号(プラスかマイナスか)が、理論的に期待されるものと逆になってしまうことがある。
VIFの役割と計算方法
VIFは、特定の説明変数が、他の説明変数によってどの程度「説明できてしまうか」を示します。
ある説明変数 \(x_k\) のVIFは、以下の手順で計算されます。
- 説明変数 \(x_k\) を「目的変数」とし、残りのすべての説明変数を「説明変数」とする回帰モデルを作成します。
- このモデルの決定係数 \(R_k^2\) を計算します。この \(R_k^2\) は、\(x_k\) が他の説明変数によってどれだけ説明されるかを示します。
- VIFを以下の式で計算します。 \[ VIF_k = \frac{1}{1 - R_k^2} \]
- \(R_k^2\) が0に近い場合: \(x_k\) は他の変数とほとんど相関がない状態です。VIFは1に近づきます。
- \(R_k^2\) が1に近い場合: \(x_k\) は他の変数によってほぼ完全に説明できてしまう状態(強い多重共線性がある)です。分母が0に近づくため、VIFは非常に大きな値になります。
VIFの目安
VIFの値は以下のように解釈されるのが一般的です。
- VIF = 1: 多重共線性は全くない(理想的)。
- 1 < VIF < 5: 許容範囲内だが、注意が必要。
- VIF > 10: 深刻な多重共線性があると考えられ、モデルの改善(変数の削除や結合など)を検討する必要があります。
2. R言語によるシミュレーション
ここでは、説明変数を4つ(x1
, x2
, x3
, x4
)用いた重回帰分析を考えます。「多重共線性がないケース」と「一部の変数間に多重共線性があるケース」を比較し、VIFがモデルに与える影響を確認します。
なお、有意水準は5%とします。
2.1. 準備:パッケージのロード
シミュレーションには car
パッケージを利用します。このパッケージにはVIFを計算する関数 vif()
が含まれています。
# パッケージのロード
library(car)
<- 20250705 seed
2.2. ケース1:多重共線性がない(低い)データのシミュレーション
まず、4つの説明変数が互いにほとんど相関しないデータを作成します。
# 乱数のシードを固定して再現性を確保
set.seed(seed)
# サンプルサイズ
<- 300
n
# 互いに独立な4つの説明変数を生成
<- rnorm(n, mean = 50, sd = 10)
x1 <- rnorm(n, mean = 50, sd = 5)
x2 <- rnorm(n, mean = 100, sd = 20)
x3 <- rnorm(n, mean = 20, sd = 2)
x4
# 目的変数yを生成
# y = 45 + 2*x1 + 4*x2 - 1.5*x3 + 5*x4 + 誤差
<- 45 + 2 * x1 + 4 * x2 - 1.5 * x3 + 5 * x4 + rnorm(n, mean = 0, sd = 25)
y
# データフレームにまとめる
<- data.frame(y, x1, x2, x3, x4)
data_case1
# 変数間の相関を確認
cat("--- 4つの説明変数間の相関係数 ---\n")
cor(data_case1[, c("x1", "x2", "x3", "x4")])
--- 4つの説明変数間の相関係数 ---
x1 x2 x3 x4
x1 1.00000000 -0.04283919 -0.11647058 -0.07012051
x2 -0.04283919 1.00000000 0.02104802 -0.01949992
x3 -0.11647058 0.02104802 1.00000000 0.05450594
x4 -0.07012051 -0.01949992 0.05450594 1.00000000
4つの説明変数間の相関係数は、いずれの組み合わせも低いことが確認できます。
モデルの構築とVIFの計算(ケース1)
# 重回帰モデルを構築
<- lm(y ~ x1 + x2 + x3 + x4, data = data_case1)
model_case1
# モデルのサマリーを表示
cat("--- 重回帰モデルのサマリー ---\n")
summary(model_case1)
# VIFを計算
cat("--- VIF ---\n")
vif(model_case1)
--- 重回帰モデルのサマリー ---
Call:
lm(formula = y ~ x1 + x2 + x3 + x4, data = data_case1)
Residuals:
Min 1Q Median 3Q Max
-63.460 -16.332 -1.417 15.517 74.958
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 50.58223 23.23931 2.177 0.0303 *
x1 2.09859 0.15037 13.956 < 2e-16 ***
x2 3.96514 0.28458 13.933 < 2e-16 ***
x3 -1.48094 0.07274 -20.360 < 2e-16 ***
x4 4.63112 0.70237 6.594 1.98e-10 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 24.64 on 295 degrees of freedom
Multiple R-squared: 0.7458, Adjusted R-squared: 0.7423
F-statistic: 216.3 on 4 and 295 DF, p-value: < 2.2e-16
--- VIF ---
x1 x2 x3 x4
1.019769 1.002648 1.016277 1.007695
考察(ケース1)
- 回帰係数: 各変数の係数(Estimate)は、設定した真の値(2, 4, -1.5, 5)に近い値が推定されています。
- VIF: すべての変数のVIFが理想的な値である1に近く、多重共線性の問題はないことが確認できます。その結果、モデルは各変数の影響を正しく安定して捉えることができています。
2.3. ケース2:一部の変数間に多重共線性があるデータのシミュレーション
次に、x1
とx2
の間に強い正の相関があるデータを作成します。x2
をx1
から生成することで、意図的に多重共線性を引き起こします。
# 乱数のシードを固定
set.seed(seed)
# サンプルサイズ
<- 300
n
# x1, x3, x4はケース1と同様に生成
<- rnorm(n, mean = 50, sd = 10)
x1 <- rnorm(n, mean = 100, sd = 20)
x3 <- rnorm(n, mean = 20, sd = 2)
x4
# x2を「x1と強い相関を持つ変数」として生成
# x2 = x1 + 小さな誤差
<- x1 + rnorm(n, mean = 0, sd = 0.5)
x2
# 目的変数yを生成
# 式はケース1と同じ。x1とx2の真の影響は「2」と「4」
<- 45 + 2 * x1 + 4 * x2 - 1.5 * x3 + 5 * x4 + rnorm(n, mean = 0, sd = 25)
y
# データフレームにまとめる
<- data.frame(y, x1, x2, x3, x4)
data_case2
# 変数間の相関を確認
cat("--- 4つの説明変数間の相関係数 ---\n")
cor(data_case2[, c("x1", "x2", "x3", "x4")])
--- 4つの説明変数間の相関係数 ---
x1 x2 x3 x4
x1 1.00000000 0.99858406 -0.04283919 -0.11647058
x2 0.99858406 1.00000000 -0.04397861 -0.11383451
x3 -0.04283919 -0.04397861 1.00000000 0.02104802
x4 -0.11647058 -0.11383451 0.02104802 1.00000000
x1とx2の相関が高いことを確認できます。
モデルの構築とVIFの計算(ケース2)
# 重回帰モデルを構築
<- lm(y ~ x1 + x2 + x3 + x4, data = data_case2)
model_case2
# モデルのサマリーを表示
cat("--- 重回帰モデルのサマリー ---\n")
summary(model_case2)
# VIFを計算
cat("--- VIF ---\n")
vif(model_case2)
--- 重回帰モデルのサマリー ---
Call:
lm(formula = y ~ x1 + x2 + x3 + x4, data = data_case2)
Residuals:
Min 1Q Median 3Q Max
-63.460 -16.332 -1.417 15.517 74.958
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 40.42753 18.45504 2.191 0.0293 *
x1 3.57412 2.80370 1.275 0.2034
x2 2.52446 2.80949 0.899 0.3696
x3 -1.50871 0.07114 -21.206 < 2e-16 ***
x4 5.19056 0.72737 7.136 7.48e-12 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 24.64 on 295 degrees of freedom
Multiple R-squared: 0.8806, Adjusted R-squared: 0.879
F-statistic: 544.2 on 4 and 295 DF, p-value: < 2.2e-16
--- VIF ---
x1 x2 x3 x4
354.524264 354.341081 1.002648 1.016277
考察(ケース2)
- 回帰係数:
- 多重共線性のない
x3
とx4
の係数は、真の値(-1.5, 5)に近く、安定して推定されています。 - 一方、多重共線性の高い
x1
とx2
の係数は、真の値(x1: 2
,x2: 4
)から外れ、両変数のp値は設定した有意水準を超えています。
- 多重共線性のない
- VIF:
-
x3
とx4
のVIFは1に近く、問題ありません。 -
x1
とx2
のVIFは約355と、危険水域の目安である10を大幅に超えています。この高いVIF値が、x1
とx2
の係数推定が不安定になった原因です。モデルは「x1
とx2
が一緒になってy
を動かしている」ことは分かっても、その貢献度をx1
とx2
に正しく分配できなかったのです。
-
3. まとめ
重回帰分析を実施する際は、VIFを算出して説明変数間の多重共線性をチェックし、もし高いVIF値を持つ変数ペアがあれば、モデルの解釈には細心の注意を払うか、変数の削除・統合といった対策を検討する必要があります。
以上です。