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