Эффективное обнаружение мультиколлинеарности - PullRequest
0 голосов
/ 08 февраля 2019

Мне нужно обнаружить наличие множественной коллинеарности для примерно 1000 наборов переменных. И через содержимое здесь изучить и построить следующие функции. Коэффициент инфляции дисперсии в 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)

Но эта функция вычисляется очень медленно, поэтому мне нужен более эффективный подход.Я заметил, что алгоритм в следующем посте был более эффективным, поэтому я создал эффективную версию. Получение высокой мультиколлинеарности в статистических моделях

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...