我需要检测大约1000组变量的多重共线性,并通过此处的内容学习和构造以下函数。 Variance Inflation Factor in Python
from statsmodels.regression.linear_model import OLS
def vif(X):
''' vif : variance inflation factors '''
exog = X - np.nanmean(X,0); variables = np.arange(exog.shape[1])
vifs = np.r_[[OLS(exog[:,i], exog[:,variables!=i]).fit().rsquared for i in variables]]
return 1/(1.-vifs)
但是此函数的计算非常慢,因此我需要一种更有效的方法。我注意到以下文章中的算法更加有效,因此我构建了一个有效的版本。 Capturing high multi-collinearity in statsmodels
def vif2(X):
corr = np.corrcoef(X, rowvar=0)
w, v = np.linalg.eig(corr)
xx = ((v**2)/(w**2)).sum(1)
return xx/xx.max()
此快速版本比标准版本快100倍。但是我不确定结果是否准确,因为结果存在明显差异。而且我不了解两者之间的差异是源于计算方式还是错误,还是构建方式。因此,我需要建议和可能的帮助,谢谢。
x = np.random.randn(100,30)
%timeit vif(x)
%timeit vif2(x)
3.79 s ± 392 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
40 ms ± 10.6 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)