Hoe de variantie-inflatiefactor (vif) in r te berekenen
Multicollineariteit bij regressieanalyse treedt op wanneer twee of meer voorspellende variabelen sterk met elkaar gecorreleerd zijn, zodat ze geen unieke of onafhankelijke informatie verschaffen in het regressiemodel.
Als de mate van correlatie tussen variabelen hoog genoeg is, kan dit problemen veroorzaken bij het aanpassen en interpreteren van het regressiemodel .
De meest gebruikelijke manier om multicollineariteit te detecteren is het gebruik van de variantie-inflatiefactor (VIF), die decorrelatie en sterkte van de correlatie tussen voorspellende variabelen in een regressiemodel meet.
De VIF-waarde begint bij 1 en heeft geen bovengrens. Een algemene regel voor het interpreteren van VIF’s is:
- Een waarde van 1 geeft aan dat er geen correlatie bestaat tussen een bepaalde voorspellende variabele en enige andere voorspellende variabele in het model.
- Een waarde tussen 1 en 5 duidt op een gematigde correlatie tussen een bepaalde voorspellende variabele en andere voorspellende variabelen in het model, maar deze is vaak niet ernstig genoeg om speciale aandacht te vereisen.
- Een waarde groter dan 5 duidt op een potentieel ernstige correlatie tussen een bepaalde voorspellende variabele en andere voorspellende variabelen in het model. In dit geval zijn de coëfficiëntschattingen en p-waarden in de regressieresultaten waarschijnlijk onbetrouwbaar.
Houd er rekening mee dat er enkele gevallen zijn waarin hoge VIF-waarden veilig kunnen worden genegeerd .
Hoe VIF in R te berekenen
Om te illustreren hoe VIF voor een regressiemodel in R kan worden berekend, zullen we de ingebouwde mtcars- dataset gebruiken:
#view first six lines of mtcars
head(mtcars)
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
#Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
#Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
#Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
Eerst zullen we een regressiemodel passen met mpg als de responsvariabele en disp , hp , wt en drat als de voorspellende variabelen:
#fit the regression model model <- lm(mpg ~ disp + hp + wt + drat, data = mtcars) #view the output of the regression model summary(model) #Call: #lm(formula = mpg ~ disp + hp + wt + drat, data = mtcars) # #Residuals: # Min 1Q Median 3Q Max #-3.5077 -1.9052 -0.5057 0.9821 5.6883 # #Coefficients: #Estimate Std. Error t value Pr(>|t|) #(Intercept) 29.148738 6.293588 4.631 8.2e-05 *** #available 0.003815 0.010805 0.353 0.72675 #hp -0.034784 0.011597 -2.999 0.00576 ** #wt -3.479668 1.078371 -3.227 0.00327 ** #drat 1.768049 1.319779 1.340 0.19153 #--- #Significant. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 # #Residual standard error: 2.602 on 27 degrees of freedom #Multiple R-squared: 0.8376, Adjusted R-squared: 0.8136 #F-statistic: 34.82 on 4 and 27 DF, p-value: 2.704e-10
Uit het resultaat kunnen we zien dat de R-kwadraatwaarde van het model 0,8376 is. We kunnen ook zien dat de totale F-statistiek 34,82 is en de overeenkomstige p-waarde 2,704e-10 , wat aangeeft dat het algehele regressiemodel significant is. Bovendien zijn de voorspellende variabelen hp en wt statistisch significant op het significantieniveau van 0,05, terwijl disp en drat dat niet zijn.
Vervolgens zullen we de vive()- functie van de bibliotheek gebruiken om de VIF voor elke voorspellende variabele in het model te berekenen:
#load the car library library(car) #calculate the VIF for each predictor variable in the model lively(model) # disp hp wt drat #8.209402 2.894373 5.096601 2.279547
We kunnen zien dat de VIF’s voor disp en wt groter zijn dan 5, wat mogelijk zorgwekkend is.
VIF-waarden bekijken
Om de VIF-waarden voor elke voorspellende variabele te visualiseren, kunnen we een eenvoudig horizontaal staafdiagram maken en een verticale lijn toevoegen bij 5, zodat we duidelijk kunnen zien welke VIF-waarden groter zijn dan 5:
#create vector of VIF values vive_values <- vive(model) #create horizontal bar chart to display each VIF value barplot(vif_values, main = "VIF Values", horiz = TRUE, col = "steelblue") #add vertical line at 5 abline(v = 5, lwd = 3, lty = 2)
Merk op dat dit type diagram het nuttigst zou zijn voor een model met veel voorspellende variabelen, zodat we gemakkelijk alle VIF-waarden in één keer kunnen bekijken. In dit voorbeeld is het echter een nuttig diagram.
Afhankelijk van welke VIF-waarde u te hoog vindt om in het model op te nemen, kunt u ervoor kiezen bepaalde voorspellende variabelen te verwijderen en te kijken of de overeenkomstige R-kwadraatwaarde of standaardfout van het model wordt beïnvloed.
Visualiseren van correlaties tussen voorspellende variabelen
Om beter te begrijpen waarom een voorspellende variabele een hoge VIF-waarde kan hebben, kunnen we een correlatiematrix maken om de lineaire correlatiecoëfficiënten tussen elk paar variabelen weer te geven:
#define the variables we want to include in the correlation matrix data <- mtcars[, c("disp", "hp", "wt", "drat")] #create correlation matrix cor(data) # disp hp wt drat #available 1.0000000 0.7909486 0.8879799 -0.7102139 #hp 0.7909486 1.0000000 0.6587479 -0.4487591 #wt 0.8879799 0.6587479 1.0000000 -0.7124406 #drat -0.7102139 -0.4487591 -0.7124406 1.0000000
Bedenk dat de disp- variabele een VIF-waarde had groter dan 8, wat de hoogste VIF-waarde was van alle voorspellende variabelen in het model. Uit de correlatiematrix kunnen we zien dat disp sterk gecorreleerd is met de andere drie voorspellende variabelen, wat verklaart waarom de VIF-waarde zo hoog is.
In dit geval wilt u wellicht disp uit het model verwijderen, omdat de VIF-waarde hoog is en niet statistisch significant is op het significantieniveau van 0,05.
Merk op dat een correlatiematrix en een VIF u vergelijkbare informatie zullen verschaffen: ze vertellen u allebei wanneer een variabele sterk gecorreleerd is met een of meer andere variabelen in een regressiemodel.
Verder lezen:
Een gids voor multicollineariteit en VIF in regressie
Wat is een goede R-kwadraatwaarde?