Jak obliczyć współczynnik inflacji wariancji (vif) w r


Wielokolinearność w analizie regresji ma miejsce, gdy dwie lub więcej zmiennych predykcyjnych jest ze sobą silnie skorelowanych, w związku z czym nie dostarczają unikalnych lub niezależnych informacji w modelu regresji.

Jeśli stopień korelacji między zmiennymi jest wystarczająco wysoki, może to powodować problemy podczas dopasowywania i interpretacji modelu regresji .

Najbardziej powszechnym sposobem wykrywania wieloliniowości jest użycie współczynnika inflacji wariancji (VIF), który mierzy korelację i siłę korelacji między zmiennymi predykcyjnymi w modelu regresji.

Wartość VIF zaczyna się od 1 i nie ma górnej granicy. Ogólna zasada interpretacji VIF jest następująca:

  • Wartość 1 wskazuje, że nie ma korelacji pomiędzy daną zmienną predykcyjną a jakąkolwiek inną zmienną predykcyjną w modelu.
  • Wartość od 1 do 5 wskazuje na umiarkowaną korelację między daną zmienną predykcyjną a innymi zmiennymi predykcyjnymi w modelu, ale często nie jest ona na tyle poważna, aby wymagała szczególnej uwagi.
  • Wartość większa niż 5 wskazuje na potencjalnie poważną korelację pomiędzy daną zmienną predykcyjną a innymi zmiennymi predykcyjnymi w modelu. W tym przypadku szacunki współczynników i wartości p w wynikach regresji są prawdopodobnie niewiarygodne.

Należy pamiętać, że w niektórych przypadkach wysokie wartości VIF można bezpiecznie zignorować .

Jak obliczyć VIF w R

Aby zilustrować sposób obliczenia VIF dla modelu regresji w R, użyjemy wbudowanego zbioru danych mtcars :

 #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

Najpierw dopasujemy model regresji, wykorzystując mpg jako zmienną odpowiedzi i disp , hp , wt i drat jako zmienne predykcyjne:

 #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

Z wyniku widzimy, że wartość R kwadrat modelu wynosi 0,8376 . Widzimy również, że ogólna statystyka F wynosi 34,82 , a odpowiadająca jej wartość p wynosi 2,704e-10 , co wskazuje, że ogólny model regresji jest istotny. Co więcej, zmienne predykcyjne hp i wt są istotne statystycznie na poziomie istotności 0,05, podczas gdy disp i drat nie.

Następnie użyjemy funkcji vive() z biblioteki do obliczenia VIF dla każdej zmiennej predykcyjnej w modelu:

 #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 

Widzimy, że współczynniki VIF dla disp i wt są większe niż 5, co jest potencjalnie niepokojące.

Wyświetlanie wartości VIF

Aby zwizualizować wartości VIF dla każdej zmiennej predykcyjnej, możemy utworzyć prosty poziomy wykres słupkowy i dodać pionową linię w punkcie 5, abyśmy mogli wyraźnie zobaczyć, które wartości VIF przekraczają 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)

Należy pamiętać, że tego typu wykres byłby najbardziej przydatny w przypadku modelu z wieloma zmiennymi predykcyjnymi, dzięki czemu możemy łatwo wyświetlić wszystkie wartości VIF na raz. Jest to jednak przydatny wykres w tym przykładzie.

W zależności od tego, którą wartość VIF uważasz za zbyt wysoką, aby uwzględnić ją w modelu, możesz usunąć pewne zmienne predykcyjne i sprawdzić, czy ma to wpływ na odpowiednią wartość R-kwadrat lub błąd standardowy modelu.

Wizualizacja korelacji pomiędzy zmiennymi predykcyjnymi

Aby lepiej zrozumieć, dlaczego zmienna predykcyjna może mieć wysoką wartość VIF, możemy utworzyć macierz korelacji, aby wyświetlić współczynniki korelacji liniowej pomiędzy każdą parą zmiennych:

 #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

Przypomnijmy, że zmienna disp miała wartość VIF większą niż 8, co było najwyższą wartością VIF spośród wszystkich zmiennych predykcyjnych w modelu. Z macierzy korelacji widzimy, że disp jest silnie skorelowany z pozostałymi trzema zmiennymi predykcyjnymi, co wyjaśnia, dlaczego jego wartość VIF jest tak wysoka.

W takim przypadku warto usunąć disp z modelu, ponieważ jego wartość VIF jest wysoka i nie jest istotna statystycznie na poziomie istotności 0,05.

Należy pamiętać, że macierz korelacji i VIF dostarczą podobnych informacji: obie informują, kiedy zmienna jest silnie skorelowana z jedną lub większą liczbą innych zmiennych w modelu regresji.

Dalsza lektura:
Przewodnik po wielowspółliniowości i VIF w regresji
Jaka jest dobra wartość R-kwadrat?

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *