앞서 단계적 회귀분석(stepwise regression)으로 가장 적합한 모델을 검색해봤습니다. 하지만 대부분 모델 선택이 여기서 끝나지는 않습니다. 꼭 넣어야 할 것으로 보이는 변수가 빠지거나 혹은 필요없거나 혼란을 줄 수 있는 독립 변수가 여전히 남을 수 있기 때문입니다. 이 가운데서 중요한 문제가 각 독립변수의 관계입니다. 예를 들어 앞서 보스턴 집값 데이터에서는 노후화 주택 비율과 범죄율은 상당한 연관성이 있을 것으로 보입니다. 그렇게 되면 각각의 회귀 계수는 사실 정확하지 않게 됩니다. 예를 들어 키와 몸무게를 같이 모델에 넣게 되면 서로 비례할 것이기 때문에 각각의 회귀계수에 서로 영향을 주게 됩니다.
이런 문제를 다중공선성 (multicollinearity)라고 부릅니다. 해결책은 문제를 일으키는 변수 가운데 하나를 제거하거나 주성분 분석 (PCA) 및 능형회귀분석 (Ridge Regression) 같이 다른 방법을 사용하는 것입니다. 다중공선성이 있는지 측정하는 대표적인 방법은 분산 팽창 인수 (Variance inflation Factor, VIF)를 측정하는 것입니다. 이 값의 루트를 취한 값이 2를 넘으면 (혹은 VIF가 4를 넘으면) 상당한 다중공선성이 있다고 할 수 있습니다. VIF 값의 의미는 변수 간 상호 작용이 없는 경우 대비 있는 경우 standard error의 차이가 얼마나 커지는지 보여주는 것입니다.
R에서 다중공선성을 측정할 수 있는 대표적인 패키지는 car 입니다. 처음에 이름을 보면 마치 자동차 관련 패키지 같지만, 사실은 Companion to Applied Regression의 약자로 존 폭스 (John Fox)를 비롯한 여러 연구자들이 협력해서 제작한 R의 대표적인 패키지입니다. 선형 회귀 분석에서는 빠지지 않는 필수 패키지 가운데 하나입니다. 이 패키지를 잘 설명한 책이 An R Companion to Applied Regression, Third Edition 입니다.
car 패키지를 설치한 후 VIF 값을 측정하기 위한 방법은 매우 간단합니다. 모델에 vif()만 해주면 됩니다. 앞서 보스턴 집값 패키지를 단계적 회귀분석으로 구해 최적 모델을 구하면 아래와 같습니다.
library(car)
library(MASS)
data("Boston", package = "MASS")
data<-boston span="">-boston>
model5=lm(medv ~ lstat + rm + ptratio + dis + nox + chas + black + zn + crim + rad + tax, data = data)
summary(model5)
> model5=lm(medv ~ lstat + rm + ptratio + dis + nox + chas + black + zn + crim + rad + tax, data = data)
> summary(model5)
Call:
lm(formula = medv ~ lstat + rm + ptratio + dis + nox + chas +
black + zn + crim + rad + tax, data = data)
Residuals:
Min 1Q Median 3Q Max
-15.5984 -2.7386 -0.5046 1.7273 26.2373
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 36.341145 5.067492 7.171 2.73e-12 ***
lstat -0.522553 0.047424 -11.019 < 2e-16 ***
rm 3.801579 0.406316 9.356 < 2e-16 ***
ptratio -0.946525 0.129066 -7.334 9.24e-13 ***
dis -1.492711 0.185731 -8.037 6.84e-15 ***
nox -17.376023 3.535243 -4.915 1.21e-06 ***
chas 2.718716 0.854240 3.183 0.001551 **
black 0.009291 0.002674 3.475 0.000557 ***
zn 0.045845 0.013523 3.390 0.000754 ***
crim -0.108413 0.032779 -3.307 0.001010 **
rad 0.299608 0.063402 4.726 3.00e-06 ***
tax -0.011778 0.003372 -3.493 0.000521 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.736 on 494 degrees of freedom
Multiple R-squared: 0.7406, Adjusted R-squared: 0.7348
F-statistic: 128.2 on 11 and 494 DF, p-value: < 2.2e-16
상당히 많은 변수가 선택되었기 때문에 다중공선성이 있을 가능성이 큽니다. 알아보겠습니다.
> vif(model5)
lstat rm ptratio dis nox chas black zn crim rad tax
2.581984 1.834806 1.757681 3.443420 3.778011 1.059819 1.341559 2.239229 1.789704 6.861126 7.272386
역시 예상대로 상당히 다중공선성이 의심됩니다. 가장 큰 수치는 tax로 7이 넘는 것으로 나타났습니다. 이걸 제거하고 다시 해보겠습니다. 상식적으로 생각할 때 VIF가 큰 순으로
> vif(model5)
lstat rm ptratio dis nox chas black zn crim rad
2.579040 1.806735 1.717222 3.410587 3.564036 1.052428 1.338982 2.154054 1.787963 2.776775
제거하고 나니 4가 넘는 변수가 없습니다. 어느 정도 다중공선성 문제는 해결되었다고 볼 수 있는데, 만약 모델에서 tax를 제거할 수 없는 상황이라면 어떻게 할까요? 연구자가 tax라는 변수를 꼭 보여주고 싶다면 그 다음으로 큰 변수인 rad를 제거하는 것이 방법입니다.
> vif(model5)
lstat rm ptratio dis nox chas black zn crim tax
2.581558 1.775314 1.715392 3.425131 3.766750 1.053220 1.334766 2.227965 1.639661 2.943217
역시 VIF 4 이상 (루트를 씌우면 2 이상)인 변수가 없습니다. 어느 것이 더 좋은 모델인지는 연구의 주제에 따라 다르겠지만, 다중 회귀 분석에서 정확한 회귀 계수를 구하려면 변수간의 상호 관계를 항상 염두에 두고 모델을 분석해야 합니다.
댓글
댓글 쓰기