Як розрахувати фактор інфляції дисперсії (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-квадрат?