R で分散膨張係数 (vif) を計算する方法


回帰分析における多重共線性は、2 つ以上の予測変数が相互に高度に相関しており、回帰モデル内で固有または独立した情報を提供しない場合に発生します。

変数間の相関度が十分に高い場合、回帰モデルのフィッティングと解釈の際に問題が発生する可能性があります。

多重共線性を検出する最も一般的な方法は、回帰モデル内の予測変数間の 相関と相関の強さを測定する分散膨張係数 (VIF) を使用することです。

VIF 値は 1 から始まり、上限はありません。 VIF を解釈するための一般的なルールは次のとおりです。

  • 値 1 は、モデル内の特定の予測子変数と他の予測子変数の間に相関がないことを示します。
  • 1 ~ 5 の値は、モデル内の特定の予測子変数と他の予測子変数の間に中程度の相関関係があることを示しますが、多くの場合、特別な注意を必要とするほど深刻ではありません。
  • 5 より大きい値は、モデル内の特定の予測子変数と他の予測子変数の間に重大な相関関係がある可能性があることを示します。この場合、回帰結果の係数推定値と p 値は信頼できない可能性があります。

高い VIF 値を無視しても安全な場合があることに注意してください。

RでVIFを計算する方法

R で回帰モデルの VIF を計算する方法を説明するために、組み込みのmtcarsデータセットを使用します。

 #view first six lines of mtcars
head(mtcars)

# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
#Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
#Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
#Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1

まず、応答変数としてmpg を、予測変数としてdisphpwt 、およびdratを使用して回帰モデルを近似します。

 #fit the regression model
model <- lm(mpg ~ disp + hp + wt + drat, data = mtcars)

#view the output of the regression model
summary(model)

#Call:
#lm(formula = mpg ~ disp + hp + wt + drat, data = mtcars)
#
#Residuals:
# Min 1Q Median 3Q Max 
#-3.5077 -1.9052 -0.5057 0.9821 5.6883 
#
#Coefficients:
#Estimate Std. Error t value Pr(>|t|)    
#(Intercept) 29.148738 6.293588 4.631 8.2e-05 ***
#available 0.003815 0.010805 0.353 0.72675    
#hp -0.034784 0.011597 -2.999 0.00576 ** 
#wt -3.479668 1.078371 -3.227 0.00327 ** 
#drat 1.768049 1.319779 1.340 0.19153    
#---
#Significant. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#
#Residual standard error: 2.602 on 27 degrees of freedom
#Multiple R-squared: 0.8376, Adjusted R-squared: 0.8136 
#F-statistic: 34.82 on 4 and 27 DF, p-value: 2.704e-10

結果から、モデルのR 二乗値は0.8376であることがわかります。また、全体的な F 統計量34.82で、対応する p 値が2.704e-10であることもわかります。これは、全体的な回帰モデルが有意であることを示しています。さらに、予測変数hpwt は有意水準 0.05 で統計的に有意ですが、 dispdrat は有意ではありません。

次に、ライブラリのvive()関数を使用して、モデル内の各予測子変数の VIF を計算します

 #load the car library
library(car)

#calculate the VIF for each predictor variable in the model
lively(model)

# disp hp wt drat 
#8.209402 2.894373 5.096601 2.279547 

dispwtの VIF が 5 より大きいことがわかりますが、これは潜在的に懸念事項です。

VIF 値の表示

各予測変数の VIF 値を視覚化するには、単純な水平棒グラフを作成し、5 の位置に垂直線を追加して、どの VIF 値が 5 を超えているかを明確に確認できます。

 #create vector of VIF values
vive_values <- vive(model)

#create horizontal bar chart to display each VIF value
barplot(vif_values, main = "VIF Values", horiz = TRUE, col = "steelblue")

#add vertical line at 5
abline(v = 5, lwd = 3, lty = 2)

このタイプのチャートは、多くの予測子変数を持つモデルに最も役立つため、すべての VIF 値を一度に簡単に表示できることに注意してください。ただし、この例では便利なチャートです。

どの VIF 値が高すぎてモデルに含めることができないと考えるかに応じて、特定の予測子変数を削除し、モデルの対応するR 二乗値または標準誤差が影響を受けるかどうかを確認できます。

予測変数間の相関関係の視覚化

予測子変数の VIF 値が高い理由をより深く理解するために、相関行列を作成して、変数の各ペア間の線形相関係数を表示できます。

 #define the variables we want to include in the correlation matrix
data <- mtcars[, c("disp", "hp", "wt", "drat")]

#create correlation matrix
cor(data)

# disp hp wt drat
#available 1.0000000 0.7909486 0.8879799 -0.7102139
#hp 0.7909486 1.0000000 0.6587479 -0.4487591
#wt 0.8879799 0.6587479 1.0000000 -0.7124406
#drat -0.7102139 -0.4487591 -0.7124406 1.0000000

disp変数の VIF 値が 8 を超えていたことを思い出してください。これは、モデル内のすべての予測子変数の中で最も高い VIF 値でした。相関行列から、 disp が他の 3 つの予測子変数と高い相関関係にあることがわかり、これが VIF 値が非常に高い理由を説明しています。

この場合、VIF 値が高く有意水準 0.05 では統計的に有意ではないため、モデルからdispを削除することができます。

相関行列と VIF は同様の情報を提供することに注意してください。どちらも、ある変数が回帰モデル内の 1 つ以上の他の変数と高い相関関係にあることを示します。

参考文献:
回帰における多重共線性と VIF のガイド
適切な R 二乗値はどれくらいですか?

コメントを追加する

メールアドレスが公開されることはありません。 が付いている欄は必須項目です