Как рассчитать коэффициент инфляции дисперсии (VIF) в R


Мультиколлинеарность в регрессионном анализе возникает, когда две или более переменных-предикторов сильно коррелируют друг с другом, так что они не предоставляют уникальную или независимую информацию в регрессионной модели.

Если степень корреляции между переменными достаточно высока, это может вызвать проблемы при подгонке и интерпретации регрессионной модели .

Наиболее распространенным способом обнаружения мультиколлинеарности является использование коэффициента инфляции дисперсии (VIF), который измеряеткорреляцию и силу корреляции между переменными-предикторами в регрессионной модели.

Значение VIF начинается с 1 и не имеет верхнего предела. Общее эмпирическое правило для интерпретации VIF выглядит следующим образом:

  • Значение 1 указывает на отсутствие корреляции между данной переменной-предиктором и любыми другими переменными-предикторами в модели.
  • Значение от 1 до 5 указывает на умеренную корреляцию между данной переменной-предиктором и другими переменными-предикторами в модели, но часто она недостаточно серьезная, чтобы требовать внимания.
  • Значение больше 5 указывает на потенциально сильную корреляцию между данной переменной-предиктором и другими переменными-предикторами в модели. В этом случае оценки коэффициентов и p-значения в выходных данных регрессии, вероятно, ненадежны.

Обратите внимание, что в некоторых случаях высокие значения VIF можно спокойно игнорировать .

Как рассчитать VIF в R

Чтобы проиллюстрировать, как рассчитать VIF для регрессионной модели в R, мы будем использовать встроенный набор данных 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

Во-первых, мы подгоним регрессионную модель, используя mpg в качестве переменной ответа и disp , hp , wt и drat в качестве переменных-предикторов:

#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 \*\*\*
#disp 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 
#---
#Signif. 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

Из вывода видно, что значение R-квадрата для модели равно 0,8376.Мы также можем видеть, что общая F-статистика составляет 34,82 , а соответствующее значение p равно 2,704e-10 , что указывает на то, что общая модель регрессии является значимой. Кроме того, переменные-предикторы hp и wt являются статистически значимыми при уровне значимости 0,05, а disp и drat — нет.

Далее мы воспользуемся функцией vif() из библиотеки car , чтобы вычислить VIF для каждой переменной-предиктора в модели:

#load the *car* library
library(car)

#calculate the VIF for each predictor variable in the model
vif(model)

# disp hp wt drat 
#8.209402 2.894373 5.096601 2.279547

Мы видим, что VIF для disp и wt больше 5, что потенциально вызывает беспокойство.

Визуализация значений VIF

Чтобы визуализировать значения VIF для каждой переменной-предиктора, мы можем создать простую горизонтальную гистограмму и добавить вертикальную линию на уровне 5, чтобы мы могли четко видеть, какие значения VIF превышают 5:

#create vector of VIF values
vif_values <- vif(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) 
Горизонтальная гистограмма в R, отображающая значения VIF

Обратите внимание, что этот тип диаграммы был бы наиболее полезен для модели с большим количеством переменных-предикторов, поэтому мы могли бы легко визуализировать все значения VIF одновременно. Тем не менее, в этом примере это все еще полезная диаграмма.

В зависимости от того, какое значение VIF вы считаете слишком высоким для включения в модель, вы можете удалить определенные переменные-предикторы и посмотреть, влияет ли это на соответствующее значение R-квадрата или стандартную ошибку модели.

Визуализация корреляций между переменными предиктора

Чтобы лучше понять, почему одна предикторная переменная может иметь высокое значение VIF, мы можем создать матрицу корреляции для просмотра коэффициентов линейной корреляции между каждой парой переменных:

#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
#disp 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

Напомним, что переменная disp имела значение VIF более 8, что было самым большим значением VIF среди всех переменных-предикторов в модели. Из матрицы корреляции видно, что disp сильно коррелирует со всеми тремя другими переменными-предикторами, что объясняет, почему он имеет такое высокое значение VIF.

В этом случае вы можете удалить disp из модели, потому что он имеет высокое значение VIF и не является статистически значимым на уровне значимости 0,05.

Обратите внимание, что корреляционная матрица и VIF предоставят вам аналогичную информацию: они оба сообщают вам, когда одна переменная сильно коррелирует с одной или несколькими другими переменными в регрессионной модели.

Дальнейшее чтение:
Руководство по мультиколлинеарности и VIF в регрессии
Что такое хорошее значение R-квадрата?

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.