多重共线性的有效检测

时间:2019-02-08 09:08:46

标签: python numpy

我需要检测大约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)

0 个答案:

没有答案