R에서 vif(variance inflation factor)를 계산하는 방법


회귀 분석의 다중 공선성은 둘 이상의 예측 변수가 서로 높은 상관 관계를 갖고 있어 회귀 모델에서 고유하거나 독립적인 정보를 제공하지 않는 경우에 발생합니다.

변수 간의 상관 정도가 충분히 높으면 회귀 모델을 피팅하고 해석할 때 문제가 발생할 수 있습니다.

다중 공선성을 탐지하는 가장 일반적인 방법은 회귀 모델에서 예측 변수 간의 상관 관계 및 상관 강도를 측정하는 분산 팽창 계수(VIF)를 사용하는 것입니다.

VIF 값은 1부터 시작하며 상한이 없습니다. VIF를 해석하는 일반적인 규칙은 다음과 같습니다.

  • 값 1은 주어진 예측 변수와 모델의 다른 예측 변수 사이에 상관 관계가 없음을 나타냅니다.
  • 1과 5 사이의 값은 주어진 예측 변수와 모델의 다른 예측 변수 사이의 중간 정도의 상관 관계를 나타내지만 특별한 주의가 필요할 만큼 심각하지는 않은 경우가 많습니다.
  • 5보다 큰 값은 주어진 예측 변수와 모델의 다른 예측 변수 사이에 잠재적으로 심각한 상관 관계가 있음을 나타냅니다. 이 경우 회귀 결과의 계수 추정치와 p-값은 신뢰할 수 없을 가능성이 높습니다.

높은 VIF 값을 무시해도 되는 경우가 있다는 점에 유의하세요.

R에서 VIF를 계산하는 방법

R에서 회귀 모델에 대한 VIF를 계산하는 방법을 설명하기 위해 내장된 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 , wtdrat를 예측 변수로 사용하여 회귀 모델을 피팅합니다.

 #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 으로 전체 회귀 모델이 유의미하다는 것을 알 수 있습니다. 또한 예측 변수 hpwt 는 0.05 유의 수준에서 통계적으로 유의미한 반면, dispdrat는 그렇지 않습니다.

다음으로, 라이브러리의 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 

dispwt 에 대한 VIF가 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 값이 그렇게 높은 이유를 설명합니다.

이 경우 VIF 값이 높고 0.05 유의 수준에서 통계적으로 유의하지 않기 때문에 모델에서 disp를 제거할 수 있습니다.

상관 행렬과 VIF는 유사한 정보를 제공합니다. 두 가지 모두 회귀 모델에서 변수가 하나 이상의 다른 변수와 높은 상관 관계를 나타내는 시기를 알려줍니다.

추가 자료:
회귀 분석의 다중 공선성과 VIF에 대한 가이드
좋은 R 제곱 값이란 무엇입니까?

의견을 추가하다

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다