如何用python计算vif
当两个或多个解释变量彼此高度相关,以致它们在回归模型中不提供唯一或独立的信息时,就会出现回归分析中的多重共线性。
如果变量之间的相关程度足够高,则在拟合和解释回归模型时可能会出现问题。
检测多重共线性的一种方法是使用称为方差膨胀因子 (VIF) 的指标,该指标衡量回归模型中解释变量之间的相关性和相关强度。
本教程介绍如何在 Python 中计算 VIF。
示例:用 Python 计算 VIF
在本例中,我们将使用一个描述 10 名篮球运动员属性的数据集:
import numpy as np import pandas as pd #create dataset df = pd.DataFrame({'rating': [90, 85, 82, 88, 94, 90, 76, 75, 87, 86], 'points': [25, 20, 14, 16, 27, 20, 12, 15, 14, 19], 'assists': [5, 7, 7, 8, 5, 7, 6, 9, 9, 5], 'rebounds': [11, 8, 10, 6, 6, 9, 6, 10, 10, 7]}) #view dataset df rating points assists rebounds 0 90 25 5 11 1 85 20 7 8 2 82 14 7 10 3 88 16 8 6 4 94 27 5 6 5 90 20 7 9 6 76 12 6 6 7 75 15 9 10 8 87 14 9 10 9 86 19 5 7
假设我们想要拟合一个多元线性回归模型,使用得分作为响应变量,得分、助攻和篮板作为解释变量。
要计算模型中每个解释变量的 VIF,我们可以使用 statsmodels 库中的variance_inflation_factor()函数:
from patsy import damatrices from statsmodels.stats.outliers_influence import variance_inflation_factor #find design matrix for linear regression model using 'rating' as response variable y, X = dmatrices('rating ~ points+assists+rebounds', data=df, return_type='dataframe') #calculate VIF for each explanatory variable vivid = pd.DataFrame() vive['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])] vivid['variable'] = X.columns #view VIF for each explanatory variable lively Variable VIF 0 101.258171 Intercept 1 1.763977 points 2 1.959104 assists 3 1.175030 rebounds
我们可以观察每个解释变量的VIF值:
- 积分: 1.76
- 助攻: 1.96
- 篮板数: 1.18
注意:忽略模板中“Intercept”的 VIF,因为该值不相关。
如何解释 VIF 值
VIF 值从 1 开始,没有上限。解释 VIF 的一般规则是:
- 值为 1 表示给定解释变量与模型中的任何其他解释变量之间不存在相关性。
- 1 到 5 之间的值表示给定解释变量与模型中的其他解释变量之间存在中等相关性,但通常没有严重到需要特别注意的程度。
- 大于 5 的值表示给定解释变量与模型中的其他解释变量之间可能存在严重相关性。在这种情况下,回归结果中的系数估计和 p 值可能不可靠。
由于我们的回归模型中解释变量的每个 VIF 值都接近于 1,因此多重共线性在我们的示例中不是问题。