dati <- read.csv("neonati.csv",stringsAsFactors = TRUE)
str(dati)
## 'data.frame':    2500 obs. of  10 variables:
##  $ Anni.madre  : int  26 21 34 28 20 32 26 25 22 23 ...
##  $ N.gravidanze: int  0 2 3 1 0 0 1 0 1 0 ...
##  $ Fumatrici   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Gestazione  : int  42 39 38 41 38 40 39 40 40 41 ...
##  $ Peso        : int  3380 3150 3640 3690 3700 3200 3100 3580 3670 3700 ...
##  $ Lunghezza   : int  490 490 500 515 480 495 480 510 500 510 ...
##  $ Cranio      : int  325 345 375 365 335 340 345 349 335 362 ...
##  $ Tipo.parto  : Factor w/ 2 levels "Ces","Nat": 2 2 2 2 2 2 2 2 1 1 ...
##  $ Ospedale    : Factor w/ 3 levels "osp1","osp2",..: 3 1 2 2 3 2 3 1 2 2 ...
##  $ Sesso       : Factor w/ 2 levels "F","M": 2 1 2 2 1 1 1 2 1 1 ...
attach(dati)
summary(dati)
##    Anni.madre     N.gravidanze       Fumatrici        Gestazione   
##  Min.   : 0.00   Min.   : 0.0000   Min.   :0.0000   Min.   :25.00  
##  1st Qu.:25.00   1st Qu.: 0.0000   1st Qu.:0.0000   1st Qu.:38.00  
##  Median :28.00   Median : 1.0000   Median :0.0000   Median :39.00  
##  Mean   :28.16   Mean   : 0.9812   Mean   :0.0416   Mean   :38.98  
##  3rd Qu.:32.00   3rd Qu.: 1.0000   3rd Qu.:0.0000   3rd Qu.:40.00  
##  Max.   :46.00   Max.   :12.0000   Max.   :1.0000   Max.   :43.00  
##       Peso        Lunghezza         Cranio    Tipo.parto Ospedale   Sesso   
##  Min.   : 830   Min.   :310.0   Min.   :235   Ces: 728   osp1:816   F:1256  
##  1st Qu.:2990   1st Qu.:480.0   1st Qu.:330   Nat:1772   osp2:849   M:1244  
##  Median :3300   Median :500.0   Median :340              osp3:835           
##  Mean   :3284   Mean   :494.7   Mean   :340                                 
##  3rd Qu.:3620   3rd Qu.:510.0   3rd Qu.:350                                 
##  Max.   :4930   Max.   :565.0   Max.   :390
n<-nrow(dati)
n
## [1] 2500

ANALISI PRELIMINARE

Dopo aver caricato i dati ( n = 2500), si nota che alcune variabili presentano valori anomali:

Si estraggono i record contenenti i valori anomali: a partire dal dato sull’età materna, con lo scopo di sostituirla con un’età plausibile.

#estraggo caso sospetto eta madre
dati[Anni.madre == 0, ]
##      Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio
## 1380          0            0         0         39 3060       490    330
##      Tipo.parto Ospedale Sesso
## 1380        Nat     osp3     M
knitr::kable(dati[Anni.madre == 0, ])
Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio Tipo.parto Ospedale Sesso
1380 0 0 0 39 3060 490 330 Nat osp3 M
median(Anni.madre) #28
## [1] 28
dati$Anni.madre[dati$Anni.madre == 0] <- median(dati$Anni.madre[dati$Anni.madre > 0])

Il valore anomalo dell’età materna pari a 0 è stato sostituito con la mediana dei valori validi di età. La mediana è stata scelta in quanto misura più robusta rispetto alla media poichè non risente dei valori estremi.

Successivamente si osserva il record che contiene la lunghezza del neonato pari a 310 mm:

#estraggo caso sospetto Lunghezza e Peso
#dati[Lunghezza == 310, ]#| Peso == 830, ]
knitr::kable(dati[Lunghezza == 310, ])
Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio Tipo.parto Ospedale Sesso
928 25 0 0 28 830 310 254 Nat osp1 F

Nonostante i valori estremi, peso e lunghezza risultano coerenti con una gestazione di 28 settimane e cranio molto piccolo (254 mm). Pertanto, il record è stato mantenuto inalterato nel dataset in quanto rappresentativo di un caso clinico plausibile.

Si prosegue osservando la distribuzione della variabile target peso:

plot(density(Peso))

La curva di densità del peso neonatale mostra una distribuzione leggermente asimmetrica a destra, con una coda più lunga verso valori alti.

Per indagare le relazioni tra le variabili quantitative, si costruisce un grafico di correlazione. Questo consente di valutare possibili problemi di multicollinearità tra i regressori, oltre ad identificare le variabili maggiormente associate alla variabile target.

#x11()
panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor, ...)
{
  par(usr = c(0, 1, 0, 1))
  r <- abs(cor(x, y))
  txt <- format(c(r, 0.123456789), digits = digits)[1]
  txt <- paste0(prefix, txt)
  if(missing(cex.cor)) cex.cor <- 0.8/strwidth(txt)
  text(0.5, 0.5, txt, cex = cex.cor * r)
}
pairs(dati, upper.panel = panel.smooth, lower.panel = panel.cor)

Le variabili maggiormente correlate al peso neonatale sono la lunghezza (r = 0.80), il cranio (r = 0.70) e la gestazione (r = 0.59), suggerendo una forte associazione lineare positiva con il peso. Questo implica, ad esempio, che all’aumentare della lunghezza il peso tende ad aumentare, così come neonati con cranio più largo o nati più tardi tendono ad avere un peso maggiore. La lunghezza e il diametro cranico risultano fortemente correlate tra loro (r = 0.60).

Variabili come l’età della madre e il numero di gravidanze, invece, mostrano una correlazione debole con il peso. Anche il fumo materno non mostra una chiara relazione lineare, ma il suo effetto potrebbe manifestarsi in modo non lineare o attraverso interazioni. Tuttavia, queste variabili non verrano escluse a priori ma verranno comunque considerate nelle prime fasi dell’analisi per esplorare eventuali effetti non lineari o interazioni.

Per le variabili categoriali, si procederà con boxplot e test t per confrontare i gruppi e identificare eventuali differenze significative nel peso.

I boxplot permettono di evidenziare differenze mediane, dispersione e la presenza di outlier tra i gruppi, mentre i test-t consentono di verificare se tali differenze siano statisticamente significative.

par(mfrow=c(2,2))
boxplot(Peso)
boxplot(Peso~Tipo.parto)
boxplot(Peso~Sesso)
boxplot(Peso~Ospedale)

median(Peso[Sesso=="M"]) #[1] 3430
## [1] 3430
median(Peso[Sesso=="F"]) #[1] 3160
## [1] 3160

I boxplot mostrano che, condizionando il peso al sesso, al tipo di parto e all’ospedale, si evidenziano alcune differenze interessanti. I neonati maschi sembrano avere un peso leggermente maggiore rispetto alle femmine. Le differenze tra i tipi di parto e tra i tre ospedali risultano contenute, ma si notano outlier evidenti, in particolare per neonati con peso molto basso.

A confermare la tendenza emersa dal boxplot, la mediana del peso nei neonati maschi (3430 g) è sensibilmente più alta rispetto a quella delle femmine (3160 g).

t.test(Peso~Sesso)
## 
##  Welch Two Sample t-test
## 
## data:  Peso by Sesso
## t = -12.106, df = 2490.7, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
##  -287.1051 -207.0615
## sample estimates:
## mean in group F mean in group M 
##        3161.132        3408.215
t.test(Peso~Tipo.parto)  
## 
##  Welch Two Sample t-test
## 
## data:  Peso by Tipo.parto
## t = -0.12968, df = 1493, p-value = 0.8968
## alternative hypothesis: true difference in means between group Ces and group Nat is not equal to 0
## 95 percent confidence interval:
##  -46.27992  40.54037
## sample estimates:
## mean in group Ces mean in group Nat 
##          3282.047          3284.916
t.test(Peso~Fumatrici)
## 
##  Welch Two Sample t-test
## 
## data:  Peso by Fumatrici
## t = 1.034, df = 114.1, p-value = 0.3033
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
##  -45.61354 145.22674
## sample estimates:
## mean in group 0 mean in group 1 
##        3286.153        3236.346
par(mfrow=c(1,2))
boxplot(Peso)
boxplot(Peso~Fumatrici)

boxplot(Peso~Tipo.parto)

t.test(Lunghezza~Sesso)
## 
##  Welch Two Sample t-test
## 
## data:  Lunghezza by Sesso
## t = -9.582, df = 2459.3, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
##  -11.929470  -7.876273
## sample estimates:
## mean in group F mean in group M 
##        489.7643        499.6672
t.test(Cranio~Sesso)
## 
##  Welch Two Sample t-test
## 
## data:  Cranio by Sesso
## t = -7.4102, df = 2491.4, p-value = 1.718e-13
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
##  -6.089912 -3.541270
## sample estimates:
## mean in group F mean in group M 
##        337.6330        342.4486
boxplot(Lunghezza~Sesso)

boxplot(Cranio~Sesso)

I test t confermano che la differenza tra i sessi è statisticamente significativa (p < 2.2e-16), mentre non emergono differenze significative tra parto cesareo e naturale (p ≈ 0.90) né tra figli di madri fumatrici e non fumatrici.

Anche le misure antropometriche alla nascita (lunghezza e circonferenza cranica) risultano significativamente diverse tra i sessi. I maschi, in media, hanno una lunghezza di circa 499.7 mm contro 489.8 mm nelle femmine, e una circonferenza cranica di 342.4 mm rispetto a 337.6 mm. I p-value molto bassi confermano la significatività statistica di tali differenze.

table(Tipo.parto,Ospedale)  
##           Ospedale
## Tipo.parto osp1 osp2 osp3
##        Ces  242  254  232
##        Nat  574  595  603
chisq.test(table(Tipo.parto,Ospedale))
## 
##  Pearson's Chi-squared test
## 
## data:  table(Tipo.parto, Ospedale)
## X-squared = 1.0972, df = 2, p-value = 0.5778

Attraverso un test del chi quadrato su tabella di contingenza tra tipo di parto e ospedale, è stato verificato se la frequenza di parti cesarei differisce tra le tre strutture. Il test restituisce un p-value = 0.5778, molto superiore alla soglia di 0.05. I tipi di parto risultano equamente distribuiti.

Inoltre, da letteratura clinica ed in particolare secondo le indicazioni fornite dall’Ospedale Pediatrico Bambino Gesù, è noto che il peso medio alla nascita si aggira intorno ai 3300 grammi, mentre la lunghezza media è comunemente considerata pari a 500 mm. Per verificare se il nostro campione si discosta da questi valori attesi, sono stati eseguiti due test t per un campione.

mean(Peso)
## [1] 3284.081
mean(Lunghezza)
## [1] 494.692
t.test(Peso, mu=3300)
## 
##  One Sample t-test
## 
## data:  Peso
## t = -1.516, df = 2499, p-value = 0.1296
## alternative hypothesis: true mean is not equal to 3300
## 95 percent confidence interval:
##  3263.490 3304.672
## sample estimates:
## mean of x 
##  3284.081
t.test(Lunghezza, mu=500)
## 
##  One Sample t-test
## 
## data:  Lunghezza
## t = -10.084, df = 2499, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 500
## 95 percent confidence interval:
##  493.6598 495.7242
## sample estimates:
## mean of x 
##   494.692

L’ipotesi nulla (H₀) assume che non vi sia differenza tra la media campionaria e quella teorica. Per il peso neonatale, non si rifiuta H₀ (p-value = 0.13), quindi la media del campione non differisce significativamente da quella attesa (3300 g). Al contrario, per la lunghezza, si rifiuta H₀ (p-value < 2.2e-16), indicando una differenza statisticamente significativa rispetto al valore ipotizzato (500 mm). Gli intervalli di confidenza al 95% confermano queste conclusioni: il valore teorico di 500 non è incluso per la lunghezza, mentre 3300 sì nel caso del peso.

CREAZIONE DEL MODELLO

Si è scelto di procedere inizialmente con una selezione manuale delle variabili, seguita successivamente da una selezione automatica tramite procedura stepwise, per poter avere un confronto sulla bontà delle variabili selezionate.

Nella fase manuale, sono state incluse tutte le variabili disponibili, al fine di valutarne l’effettivo contributo esplicativo. Alcune di queste, come tipo tipo di ospedale, pur potendo essere escluse a priori per motivi logici (in quanto non legate direttamente alle caratteristiche biologiche del neonato o della gravidanza), sono state comunque mantenute in un primo momento per completezza, e rimosse solo in seguito se non significative o non utili in ottica previsionale.

#selezione manuale del modello
mod1<-lm(Peso~., data=dati)
summary(mod1)
## 
## Call:
## lm(formula = Peso ~ ., data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1123.80  -181.38   -14.49   160.84  2612.20 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -6736.8188   141.4196 -47.637  < 2e-16 ***
## Anni.madre        0.8400     1.1393   0.737   0.4610    
## N.gravidanze     11.3505     4.6619   2.435   0.0150 *  
## Fumatrici       -30.1627    27.5391  -1.095   0.2735    
## Gestazione       32.5501     3.8189   8.523  < 2e-16 ***
## Lunghezza        10.2945     0.3007  34.236  < 2e-16 ***
## Cranio           10.4722     0.4260  24.582  < 2e-16 ***
## Tipo.partoNat    29.5134    12.0846   2.442   0.0147 *  
## Ospedaleosp2    -11.2019    13.4381  -0.834   0.4046    
## Ospedaleosp3     28.0836    13.4970   2.081   0.0376 *  
## SessoM           77.5246    11.1781   6.935 5.14e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 273.9 on 2489 degrees of freedom
## Multiple R-squared:  0.7289, Adjusted R-squared:  0.7278 
## F-statistic: 669.2 on 10 and 2489 DF,  p-value: < 2.2e-16

Dal summary del modello iniziale completo (mod1), si osserva che le variabili Anni.madre, Fumatrici e Ospedaleosp2 hanno p-value rispettivamente pari a 0.43, 0.27 e 0.40: valori molto superiori alla soglia di significatività (0.05), indicando che non forniscono un contributo statisticamente rilevante alla spiegazione del peso neonatale e per questo vengono tolte.

# Rimozione delle variabili non significative: età madre, fumo materno e ospedale
mod2<-update(mod1, ~.-Anni.madre - Fumatrici -Ospedale)
summary(mod2)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto + Sesso, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1129.31  -181.70   -16.31   161.07  2638.85 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -6707.2971   135.9911 -49.322  < 2e-16 ***
## N.gravidanze     12.7558     4.3366   2.941   0.0033 ** 
## Gestazione       32.2713     3.7941   8.506  < 2e-16 ***
## Lunghezza        10.2864     0.3007  34.207  < 2e-16 ***
## Cranio           10.5057     0.4260  24.659  < 2e-16 ***
## Tipo.partoNat    30.0342    12.0969   2.483   0.0131 *  
## SessoM           77.9285    11.1905   6.964 4.22e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 274.3 on 2493 degrees of freedom
## Multiple R-squared:  0.7277, Adjusted R-squared:  0.727 
## F-statistic:  1110 on 6 and 2493 DF,  p-value: < 2.2e-16

La variabile numero di gravidanze, pur risultando significativa nel modello precedente (p = 0.003), presenta un effetto molto contenuto (+12.8 g per ogni gravidanza in più) e non sembra contribuire in modo sostanziale alla qualità predittiva del modello.

#rimozione di N.gravidanze
mod3<-update(mod2, ~.-N.gravidanze)
summary(mod3)
## 
## Call:
## lm(formula = Peso ~ Gestazione + Lunghezza + Cranio + Tipo.parto + 
##     Sesso, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1118.43  -185.56   -16.07   161.53  2626.18 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -6675.8084   135.7769 -49.167  < 2e-16 ***
## Gestazione       31.1917     3.7821   8.247 2.59e-16 ***
## Lunghezza        10.2412     0.3008  34.049  < 2e-16 ***
## Cranio           10.6397     0.4242  25.080  < 2e-16 ***
## Tipo.partoNat    29.1062    12.1113   2.403   0.0163 *  
## SessoM           79.0670    11.2010   7.059 2.17e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 274.7 on 2494 degrees of freedom
## Multiple R-squared:  0.7267, Adjusted R-squared:  0.7262 
## F-statistic:  1326 on 5 and 2494 DF,  p-value: < 2.2e-16

La sua rimozione nel modello mod3 comporta una riduzione minima dell’R² aggiustato e un lieve miglioramento del BIC (da 35221.75 a 35222.59), suggerendo che il modello diventa più parsimonioso senza perdere informazione rilevante.

#Rimozione tipo di parto
mod4<-update(mod3, ~.-Tipo.parto)
summary(mod4)
## 
## Call:
## lm(formula = Peso ~ Gestazione + Lunghezza + Cranio + Sesso, 
##     data = dati)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1138.2  -184.3   -17.6   163.3  2627.3 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -6651.1188   135.5172 -49.080  < 2e-16 ***
## Gestazione     31.2737     3.7856   8.261 2.31e-16 ***
## Lunghezza      10.2054     0.3007  33.939  < 2e-16 ***
## Cranio         10.6704     0.4245  25.139  < 2e-16 ***
## SessoM         79.1049    11.2117   7.056 2.22e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 275 on 2495 degrees of freedom
## Multiple R-squared:  0.7261, Adjusted R-squared:  0.7257 
## F-statistic:  1654 on 4 and 2495 DF,  p-value: < 2.2e-16
#Verifica BIC per i modelli costruiti manualmente
knitr::kable(BIC(mod1,mod2,mod3,mod4))
df BIC
mod1 12 35241.91
mod2 8 35221.75
mod3 7 35222.59
mod4 6 35220.54

Analogamente alla variabile “N.gravidanze”, la variabile tipo di parto presenta un effetto significativo ma contenuto (+29 g per i parti naturali) e la sua esclusione non compromette la bontà del modello: nel modello 4 il BIC migliora ulteriormente (da 35222.59 a 35220.54), mentre l’R² rimane pressoché invariato (R² aggiustato modello 4 = 0.7257).

Il modello 4 spiega circa il 72% della variabilità del peso neonatale.

Dopo aver verificato la presenza di multicollinearità si procede con l’analisi della varianza:

#Verifica multicollinearità
car::vif(mod4)
## Gestazione  Lunghezza     Cranio      Sesso 
##   1.653502   2.069517   1.606131   1.038813
anova(mod4, mod2)
## Analysis of Variance Table
## 
## Model 1: Peso ~ Gestazione + Lunghezza + Cranio + Sesso
## Model 2: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Tipo.parto + 
##     Sesso
##   Res.Df       RSS Df Sum of Sq      F    Pr(>F)    
## 1   2495 188688687                                  
## 2   2493 187601677  2   1087011 7.2225 0.0007453 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

La verifica della multicollinearità tramite il VIF (Variance Inflation Factor) sul modello mod4 mostra valori tutti inferiori alla soglia critica di 5, indicando che non vi è collinearità preoccupante tra le variabili predittive incluse.

Il confronto tramite ANOVA tra mod2 e mod4 permette di testare se le variabili escluse (numero di gravidanze e tipo di parto) apportano un miglioramento significativo al modello.

L’analisi ANOVA restituisce un p-value = 0.00075, indicando che le due variabili rimosse apportano effettivamente un contributo statisticamente significativo alla spiegazione della variabilità del peso neonatale. Tuttavia, come osservato in precedenza, sia l’effetto stimato che l’impatto informativo (in termini di R² aggiustato e BIC) risultano contenuti. In ottica predittiva, si può quindi preferire un modello più parsimonioso, ovvero il modello 4.

A scopo comparativo con la selezione manuale delle variabili, è stata applicata una procedura automatica di selezione stepwise basata sul criterio BIC.

#SCELTA DEL MODELLO CON PROCEDURA STEPWISE
stepwise.mod<-MASS::stepAIC(mod1,direction = "both",
                            k=log(n))
## Start:  AIC=28139.4
## Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza + 
##     Cranio + Tipo.parto + Ospedale + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Anni.madre    1     40789 186809099 28132
## - Fumatrici     1     90016 186858326 28133
## - Ospedale      2    685217 187453527 28133
## - N.gravidanze  1    444811 187213121 28138
## - Tipo.parto    1    447562 187215872 28138
## <none>                      186768310 28139
## - Sesso         1   3609311 190377621 28179
## - Gestazione    1   5451454 192219764 28204
## - Cranio        1  45344286 232112596 28675
## - Lunghezza     1  87951071 274719381 29096
## 
## Step:  AIC=28132.12
## Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto + Ospedale + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Fumatrici     1     90897 186899996 28126
## - Ospedale      2    692738 187501837 28126
## - Tipo.parto    1    448222 187257321 28130
## <none>                      186809099 28132
## - N.gravidanze  1    633756 187442855 28133
## + Anni.madre    1     40789 186768310 28139
## - Sesso         1   3618736 190427835 28172
## - Gestazione    1   5412879 192221978 28196
## - Cranio        1  45588236 232397335 28670
## - Lunghezza     1  87950050 274759149 29089
## 
## Step:  AIC=28125.51
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Tipo.parto + 
##     Ospedale + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Ospedale      2    701680 187601677 28119
## - Tipo.parto    1    440684 187340680 28124
## <none>                      186899996 28126
## - N.gravidanze  1    610840 187510837 28126
## + Fumatrici     1     90897 186809099 28132
## + Anni.madre    1     41671 186858326 28133
## - Sesso         1   3602797 190502794 28165
## - Gestazione    1   5346781 192246777 28188
## - Cranio        1  45632149 232532146 28664
## - Lunghezza     1  88355030 275255027 29086
## 
## Step:  AIC=28119.23
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Tipo.parto + 
##     Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Tipo.parto    1    463870 188065546 28118
## <none>                      187601677 28119
## - N.gravidanze  1    651066 188252743 28120
## + Ospedale      2    701680 186899996 28126
## + Fumatrici     1     99840 187501837 28126
## + Anni.madre    1     49391 187552286 28126
## - Sesso         1   3649259 191250936 28160
## - Gestazione    1   5444109 193045786 28183
## - Cranio        1  45758101 233359778 28657
## - Lunghezza     1  88054432 275656108 29074
## 
## Step:  AIC=28117.58
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## <none>                      188065546 28118
## - N.gravidanze  1    623141 188688687 28118
## + Tipo.parto    1    463870 187601677 28119
## + Ospedale      2    724866 187340680 28124
## + Fumatrici     1     91892 187973654 28124
## + Anni.madre    1     50245 188015301 28125
## - Sesso         1   3655292 191720838 28158
## - Gestazione    1   5464853 193530399 28181
## - Cranio        1  46108583 234174130 28658
## - Lunghezza     1  87632762 275698308 29066
summary(stepwise.mod)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Sesso, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1149.44  -180.81   -15.58   163.64  2639.72 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -6681.1445   135.7229 -49.226  < 2e-16 ***
## N.gravidanze    12.4750     4.3396   2.875  0.00408 ** 
## Gestazione      32.3321     3.7980   8.513  < 2e-16 ***
## Lunghezza       10.2486     0.3006  34.090  < 2e-16 ***
## Cranio          10.5402     0.4262  24.728  < 2e-16 ***
## SessoM          77.9927    11.2021   6.962 4.26e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 274.6 on 2494 degrees of freedom
## Multiple R-squared:  0.727,  Adjusted R-squared:  0.7265 
## F-statistic:  1328 on 5 and 2494 DF,  p-value: < 2.2e-16

La procedura ha selezionato progressivamente un sottoinsieme di variabili che include: N.gravidanze, Gestazione, Lunghezza, Cranio e Sesso. Il modello finale ottenuto tramite stepwise ha un R² aggiustato di 0.7265: migliore rispetto al modello 4 nell’ordine dei centesimi (ricordo R² aggiustato mod4 = 0.7257) .

Dunque anche il modello ottenuto con il metodo stepwise spiega circa il 72% della varianza del peso neonatale.

#Confronto con i modelli selezionati manualmente
knitr::kable(BIC(stepwise.mod, mod4, mod2))
df BIC
stepwise.mod 7 35220.10
mod4 6 35220.54
mod2 8 35221.75
#anova(mod4, stepwise.mod)
anova(stepwise.mod, mod4)
## Analysis of Variance Table
## 
## Model 1: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso
## Model 2: Peso ~ Gestazione + Lunghezza + Cranio + Sesso
##   Res.Df       RSS Df Sum of Sq      F   Pr(>F)   
## 1   2494 188065546                                
## 2   2495 188688687 -1   -623141 8.2637 0.004079 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Il confronto tra i modelli conferma che il modello selezionato tramite stepwise è sostanzialmente equivalente al modello mod4, ottenuto manualmente, con valori di BIC praticamente sovrapponibili (35220.10 contro 35220.54).

Si preferisce il modello mod4 per la sua maggiore semplicità a parità di capacità esplicativa.

Dal grafico di correlazione, alcune relazioni tra le variabili e il peso neonatale mostrano andamenti curvilinei (ad es. Gestazione, Lunghezza e Cranio). Questo comportamento è un indicatore preliminare della possibile presenza di effetti non lineari, che verranno studiati di seguito.

#Introduzione di EFFETTI NON LINEARI
#Aggiunta di termini quadratici per esplorare effetti non lineari
mod_nl <- lm(Peso ~ Gestazione + I(Gestazione^2) +
               Lunghezza + I(Lunghezza^2) + Cranio +I(Cranio^2) + Sesso,
             data = dati)
summary(mod_nl)
## 
## Call:
## lm(formula = Peso ~ Gestazione + I(Gestazione^2) + Lunghezza + 
##     I(Lunghezza^2) + Cranio + I(Cranio^2) + Sesso, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1173.39  -183.29   -12.16   163.59  1473.80 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     -1.214e+03  1.163e+03  -1.044    0.296    
## Gestazione       3.709e+02  6.751e+01   5.494 4.33e-08 ***
## I(Gestazione^2) -4.332e+00  8.852e-01  -4.894 1.05e-06 ***
## Lunghezza       -2.865e+01  4.442e+00  -6.448 1.35e-10 ***
## I(Lunghezza^2)   4.008e-02  4.550e-03   8.810  < 2e-16 ***
## Cranio          -5.181e+00  9.825e+00  -0.527    0.598    
## I(Cranio^2)      2.328e-02  1.448e-02   1.608    0.108    
## SessoM           7.366e+01  1.101e+01   6.690 2.75e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 269 on 2492 degrees of freedom
## Multiple R-squared:  0.7383, Adjusted R-squared:  0.7376 
## F-statistic:  1004 on 7 and 2492 DF,  p-value: < 2.2e-16

Si toglie il termine quadratico Cranio che risulta non significativo.

#var I(Cranio^2) non sign

mod_nl2<-update(mod_nl, ~.-I(Cranio^2))
summary(mod_nl2)
## 
## Call:
## lm(formula = Peso ~ Gestazione + I(Gestazione^2) + Lunghezza + 
##     I(Lunghezza^2) + Cranio + Sesso, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1177.46  -182.44    -9.66   164.95  1406.21 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     -2.384e+03  9.072e+02  -2.628  0.00865 ** 
## Gestazione       3.310e+02  6.281e+01   5.270 1.48e-07 ***
## I(Gestazione^2) -3.819e+00  8.261e-01  -4.624 3.97e-06 ***
## Lunghezza       -3.161e+01  4.043e+00  -7.820 7.76e-15 ***
## I(Lunghezza^2)   4.310e-02  4.145e-03  10.398  < 2e-16 ***
## Cranio           1.060e+01  4.177e-01  25.376  < 2e-16 ***
## SessoM           7.397e+01  1.101e+01   6.716 2.30e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 269.1 on 2493 degrees of freedom
## Multiple R-squared:  0.738,  Adjusted R-squared:  0.7374 
## F-statistic:  1170 on 6 and 2493 DF,  p-value: < 2.2e-16

Il modello mod_nl2 include effetti quadratici per le variabili Gestazione e Lunghezza, con un R² aggiustato pari a 0.738, leggermente superiore a quello del modello mod4 (che si ricorda ancora essere pari a 0.7257). Questo significa che mod_nl2 spiega circa un punto percentuale in più della variabilità del peso neonatale ma risultando molto più complesso.

knitr::kable(BIC(mod_nl2, mod4))
df BIC
mod_nl2 8 35124.96
mod4 6 35220.54

Il confronto del BIC mostra che mod_nl2 è preferibile secondo questo criterio (35121.14 vs 35220.54). Tuttavia, si osserva nuovamente che il guadagno di varianza spiegata è minimo. Per questo motivo, si preferisce ancora mantenere come base il modello mod4, più semplice e interpretabile.

Si passa ad osservare la bontà del modello inserendo anche le interazioni tra le variabili:

#Introduzione di INTERAZIONI TRA VARIABILI
mod_inter <- lm(Peso ~ N.gravidanze + Gestazione + I(Gestazione^2) + 
                  Lunghezza + I(Lunghezza^2) + Cranio + Sesso + 
                  Gestazione*Lunghezza + Gestazione*Cranio + 
                  Lunghezza*Cranio + Lunghezza*Sesso, 
                data = dati)
summary(mod_inter)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + I(Gestazione^2) + 
##     Lunghezza + I(Lunghezza^2) + Cranio + Sesso + Gestazione * 
##     Lunghezza + Gestazione * Cranio + Lunghezza * Cranio + Lunghezza * 
##     Sesso, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1191.72  -181.65   -10.29   166.82  1313.92 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          -1.315e+03  1.105e+03  -1.190 0.234086    
## N.gravidanze          1.491e+01  4.222e+00   3.532 0.000419 ***
## Gestazione            1.221e+02  7.337e+01   1.664 0.096201 .  
## I(Gestazione^2)      -3.677e+00  1.585e+00  -2.320 0.020441 *  
## Lunghezza            -1.067e+01  5.550e+00  -1.923 0.054634 .  
## I(Lunghezza^2)        5.904e-02  6.554e-03   9.008  < 2e-16 ***
## Cranio               -2.505e+00  6.739e+00  -0.372 0.710114    
## SessoM                1.410e+02  2.133e+02   0.661 0.508823    
## Gestazione:Lunghezza -3.817e-01  1.938e-01  -1.969 0.049058 *  
## Gestazione:Cranio     1.140e+00  2.064e-01   5.520 3.73e-08 ***
## Lunghezza:Cranio     -6.362e-02  1.471e-02  -4.325 1.59e-05 ***
## Lunghezza:SessoM     -1.366e-01  4.303e-01  -0.317 0.750922    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 266.8 on 2488 degrees of freedom
## Multiple R-squared:  0.743,  Adjusted R-squared:  0.7418 
## F-statistic: 653.8 on 11 and 2488 DF,  p-value: < 2.2e-16

A partire dal modello completo con interazioni (mod_inter), si è costruito un modello semplificato (mod_inter_simpl) mantenendo solo i termini quadratici e le interazioni risultate significative. Il nuovo modello include: N.gravidanze, I(Gestazione^2), I(Lunghezza^2), Gestazione:Cranio, Gestazione:Lunghezza e Cranio:Lunghezza.

mod_inter_simpl <- lm(Peso ~ N.gravidanze + 
                        I(Gestazione^2) + 
                        I(Lunghezza^2) +
                        Gestazione:Cranio + 
                        Gestazione:Lunghezza + 
                        Lunghezza:Cranio, 
                      data = dati)
summary(mod_inter_simpl)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + I(Gestazione^2) + I(Lunghezza^2) + 
##     Gestazione:Cranio + Gestazione:Lunghezza + Lunghezza:Cranio, 
##     data = dati)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1157.2  -176.6    -8.2   165.2  1282.3 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          -2.017e+03  7.015e+01 -28.755  < 2e-16 ***
## N.gravidanze          1.572e+01  4.256e+00   3.693 0.000226 ***
## I(Gestazione^2)      -2.572e+00  1.412e+00  -1.821 0.068718 .  
## I(Lunghezza^2)        5.594e-02  6.450e-03   8.674  < 2e-16 ***
## Gestazione:Cranio     1.303e+00  1.487e-01   8.763  < 2e-16 ***
## Gestazione:Lunghezza -4.195e-01  1.650e-01  -2.542 0.011087 *  
## Cranio:Lunghezza     -8.137e-02  1.174e-02  -6.931  5.3e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 269.2 on 2493 degrees of freedom
## Multiple R-squared:  0.7377, Adjusted R-squared:  0.737 
## F-statistic:  1168 on 6 and 2493 DF,  p-value: < 2.2e-16

L’R² aggiustato (0.737) resta praticamente invariato rispetto al modello completo (0.7418), mentre il numero di parametri stimati si riduce da 11 a 6. Questo suggerisce che il modello semplificato mantiene una buona capacità esplicativa e predittiva, risultando preferibile in ottica di parsimonia.

Per testare un ulteriore modello si prova ad aggiungere le interazioni al mod4:

mod4_inter <- lm(Peso ~ Gestazione + Lunghezza + Cranio + Sesso +
         Gestazione:Lunghezza + Gestazione:Cranio + 
         Lunghezza:Cranio + Lunghezza:Sesso)
summary(mod4_inter)
## 
## Call:
## lm(formula = Peso ~ Gestazione + Lunghezza + Cranio + Sesso + 
##     Gestazione:Lunghezza + Gestazione:Cranio + Lunghezza:Cranio + 
##     Lunghezza:Sesso)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1129.26  -182.51   -12.59   163.74  2575.96 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)   
## (Intercept)          -4.098e+02  1.118e+03  -0.367  0.71399   
## Gestazione           -1.747e+02  6.318e+01  -2.764  0.00575 **
## Lunghezza             1.174e+01  4.990e+00   2.352  0.01873 * 
## Cranio               -6.022e+00  6.890e+00  -0.874  0.38217   
## SessoM               -2.042e+02  2.151e+02  -0.949  0.34258   
## Gestazione:Lunghezza  4.660e-02  1.047e-01   0.445  0.65623   
## Gestazione:Cranio     5.631e-01  2.008e-01   2.804  0.00509 **
## Lunghezza:Cranio     -9.895e-03  1.379e-02  -0.717  0.47324   
## Lunghezza:SessoM      5.603e-01  4.339e-01   1.291  0.19675   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 273.3 on 2491 degrees of freedom
## Multiple R-squared:   0.73,  Adjusted R-squared:  0.7291 
## F-statistic: 841.9 on 8 and 2491 DF,  p-value: < 2.2e-16

Ne risulta che anche il modello mod4_inter, che introduce solo interazioni tra le variabili principali, incrementa l’R² aggiustato in modo minimo (0.7291).

Si esegue nuovamente l’iter per l’analisi sulla bontà del modello:

knitr::kable(BIC(mod4, mod_inter, mod4_inter))
df BIC
mod4 6 35220.54
mod_inter 13 35116.50
mod4_inter 10 35215.89

Dal confronto appena effettuato non risulta che il modello 4 abbia il valore di BIC, ma come ripetutamente sostenuto in precendenza la differenza con gli altri modelli non è tale da giustificare la scelta di un modello piu complesso.

anova(mod4,mod4_inter)
## Analysis of Variance Table
## 
## Model 1: Peso ~ Gestazione + Lunghezza + Cranio + Sesso
## Model 2: Peso ~ Gestazione + Lunghezza + Cranio + Sesso + Gestazione:Lunghezza + 
##     Gestazione:Cranio + Lunghezza:Cranio + Lunghezza:Sesso
##   Res.Df       RSS Df Sum of Sq      F    Pr(>F)    
## 1   2495 188688687                                  
## 2   2491 185994918  4   2693769 9.0193 3.132e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod4, mod_inter_simpl)
## Analysis of Variance Table
## 
## Model 1: Peso ~ Gestazione + Lunghezza + Cranio + Sesso
## Model 2: Peso ~ N.gravidanze + I(Gestazione^2) + I(Lunghezza^2) + Gestazione:Cranio + 
##     Gestazione:Lunghezza + Lunghezza:Cranio
##   Res.Df       RSS Df Sum of Sq      F    Pr(>F)    
## 1   2495 188688687                                  
## 2   2493 180712610  2   7976077 55.017 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod_nl, mod_nl2)
## Analysis of Variance Table
## 
## Model 1: Peso ~ Gestazione + I(Gestazione^2) + Lunghezza + I(Lunghezza^2) + 
##     Cranio + I(Cranio^2) + Sesso
## Model 2: Peso ~ Gestazione + I(Gestazione^2) + Lunghezza + I(Lunghezza^2) + 
##     Cranio + Sesso
##   Res.Df       RSS Df Sum of Sq      F Pr(>F)
## 1   2492 180290170                           
## 2   2493 180477124 -1   -186953 2.5841 0.1081

Per proseguire con il confronto sono dunque stati eseguiti test ANOVA tra modelli nidificati.

Il test ANOVA risulta significativo nel confronto tra modello semplice (mod4) e modello con interazioni: il Residual Sum of Squares (RSS) passa da 188.688.687 a 185.994.918, e il test F restituisce un valore pari a 9.02 (p-value = 3.13e-07), indicando un miglioramento statisticamente rilevante.

Lo stesso ragionamento si applica al confronto tra mod4 e mod_inter_simpl, dove l’introduzione di interazioni comporta una riduzione dell’RSS significativa. Al contrario, l’output di anova(mod_nl, mod_nl2) mostra che il termine quadratico I(Cranio²) non fornisce un contributo informativo rilevante e può essere rimosso.

Tuttavia, bilanciando l’aumento di variabilità spiegata con l’aumento della complessità, a conferma di quanto sostenuto finora si sceglie come modello finale il modello 4, in quanto più parsimonioso ma comunque efficace dal punto di vista predittivo.

INTERPRETAZIONE DEI COEFFICIENTI DEL MODELLO SELEZIONATO

Concludendo, il modelo selezionato stima il peso neonatale in funzione della durata della gestazione, della lunghezza e del diametro cranico del neonato, e del sesso.

A parità di altre condizioni, ogni settimana aggiuntiva di gestazione è associata in media a un aumento di 31.3 grammi nel peso. Ogni millimetro in più di lunghezza corrisponde a +10.2 grammi, mentre ogni millimetro in più del diametro cranico si associa ad un aumento di 10.7 grammi nel peso del neoato.

A parità di altre variabili, i maschi pesano in media 79 grammi in più rispetto alle femmine.

ANALISI DEI RESIDUI

#test grafici
#x11()
par(mfrow=c(2,2))
plot(mod4)

Per valutare l’adeguatezza del modello, sono stati analizzati i residui attraverso test statistici e diagnostica grafica.

Di seguito il commento della diagnostica grafica.

QQ PLOT: i residui seguono approssimativamente la distribuzione normale, con lievi deviazioni nelle code.

RESIDUALS VS FITTED: non si osservano pattern sistematici, quindi si suppone che l’assunzione di linearità sia ragionevolmente rispettata.

SCALE-LOCATION: la varianza dei residui appare costante lungo i fitted values, non si notano problemi evidenti di eteroschedasticità.

RESIDUALS VD LEVERAGE: sono presenti pochi punti ad alta leva (es. osservazione 1551 che si colloca tra le soglie di Cook di 0.5 e 1 e che potrebbe avere un’influenza moderata sul mmodello), ma nessuno supera la soglia critica di Cook, quindi non emergono influenze eccessive da singole osservazioni.

Nel complesso, la diagnostica grafica non evidenzia violazioni gravi delle ipotesi del modello lineare. Il modello risulta quindi adeguato sotto questo profilo.

#test statistici

shapiro.test(residuals(mod4)) 
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mod4)
## W = 0.9742, p-value < 2.2e-16
lmtest::bptest(mod4)  
## 
##  studentized Breusch-Pagan test
## 
## data:  mod4
## BP = 89.148, df = 4, p-value < 2.2e-16
lmtest::dwtest(mod4) 
## 
##  Durbin-Watson test
## 
## data:  mod4
## DW = 1.9557, p-value = 0.1337
## alternative hypothesis: true autocorrelation is greater than 0
#Root Mean Squared Error (RMSE).
sqrt(mean(residuals(mod4)^2)) #[1] 266.1389
## [1] 274.728
#leverage
lev<-hatvalues(mod4)
plot(lev)
#valore soglia: 
p=sum(lev)  
soglia=2*p/n
abline(h=soglia, col=2)

lev[lev>soglia]
##          15          34          42          61          67          96 
## 0.006144457 0.006237758 0.004252678 0.004587185 0.005345322 0.004801899 
##         101         106         117         131         151         155 
## 0.007185969 0.012812305 0.004746840 0.006964953 0.010847336 0.006670119 
##         190         205         206         220         249         295 
## 0.005288500 0.005297016 0.009402903 0.007376867 0.004655679 0.004008437 
##         304         305         310         312         315         348 
## 0.004419003 0.005382162 0.028757757 0.013126063 0.005342858 0.004187962 
##         378         383         445         471         486         492 
## 0.015366923 0.004305772 0.007094099 0.004289364 0.004740595 0.008175223 
##         565         587         592         615         629         638 
## 0.004635950 0.008375235 0.006313937 0.004575867 0.004041054 0.006216787 
##         656         666         684         697         702         726 
## 0.004735898 0.004345904 0.008750225 0.005809934 0.004719868 0.004038656 
##         748         750         765         805         821         895 
## 0.008236046 0.006712718 0.006049647 0.014303716 0.004039952 0.005203974 
##         928         947         956         964         968         991 
## 0.022095348 0.007803378 0.007670034 0.004618460 0.004075295 0.004259145 
##        1014        1067        1091        1096        1130        1157 
## 0.008221844 0.007868942 0.008927908 0.004268008 0.006561457 0.004080725 
##        1166        1181        1188        1200        1238        1248 
## 0.004020427 0.005586402 0.006404596 0.005445729 0.005374725 0.014573080 
##        1273        1283        1293        1294        1356        1357 
## 0.007080183 0.004055883 0.005555616 0.004735838 0.005285646 0.006526609 
##        1361        1385        1395        1400        1402        1420 
## 0.004080786 0.012017154 0.004646054 0.005559147 0.004788164 0.005130876 
##        1428        1429        1551        1553        1556        1560 
## 0.008191659 0.021037040 0.048521821 0.006810651 0.005868384 0.004588261 
##        1593        1606        1610        1619        1628        1634 
## 0.004855489 0.004746852 0.007761683 0.014504316 0.004663751 0.004527422 
##        1686        1692        1693        1701        1712        1735 
## 0.008715871 0.004260736 0.005041490 0.010197488 0.006945920 0.004370535 
##        1780        1802        1806        1809        1827        1858 
## 0.025528862 0.004005956 0.004090967 0.008388773 0.006008547 0.004328741 
##        1868        1893        1911        1920        1977        2037 
## 0.004746360 0.004245302 0.004481835 0.004131544 0.005384125 0.004234559 
##        2040        2066        2089        2114        2115        2120 
## 0.011429685 0.004013637 0.006252340 0.012850646 0.011763363 0.018002540 
##        2140        2149        2175        2200        2215        2216 
## 0.006090376 0.013033782 0.021167345 0.011030260 0.004833388 0.007548562 
##        2220        2224        2225        2257        2307        2318 
## 0.004023907 0.005780067 0.005408611 0.005767952 0.013898144 0.004770755 
##        2337        2359        2391        2408        2437        2452 
## 0.004700477 0.004750437 0.004386621 0.009632048 0.023757012 0.023227398 
##        2458        2476        2478 
## 0.008002531 0.004070348 0.005745434
#outlier
plot(rstudent(mod4))
abline(h=c(-2,2),col=2)

car::outlierTest(mod4)
##      rstudent unadjusted p-value Bonferroni p
## 1551 9.986149         4.7193e-23   1.1798e-19
## 155  4.951276         7.8654e-07   1.9663e-03
## 1306 4.781188         1.8440e-06   4.6100e-03

Per quanto concerne i test statistici invece di seguito il commento:

Il test di Shapiro-Wilk evidenzia una deviazione dalla normalità dei residui (p < 2.2e-16), ma data la numerosità campionaria elevata, tale violazione non compromette la validità delle stime.

Il test di Breusch-Pagan indica una possibile eteroschedasticità (p < 2.2e-16), confermata da una lieve variazione della varianza nei grafici. Tuttavia, l’impatto pratico è contenuto e non influisce in modo sostanziale sull’interpretazione del modello.

Il test di Durbin-Watson (p = 0.13) non segnala autocorrelazione significativa dei residui.

Infine, l’analisi dei valori di leverage e degli outlier studentizzati mostra pochi punti potenzialmente influenti.

Per valutare l’influenza delle singole osservazioni sul modello finale, è stato esaminato il grafico della distanza di Cook.

cook<-cooks.distance(mod4)
plot(cook)

max(cook)
## [1] 0.9783883

Questo indice permette di identificare punti che, se rimossi, causerebbero un cambiamento sostanziale nei coefficienti stimati. Nel grafico si osserva un’unica osservazione con valore di Cook elevato (0.978), ma comunque inferiore al valore soglia comunemente utilizzato (1). Questo suggerisce che, sebbene il punto sia influente, non lo è in maniera tale da invalidare il modello.

L’osservazione specifica è la sequnte:

which.max(cook)
## 1551 
## 1551
knitr::kable(dati[which.max(cook), ])
Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio Tipo.parto Ospedale Sesso
1551 35 1 0 38 4370 315 374 Nat osp3 F

L’osservazione con il valore di Cook elevato è la 1551: come già specificato risulta sì influente ma non anomala.

PREVISIONE E RISULTATI

Per testare il modello selezionato su un caso pratico, è stato creato un profilo tipo di neonata: madre alla terza gravidanza, parto alla 39ª settimana, con valori medi di lunghezza e cranio (rispettivamente di 494.692 e 340.0292 arrotondati a 495 e 340).

mean(Lunghezza) #494.692
## [1] 494.692
mean(Cranio)  #340.0292
## [1] 340.0292
#Profilo tipo: neonata femmina nata alla 39a settimana, terza gravidanza 
nuova_neonata <- data.frame(
  Gestazione = 39,
  Lunghezza = 495,   
  Cranio     = 340,  
  Sesso      = factor("F", levels = levels(dati$Sesso))
)




predict(mod4, newdata = nuova_neonata)
##        1 
## 3248.163
# 3248.163 

La variabile “numero di gravidanze” era stata esclusa dal modello finale per ragioni di rilevanza, dunque la sua esclusione non compromette la validità della stima.

Il peso previsto per la neonata risulta pari a 3248.163 grammi.

VISUALIZZAZIONI GRAFICHE

Per interpretare visivamente il comportamento del modello, vengono riportate di seguito delle visualizzazioni che mostrano l’effetto della durata della gestazione sul peso previsto.

È stato costruito un dataset di riferimento, fissando le altre variabili (lunghezza e cranio) su valori medi osservati nel campione e simulando un profilo tipo di neonata femmina. In questo modo, si osserva come cambia il peso previsto al variare delle settimane di gestazione, mantenendo costanti gli altri fattori.

#VISUALIZZAZIONI

#effetto della durata della gestazione sul peso
settimane <- seq(min(dati$Gestazione), max(dati$Gestazione), 1)


dati_grafico <- data.frame(
  Gestazione = settimane,
  Lunghezza  = 495,  # valore medio approssimato
  Cranio     = 340,  # valore medio
  Sesso      = factor("F", levels = levels(dati$Sesso))
)

# Aggiunta della previsione
dati_grafico$Peso_previsto <- predict(mod4, newdata = dati_grafico)
# Grafico
# Plot base: effetto della gestazione sul peso atteso per neonata tipo (femmina)
plot(dati_grafico$Gestazione, dati_grafico$Peso_previsto,
     type = "b", pch = 19,
     xlab = "Settimane di gestazione",
     ylab = "Peso previsto (g)",
     main = "Peso previsto in base alla gestazione (neonata tipo)")

Dal grafico si osserva una relazione crescente e lineare tra le settimane di gestazione e il peso previsto alla nascita. L’andamento è coerente con la matrice di correlazione, in cui l’indice di correlazione tra peso e gestazione è pari a 0.59.

Nel modello, infatti, la variabile Gestazione risulta significativa, con un coefficiente positivo che indica un aumento medio di peso di circa 31 grammi per ogni settimana aggiuntiva.

Nel secondo grafico viene mostrato l’effetto congiunto del sesso e della durata della gestazione sul peso previsto alla nascita, sempre mantenendo costanti le altre variabili (lunghezza e cranio su valori medi). Le due curve presentano un andamento parallelo e crescente, confermando il contributo positivo della gestazione.

library(ggplot2)

# Dataset per entrambi i sessi (con variabili compatibili col mod4)
dati_plot <- do.call(rbind, lapply(c("M", "F"), function(sesso) {
  data.frame(
    Gestazione = settimane,
    Lunghezza  = 495,
    Cranio     = 340,
    Sesso      = factor(sesso, levels = levels(dati$Sesso)),
    SessoLabel = ifelse(sesso == "M", "Maschio", "Femmina")
  )
}))

# Previsione peso dal modello 4
dati_plot$Peso_previsto <- predict(mod4, newdata = dati_plot)

# Grafico con ggplot
ggplot(dati_plot, aes(x = Gestazione, y = Peso_previsto, color = SessoLabel)) +
  geom_line(size = 1.2) +
  geom_point(size = 2) +
  scale_color_manual(values = c("Maschio" = "tan2", "Femmina" = "olivedrab4")) +
  labs(title = "Peso previsto in base alla gestazione per sesso",
       x = "Settimane di gestazione",
       y = "Peso previsto (g)",
       color = "Sesso") +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

La curva relativa ai neonati maschi si colloca sistematicamente al di sopra di quella delle femmine, evidenziando come il sesso maschile incida mediamente per circa 79 grammi in più rispetto al sesso femminile, in linea con quanto indicato dal coefficiente associato alla variabile Sesso (SessoM).

CONCLUSIONI

Il modello finale risulta essere parsimoniamente efficace: spiega una quota consistente della variabilità del peso neonatale, poco più del 72%, e mantiene una struttura semplice con sole variabili principali, tutte significative. Le diagnosi grafiche e statistiche dei residui mostrano una buona adeguatezza del modello.

L’introduzione di interazioni o termini non lineari porta a miglioramenti marginali ed il guadagno in capacità predittiva non ne giustifica la maggiore complessità.