Toinen lähestymistapa monikollineaarisuuden tunnistamiseen on varianssin inflaatiokerroin. VIF ilmaisee, kuinka suuri prosenttiosuus varianssista on paisunut kunkin muuttujan kertoimen osalta. Alkaen arvosta 1 (ei kollineaarisuutta), VIF-arvo 1-5 osoittaa kohtalaista kollineaarisuutta, kun taas arvot yli 5 osoittavat suurta kollineaarisuutta. Joitakin tapauksia, joissa korkea VIF olisi hyväksyttävä, ovat esimerkiksi vuorovaikutustermien, polynomitermien tai dummy-muuttujien (nimelliset muuttujat, joissa on kolme tai useampia luokkia) käyttö. Korrelaatiomatriisien avulla voidaan tunnistaa muuttujaparien välinen korrelaatio, kun taas VIF mahdollistaa multikollineaarisuuden kokonaisarvioinnin. Useimpien jatkuvien muuttujien korrelaatiomatriisi esitetään jäljempänä, jotta erilaiset kollineaariset muuttujaparit tulevat esiin. VIF voidaan laskea käyttämällä statsmodels-pakettia; alla olevassa koodilohkossa esitetään VIF-arvot, kun kollineaariset muuttujat on sisällytetty (vasemmalla) ja poistettu (oikealla).
# 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-arvot vastaavat korrelaatiomatriisia; esimerkiksi muuttujaparin NOX ja INDUS korrelaatiokerroin on yli 0.5 (0,61), ja vastaavat VIF-arvot ovat yli 5. Kollineaaristen muuttujien RAD ja NOX poistaminen paransi VIF-lukuja. Yhteensopivien muuttujien poistaminen pelkästään korkeimman VIF-luvun perusteella ei ole taattu tapa rakentaa parhaiten toimiva malli, kuten seuraavassa jaksossa selvitetään.
Rakennamme perusmallin poistamalla kaikki korrelaatiomatriisissa tunnistetut (edellä esitetyt) yhteensopivat muuttujat ja odottelemalla, että seuraavaksi poistetaan TAX ja RAD.
# 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)
Vaikkakin näyttää siltä, että TAX-muuttujan pudottaminen VIF:n perusteella näyttää olevan parempi, varovaisempi lähestymistapa on tarkistaa oikaistun R-kvartiilimittarin avulla (oikaistuna ennustajien lukumäärän mukaan mittari kasvaa vain, jos seuraavaksi lisätty muuttuja parantaa mallia enemmän kuin olisi odotettavissa sattuman perusteella).
# 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)
Korkeammasta oikaistusta R-neliö -lukua, voimme päätellä, että malli toimii paremmin, kun RAD-muuttuja jätetään pois! Kun monikollineaarisuusongelma on ratkaistu, seuraavaksi voitaisiin tutkia vuorovaikutustermien lisäämistä mallin suorituskyvyn parantamiseksi
.