如何在 r 中计算方差膨胀因子 (vif)
当两个或多个预测变量彼此高度相关时,就会出现回归分析中的多重共线性,以致它们不会在回归模型中提供唯一或独立的信息。
如果变量之间的相关程度足够高,则在拟合和解释回归模型时可能会出现问题。
检测多重共线性的最常见方法是使用方差膨胀因子 (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作为响应变量,使用disp 、 hp 、 wt和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 ,这表明总体回归模型显着。此外,预测变量hp和wt在 0.05 显着性水平上具有统计显着性,而disp和drat则不然。
接下来,我们将使用库的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
我们可以看到disp和wt的 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与其他三个预测变量高度相关,这解释了为什么它的 VIF 值如此之高。
在这种情况下,您可能需要从模型中删除disp ,因为它的 VIF 值很高,并且在 0.05 显着性水平下不具有统计显着性。
请注意,相关矩阵和 VIF 将为您提供类似的信息:它们都会告诉您某个变量何时与回归模型中的一个或多个其他变量高度相关。