비선형 회귀분석(Non-linear Regression Analysis)
은 독립변수와 종속변수가 선형관계가 아닌 비선형 관계일 때 사용하는 분석 방법이다. 직선이 아닌 곡선 형태의 관계를 가질 수도 있기 때문에 이런 때에는 독립변수에 로그(log)
나 거듭제곱
등을 취해 보면서 적합한 비선형 모델을 찾아내야 한다.
> df <- read.csv('ch5-2.csv', header=TRUE)
> head(df)
day weight
1 1 43
2 2 55
3 3 69
4 4 86
5 5 104
6 6 124
> str(df)
'data.frame': 70 obs. of 2 variables:
$ day : int 1 2 3 4 5 6 7 8 9 10 ...
$ weight: int 43 55 69 86 104 124 147 172 200 229 ...
> plot(df)
성장기간에 따른 병아리 몸뭄게의 변화는 직선이라고 보기엔 적합하지 않은 것 같다. 그래도 우선은 선형 회귀분석을 진행해보자.
> df_lm <- lm(weight ~ day, data=df)
> summary(df_lm)
Call:
lm(formula = weight ~ day, data = df)
Residuals:
Min 1Q Median 3Q Max
-416.65 -138.42 -12.21 151.32 282.05
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -295.867 41.102 -7.198 6.22e-10 ***
day 56.822 1.006 56.470 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 170.1 on 68 degrees of freedom
Multiple R-squared: 0.9791, Adjusted R-squared: 0.9788
F-statistic: 3189 on 1 and 68 DF, p-value: < 2.2e-16
선형 회귀분석을 실시한 결과 생각보다 높은 0.9791의 R-squared를 나타냈다. 회귀모델 및 개별 독립변수의 p-value도 모두 유의함을 확인했다. 회귀분석 결과로 계산한 값(fitted.values)을 통해 산점도에 회귀직선을 추가해보자.
> lines(df$day, df_lm$fitted.values, col='blue')
산점도 위에 회귀직선을 표시한 결과 개별 데이터와 편차가 존재하는 구간들로 인해 회귀 모델의 성능이 다소 아쉽다. 이번에는 독립변수에 세제곱
을 시켜 종속변수를 잘 표현할 수 있는지 확인해보자.
개별 독립변수 값에 로그(log)니 제곱을 취하기 위해서는 I()
함수를 이용한다.
> df_lm2 <- lm(weight ~ I(day^3) + I(day^2) + day, data=df)
> summary(df_lm2)
Call:
lm(formula = weight ~ I(day^3) + I(day^2) + day, data = df)
Residuals:
Min 1Q Median 3Q Max
-61.315 -22.821 -1.336 22.511 48.772
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.170e+02 1.348e+01 8.683 1.59e-12 ***
I(day^3) -2.529e-02 4.929e-04 -51.312 < 2e-16 ***
I(day^2) 2.624e+00 5.321e-02 49.314 < 2e-16 ***
day -1.530e+01 1.632e+00 -9.373 9.51e-14 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 26.69 on 66 degrees of freedom
Multiple R-squared: 0.9995, Adjusted R-squared: 0.9995
F-statistic: 4.407e+04 on 3 and 66 DF, p-value: < 2.2e-16
비선형 회귀분석을 실시한 결과 R-squared가 0.9995를 나타냈다. 산점도를 다시 그려보자.
> plot(df)
> lines(df$day, df_lm2$fitted.values, col='blue')
산점도와 회귀곡선이 거의 일치함을 확인할 수 있다.
회귀모델을 수식으로 나타내면 다음과 같다.
weight = -0.025*day^3 + 2.624*day^2 - 15.298*day + 117.014