비선형 회귀분석(Non-linear Regression Analysis)

ddoddo·2023년 1월 10일
0

데이터분석 with R

목록 보기
12/21

비선형 회귀분석

비선형 회귀분석(Non-linear Regression Analysis)은 독립변수와 종속변수가 선형관계가 아닌 비선형 관계일 때 사용하는 분석 방법이다. 직선이 아닌 곡선 형태의 관계를 가질 수도 있기 때문에 이런 때에는 독립변수에 로그(log)거듭제곱 등을 취해 보면서 적합한 비선형 모델을 찾아내야 한다.

Data Load

> 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

0개의 댓글