분산팽창인자 VIF
정의 1
다중회귀분석 $Y \gets X_{1} , \cdots, X_{p}$ 을 할 때 $i$번째 독립변수에 대한 다중회귀분석 $$X_{i} \gets X_{1} , \cdots, X_{i-1} , X_{i+1} , \cdots, X_{p}$$ 의 중회귀계수를 $R_{i}^2$ 라고 두자. 다음을 $X_{i}$ 의 분산팽창인자variance Inflation Factor라고 한다. $$\displaystyle \text{VIF}_{i}: = {{1} \over {1 - R_{i}^{2} }}$$
설명
우선 다중공선성에 대해 읽어보는 것을 추천한다.
VIF는 분산확대지수 로 번역되는 경우도 있는 것 같지만, 보통은 너무 길어서 그냥 VIF라고 부른다.
분석자의 직관만으로는 찾아내기 어려운 다중공선성을 파악하기 위한 수치적 지표로써 널리 쓰이고 있다.회귀분석에서 설명력은 반드시 $0 < R^{2} < 1$ 으로 구해지므로 VIF는 항상 $1$ 보다 크다. $R_{i}^2$ 가 높다는 것은 그만큼 $X_{i}$ 를 제외한 다른 독립변수들이 $X_{i}$ 를 잘 설명한다는 뜻이므로, 다중공선성이 강하면 강할수록 $\displaystyle \text{VIF}_{i} = {{1} \over {1 - R_{i}^{2} }}$ 의 값은 커질 것이다.
$i$번째 독립변수에 대한 $\text{VIF}_{i}$ 가 $3$ 혹은 $5$ 혹은 $10$ 보다 크면 $i$번째 독립변수는 다중공선성을 가질 가능성이 높다고 본다. 수학에 친숙한 학습자라면 당연히 불편함을 느낄 대목인데, 이 기준들은 경험적으로 구해진 것이기 때문에 누가 옳고 틀리고가 명확하지가 않다. 또한 데이터에 따라서는 다소 무시하기 힘든 다중공선성이 발견되었더라도 손 쓸 수 없는 경우도 왕왕 있다. 하지만 이는 반대로 말해서 데이터를 이해하고 분석자 스스로가 납득할만한 정당화가 가능하다면 다소 너그러운 기준을 적용시킬 수 있다는 뜻이기도 하다.
실습
(다중공선성을 찾아내는 법에 이어서)
이전 포스트에서 collgeGrad
를 종속변수로 둔 다중회귀분석을 실시하면서 white
가 다중공선성을 강하게 가짐을 짐작한 바 있다. 이에 대해 실제로 VIF를 계산한 결과 예상대로 white
의 VIF는 $10$ 을 넘길 정도로 강한 다중공선성을 갖고 있었다.
그런데 VIF를 구할때마다 이런 식으로 계산하는 것은 불편하니까 그냥 car
패키지의 vif()
함수를 사용해 계산해보자.
회귀분석의 결과가 직관과 많이 달라서 다중공선성이 의심되는 와중에 white
의 VIF가 $10$ 을 넘긴다는 것은 거의 확실히 white
변수에 문제가 있다는 말이다. black
도 만만치 않지만, 우선은 white
부터 제거해보자.
white
를 제거하고 다시 분석해본 결과는 상당히 괜찮을뿐만이 아니라 white
가 사라짐으로써 black
의 상관관계도 호전되었음을 확인할 수 있다. 모형진단에도 별다른 문제가 없다면 이 회귀모형은 변수를 $3$ 개밖에 쓰지 않으면서도 설명력이 $70 \%$ 를 넘기므로 제법 쓸만하다고 볼 수 있다.
코드
아래는 예제 코드다.
install.packages('car')
library(car)
DATA=MplsDemo; head(DATA)
win.graph()
plot(DATA[,-1])
out<-lm(population~.-collegeGrad-neighborhood,data=DATA)
print(paste("population의 VIF : ",(1-summary(out)$r.squared)^{-1}))
out<-lm(white~.-collegeGrad-neighborhood,data=DATA)
print(paste("white의 VIF : ",(1-summary(out)$r.squared)^{-1}))
out<-lm(black~.-collegeGrad-neighborhood,data=DATA)
print(paste("black의 VIF : ",(1-summary(out)$r.squared)^{-1}))
out<-lm(foreignBorn~.-collegeGrad-neighborhood,data=DATA)
print(paste("foreinBorn의 VIF : ",(1-summary(out)$r.squared)^{-1}))
out<-lm(hhIncome~.-collegeGrad-neighborhood,data=DATA)
print(paste("hhIncome의 VIF : ",(1-summary(out)$r.squared)^{-1}))
out<-lm(poverty~.-collegeGrad-neighborhood,data=DATA)
print(paste("poverty의 VIF : ",(1-summary(out)$r.squared)^{-1}))
out0<-lm(collegeGrad~.-neighborhood,data=DATA)
summary(out0); vif(out0)
out1<-lm(collegeGrad~.-neighborhood-white,data=DATA)
summary(out1); vif(out1)
Hadi. (2006). Regression Analysis by Example(4th Edition): p236. ↩︎