En anden metode til at identificere multikollinearitet er via variansinflationsfaktoren. VIF angiver den procentdel af variansen, der er inflateret for hver variabelkoefficient. Begyndende ved en værdi på 1 (ingen kollinearitet) angiver en VIF mellem 1-5 moderat kollinearitet, mens værdier over 5 angiver høj kollinearitet. Nogle tilfælde, hvor en høj VIF ville være acceptabel, omfatter brugen af interaktionstermer, polynomiske termer eller dummy-variabler (nominelle variabler med tre eller flere kategorier). Korrelationsmatricer gør det muligt at identificere korrelation mellem variabelpar, mens VIF gør det muligt at foretage en samlet vurdering af multikollinearitet. Korrelationsmatrixen for de fleste af de kontinuerte variabler er vist nedenfor for at fremhæve de forskellige kollineære variabelpar. VIF kan beregnes ved hjælp af statsmodels-pakken; kodeblokken nedenfor viser VIF-værdierne med kollineære variabler inkluderet (til venstre) og fjernet (til højre).
# 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)
VIF-værdierne svarer til korrelationsmatrixen; f.eks. er korrelationskoefficienten for variabelparret NOX og INDUS over 0.5 (0,61), og de respektive VIF-værdier er over 5. Fjernelsen af de kollineære variabler RAD og NOX forbedrede VIF-værdierne. At fjerne kollineære variabler udelukkende på grundlag af det højeste VIF-tal er ikke en garanteret måde at opbygge den bedst fungerende model på, hvilket uddybes i næste afsnit.
Vi opbygger en basismodel ved at fjerne alle kollineære variabler, der er identificeret i korrelationsmatrixen (vist ovenfor), i afventning af TAX og RAD, der skal fjernes som de næste.
# 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)
Mens det ser ud til at droppe TAX-variablen baseret på VIF synes at være bedre, en forsigtig tilgang er at kontrollere via den justerede R-squared-metrikken (justeret for antallet af prædiktorer, metrikken stiger kun, hvis den næste tilføjede variabel forbedrer modellen mere, end det ville være forventet ved en tilfældighed).
# 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)
Fra den højere justerede R-kvadreret tal, kan vi udlede, at modellen klarer sig bedre, når RAD-variablen er udeladt! Nu hvor problemet med multikollinearitet er løst, kunne det næste skridt være at undersøge tilføjelsen af interaktionstermer for potentielt at øge modellens ydeevne.