En annan metod för att identifiera multikollinearitet är variansinflationsfaktorn. VIF anger hur stor andel av variansen som är inflaterad för varje variabels koefficient. Med utgångspunkt i värdet 1 (ingen kollinearitet) indikerar en VIF mellan 1-5 måttlig kollinearitet medan värden över 5 indikerar hög kollinearitet. Några fall där hög VIF skulle vara acceptabel är interaktionstermer, polynomtermer eller dummyvariabler (nominella variabler med tre eller fler kategorier). Korrelationsmatriser gör det möjligt att identifiera korrelation mellan variabelpar medan VIF gör det möjligt att göra en övergripande bedömning av multikollinearitet. Korrelationsmatrisen för de flesta av de kontinuerliga variablerna presenteras nedan för att belysa de olika kollinjära variabelparen. VIF kan beräknas med hjälp av paketet statsmodels; i kodblocket nedan visas VIF-värdena med kollinjära variabler inkluderade (till vänster) och borttagna (till höger).
# 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ärdena motsvarar korrelationsmatrisen; till exempel, för variablerna NOX och INDUS är korrelationskoefficienten över 0.5 (0,61), och respektive VIF-värden är över 5. Genom att ta bort de kollinjära variablerna RAD och NOX förbättrades VIF-värdena. Att ta bort kollinjära variabler enbart på grundval av det högsta VIF-talet är inte ett garanterat sätt att bygga upp den bäst presterande modellen, vilket utvecklas i nästa avsnitt.
Vi bygger en grundmodell genom att ta bort alla kollinjära variabler som identifierats i korrelationsmatrisen (som visas ovan), i avvaktan på att TAX och RAD ska tas bort härnäst.
# 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)
Medans det verkar som att det är bättre att släppa TAX-variabeln baserat på VIF, är ett försiktigt tillvägagångssätt att kontrollera med hjälp av det justerade R-kvadratiska måttet (justerat för antalet prediktorer ökar måttet endast om nästa tillagda variabel förbättrar modellen mer än vad som skulle kunna förväntas av en slump).
# 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)
Från den högre justerade R-kvadrat, kan vi dra slutsatsen att modellen fungerar bättre om RAD-variabeln tas bort! När problemet med multikollinearitet har lösts kan nästa steg vara att utforska tillägget av interaktionstermer för att potentiellt öka modellens prestanda.