R에서 스플라인 회귀를 수행하는 방법(예제 포함)


스플라인 회귀는 데이터의 패턴이 갑자기 변경되는 점 또는 “매듭”이 있고 선형 회귀다항식 회귀가 데이터에 적합할 만큼 유연하지 않을 때 사용되는 회귀 유형입니다.

다음 단계별 예제에서는 R에서 스플라인 회귀를 수행하는 방법을 보여줍니다.

1단계: 데이터 생성

먼저 두 개의 변수가 있는 R에서 데이터 세트를 만들고 변수 간의 관계를 시각화하기 위한 산점도를 만들어 보겠습니다.

 #create data frame
df <- data. frame (x=1:20,
                 y=c(2, 4, 7, 9, 13, 15, 19, 16, 13, 10,
                     11, 14, 15, 15, 16, 15, 17, 19, 18, 20))

#view head of data frame
head(df)

  xy
1 1 2
2 2 4
3 3 7
4 4 9
5 5 13
6 6 15

#create scatterplot
plot(df$x, df$y, cex= 1.5 , pch= 19 )

분명히 x와 y 사이의 관계는 비선형이며 x=7과 x=10에서 데이터의 패턴이 갑자기 변경되는 두 개의 점 또는 “노드”가 있는 것으로 보입니다.

2단계: 단순 선형 회귀 모델 피팅

그런 다음 lm() 함수를 사용하여 간단한 선형 회귀 모델을 이 데이터 세트에 맞추고 산점도의 회귀선에 맞춰 플롯합니다.

 #fit simple linear regression model
linear_fit <- lm(df$y ~ df$x)

#view model summary
summary(linear_fit)

Call:
lm(formula = df$y ~ df$x)

Residuals:
    Min 1Q Median 3Q Max 
-5.2143 -1.6327 -0.3534 0.6117 7.8789 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 6.5632 1.4643 4.482 0.000288 ***
df$x 0.6511 0.1222 5.327 4.6e-05 ***
---
Significant. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 3.152 on 18 degrees of freedom
Multiple R-squared: 0.6118, Adjusted R-squared: 0.5903 
F-statistic: 28.37 on 1 and 18 DF, p-value: 4.603e-05

#create scatterplot
plot(df$x, df$y, cex= 1.5 , pch= 19 )

#add regression line to scatterplot
abline(linear_fit) 

산점도를 보면 단순 선형 회귀선이 데이터에 잘 맞지 않음을 알 수 있습니다.

모델 결과에서 조정된 R 제곱 값이 0.5903 임을 확인할 수도 있습니다.

이를 스플라인 모델의 조정된 R 제곱 값과 비교해 보겠습니다.

3단계: 스플라인 회귀 모델 맞추기

다음으로, splines 패키지의 bs() 함수를 사용하여 두 개의 노드가 있는 스플라인 회귀 모델을 맞춘 다음 적합한 모델을 산점도에 그려 보겠습니다.

 library (splines)

#fit spline regression model
spline_fit <- lm(df$y ~ bs(df$x, knots=c( 7 , 10 )))

#view summary of spline regression model
summary(spline_fit)

Call:
lm(formula = df$y ~ bs(df$x, knots = c(7, 10)))

Residuals:
     Min 1Q Median 3Q Max 
-2.84883 -0.94928 0.08675 0.78069 2.61073 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 2.073 1.451 1.429 0.175    
bs(df$x, knots = c(7, 10))1 2.173 3.247 0.669 0.514    
bs(df$x, knots = c(7, 10))2 19.737 2.205 8.949 3.63e-07 ***
bs(df$x, knots = c(7, 10))3 3.256 2.861 1.138 0.274    
bs(df$x, knots = c(7, 10))4 19.157 2.690 7.121 5.16e-06 ***
bs(df$x, knots = c(7, 10))5 16.771 1.999 8.391 7.83e-07 ***
---
Significant. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.568 on 14 degrees of freedom
Multiple R-squared: 0.9253, Adjusted R-squared: 0.8987 
F-statistic: 34.7 on 5 and 14 DF, p-value: 2.081e-07

#calculate predictions using spline regression model
x_lim <- range(df$x)
x_grid <- seq(x_lim[ 1 ], x_lim[ 2 ])
preds <- predict(spline_fit, newdata=list(x=x_grid))

#create scatter plot with spline regression predictions
plot(df$x, df$y, cex= 1.5 , pch= 19 )
lines(x_grid, preds) 

산점도에서 스플라인 회귀 모델이 데이터를 매우 잘 적합할 수 있음을 알 수 있습니다.

모델 결과에서 조정된 R-제곱 값이 0.8987 임을 알 수 있습니다.

이 모델의 조정된 R-제곱 값은 단순 선형 회귀 모델보다 훨씬 높으며 이는 스플라인 회귀 모델이 데이터에 더 잘 적합할 수 있음을 나타냅니다.

이 예에서는 노드가 x=7 및 x=10에 위치하도록 선택했습니다.

실제로는 데이터의 패턴이 변경되는 것으로 나타나는 위치와 도메인 전문 지식을 기반으로 노드 위치를 직접 선택해야 합니다.

추가 리소스

다음 튜토리얼에서는 R에서 다른 일반적인 작업을 수행하는 방법을 설명합니다.

R에서 다중 선형 회귀를 수행하는 방법
R에서 지수 회귀를 수행하는 방법
R에서 가중 최소 제곱 회귀를 수행하는 방법

의견을 추가하다

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다