Introduzione

L’obiettivo di questo lavoro è costruire un modello statistico per la previsione del peso neonatale alla nascita. Il peso del neonato rappresenta infatti una variabile clinicamente rilevante, poiché può essere associato a condizioni di rischio, prematurità o necessità di assistenza specifica dopo il parto.

Il dataset contiene informazioni relative a 2500 neonati provenienti da tre ospedali. Le variabili disponibili riguardano caratteristiche materne, come età, numero di gravidanze precedenti e abitudine al fumo, caratteristiche della gravidanza, come la durata della gestazione, e misure antropometriche del neonato, come peso, lunghezza e circonferenza cranica.

Caricamento dei dati e analisi descrittiva

dati <- read.csv("C:\\Users\\anton\\Desktop\\neonati.csv")
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       
##  Min.   : 830   Min.   :310.0   Min.   :235   Length:2500       
##  1st Qu.:2990   1st Qu.:480.0   1st Qu.:330   Class :character  
##  Median :3300   Median :500.0   Median :340   Mode  :character  
##  Mean   :3284   Mean   :494.7   Mean   :340                     
##  3rd Qu.:3620   3rd Qu.:510.0   3rd Qu.:350                     
##  Max.   :4930   Max.   :565.0   Max.   :390                     
##    Ospedale            Sesso          
##  Length:2500        Length:2500       
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 
table(Tipo.parto)
## Tipo.parto
##  Ces  Nat 
##  728 1772
table(Ospedale)
## Ospedale
## osp1 osp2 osp3 
##  816  849  835
table(Sesso)
## Sesso
##    F    M 
## 1256 1244
table(Fumatrici)
## Fumatrici
##    0    1 
## 2396  104
table(Anni.madre == 0)
## 
## FALSE  TRUE 
##  2499     1
table(N.gravidanze)
## N.gravidanze
##    0    1    2    3    4    5    6    7    8    9   10   11   12 
## 1096  818  340  150   48   21   11    1    8    2    3    1    1
summary(Peso[Gestazione < 37])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     830    1892    2435    2342    2815    4520
summary(Peso[Gestazione >= 37])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1750    3050    3320    3349    3640    4930

Dall’analisi descrittiva emergono diversi aspetti che vale la pena commentare. Il dataset è composto da 2500 osservazioni e, in generale, le distribuzioni delle variabili principali appaiono coerenti con quanto ci si aspetterebbe in un contesto di rilevazioni neonatali.

L’età media delle madri è pari a circa 28 anni, con una distribuzione abbastanza simmetrica intorno alla media. Si osserva però un valore pari a 0, che è chiaramente anomalo: si tratta verosimilmente di un errore di codifica oppure di un missing value gestito in modo improprio. È un dato da trattare con attenzione; come vedremo, l’età materna non rientrerà tra i predittori del modello finale, quindi questa anomalia non influenza le previsioni, ma resta un punto da segnalare.

La variabile relativa al numero di gravidanze precedenti presenta una distribuzione fortemente asimmetrica a destra, concentrata sui valori bassi: la maggior parte delle madri ha avuto zero, una o due gravidanze precedenti. Sono presenti alcune osservazioni con valori più elevati, fino a un massimo di 12, ma si tratta di casi isolati che possono essere considerati come code della distribuzione e che, se necessario, andranno valutati come potenziali outlier.

Il fumo materno risulta una variabile particolarmente sbilanciata: solo 104 madri su 2500 sono classificate come fumatrici, circa il 4% del campione. È un aspetto rilevante in vista delle analisi successive, perché una numerosità così ridotta in uno dei due gruppi potrebbe compromettere la potenza statistica dei confronti e, eventualmente, richiedere tecniche specifiche per il trattamento di gruppi non bilanciati.

La durata della gestazione si concentra intorno alle 39 settimane, valore mediano coerente con la fisiologia dei parti a termine. Suddividendo il campione in prematuri, cioè con gestazione inferiore a 37 settimane, e nati a termine emerge una differenza piuttosto marcata in termini di peso medio alla nascita: circa 2342 g per i prematuri contro 3349 g per i nati dalla 37ª settimana in poi. La differenza, di circa 1000 g, è già a livello descrittivo un forte indizio della relazione tra età gestazionale e peso neonatale, che andrà poi verificata formalmente in fase di modellazione.

Per quanto riguarda le variabili qualitative, i parti naturali risultano più frequenti dei cesarei, mentre la distribuzione per ospedale è molto equilibrata tra le tre strutture considerate. Anche la variabile sesso si presenta quasi perfettamente bilanciata tra maschi e femmine. Nel complesso, quindi, il campione appare omogeneo rispetto a ospedale e sesso, mentre risulta nettamente più sbilanciato rispetto a fumo materno e prematurità: un elemento da tenere presente nelle analisi successive, soprattutto quando si lavorerà con confronti tra sottogruppi.

Test di ipotesi preliminari

# Associazione tra ospedale e tipo di parto
tab_osp_parto <- table(Ospedale, Tipo.parto)
prop.table(tab_osp_parto, margin = 1) * 100
##         Tipo.parto
## Ospedale      Ces      Nat
##     osp1 29.65686 70.34314
##     osp2 29.91755 70.08245
##     osp3 27.78443 72.21557
chisq.test(tab_osp_parto)
## 
##  Pearson's Chi-squared test
## 
## data:  tab_osp_parto
## X-squared = 1.0972, df = 2, p-value = 0.5778
# Confronto con i valori medi di riferimento della popolazione
mu_peso <- 3405
mu_lunghezza <- 500

t.test(Peso, mu = mu_peso)
## 
##  One Sample t-test
## 
## data:  Peso
## t = -11.515, df = 2499, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 3405
## 95 percent confidence interval:
##  3263.490 3304.672
## sample estimates:
## mean of x 
##  3284.081
t.test(Lunghezza, mu = mu_lunghezza)
## 
##  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
# Differenze antropometriche tra i due sessi
aggregate(Peso ~ Sesso, FUN = mean)
##   Sesso     Peso
## 1     F 3161.132
## 2     M 3408.215
aggregate(Lunghezza ~ Sesso, FUN = mean)
##   Sesso Lunghezza
## 1     F  489.7643
## 2     M  499.6672
aggregate(Cranio ~ Sesso, FUN = mean)
##   Sesso   Cranio
## 1     F 337.6330
## 2     M 342.4486
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(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

In questa fase sono stati applicati alcuni test di ipotesi con l’obiettivo di verificare la presenza di differenze significative tra gruppi e rispetto ad alcuni valori di riferimento presi dalla letteratura.

Come prima cosa è stata valutata l’eventuale associazione tra ospedale e tipo di parto. Le percentuali di parti cesarei nelle tre strutture risultano piuttosto simili tra loro: 29,66% nell’ospedale 1, 29,92% nell’ospedale 2 e 27,78% nell’ospedale 3. Il test chi-quadrato di indipendenza non risulta significativo, con p-value pari a 0,5778, quindi non emerge alcuna evidenza statistica di un’associazione tra le due variabili. In altre parole, sulla base dei dati a disposizione, non possiamo affermare che la struttura ospedaliera influisca sulla probabilità che un parto sia cesareo piuttosto che naturale.

Successivamente, il peso e la lunghezza medi del campione sono stati confrontati con valori di riferimento per neonati a termine, pari rispettivamente a 3405 g e 500 mm. Il peso medio osservato è 3284,08 g, quindi inferiore al riferimento, e il t-test a un campione risulta altamente significativo: si rifiuta dunque l’ipotesi nulla di uguaglianza tra la media campionaria e il valore atteso. Lo stesso vale per la lunghezza, con una media campionaria di 494,69 mm contro i 500 mm di riferimento, anche in questo caso con p-value molto basso.

Questi risultati vanno però interpretati con una certa cautela. Il campione include anche neonati prematuri, mentre i valori di riferimento sono costruiti su nati a termine: è quindi plausibile che la presenza di soggetti con età gestazionale inferiore abbassi le medie osservate. Inoltre, con una numerosità campionaria così elevata, pari a 2500 osservazioni, anche scostamenti modesti dal valore di riferimento possono risultare statisticamente significativi pur non avendo necessariamente una grande rilevanza pratica.

Infine, sono state confrontate le principali misure antropometriche tra femmine e maschi. I maschi mostrano valori medi più alti in tutte le variabili considerate: peso, lunghezza e circonferenza cranica. Trattandosi di due gruppi con varianze non necessariamente uguali è stato utilizzato il t-test di Welch, che restituisce differenze statisticamente significative per tutte e tre le variabili. Si può quindi concludere che, nel campione in esame, le misure antropometriche risultano significativamente maggiori nei neonati maschi rispetto alle femmine.

Analisi preliminare alla regressione

n <- nrow(dati)
n
## [1] 2500
shapiro.test(Peso)
## 
##  Shapiro-Wilk normality test
## 
## data:  Peso
## W = 0.97066, p-value < 2.2e-16

Prima della costruzione del modello è stata analizzata la variabile target, cioè il peso neonatale. Il test di Shapiro-Wilk risulta significativo, indicando uno scostamento dalla normalità. Tuttavia, questo risultato va interpretato con prudenza: con un campione molto grande, come in questo caso, il test diventa estremamente sensibile e può segnalare come significative anche deviazioni non particolarmente gravi. Per questo motivo, oltre al test formale, è utile osservare anche le rappresentazioni grafiche e l’andamento dei residui del modello.

dati_quant <- dati[, c("Peso", "Gestazione", "Lunghezza", "Cranio",
                       "Anni.madre", "N.gravidanze")]

names(dati_quant) <- c("Peso", "Gestazione", "Lunghezza", "Cranio",
                       "Età madre", "N. gravidanze")

panel.cor <- function(x, y, digits = 2, ...) {
  usr <- par("usr")
  on.exit(par(usr = usr))
  par(usr = c(0, 1, 0, 1))
  
  r <- cor(x, y, use = "complete.obs", method = "pearson")
  txt <- round(r, digits)
  
  text(0.5, 0.5, txt, cex = 1.2 + abs(r) * 2.5)
}

panel.hist <- function(x, ...) {
  usr <- par("usr")
  on.exit(par(usr = usr))
  par(usr = c(usr[1:2], 0, 1.5))
  
  h <- hist(x, plot = FALSE)
  breaks <- h$breaks
  y <- h$counts / max(h$counts)
  
  rect(breaks[-length(breaks)], 0, breaks[-1], y,
       col = "lightgray", border = "white")
}

pairs(dati_quant,
      lower.panel = panel.smooth,
      upper.panel = panel.cor,
      diag.panel = panel.hist,
      cex.labels = 1.4,
      font.labels = 2,
      gap = 0.6,
      main = "Matrice di correlazione tra variabili quantitative")

La matrice di correlazione consente di osservare le relazioni lineari tra le variabili quantitative prima della costruzione del modello. Come prevedibile, il peso neonatale risulta fortemente associato alle altre misure antropometriche del neonato, in particolare alla lunghezza e alla circonferenza cranica. Anche la durata della gestazione mostra una relazione positiva con il peso, coerentemente con l’idea che una gravidanza più lunga sia associata a un maggiore sviluppo fetale e quindi a un peso alla nascita più elevato.

Le variabili materne, come età della madre e numero di gravidanze precedenti, sembrano invece mostrare relazioni lineari più deboli con il peso. Questa prima esplorazione suggerisce quindi che le variabili antropometriche e la gestazione saranno probabilmente tra i predittori più importanti nel modello di regressione.

boxplot(Peso ~ Sesso,
        main = "Peso per sesso",
        xlab = "Sesso",
        ylab = "Peso")

boxplot(Peso ~ Fumatrici,
        main = "Peso per abitudine al fumo",
        xlab = "Fumatrici",
        ylab = "Peso")

boxplot(Peso ~ Tipo.parto,
        main = "Peso per tipo di parto",
        xlab = "Tipo di parto",
        ylab = "Peso")

boxplot(Peso ~ Ospedale,
        main = "Peso per ospedale",
        xlab = "Ospedale",
        ylab = "Peso")

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 ~ 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
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
summary(aov(Peso ~ Ospedale))
##               Df    Sum Sq Mean Sq F value Pr(>F)
## Ospedale       2    936237  468118   1.699  0.183
## Residuals   2497 687952305  275512

Per valutare il rapporto tra il peso e le variabili qualitative sono stati utilizzati boxplot e test di confronto tra gruppi. Il peso medio risulta significativamente diverso tra maschi e femmine, confermando quanto già emerso nell’analisi precedente: i maschi presentano in media un peso maggiore rispetto alle femmine.

Per quanto riguarda il fumo materno, il confronto grezzo mostra un peso medio leggermente inferiore nei neonati da madri fumatrici, ma la differenza non risulta statisticamente significativa. Questo risultato può dipendere anche dalla forte sproporzione tra i due gruppi, dato che le madri fumatrici sono molto meno numerose delle non fumatrici.

Il tipo di parto non sembra invece essere associato a differenze significative nel peso medio, così come non emergono differenze statisticamente significative tra i tre ospedali. Questi risultati indicano che, a livello descrittivo e nei confronti semplici, sesso e misure antropometriche sembrano più rilevanti rispetto a tipo di parto e ospedale nella spiegazione del peso neonatale.

Costruzione dei modelli di regressione

mod1 <- lm(Peso ~ Fumatrici + Gestazione + Sesso + Lunghezza + Cranio + 
             Anni.madre + N.gravidanze, data = dati)

summary(mod1)
## 
## Call:
## lm(formula = Peso ~ Fumatrici + Gestazione + Sesso + Lunghezza + 
##     Cranio + Anni.madre + N.gravidanze, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1161.56  -181.19   -15.75   163.70  2630.75 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -6714.4109   141.1515 -47.569  < 2e-16 ***
## Fumatrici      -30.2959    27.5971  -1.098   0.2724    
## Gestazione      32.9331     3.8267   8.606  < 2e-16 ***
## SessoM          78.0845    11.2039   6.969 4.06e-12 ***
## Lunghezza       10.2342     0.3009  34.009  < 2e-16 ***
## Cranio          10.5177     0.4268  24.642  < 2e-16 ***
## Anni.madre       0.9585     1.1347   0.845   0.3984    
## N.gravidanze    11.2756     4.6690   2.415   0.0158 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 274.6 on 2492 degrees of freedom
## Multiple R-squared:  0.7272, Adjusted R-squared:  0.7264 
## F-statistic:   949 on 7 and 2492 DF,  p-value: < 2.2e-16
vif(mod1)
##    Fumatrici   Gestazione        Sesso    Lunghezza       Cranio   Anni.madre 
##     1.006659     1.694517     1.040359     2.078644     1.628748     1.186683 
## N.gravidanze 
##     1.184706
mod2 <- lm(Peso ~ Fumatrici + Gestazione + Sesso + Anni.madre + 
             N.gravidanze, data = dati)

summary(mod2)
## 
## Call:
## lm(formula = Peso ~ Fumatrici + Gestazione + Sesso + Anni.madre + 
##     N.gravidanze, data = dati)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1466.6  -271.3   -12.0   261.1  1901.5 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -3292.719    186.469 -17.658   <2e-16 ***
## Fumatrici     -110.625     41.480  -2.667   0.0077 ** 
## Gestazione     163.525      4.518  36.193   <2e-16 ***
## SessoM         164.913     16.697   9.877   <2e-16 ***
## Anni.madre       3.797      1.705   2.226   0.0261 *  
## N.gravidanze    18.477      7.005   2.638   0.0084 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 413.4 on 2494 degrees of freedom
## Multiple R-squared:  0.3814, Adjusted R-squared:  0.3802 
## F-statistic: 307.6 on 5 and 2494 DF,  p-value: < 2.2e-16

Sono stati stimati due modelli di regressione lineare multipla. Il primo modello, indicato come mod1, include fumo materno, durata della gestazione, sesso, lunghezza, circonferenza cranica, età materna e numero di gravidanze precedenti. Si tratta del modello più completo, perché considera sia variabili materne e gestazionali sia misure antropometriche del neonato.

Il secondo modello, indicato come mod2, esclude invece lunghezza e circonferenza cranica, mantenendo solo fumo materno, durata della gestazione, sesso, età materna e numero di gravidanze precedenti. Questo modello è meno potente dal punto di vista predittivo, ma è più interpretabile dal punto di vista clinico, perché utilizza soprattutto informazioni materne e gestazionali.

Nel modello completo l’R² corretto è pari a circa 0,726, quindi il modello riesce a spiegare circa il 72,6% della variabilità del peso neonatale. Risultano statisticamente significative la durata della gestazione, il sesso del neonato, la lunghezza, la circonferenza cranica e il numero di gravidanze precedenti. In particolare, a parità delle altre variabili, una settimana in più di gestazione è associata a un aumento medio del peso, i maschi pesano mediamente più delle femmine, e valori maggiori di lunghezza e circonferenza cranica sono associati a pesi maggiori.

Nel modello completo il fumo materno non risulta statisticamente significativo. Questo non significa necessariamente che il fumo non abbia alcun ruolo, ma che, una volta considerate anche lunghezza, cranio, gestazione, sesso e altre variabili, il suo contributo specifico non emerge come significativo.

Il modello ridotto mostra invece un R² corretto più basso, pari a circa 0,380, ma in questo caso il fumo materno risulta significativo: a parità di gestazione, sesso, età materna e numero di gravidanze, i neonati da madri fumatrici pesano mediamente circa 111 grammi in meno. Questo suggerisce che l’effetto del fumo può essere visibile quando si considerano solo variabili materne e gestazionali, mentre tende ad attenuarsi nel modello completo, dove entrano anche misure antropometriche molto vicine al peso.

Il controllo della multicollinearità tramite VIF non evidenzia criticità. Tutti i valori risultano ampiamente inferiori alle soglie comunemente considerate problematiche, quindi non emergono segnali di forte ridondanza tra i predittori. Anche lunghezza e circonferenza cranica, pur essendo entrambe misure antropometriche, possono essere mantenute nel modello.

Interazioni ed effetti non lineari

# Modello base con i soli effetti principali, usato come riferimento per i confronti
mod_base <- lm(Peso ~ Gestazione + Fumatrici + Sesso + Lunghezza + 
                 Cranio + N.gravidanze, data = dati)

# Interazione fumo-gestazione: l'effetto del fumo cambia con le settimane di gestazione?
mod_int <- lm(Peso ~ Gestazione * Fumatrici + Sesso + Lunghezza + 
                Cranio + N.gravidanze, data = dati)
summary(mod_int)
## 
## Call:
## lm(formula = Peso ~ Gestazione * Fumatrici + Sesso + Lunghezza + 
##     Cranio + N.gravidanze, data = dati)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1149.9  -181.1   -17.1   163.6  2636.3 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          -6699.0708   136.6478 -49.024  < 2e-16 ***
## Gestazione              33.1472     3.8389   8.635  < 2e-16 ***
## Fumatrici              794.5870   757.2739   1.049  0.29415    
## SessoM                  78.7548    11.2151   7.022 2.81e-12 ***
## Lunghezza               10.2285     0.3009  33.988  < 2e-16 ***
## Cranio                  10.5305     0.4263  24.704  < 2e-16 ***
## N.gravidanze            12.7641     4.3451   2.938  0.00334 ** 
## Gestazione:Fumatrici   -21.0157    19.2765  -1.090  0.27572    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 274.6 on 2492 degrees of freedom
## Multiple R-squared:  0.7273, Adjusted R-squared:  0.7265 
## F-statistic: 949.3 on 7 and 2492 DF,  p-value: < 2.2e-16
anova(mod_base, mod_int)
## Analysis of Variance Table
## 
## Model 1: Peso ~ Gestazione + Fumatrici + Sesso + Lunghezza + Cranio + 
##     N.gravidanze
## Model 2: Peso ~ Gestazione * Fumatrici + Sesso + Lunghezza + Cranio + 
##     N.gravidanze
##   Res.Df       RSS Df Sum of Sq      F Pr(>F)
## 1   2493 187973654                           
## 2   2492 187884041  1     89614 1.1886 0.2757
# Effetto non lineare della gestazione tramite un termine quadratico
mod_poly <- lm(Peso ~ poly(Gestazione, 2) + Sesso + Lunghezza + 
                 Cranio + N.gravidanze + Fumatrici, data = dati)
summary(mod_poly)
## 
## Call:
## lm(formula = Peso ~ poly(Gestazione, 2) + Sesso + Lunghezza + 
##     Cranio + N.gravidanze + Fumatrici, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1145.00  -180.96   -13.12   165.00  2659.10 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          -5494.4034   157.5197 -34.881  < 2e-16 ***
## poly(Gestazione, 2)1  2930.7077   358.6777   8.171 4.81e-16 ***
## poly(Gestazione, 2)2   640.8036   282.7497   2.266  0.02352 *  
## SessoM                  75.9814    11.2351   6.763 1.68e-11 ***
## Lunghezza               10.3386     0.3042  33.989  < 2e-16 ***
## Cranio                  10.6312     0.4280  24.841  < 2e-16 ***
## N.gravidanze            12.7990     4.3416   2.948  0.00323 ** 
## Fumatrici              -29.2442    27.5772  -1.060  0.28904    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 274.4 on 2492 degrees of freedom
## Multiple R-squared:  0.7277, Adjusted R-squared:  0.7269 
## F-statistic: 951.4 on 7 and 2492 DF,  p-value: < 2.2e-16
anova(mod_base, mod_poly)
## Analysis of Variance Table
## 
## Model 1: Peso ~ Gestazione + Fumatrici + Sesso + Lunghezza + Cranio + 
##     N.gravidanze
## Model 2: Peso ~ poly(Gestazione, 2) + Sesso + Lunghezza + Cranio + N.gravidanze + 
##     Fumatrici
##   Res.Df       RSS Df Sum of Sq      F  Pr(>F)  
## 1   2493 187973654                              
## 2   2492 187587020  1    386634 5.1362 0.02352 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Oltre al modello puramente additivo, come previsto dalla traccia, sono stati considerati anche un termine di interazione e un effetto non lineare. L’interazione tra fumo e gestazione verifica se il fumo materno penalizzi il peso in misura diversa a seconda della durata della gravidanza, mentre il termine quadratico sulla gestazione verifica se la relazione tra settimane e peso si discosti dalla linearità.

Il termine di interazione tra gestazione e fumo non risulta statisticamente significativo, con un p-value pari a 0,276: non emerge quindi alcuna evidenza che l’effetto del fumo dipenda dalla durata della gestazione. Il termine quadratico della gestazione è invece formalmente significativo, con un p-value pari a 0,024, segnalando una lieve curvatura nella relazione tra settimane e peso.

I due termini vanno però valutati in modo diverso. L’interazione, non significativa, può essere scartata senza esitazioni. Il termine quadratico, pur significativo, produce un miglioramento pratico trascurabile: l’R² corretto passa da 0,7265 a 0,7269 e l’RMSE resta sostanzialmente invariato. Si tratta dunque di un effetto reale ma di entità minima, che verrà valutato nella sezione di confronto, insieme ai criteri informativi, prima di decidere se inserirlo nel modello finale.

Selezione automatica del modello

# Selezione stepwise basata sulla minimizzazione dell'AIC, a partire dal modello completo
mod_step <- MASS::stepAIC(mod1, direction = "both", trace = FALSE)

mod_step$anova
## Stepwise Model Path 
## Analysis of Deviance Table
## 
## Initial Model:
## Peso ~ Fumatrici + Gestazione + Sesso + Lunghezza + Cranio + 
##     Anni.madre + N.gravidanze
## 
## Final Model:
## Peso ~ Gestazione + Sesso + Lunghezza + Cranio + N.gravidanze
## 
## 
##           Step Df Deviance Resid. Df Resid. Dev      AIC
## 1                               2492  187919851 28084.70
## 2 - Anni.madre  1 53803.09      2493  187973654 28083.42
## 3  - Fumatrici  1 91891.97      2494  188065546 28082.64
summary(mod_step)
## 
## Call:
## lm(formula = Peso ~ Gestazione + Sesso + Lunghezza + Cranio + 
##     N.gravidanze, 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 ***
## Gestazione      32.3321     3.7980   8.513  < 2e-16 ***
## SessoM          77.9927    11.2021   6.962 4.26e-12 ***
## Lunghezza       10.2486     0.3006  34.090  < 2e-16 ***
## Cranio          10.5402     0.4262  24.728  < 2e-16 ***
## N.gravidanze    12.4750     4.3396   2.875  0.00408 ** 
## ---
## 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
mod_fin <- mod_step

Per ottenere il modello più parsimonioso, come previsto dalla traccia, è stata utilizzata una procedura di selezione stepwise basata sulla minimizzazione dell’AIC, a partire dal modello completo mod1. La procedura elimina progressivamente le variabili che non contribuiscono in modo apprezzabile all’adattamento.

Il risultato è un modello che esclude età materna e fumo, entrambe non significative nel modello completo, e mantiene durata della gestazione, sesso, lunghezza, circonferenza cranica e numero di gravidanze precedenti. Questo modello, indicato come mod_fin, rappresenta un buon compromesso tra adattamento ai dati e parsimonia: conserva sostanzialmente la stessa capacità esplicativa del modello completo utilizzando però un numero ridotto di predittori, tutti statisticamente significativi.

Confronto tra modelli e scelta del modello finale

AIC(mod1, mod2, mod_int, mod_poly, mod_fin)
##          df      AIC
## mod1      9 35181.39
## mod2      7 37224.22
## mod_int   9 35180.92
## mod_poly  9 35176.96
## mod_fin   7 35179.33
BIC(mod1, mod2, mod_int, mod_poly, mod_fin)
##          df      BIC
## mod1      9 35233.81
## mod2      7 37264.99
## mod_int   9 35233.33
## mod_poly  9 35229.38
## mod_fin   7 35220.10
anova(mod_fin, mod1)
## Analysis of Variance Table
## 
## Model 1: Peso ~ Gestazione + Sesso + Lunghezza + Cranio + N.gravidanze
## Model 2: Peso ~ Fumatrici + Gestazione + Sesso + Lunghezza + Cranio + 
##     Anni.madre + N.gravidanze
##   Res.Df       RSS Df Sum of Sq     F Pr(>F)
## 1   2494 188065546                          
## 2   2492 187919851  2    145695 0.966 0.3807

Per la scelta del modello finale sono stati confrontati i diversi modelli stimati tramite i criteri AIC e BIC, oltre al confronto ANOVA tra modelli annidati. Il modello ridotto mod2, privo delle misure antropometriche, mostra valori di AIC e BIC nettamente più alti, confermando che lunghezza e circonferenza cranica apportano un contributo informativo importante.

Tra i modelli che includono le misure antropometriche le differenze sono invece minime. L’AIC premia di pochissimo il modello con il termine quadratico, mod_poly, con un valore di 35177 contro 35179 di mod_fin, coerentemente con la lieve significatività del termine di secondo grado. Il BIC, che penalizza più severamente la complessità, indica al contrario come migliore il modello parsimonioso mod_fin, con il valore più basso in assoluto pari a 35220. Ci troviamo quindi nel caso tipico in cui AIC e BIC danno indicazioni opposte a fronte di uno scarto pratico irrilevante.

Si è quindi scelto mod_fin come modello finale: pur non avendo l’AIC più basso in assoluto, è il modello indicato dal BIC, è il più parsimonioso, contiene solo variabili significative ed è il più semplice da interpretare e da usare in previsione. Il confronto ANOVA tra mod_fin e mod1 non risulta significativo, con un p-value pari a 0,38, a conferma che le variabili escluse dalla selezione, cioè età materna e fumo, non aggiungono capacità esplicativa rilevante. La lieve non linearità della gestazione, statisticamente reale ma di entità pratica trascurabile, viene segnalata ma non inclusa, per privilegiare semplicità e robustezza. Il modello ridotto mod2 resta comunque utile come confronto interpretativo, perché mostra meglio il ruolo delle variabili materne e gestazionali, e in particolare l’effetto del fumo, quando non si includono le altre misure del neonato.

Diagnostica e qualità del modello finale

par(mfrow = c(2, 2))
plot(mod_fin)

par(mfrow = c(1, 1))

res_fin   <- residuals(mod_fin)
rmse_fin  <- sqrt(mean(res_fin^2))
r2_fin    <- summary(mod_fin)$r.squared
r2adj_fin <- summary(mod_fin)$adj.r.squared

rmse_fin
## [1] 274.274
r2_fin
## [1] 0.7270015
r2adj_fin
## [1] 0.7264542

La qualità del modello finale è stata valutata attraverso i grafici diagnostici, l’R², l’R² corretto e l’RMSE. Il modello presenta un R² corretto pari a circa 0,726 e un RMSE pari a circa 274 g. In termini pratici, ciò significa che il modello spiega una quota molto rilevante della variabilità del peso e che l’errore medio di previsione è dell’ordine di 274 grammi, un livello ragionevole considerando la naturale variabilità biologica del peso alla nascita.

I grafici diagnostici permettono di valutare visivamente alcune assunzioni del modello lineare, tra cui linearità, omoschedasticità e normalità approssimativa dei residui. Nel complesso il modello appare adeguato per finalità predittive, anche se i grafici evidenziano la presenza di alcuni valori estremi, soprattutto in corrispondenza dei residui più elevati, che meritano un approfondimento specifico.

Analisi dei valori influenti

cook   <- cooks.distance(mod_fin)
soglia <- 4 / n

n_infl   <- sum(cook > soglia)
oss_infl <- which(cook > soglia)

n_infl
## [1] 124
max(cook)
## [1] 0.8300965
dati[which.max(cook), ]
##      Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio
## 1551         35            1         0         38 4370       315    374
##      Tipo.parto Ospedale Sesso
## 1551        Nat     osp3     F
# Ristima del modello escludendo le osservazioni influenti, come controllo di robustezza
mod_noinfl <- lm(formula(mod_fin), data = dati[-oss_infl, ])
round(cbind(completo = coef(mod_fin),
            senza_influenti = coef(mod_noinfl)), 2)
##              completo senza_influenti
## (Intercept)  -6681.14        -7015.35
## Gestazione      32.33           30.54
## SessoM          77.99           78.70
## Lunghezza       10.25           11.26
## Cranio          10.54           10.21
## N.gravidanze    12.47           15.32

Per indagare la presenza di osservazioni influenti è stata calcolata la distanza di Cook, usando come soglia di attenzione il valore convenzionale 4/n. Le osservazioni che la superano sono 124, circa il 5% del campione, una quota fisiologica per un dataset di queste dimensioni. Il valore massimo della distanza di Cook è circa 0,83: resta sotto la soglia critica più severa, pari a 1, ma supera quella più prudente di 0,5, segnalando almeno un’osservazione moderatamente influente che merita un esame diretto.

Tale osservazione, corrispondente alla riga 1551, riguarda un neonato con lunghezza pari a 315 mm, tra i valori più bassi dell’intero campione, ma con un peso di 4370 g, tra i più alti. Si tratta di una combinazione biologicamente implausibile, verosimilmente dovuta a un errore di misurazione o di trascrizione, ed è proprio questa incoerenza tra lunghezza e peso a renderla così influente. Per verificare che casi del genere non distorcano le conclusioni, il modello è stato ristimato escludendo tutte le osservazioni segnalate: i coefficienti variano in modo modesto e non cambiano né segno né ordine di grandezza, a conferma della sostanziale stabilità del modello. Le previsioni vanno comunque interpretate con maggiore cautela nei casi più lontani dal profilo medio del campione.

Previsione su un nuovo caso

nuova_neonata <- data.frame(
  Fumatrici = 0,
  Gestazione = 39,
  Sesso = "F",
  Lunghezza = 490,
  Cranio = 338,
  Anni.madre = 28,
  N.gravidanze = 3
)

pred <- predict(mod_fin, newdata = nuova_neonata, interval = "prediction")
pred
##        fit      lwr      upr
## 1 3201.615 2662.635 3740.596

Infine, il modello selezionato è stato utilizzato per effettuare una previsione pratica, coerente con lo scenario proposto: una neonata di madre alla terza gravidanza che partorisce alla 39ª settimana. Poiché il modello finale impiega anche lunghezza e circonferenza cranica, che nello scenario non sono specificate ma sono comunque rilevabili in gravidanza tramite ecografia, sono stati assunti valori tipici, pari a 490 mm e 338 mm, mentre il numero di gravidanze precedenti è stato posto pari a 3.

Il modello stima un peso alla nascita pari a circa 3202 g, con un intervallo di previsione al 95% compreso approssimativamente tra 2663 g e 3741 g. L’intervallo è piuttosto ampio, ma coerente con la variabilità biologica del peso neonatale: anche a parità delle caratteristiche osservate, neonati con profili simili possono presentare pesi differenti. La previsione puntuale va quindi interpretata come stima del peso atteso, mentre l’intervallo fornisce un intervallo plausibile entro cui potrebbe collocarsi il peso effettivo.

È utile osservare che il modello finale predice il peso anche a partire da misure del neonato stesso, come lunghezza e cranio: ciò lo rende molto accurato, ma in una logica di pianificazione anticipata richiede che tali misure siano disponibili, per esempio tramite ecografia. Quando si dispone delle sole informazioni materne e gestazionali, il modello ridotto mod2 rappresenta un’alternativa meno precisa ma comunque utilizzabile.

Conclusioni

L’analisi ha permesso di individuare alcune variabili fortemente associate al peso neonatale. In particolare, la durata della gestazione, il sesso del neonato, la lunghezza e la circonferenza cranica risultano tra i predittori più rilevanti, insieme al numero di gravidanze precedenti.

La fase di modellazione ha previsto la stima di un modello completo, la verifica di possibili interazioni ed effetti non lineari e una selezione automatica basata sull’AIC. Quest’ultima ha portato a un modello finale parsimonioso, che esclude età materna e fumo, non significativi, mantenendo le sole variabili realmente informative. Il modello finale conserva un’elevata capacità esplicativa, spiegando circa il 72,6% della variabilità del peso, con un errore medio di previsione di circa 274 g.

Il confronto tra modelli ha mostrato che l’inclusione delle misure antropometriche migliora nettamente la qualità predittiva, mentre l’interazione fumo-gestazione si è rivelata non significativa e la lieve non linearità della gestazione, pur statisticamente significativa, ha un impatto pratico trascurabile. Il modello ridotto ha comunque fornito informazioni utili dal punto di vista interpretativo, evidenziando il possibile effetto negativo del fumo materno sul peso alla nascita quando si considerano solo variabili materne e gestazionali. L’analisi dei valori influenti, infine, ha confermato la stabilità del modello rispetto ai casi più estremi, segnalando al tempo stesso la presenza di qualche dato anomalo da verificare a livello di qualità della rilevazione.

Nel complesso, il modello finale rappresenta uno strumento utile per stimare il peso neonatale sulla base di variabili cliniche disponibili. Le previsioni devono comunque essere interpretate con cautela, soprattutto in presenza di neonati prematuri o profili molto diversi da quelli mediamente osservati nel campione.