다중 회귀분석(Multiple Regression Analysis)
은 독립변수가 2개 이상일 경우에 사용하며 수식으로 표현하면 y = ax1 + ax2 + c
형태로 나타낼 수 있다.
weight를 종속변수로, egg_weight, movement, food를 독립변수로 활용하여 회귀분석을 진행해보자.
lm()
함수에서는 변수가 추가될 경우 기호 +
를 사용한다.
> df <- read.csv('ch5-1.csv', header=TRUE)
> df_n <- subset(df, select=-c(chick_nm))
> head(df_n)
weight egg_weight movement food
1 140 65 146 14
2 128 62 153 12
3 140 65 118 13
4 135 65 157 13
5 145 69 157 13
6 138 65 143 13
summary()
함수를 통해 회귀모델 결과를 확인한다.
# lm(weight ~ ., data=df_n)을 사용해도 같은 결과가 나타난다.
> df_mlm <- lm(weight ~ egg_weight + movement + food, data=df_n)
> summary(df_mlm)
Call:
lm(formula = weight ~ egg_weight + movement + food, data = df_n)
Residuals:
Min 1Q Median 3Q Max
-3.2037 -1.3079 0.1826 1.2572 2.3647
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.974830 8.587203 0.346 0.731811
egg_weight 1.776350 0.194845 9.117 1.4e-09 ***
movement -0.008674 0.016631 -0.522 0.606417
food 1.584729 0.404757 3.915 0.000583 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.681 on 26 degrees of freedom
Multiple R-squared: 0.9479, Adjusted R-squared: 0.9419
F-statistic: 157.7 on 3 and 26 DF, p-value: < 2.2e-16
p-value: < 2.2e-16
이므로 회귀모델이 통계적으로 유의하다.
egg_weight
: 1.4e-09으로 통계적으로 유의하다.movement
: 0.606417으로 통계적으로 유의하지 않다.food
: 0.000583으로 통계적으로 유의하다.movement 변수는 독립변수에서 제거하는 것이 좋다.
Adjusted R-squared: 0.9419
유의하지 않은 독립변수를 제외하거 다중 회귀분석을 다시 실행한다.
> df_mlm2 <- lm(weight ~ egg_weight + food, data=df_n)
> summary(df_mlm2)
Call:
lm(formula = weight ~ egg_weight + food, data = df_n)
Residuals:
Min 1Q Median 3Q Max
-3.0231 -1.2124 0.2445 1.3607 2.2352
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.6638 8.3698 0.438 0.665052
egg_weight 1.7453 0.1830 9.536 3.89e-10 ***
food 1.5955 0.3987 4.001 0.000441 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.658 on 27 degrees of freedom
Multiple R-squared: 0.9474, Adjusted R-squared: 0.9435
F-statistic: 243 on 2 and 27 DF, p-value: < 2.2e-16
수정된 결정계수가 Adjusted R-squared: 0.9435
로 이전에 비해 조금 올라갔다. 게다가 독립변수는 하나 줄어들어 회귀모델은 더 간단해졌다.
전진선택법(Forward Selection)
: y절편만 있는 상수모형부터 시작하여 중요한 독립변수를 하나씩 추가해가는 방법이다.후진선택법(Backward Selection)
: 독립변수를 모두 포함한 상태에서 가장 적은 영향을 주는 변수를 하나씩 제거하는 방법이다.step()
함수를 통해 실행할 수 있으며 아래 코드가 그 예시이다.
step_min <- step(df_mlm, direction='backward')
다중 회귀분석의 경우 단순 회귀분석과 달리 독립변수가 많기 때문에 예상치 못한 변수들 간의 강한 상관관계로 인해 제대로 된 회귀분석이 실행되지 못할 수도 있다. 이런 현상을 다중공선성(Multicollinearity)
라고 한다.
다중공선성 문제는 분산팽창요인(VIF)
을 계산해 구할 수 있는데 일반적으로 10 이상이면 다중공선성 문제가 있다고 판단하며 30을 초과하면 심각한 다중공선성 문제가 있다고 판단한다.
car
패키지를 설치하면 쉽게 구할 수 있다.
> install.packages('car')
> library(car)
> vif(df_mlm2)
egg_weight food
2.882685 2.882685
두 변수 모두 2.88 수준으로 10보다 매우 작기 때문에 다중공선성 문제가 없는 것으로 판단된다.
weight = 1.7453*egg_weight + 1.5955*food + 3.6638
> hist(df_mlm2$residuals, col='skyblue', xlab='residuals')