我知道用stata和R的更多,此处仅基于兴趣摸索,本文数据和方法均来自于朱顺全老师的教程
核心代码 书上老师使用的方法是一个一个计算,可维护性有点低,所以我就优化了一下
1 2 X_with_const = sm.add_constant(X) vif_values = [variance_inflation_factor(X_with_const.values, i) for i in range (X_with_const.shape[1 ])]
使用了statsmodels.stats.outliers_influence 模块里面的 variance_inflation_factor 函数
首先,在X矩阵中添加常数项以符合 variance_inflation_factor 函数的计算要求
然后,使用 X_with_const.value 来返回 variance_inflation_factor 函数计算需要的 NumPy 数组
然后,使用 range(X_with_const.shape[1]) 来生成一个从 0 到 X_with_const 矩阵的列数(即特征数加一,因为有常数项)减一的整数序列。因为 shape[1] 返回的是矩阵的列数,所以这个序列包含了从 0 到列数减一的所有索引。
最后,使用 variance_inflation_factor 函数来计算给定 X_with_const.values 中第 i 个特征的 VIF
完整代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import pandas as pdimport numpy as npimport statsmodels.api as smfrom statsmodels.stats.outliers_influence import variance_inflation_factorfrom patsy import dmatrices data=pd.DataFrame() data=pd.DataFrame(pd.read_excel('C:\\Users\\cyx94a\\Desktop\\Python\\data\\al7-1.xls' ))vars =['run' ,'z1' ,'z2' ,'z3' ] df=data[vars ] y,X=dmatrices('run~z1+z2+z3' ,data=df,return_type='dataframe' )print (data.describe())print (data.corr()) model=sm.OLS(y,X) fit=model.fit()print (fit.summary()) X_with_const = sm.add_constant(X) vif_values = [variance_inflation_factor(X_with_const.values, i) for i in range (X_with_const.shape[1 ])] print ("VIF values:" , vif_values)