Spline-regressie uitvoeren in r (met voorbeeld)


Spline-regressie is een type regressie dat wordt gebruikt wanneer er punten of „knopen“ zijn waar het patroon in de gegevens abrupt verandert en lineaire regressie en polynomiale regressie niet flexibel genoeg zijn om in de gegevens te passen.

Het volgende stapsgewijze voorbeeld laat zien hoe u spline-regressie uitvoert in R.

Stap 1: Creëer de gegevens

Laten we eerst een gegevensset in R maken met twee variabelen en een spreidingsdiagram maken om de relatie tussen de variabelen te visualiseren:

 #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 )

Het is duidelijk dat de relatie tussen x en y niet-lineair is en dat er twee punten of „knooppunten“ lijken te zijn waar het patroon in de gegevens abrupt verandert bij x=7 en x=10.

Stap 2: Pas het eenvoudige lineaire regressiemodel toe

Laten we vervolgens de functie lm() gebruiken om een eenvoudig lineair regressiemodel aan deze gegevensset toe te passen en de regressielijn op het spreidingsdiagram te plotten:

 #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) 

Uit het spreidingsdiagram kunnen we zien dat de eenvoudige lineaire regressielijn niet goed bij de gegevens past.

Uit de modelresultaten kunnen we ook zien dat de aangepaste R-kwadraatwaarde 0,5903 is.

We zullen dit vergelijken met de aangepaste R-kwadraatwaarde van een spline-model.

Stap 3: Pas het spline-regressiemodel aan

Laten we vervolgens de functie bs() uit het splines- pakket gebruiken om een spline-regressiemodel met twee knooppunten te fitten, en vervolgens het gepaste model in de spreidingsdiagram plotten:

 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) 

Uit het spreidingsdiagram kunnen we zien dat het spline-regressiemodel de gegevens redelijk goed kan weergeven.

Uit de modelresultaten kunnen we ook zien dat de aangepaste R-kwadraatwaarde 0,8987 is.

De aangepaste R-kwadraatwaarde voor dit model is veel hoger dan het eenvoudige lineaire regressiemodel, wat ons vertelt dat het spline-regressiemodel beter bij de gegevens kan passen.

Merk op dat we er voor dit voorbeeld voor hebben gekozen dat de knooppunten zich op x=7 en x=10 bevinden.

In de praktijk zul je zelf knooppuntlocaties moeten kiezen op basis van waar patronen in de data lijken te veranderen en op basis van jouw domeinexpertise.

Aanvullende bronnen

In de volgende tutorials wordt uitgelegd hoe u andere veelvoorkomende taken in R kunt uitvoeren:

Hoe meervoudige lineaire regressie uit te voeren in R
Hoe exponentiële regressie uit te voeren in R
Hoe u een gewogen kleinste kwadratenregressie uitvoert in R

Einen Kommentar hinzufügen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert