이번에 알아볼 예제는 Multiple Linear Regression에 관한 내용입니다. 이전에 알아봤던 linear regression에서는 하나의 variable만 가지고 regression을 했었는데요, 이번에는 여러 variable들을 이용하여 model을 만들어 보겠습니다.

library(MASS)
fit2=lm(medv~lstat+age,data=Boston)
summary(fit2)
## 
## Call:
## lm(formula = medv ~ lstat + age, data = Boston)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -15.981  -3.978  -1.283   1.968  23.158 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 33.22276    0.73085  45.458  < 2e-16 ***
## lstat       -1.03207    0.04819 -21.416  < 2e-16 ***
## age          0.03454    0.01223   2.826  0.00491 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.173 on 503 degrees of freedom
## Multiple R-squared:  0.5513,	Adjusted R-squared:  0.5495 
## F-statistic:   309 on 2 and 503 DF,  p-value: < 2.2e-16

fit2lstatage라는 변수를 가지고 medv를 예측하는 선형 모델을 만든 것입니다. lstatage모두 중요한 역할을 한다고 확인할 수 있습니다. (*)의 개수가 많으니까요~ 그럼 이제 모든 변수들을 이용해서 모델을 만들어 볼까요?

fit3=lm(medv~.,Boston) # '.'을 통해 medv를 제외한 모든 변수들을 x들로 포함할 수 있습니다.
summary(fit3)
## 
## Call:
## lm(formula = medv ~ ., data = Boston)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -15.595  -2.730  -0.518   1.777  26.199 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.646e+01  5.103e+00   7.144 3.28e-12 ***
## crim        -1.080e-01  3.286e-02  -3.287 0.001087 ** 
## zn           4.642e-02  1.373e-02   3.382 0.000778 ***
## indus        2.056e-02  6.150e-02   0.334 0.738288    
## chas         2.687e+00  8.616e-01   3.118 0.001925 ** 
## nox         -1.777e+01  3.820e+00  -4.651 4.25e-06 ***
## rm           3.810e+00  4.179e-01   9.116  < 2e-16 ***
## age          6.922e-04  1.321e-02   0.052 0.958229    
## dis         -1.476e+00  1.995e-01  -7.398 6.01e-13 ***
## rad          3.060e-01  6.635e-02   4.613 5.07e-06 ***
## tax         -1.233e-02  3.760e-03  -3.280 0.001112 ** 
## ptratio     -9.527e-01  1.308e-01  -7.283 1.31e-12 ***
## black        9.312e-03  2.686e-03   3.467 0.000573 ***
## lstat       -5.248e-01  5.072e-02 -10.347  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.745 on 492 degrees of freedom
## Multiple R-squared:  0.7406,	Adjusted R-squared:  0.7338 
## F-statistic: 108.1 on 13 and 492 DF,  p-value: < 2.2e-16
par(mfrow=c(2,2))
plot(fit3)

center

summary를 통해 보니 대부분의 변수들이 모델에 중요한 기여를 하고 있는 것을 확인할 수 있습니다. R-squared값도 0.7406으로 앞서 lstatage만 가지고 모델을 만들었을 때보다 많이 향상됨을 볼 수 있는데요, 더 정확히 medv의 값들을 예측할 수 있다는 것입니다. 이것은 어떻게 보면 당연한 얘기일 수 있습니다. 설령 쓸모없는 변수가 추가되었다고 하더라도 그 계수를 0으로 만들면 최소한 성능이 악화되지는 않을테니까요. 다음에 살표보겠지만, 이것은 결국 overfitting이라는 현상으로 이어져 꼭 좋지만은 않은 결과를 낳을 수 있습니다.

plot을 통해 model의 여러가지 특징들을 살펴볼 수 있는데요, 왼쪽 위의 그래프의 붉은 실선이 휘어져 있는 것은 non-linear한 추세가 있을 수 있다는 표시입니다. outlier나 high leverage 점들 등 다양하게 분석할 수 있으니, 앞으로 다룰 기회가 있다면 자세히 다루겠습니다.

그럼 이제 마지막으로 중요하지 않다고 표시되었던 ageindus를 제거하고 모델을 만들어 봅시다.

fit4=update(fit3,~.-age-indus) # '.'을 통해 모든 변수를 포함시키고 '-'를 통해 제외할 변수들을 선언합니다.
summary(fit4)
## 
## Call:
## lm(formula = medv ~ crim + zn + chas + nox + rm + dis + rad + 
##     tax + ptratio + black + lstat, data = Boston)
## 
## 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 ***
## crim         -0.108413   0.032779  -3.307 0.001010 ** 
## zn            0.045845   0.013523   3.390 0.000754 ***
## chas          2.718716   0.854240   3.183 0.001551 ** 
## nox         -17.376023   3.535243  -4.915 1.21e-06 ***
## rm            3.801579   0.406316   9.356  < 2e-16 ***
## dis          -1.492711   0.185731  -8.037 6.84e-15 ***
## rad           0.299608   0.063402   4.726 3.00e-06 ***
## tax          -0.011778   0.003372  -3.493 0.000521 ***
## ptratio      -0.946525   0.129066  -7.334 9.24e-13 ***
## black         0.009291   0.002674   3.475 0.000557 ***
## lstat        -0.522553   0.047424 -11.019  < 2e-16 ***
## ---
## 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

이제 모든 model에 포함된 변수들이 중요하다고 나타나네요. 그리고 R-squared도 동일한 값을 나타내고 있습니다. 같은 값이면 다홍치마라고, 동일한 성능을 지닌다면, 더 적은 variable을 지닌 모델이 더 선호됩니다. 더 해석하기가 간단해지기 때문이죠 ^^

한가지 짚고 넘어갈 점은, 위에서 lstatage를 사용했을 때, age가 분명 중요한 변수라고 했는데, 막상 모든 변수들을 사용했을 때는 중요하지 않다고 나왔습니다. 이것은 multiple linear regression의 특징이기도 한데, 다양한 상호작용의 영향으로 해당 변수만 존재했을 때는 중요한 역할을 했지만, 다른 변수들의 상호작용으로 중요성이 사라지기도 한답니다. 예를들면 $a=bc$라는 관계를 가진다면, $b, c$가 포함됨으로써 $a$의 역할까지 하기 때문에 $a$는 상대적으로 중요성이 줄어드는 것입니다.

매우 복잡하고 그 영향성을 쉽게 추론할 수 없기 때문에, 신중한 접근과 해석이 필요합니다 :)