Innym podejściem do identyfikacji wieloliniowości jest współczynnik inflacji wariancji. VIF wskazuje procent wariancji zawyżonej dla współczynnika każdej zmiennej. Zaczynając od wartości 1 (brak współliniowości), VIF pomiędzy 1-5 wskazuje na umiarkowaną współliniowość, podczas gdy wartości powyżej 5 wskazują na wysoką współliniowość. Niektóre przypadki, w których wysoki VIF byłby do zaakceptowania, obejmują użycie terminów interakcji, terminów wielomianowych lub zmiennych dummy (zmiennych nominalnych z trzema lub więcej kategoriami). Macierze korelacji umożliwiają identyfikację korelacji między parami zmiennych, natomiast VIF umożliwia ogólną ocenę wieloliniowości. Poniżej przedstawiono macierz korelacji dla większości zmiennych ciągłych, aby podkreślić różne współliniowe pary zmiennych. VIF można obliczyć za pomocą pakietu statsmodels; poniższy blok kodu przedstawia wartości VIF z uwzględnionymi (po lewej) i usuniętymi (po prawej) zmiennymi współliniowymi.
# Setting the predictor variables
X_o = df_wdummy]
X_r1 = df_wdummy]#
from statsmodels.stats.outliers_influence import variance_inflation_factorvif = pd.Series()], index=X_o.columns,
name='vif_full')
vif_r = pd.Series()], index=X_r1.columns,
name='vif_collinear_rvmd')
pd.concat(, axis=1)
Wartości VIF odpowiadają macierzy korelacji; na przykład, zmienna-para NOX i INDUS, współczynnik korelacji jest powyżej 0.5 (0,61), a odpowiednie wartości VIF są powyżej 5. Usunięcie współliniowych zmiennych RAD i NOX poprawiło wartości VIF. Usunięcie współliniowych zmiennych wyłącznie w oparciu o najwyższą wartość VIF nie jest gwarantowanym sposobem na zbudowanie najlepiej działającego modelu, co zostało omówione w następnej sekcji.
Budujemy model bazowy poprzez usunięcie wszystkich współliniowych zmiennych zidentyfikowanych w macierzy korelacji (przedstawionej powyżej), oczekując na usunięcie TAX i RAD w następnej kolejności.
# Baseline variables
X_bl = df_wdummy]
y_bl = df_wdummy# Explore mitigating multi-collinearity
vif_bl = pd.Series()], index=X_bl.columns,
name='vif_bl')X_noTAX = X_bl.drop(,axis=1)
X_noRAD = X_bl.drop(,axis=1)
vif_noTAX = pd.Series()],
index=X_noTAX.columns, name='vif_noTAX')
vif_noRAD = pd.Series()],
index=X_noRAD.columns, name='vif_noRAD')
pd.concat(, axis=1)
Choć wydaje się, że upuszczenie zmiennej TAX na podstawie VIF jest lepsze, ostrożnym podejściem jest sprawdzenie za pomocą skorygowanej metryki R-squared (skorygowanej o liczbę predyktorów, metryka wzrasta tylko wtedy, gdy kolejna dodana zmienna poprawia model bardziej niż można by się spodziewać przez przypadek).
# Without TAX
model = sm.OLS(y, sm.add_constant(X_noTAX)).fit()
print_model = model.summary()
print(print_model)
# Without RAD
model = sm.OLS(y, sm.add_constant(X_noRAD)).fit()
print_model = model.summary()
print(print_model)
.
Z wyższej skorygowanej wartości R-squared, możemy wywnioskować, że model działa lepiej, gdy zmienna RAD została usunięta! Po rozwiązaniu problemu wieloliniowości, następnym krokiem może być zbadanie możliwości dodania warunków interakcji, aby potencjalnie zwiększyć wydajność modelu.
.