Как рассчитать коэффициент инфляции дисперсии (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 ***
#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

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

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

 #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 

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

Просмотр значений VIF

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

Обратите внимание, что этот тип диаграммы был бы наиболее полезен для модели со многими переменными-предикторами, поэтому мы можем легко просмотреть все значения 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
#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

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *