Come eseguire la regressione spline in r (con esempio)


La regressione spline è un tipo di regressione utilizzato quando sono presenti punti o “nodi” in cui il modello nei dati cambia bruscamente e la regressione lineare e la regressione polinomiale non sono sufficientemente flessibili per adattarsi ai dati.

Il seguente esempio passo passo mostra come eseguire la regressione spline in R.

Passaggio 1: creare i dati

Innanzitutto, creiamo un set di dati in R con due variabili e creiamo un grafico a dispersione per visualizzare la relazione tra le variabili:

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

Ovviamente la relazione tra xey non è lineare e sembrano esserci due punti o “nodi” in cui lo schema dei dati cambia bruscamente in x=7 e x=10.

Passaggio 2: adattare il modello di regressione lineare semplice

Utilizziamo quindi la funzione lm() per adattare un semplice modello di regressione lineare a questo set di dati e tracciamo la linea di regressione adattata sul grafico a dispersione:

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

Dal grafico a dispersione, possiamo vedere che la semplice linea di regressione lineare non si adatta bene ai dati.

Dai risultati del modello, possiamo anche vedere che il valore R quadrato corretto è 0,5903 .

Lo confronteremo con il valore R quadrato modificato di un modello spline.

Passaggio 3: adattare il modello di regressione spline

Successivamente, utilizziamo la funzione bs() del pacchetto splines per adattare un modello di regressione spline con due nodi, quindi tracciare il modello adattato sul grafico a dispersione:

 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) 

Dal grafico a dispersione, possiamo vedere che il modello di regressione spline è in grado di adattarsi abbastanza bene ai dati.

Dai risultati del modello, possiamo anche vedere che il valore R quadrato corretto è 0,8987 .

Il valore R quadrato corretto per questo modello è molto più elevato rispetto al modello di regressione lineare semplice, il che ci dice che il modello di regressione spline è in grado di adattarsi meglio ai dati.

Nota che per questo esempio abbiamo scelto che i nodi si trovino in x=7 e x=10.

In pratica, dovrai scegliere tu stesso le posizioni dei nodi in base a dove i modelli nei dati sembrano cambiare e in base alla tua esperienza nel settore.

Risorse addizionali

I seguenti tutorial spiegano come eseguire altre attività comuni in R:

Come eseguire la regressione lineare multipla in R
Come eseguire la regressione esponenziale in R
Come eseguire la regressione dei minimi quadrati ponderati in R

Aggiungi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *