MIN_ANNI_MADRE = 11
#' Crea una variabile categoriale a partire da una variabile numerica.
#'
#' Verifica che il numero di etichette corrisponda al numero di intervalli
#' definiti nei break e crea una nuova colonna categoriale utilizzando
#' la funzione `cut()`.
#'
#' @param dati Data frame contenente i dati.
#' @param variabile Nome della variabile numerica da categorizzare.
#' @param breaks Vettore dei punti di separazione degli intervalli.
#' @param labels Vettore delle etichette associate agli intervalli.
#' @param nome_categoria Nome della nuova variabile categoriale.
#'
#' @return Il data frame con la nuova variabile categoriale.
crea_categoria <- function(dati, variabile, breaks, labels, nome_categoria){
  if(length(labels) != length(breaks) - 1){
    stop(
      paste(
        "Errore in", nome_categoria, ":",
        length(breaks) - 1,
        "etichette richieste ma ne hai fornite",
        length(labels)
      )
    )
  }
  dati[[nome_categoria]] <- cut(
    dati[[variabile]],
    breaks = breaks,
    labels = labels
  )
  dati
}

#' Calcola la tabella delle frequenze di una variabile.
#'
#' Restituisce il numero di osservazioni e la percentuale associata
#' a ciascuna modalità della variabile selezionata.
#'
#' @param dati Data frame contenente i dati.
#' @param variabile Nome della variabile di cui calcolare la distribuzione.
#'
#' @return Un data frame contenente:
#' \itemize{
#'   \item la modalità della variabile;
#'   \item il numero di osservazioni (`n`);
#'   \item la percentuale sul totale.
#' }
tabella_frequenze <- function(dati, variabile) {

  dati %>%
    count(.data[[variabile]]) %>%
    mutate(
      Percentuale = paste0(round(n / sum(n) * 100, 2), "%")
    )
}

#' Controlla la validità dei valori di una variabile categoriale.
#'
#' Visualizza i valori osservati, il numero di valori mancanti
#' ed eventuali modalità non appartenenti all'insieme dei valori attesi.
#'
#' @param dati Data frame contenente i dati.
#' @param variabile Nome della variabile da controllare.
#' @param valori_attesi Vettore contenente i valori ammessi.
#'
#' @return Nessun valore restituito. La funzione stampa a video
#' informazioni di controllo sulla variabile.

controlla_categorie <- function(dati, variabile, valori_attesi){

  cat("\nVariabile:", variabile, "\n")

  cat("\nValori osservati:\n")
  print(sort(unique(dati[[variabile]])))

  cat("\nValori mancanti:\n")
  print(sum(is.na(dati[[variabile]])))

  valori_non_validi <- setdiff(unique(dati[[variabile]]), valori_attesi)

  if(length(valori_non_validi) == 0){
    cat("\nNessun valore non valido trovato.\n")
  } else{
    cat("\nValori non validi:\n")
    print(valori_non_validi)
  }
}

EDA

Eseguo un’analisi preliminare del dataset per verificare la presenza di dati mancanti o valori anomali, così da poterli gestire prima dell’addestramento del modello ed evitare che influenzino le previsioni.

I valori mancanti o palesemente errati sono stati sostituiti con la mediana, poiché il loro numero è ridotto e questa misura è robusta rispetto ai valori estremi.

Sono state effettuate le seguenti operazioni per ciascuna variabile:

# Anni.madre
head(dati_neonati)
##   Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio Tipo.parto
## 1         26            0         0         42 3380       490    325        Nat
## 2         21            2         0         39 3150       490    345        Nat
## 3         34            3         0         38 3640       500    375        Nat
## 4         28            1         0         41 3690       515    365        Nat
## 5         20            0         0         38 3700       480    335        Nat
## 6         32            0         0         40 3200       495    340        Nat
##   Ospedale Sesso
## 1     osp3     M
## 2     osp1     F
## 3     osp2     M
## 4     osp2     M
## 5     osp3     F
## 6     osp2     F
summary(dati_neonati)
##    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  
##                                       
##                                       
## 
names(dati_neonati)
##  [1] "Anni.madre"   "N.gravidanze" "Fumatrici"    "Gestazione"   "Peso"        
##  [6] "Lunghezza"    "Cranio"       "Tipo.parto"   "Ospedale"     "Sesso"
colSums(is.na(dati_neonati))
##   Anni.madre N.gravidanze    Fumatrici   Gestazione         Peso    Lunghezza 
##            0            0            0            0            0            0 
##       Cranio   Tipo.parto     Ospedale        Sesso 
##            0            0            0            0
table(
  dati_neonati$Anni.madre[
    dati_neonati$Anni.madre <= MIN_ANNI_MADRE - 1
  ],
  useNA = "ifany"
)
## 
## 0 1 
## 1 1
# Calcola la mediana dell'età della madre considerando
# esclusivamente i valori ritenuti validi.
mediana_anni_madre <- median(
  dati_neonati$Anni.madre[
    dati_neonati$Anni.madre >= MIN_ANNI_MADRE
  ],
  na.rm = TRUE
)

dati_neonati$Anni.madre[
  is.na(dati_neonati$Anni.madre) |
  (dati_neonati$Anni.madre >= 0 &
     dati_neonati$Anni.madre <= MIN_ANNI_MADRE - 1)
] <- mediana_anni_madre

summary(dati_neonati$Anni.madre)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   13.00   25.00   28.00   28.19   32.00   46.00
dati_neonati <- crea_categoria(
  dati_neonati,
  "Anni.madre",
  c(-Inf, 19, 24, 29, 34, Inf),
  c(
    "Adolescente",
    "Giovane adulta (20-24)",
    "Giovane adulta (25-29)",
    "Giovane adulta (30-34)",
    "Età materna avanzata"
  ),
  "Categorie_Anni_Madre"
)

tabella_frequenze(
  dati_neonati,
  "Categorie_Anni_Madre"
)
##     Categorie_Anni_Madre   n Percentuale
## 1            Adolescente 109       4.36%
## 2 Giovane adulta (20-24) 486      19.44%
## 3 Giovane adulta (25-29) 909      36.36%
## 4 Giovane adulta (30-34) 712      28.48%
## 5   Età materna avanzata 284      11.36%
# N gravidanze
dati_neonati <- crea_categoria(
  dati_neonati,
  "N.gravidanze",
  c(-Inf, 0, 1, 2, Inf),
  c(
    "0 gravidanze precedenti",
    "1 gravidanza precedente",
    "2 gravidanze precedenti",
    "3 gravidanze o più"
  ),
  "Categorie_gravidanze"
)

tabella_frequenze(dati_neonati, "Categorie_gravidanze")
##      Categorie_gravidanze    n Percentuale
## 1 0 gravidanze precedenti 1096      43.84%
## 2 1 gravidanza precedente  818      32.72%
## 3 2 gravidanze precedenti  340       13.6%
## 4      3 gravidanze o più  246       9.84%
# Peso
dati_neonati <- crea_categoria(
  dati_neonati,
  "Peso",
  c(-Inf, 1000, 1500, 2500, 4500, Inf),
  c(
    "Estremamente Basso (<1000 g)",
    "Molto Basso (1000-1499 g)",
    "Basso (1500-2499 g)",
    "Normopeso (2500-4499 g)",
    "Macrosomia fetale (>=4500 g)"
  ),
  "Categoria_peso"
)

tabella_frequenze(dati_neonati, "Categoria_peso")
##                 Categoria_peso    n Percentuale
## 1 Estremamente Basso (<1000 g)    6       0.24%
## 2    Molto Basso (1000-1499 g)   18       0.72%
## 3          Basso (1500-2499 g)  123       4.92%
## 4      Normopeso (2500-4499 g) 2335       93.4%
## 5 Macrosomia fetale (>=4500 g)   18       0.72%
# Gestazione
dati_neonati <- crea_categoria(
  dati_neonati,
  "Gestazione",
  c(-Inf, 28, 32, 39, 41, 42, Inf),
  c(
    "Estremamente pretermine (<28 settimane)",
    "Molto pretermine (28-31 settimane)",
    "Pretermine moderato (32-38 settimane)",
    "Pieno termine (39-40 settimane)",
    "Termine tardivo (41 settimane)",
    "Post-termine (>=42 settimane)"
  ),
  "Categoria_gestazione"
)

tabella_frequenze(dati_neonati, "Categoria_gestazione")
##                      Categoria_gestazione    n Percentuale
## 1 Estremamente pretermine (<28 settimane)    8       0.32%
## 2      Molto pretermine (28-31 settimane)   25          1%
## 3   Pretermine moderato (32-38 settimane) 1339      53.56%
## 4         Pieno termine (39-40 settimane) 1070       42.8%
## 5          Termine tardivo (41 settimane)   56       2.24%
## 6           Post-termine (>=42 settimane)    2       0.08%
# Lunghezza
p10_lunghezza <- quantile(dati_neonati$Lunghezza, 0.10, na.rm = TRUE)
p90_lunghezza <- quantile(dati_neonati$Lunghezza, 0.90, na.rm = TRUE)

lunghezza_breaks <- c(-Inf, p10_lunghezza, p90_lunghezza, Inf)

lunghezza_labels <- c(
  "Lunghezza bassa (≤ P10)",
  "Lunghezza nella norma (P10-P90)",
  "Lunghezza elevata (> P90)"
)

dati_neonati <- crea_categoria(
  dati_neonati,
  "Lunghezza",
  lunghezza_breaks,
  lunghezza_labels,
  "Categoria_lunghezza"
)
cat("P10 Lunghezza:", p10_lunghezza, "mm\n")
## P10 Lunghezza: 465 mm
cat("P90 Lunghezza:", p90_lunghezza, "mm\n")
## P90 Lunghezza: 520 mm
tabella_frequenze(dati_neonati, "Categoria_lunghezza")
##               Categoria_lunghezza    n Percentuale
## 1         Lunghezza bassa (≤ P10)  265       10.6%
## 2 Lunghezza nella norma (P10-P90) 1991      79.64%
## 3       Lunghezza elevata (> P90)  244       9.76%
# Cranio
p10_cranio <- quantile(dati_neonati$Cranio, 0.10, na.rm = TRUE)
p90_cranio <- quantile(dati_neonati$Cranio, 0.90, na.rm = TRUE)

cranio_breaks <- c(-Inf, p10_cranio, p90_cranio, Inf)

cranio_labels <- c(
  "Circonferenza cranica bassa (≤ P10)",
  "Circonferenza cranica nella norma (P10-P90)",
  "Circonferenza cranica elevata (> P90)"
)

dati_neonati <- crea_categoria(
  dati_neonati,
  "Cranio",
  cranio_breaks,
  cranio_labels,
  "Categoria_cranio"
)

cat("P10 Cranio:", p10_cranio, "mm\n")
## P10 Cranio: 320 mm
cat("P90 Cranio:", p90_cranio, "mm\n")
## P90 Cranio: 360 mm
tabella_frequenze(dati_neonati, "Categoria_cranio")
##                              Categoria_cranio    n Percentuale
## 1         Circonferenza cranica bassa (≤ P10)  252      10.08%
## 2 Circonferenza cranica nella norma (P10-P90) 2063      82.52%
## 3       Circonferenza cranica elevata (> P90)  185        7.4%
# Fumatrici
controlla_categorie(
  dati_neonati,
  "Fumatrici",
  c(0, 1)
)
## 
## Variabile: Fumatrici 
## 
## Valori osservati:
## [1] 0 1
## 
## Valori mancanti:
## [1] 0
## 
## Nessun valore non valido trovato.
dati_neonati$Fumatrici <- factor(
  dati_neonati$Fumatrici,
  levels = c(0, 1),
  labels = c("Non fumatrice", "Fumatrice")
)

tabella_frequenze(dati_neonati, "Fumatrici")
##       Fumatrici    n Percentuale
## 1 Non fumatrice 2396      95.84%
## 2     Fumatrice  104       4.16%
# Tipo.parto
controlla_categorie(
  dati_neonati,
  "Tipo.parto",
  c("Nat", "Ces")
)
## 
## Variabile: Tipo.parto 
## 
## Valori osservati:
## [1] "Ces" "Nat"
## 
## Valori mancanti:
## [1] 0
## 
## Nessun valore non valido trovato.
dati_neonati$Tipo.parto <- factor(
  dati_neonati$Tipo.parto,
  levels = c("Nat", "Ces"),
  labels = c("Parto naturale", "Taglio cesareo")
)

tabella_frequenze(dati_neonati, "Tipo.parto")
##       Tipo.parto    n Percentuale
## 1 Parto naturale 1772      70.88%
## 2 Taglio cesareo  728      29.12%
# Ospedale
controlla_categorie(
  dati_neonati,
  "Ospedale",
  c("osp1", "osp2", "osp3")
)
## 
## Variabile: Ospedale 
## 
## Valori osservati:
## [1] "osp1" "osp2" "osp3"
## 
## Valori mancanti:
## [1] 0
## 
## Nessun valore non valido trovato.
dati_neonati$Ospedale <- factor(
  dati_neonati$Ospedale,
  levels = c("osp1", "osp2", "osp3"),
  labels = c(
    "Ospedale 1",
    "Ospedale 2",
    "Ospedale 3"
  )
)

tabella_frequenze(dati_neonati, "Ospedale")
##     Ospedale   n Percentuale
## 1 Ospedale 1 816      32.64%
## 2 Ospedale 2 849      33.96%
## 3 Ospedale 3 835       33.4%
# Sesso
controlla_categorie(
  dati_neonati,
  "Sesso",
  c("M", "F")
)
## 
## Variabile: Sesso 
## 
## Valori osservati:
## [1] "F" "M"
## 
## Valori mancanti:
## [1] 0
## 
## Nessun valore non valido trovato.
dati_neonati$Sesso <- factor(
  dati_neonati$Sesso,
  levels = c("M", "F"),
  labels = c("Maschio", "Femmina")
)
tabella_frequenze(dati_neonati, "Sesso")
##     Sesso    n Percentuale
## 1 Maschio 1244      49.76%
## 2 Femmina 1256      50.24%

Plots

## `geom_smooth()` using formula = 'y ~ x'

Riepilogo EDA

Dopo l’EDA verranno effettuati opportuni test statistici per verificare se le relazioni osservate durante l’analisi esplorativa risultano statisticamente significative e per individuare le variabili maggiormente associate al peso del neonato. In particolare saranno analizzate le seguenti ipotesi:

Infine, le variabili che risulteranno statisticamente significative saranno considerate come possibili predittori nella costruzione del modello di regressione per la previsione del peso del neonato.

Test Statistici

N.B. È opportuno considerare che i test parametrici risultano generalmente robusti a moderate violazioni dell’ipotesi di normalità grazie al Teorema del Limite Centrale.

N.B. Per tutti i test t vale:

Equivalentemente:

Pertanto, nei test viene confrontata la differenza tra la media osservata e quella ipotizzata.

Considerazioni sull’ANOVA Test

  • Si utilizza quando si vuole confrontare una variabile quantitativa con una variabile categorica avente più di due livelli, evitando di eseguire numerosi t-test. Infatti, confrontare tutte le coppie di gruppi mediante più t-test aumenterebbe la probabilità di commettere un errore di I tipo (falso positivo).
  • L’ANOVA non individua quale gruppo differisce dagli altri, ma verifica solamente se almeno una media è diversa.
  • L’ANOVA confronta due tipi di variabilità:
    • variabilità tra i gruppi;
    • variabilità all’interno dei gruppi.
  • Se la variabilità tra i gruppi è molto maggiore della variabilità interna ai gruppi, allora è probabile che le medie siano realmente differenti. La statistica del test è

\[ F=\frac{\text{variabilità tra i gruppi}}{\text{variabilità all'interno dei gruppi}} \]

  • Se il valore di \(F\) è vicino a 1, le due variabilità risultano simili e, di conseguenza, anche le medie dei gruppi tendono ad essere simili.
  • Se invece il valore di \(F\) è elevato, significa che almeno una media differisce dalle altre.

Fonti


1. In alcuni ospedali si effettuano più parti cesarei

Variabili

  • Ospedale (categorica)
  • Tipo.parto (categorica)

Entrambe le variabili sono qualitative; pertanto il test corretto è il test χ² di indipendenza.

Ipotesi

  • \(H_0\): il tipo di parto è indipendente dall’ospedale.
  • \(H_1\): esiste un’associazione tra ospedale e tipo di parto.

Esito del test

Poiché il p-value (0.5778) è maggiore del livello di significatività (\(\alpha=0.05\)), non si rifiuta l’ipotesi nulla di indipendenza. Pertanto, nel campione analizzato, non vi sono evidenze statisticamente significative di un’associazione tra l’ospedale e il tipo di parto. In particolare, le differenze osservate nelle percentuali di parti cesarei tra i tre ospedali non risultano statisticamente significative e possono essere attribuite alla variabilità casuale del campione.


2. La media del peso e della lunghezza sono uguali a quelle della popolazione

Variabili

  • Peso (continua)
  • Lunghezza (continua)

È opportuno utilizzare un One Sample t-test.

Ipotesi

Peso:

  • \(H_0:\mu=3300\)
  • \(H_1:\mu\neq3300\)

Lunghezza:

  • \(H_0:\mu=500\)
  • \(H_1:\mu\neq500\)

Si considerano un peso medio pari a 3300 g e una lunghezza media pari a 500 mm, come valori di riferimento per la popolazione.

Fonte

https://www.ospedalebambinogesu.it/da-0-a-30-giorni-come-si-presenta-e-come-cresce-80012/

Esito del test

Il One Sample t-test, considerando il peso, non ha evidenziato differenze statisticamente significative tra la media del campione (3284 g) e quella ipotizzata per la popolazione (3300 g) (\(t=-1.52\); \(p=0.130\)). Pertanto non si rifiuta l’ipotesi nulla.

Per quanto riguarda la lunghezza, la media campionaria risulta significativamente diversa da quella ipotizzata. Ciò è confermato anche dall’intervallo di confidenza, che non contiene il valore di riferimento pari a 500 mm. Tale conclusione è supportata dal p-value, ampiamente inferiore al livello di significatività.


3. Le misure antropometriche sono diverse tra i due sessi

Variabili

  • Peso (continua)
  • Lunghezza (continua)
  • Cranio (continua)
  • Sesso (categorica)

È opportuno utilizzare un t-test per campioni indipendenti (Welch).

Ipotesi

  • \(H_0:\mu_M=\mu_F\)
  • \(H_1:\mu_M\neq\mu_F\)

Esito del test

Peso

Il test t di Welch evidenzia una differenza statisticamente significativa tra il peso medio dei neonati maschi e quello delle femmine (\(t=12.11\); \(p<0.001\)). Si rifiuta quindi l’ipotesi nulla. In media, i neonati maschi pesano circa 247 g in più delle femmine (3408 g contro 3161 g). L’intervallo di confidenza al 95% della differenza è compreso tra 207 g e 287 g.

Lunghezza

Anche la lunghezza media differisce significativamente tra i due sessi (\(t=9.58\); \(p<0.001\)). Si rifiuta l’ipotesi nulla. I neonati maschi risultano mediamente più lunghi di circa 10 mm rispetto alle femmine.

Cranio

Il diametro medio del cranio è significativamente maggiore nei maschi rispetto alle femmine (\(t=7.41\); \(p<0.001\)). Anche in questo caso si rifiuta l’ipotesi nulla.

Conclusione

Le misure antropometriche considerate (peso, lunghezza e circonferenza cranica) risultano significativamente maggiori nei neonati di sesso maschile rispetto a quelli di sesso femminile.


4. Il peso varia se una madre è fumatrice o meno

Variabili

  • Fumatrici (categorica)
  • Peso (continua)

È opportuno utilizzare un t-test per campioni indipendenti.

Ipotesi

  • \(H_0:\mu_F=\mu_{NF}\)
  • \(H_1:\mu_F\neq\mu_{NF}\)

Esito del test

Il test t di Welch non evidenzia una differenza statisticamente significativa tra il peso medio dei neonati di madri fumatrici e quello dei neonati di madri non fumatrici (\(t=1.03\); \(p=0.303\)). Pertanto non si rifiuta l’ipotesi nulla. Sebbene il peso medio dei figli di madri non fumatrici sia leggermente superiore (3286 g contro 3236 g), tale differenza non risulta statisticamente significativa.


5. Il peso varia tra le classi di tipo di parto

Variabili

  • Tipo.parto (categorica)
  • Peso (continua)

È opportuno utilizzare un t-test per campioni indipendenti.

Ipotesi

  • \(H_0:\mu_N=\mu_C\)
  • \(H_1:\mu_N\neq\mu_C\)

Esito del test

Il test t di Welch non evidenzia differenze statisticamente significative tra il peso medio dei neonati nati mediante parto naturale e quello dei neonati nati mediante taglio cesareo (\(t=0.13\); \(p=0.897\)). Pertanto non si rifiuta l’ipotesi nulla e non vi sono evidenze che il tipo di parto influenzi il peso alla nascita.


6. Il peso varia tra le classi di età materna

Variabili

  • Categorie_Anni_Madre (categorica)
  • Peso (continua)

È opportuno utilizzare un One-Way ANOVA.

Ipotesi

  • \(H_0:\mu_{Adolescente}=\mu_{20-24}=\mu_{25-29}=\mu_{30-34}=\mu_{\ge35}\)
  • \(H_1:\) almeno una delle medie è diversa.

Esito del test

L’ANOVA non evidenzia differenze statisticamente significative del peso medio tra le diverse classi di età materna (\(F=1.705\); \(p=0.146\)). Pertanto non si rifiuta l’ipotesi nulla e non vi sono evidenze che il peso medio del neonato vari significativamente in funzione della fascia di età della madre. Ciò è coerente con il fatto che la variabilità all’interno dei gruppi risulta maggiore della variabilità tra i gruppi e con il p-value superiore al livello di significatività.


7. Il peso dei neonati varia tra gli ospedali

Variabili

  • Ospedale (categorica)
  • Peso (continua)

È opportuno utilizzare un One-Way ANOVA.

Ipotesi

  • \(H_0:\mu_A=\mu_B=\mu_C\)
  • \(H_1:\) almeno una media differisce dalle altre.

Esito del test

L’ANOVA è stata applicata per confrontare il peso medio dei neonati nei tre ospedali. Il test non è risultato statisticamente significativo (\(F=1.699\); \(p=0.183\)). Pertanto non si rifiuta l’ipotesi nulla e non emergono differenze significative tra gli ospedali.


8. Il numero di settimane di gestazione è correlato al peso del neonato

Variabili

  • Gestazione (discreta)
  • Peso (continua)

È opportuno utilizzare il test di correlazione di Pearson, che restituisce un coefficiente compreso tra:

  • -1: massima correlazione negativa;
  • 0: assenza di correlazione;
  • +1: massima correlazione positiva.

Ipotesi

  • \(H_0:\rho=0\)
  • \(H_1:\rho\neq0\)

Esito del test

Il test di correlazione di Pearson evidenzia una correlazione positiva moderata e statisticamente significativa tra la durata della gestazione e il peso alla nascita (\(r=0.592\); \(p<0.001\)). Pertanto si rifiuta l’ipotesi nulla di assenza di correlazione. All’aumentare delle settimane di gestazione tende ad aumentare anche il peso del neonato.

##             
##              Parto naturale Taglio cesareo
##   Ospedale 1            574            242
##   Ospedale 2            595            254
##   Ospedale 3            603            232
##             
##              Parto naturale Taglio cesareo
##   Ospedale 1          70.34          29.66
##   Ospedale 2          70.08          29.92
##   Ospedale 3          72.22          27.78
##             
##              Parto naturale Taglio cesareo
##   Ospedale 1       578.3808       237.6192
##   Ospedale 2       601.7712       247.2288
##   Ospedale 3       591.8480       243.1520
## 
##  One Sample t-test
## 
## data:  dati_neonati$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
## 
##  One Sample t-test
## 
## data:  dati_neonati$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
## 
##  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 Maschio and group Femmina is not equal to 0
## 95 percent confidence interval:
##  207.0615 287.1051
## sample estimates:
## mean in group Maschio mean in group Femmina 
##              3408.215              3161.132
## 
##  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 Maschio and group Femmina is not equal to 0
## 95 percent confidence interval:
##   7.876273 11.929470
## sample estimates:
## mean in group Maschio mean in group Femmina 
##              499.6672              489.7643
## 
##  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 Maschio and group Femmina is not equal to 0
## 95 percent confidence interval:
##  3.541270 6.089912
## sample estimates:
## mean in group Maschio mean in group Femmina 
##              342.4486              337.6330
## 
##  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 Non fumatrice and group Fumatrice is not equal to 0
## 95 percent confidence interval:
##  -45.61354 145.22674
## sample estimates:
## mean in group Non fumatrice     mean in group Fumatrice 
##                    3286.153                    3236.346
## 
##  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 Parto naturale and group Taglio cesareo is not equal to 0
## 95 percent confidence interval:
##  -40.54037  46.27992
## sample estimates:
## mean in group Parto naturale mean in group Taglio cesareo 
##                     3284.916                     3282.047
##                        Df    Sum Sq Mean Sq F value Pr(>F)
## Categorie_Anni_Madre    4   1877665  469416   1.705  0.146
## Residuals            2495 687010877  275355
##               Df    Sum Sq Mean Sq F value Pr(>F)
## Ospedale       2    936237  468118   1.699  0.183
## Residuals   2497 687952305  275512
## 
##  Pearson's product-moment correlation
## 
## data:  dati_neonati$Peso and dati_neonati$Gestazione
## t = 36.691, df = 2498, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.5656894 0.6166655
## sample estimates:
##       cor 
## 0.5917687

Riepilogo dei test statistici

Nel complesso, i test statistici univariati evidenziano che le variabili Gestazione e Sesso sono quelle maggiormente associate al peso alla nascita, mostrando un’associazione statisticamente significativa con la variabile risposta.

Al contrario, le variabili Anni della madre, Fumatrici, Tipo di parto e Ospedale non risultano statisticamente significative nelle analisi univariate. Tuttavia, tale risultato non implica necessariamente che queste variabili debbano essere escluse dal modello di regressione multipla. Infatti, una variabile può non mostrare un effetto significativo se considerata singolarmente, ma contribuire in modo rilevante quando viene analizzata congiuntamente alle altre variabili esplicative, oppure migliorare la capacità predittiva complessiva del modello.

Per questo motivo, la selezione finale delle variabili è stata effettuata mediante regressione lineare multipla.

Creazione del Modello di Regressione

Strategia

Dopo aver ottenuto il modello finale mediante selezione automatica delle variabili, la sua capacità predittiva è stata valutata attraverso il coefficiente di determinazione R^2, il coefficiente di determinazione aggiustato e il Root Mean Squared Error (RMSE), che misura l’errore medio di previsione espresso in grammi. Successivamente sono state verificate le principali ipotesi della regressione lineare mediante l’analisi grafica dei residui (residui vs valori predetti, Q-Q Plot e Scale-Location Plot). Infine, sono stati individuati eventuali valori influenti tramite la distanza di Cook, il leverage e i residui standardizzati, valutando se alcune osservazioni potessero esercitare un’influenza eccessiva sulla stima dei coefficienti del modello. Inoltre, la presenza di multicollinearità tra le variabili esplicative è stata verificata mediante il Variance Inflation Factor (VIF).


Valutazione del modello di regressione lineare

È stato inizialmente costruito un modello di regressione lineare multipla (modello_baseline) considerando tutte le variabili disponibili per spiegare il peso neonatale:

\[ Peso \sim Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio + Tipo.parto + Ospedale + Sesso \]

Il modello completo ha ottenuto:

  • R² = 0.7289
  • R² corretto = 0.7278
  • RMSE = 273.9 g

Il coefficiente di determinazione indica che circa il 72.9% della variabilità del peso alla nascita è spiegata dalle variabili considerate, mentre il restante 27% è attribuibile ad altri fattori non presenti nel dataset o alla variabilità naturale del fenomeno biologico.

L’errore medio di previsione, espresso tramite RMSE, è pari a circa 273 grammi, valore contenuto considerando la variabilità fisiologica del peso neonatale.

Successivamente sono stati valutati alcuni modelli alternativi con l’obiettivo di migliorare le prestazioni predittive. In particolare, è stata introdotta una spline naturale per modellare un possibile effetto non lineare della durata della gestazione. Per modellare eventuali relazioni non lineari tra la durata della gestazione e il peso neonatale è stata utilizzata una natural cubic spline, implementata tramite la funzione ns() del package splines di R. Tale funzione costruisce automaticamente una base di spline cubiche naturali, ossia polinomi cubici a tratti raccordati nei nodi con continuità della funzione e delle sue prime due derivate, imponendo inoltre linearità oltre i nodi estremi.

L’introduzione di una spline naturale non ha evidenziato un miglioramento significativo delle prestazioni del modello, suggerendo che la relazione tra durata della gestazione e peso neonatale risulta approssimativamente lineare nell’intervallo osservato.

Sono stati testati due modelli comprendenti termini di interazione tra le variabili:

  • Gestazione × Lunghezza, per verificare se l’effetto della lunghezza sul peso variasse in funzione della durata della gravidanza;

  • Gestazione × Sesso, per valutare eventuali differenze nello sviluppo fetale tra maschi e femmine.

Nessuno di questi modelli ha prodotto un miglioramento significativo delle prestazioni in termini di capacità esplicativa e accuratezza predittiva rispetto al modello lineare. Per tale motivo si è preferito adottare un modello di regressione lineare più semplice e interpretabile, successivamente ottimizzato mediante il criterio AIC, che ha consentito di eliminare le variabili meno significative mantenendo pressoché inalterate le prestazioni del modello.

Fonti:


Analisi dei coefficienti

Dall’analisi dei coefficienti del modello completo emergono alcune variabili con un effetto statisticamente significativo sul peso.

Le variabili che mostrano un’associazione positiva con il peso sono:

  • Gestazione: ogni settimana aggiuntiva di gestazione determina un incremento medio stimato del peso di circa 32 g, mantenendo costanti le altre variabili.

  • Lunghezza: rappresenta uno dei principali predittori del peso; un aumento della lunghezza neonatale è associato ad un incremento del peso stimato.

  • Cranio: anche la circonferenza cranica mostra un effetto positivo significativo, indicando una relazione tra sviluppo corporeo e peso alla nascita.

  • Numero di gravidanze precedenti: presenta un effetto positivo ma più contenuto.

Per quanto riguarda le variabili categoriche:

  • Il parto cesareo presenta un coefficiente negativo rispetto al parto naturale, con una riduzione stimata del peso di circa 29 g.

  • Il sesso femminile mostra un coefficiente negativo significativo, con un peso medio stimato inferiore di circa 77 g rispetto al sesso maschile.

  • La variabile Ospedale mostra differenze significative solamente per l’Ospedale 3, mentre l’Ospedale 2 non risulta statisticamente diverso rispetto alla categoria di riferimento.

Al contrario, l’età della madre e il fumo durante la gravidanza non risultano statisticamente significativi nel modello completo.


Selezione del modello tramite AIC

Successivamente è stata applicata una procedura di selezione automatica basata sull’AIC (stepAIC), ottenendo un modello più parsimonioso:

[ Peso N.gravidanze + Gestazione + Lunghezza + Cranio + Tipo.parto + Ospedale + Sesso]

Sono state quindi eliminate:

poiché il loro contributo non risultava sufficiente a migliorare il compromesso tra complessità e capacità esplicativa del modello.

Il modello finale mantiene praticamente le stesse prestazioni:

Modello R² corretto
Completo 0.7289 0.7278
AIC 0.7287 0.7278

La perdita di capacità predittiva è trascurabile, mentre il modello risulta più semplice e maggiormente interpretabile.


Analisi della multicollinearità

Per verificare la presenza di ridondanza tra i predittori è stata analizzata la matrice di correlazione e successivamente calcolato il VIF.

La matrice di correlazione mostra:

Queste correlazioni sono coerenti dal punto di vista biologico, poiché neonati con maggiore sviluppo fetale tendono ad avere peso maggiore.

Le correlazioni tra variabili esplicative risultano invece moderate:

L’analisi VIF ha confermato l’assenza di multicollinearità:

Pertanto non è stato necessario eliminare variabili antropometriche come Lunghezza o Cranio, poiché entrambe forniscono informazioni indipendenti utili alla previsione del peso.


Analisi dei residui e diagnostica del modello

I grafici diagnostici evidenziano un comportamento complessivamente adeguato del modello.

Residuals vs Fitted

La maggior parte dei residui è distribuita attorno allo zero senza una struttura evidente. La linea di smoothing rimane vicina alla linea orizzontale, suggerendo una relazione prevalentemente lineare tra variabili esplicative e peso.

Sono tuttavia presenti alcuni valori estremi, in particolare l’osservazione 1551, caratterizzata da un residuo molto elevato.


Q-Q plot

Il grafico Q-Q mostra una buona aderenza dei residui alla distribuzione normale nella parte centrale.

Si osservano però deviazioni nelle code, soprattutto nella parte superiore, dovute alla presenza di alcuni neonati con peso molto superiore rispetto alla previsione del modello.

Questi punti rappresentano possibili outlier biologici e non necessariamente errori nei dati.


Scale-Location e Residui Standardizzati

Il grafico dei residui standardizzati rispetto all’indice mostra una distribuzione casuale dei residui attorno allo zero, senza evidenti pattern sistematici. La quasi totalità delle osservazioni rientra nell’intervallo ±3, sebbene siano presenti pochi outlier con residui standardizzati elevati. Dunque, non emerge una marcata eteroschedasticità, anche se per valori estremi del peso si osserva una maggiore variabilità.

Ho applicato la radice quadrata ai residui perchè questa trasformazione rende più facile valutare la variabilità dei residui. Il grafico Scale-Location evidenzia una dispersione dei residui sostanzialmente costante lungo l’intervallo dei valori predetti. La linea di smoothing risulta pressoché orizzontale, suggerendo che l’ipotesi di omoschedasticità sia ragionevolmente soddisfatta, pur in presenza di una lieve crescita della variabilità per valori predetti più elevati e di alcune osservazioni anomale


Residuals vs Leverage e Cook’s Distance

Il grafico evidenzia alcune osservazioni influenti:

  • osservazione 1551
  • osservazione 310

In particolare l’osservazione 1551 presenta un’elevata distanza di Cook, indicando una possibile influenza sul modello.

Tuttavia, considerando la dimensione del campione (2500 osservazioni), tali punti non sembrano compromettere significativamente la validità complessiva del modello.


## 
## Call:
## lm(formula = Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + 
##     Lunghezza + Cranio + Tipo.parto + Ospedale + Sesso, data = dati_neonati)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1123.3  -181.2   -14.6   160.7  2612.6 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              -6628.1178   142.9212 -46.376  < 2e-16 ***
## Anni.madre                   0.7983     1.1463   0.696   0.4862    
## N.gravidanze                11.4118     4.6665   2.445   0.0145 *  
## FumatriciFumatrice         -30.1567    27.5396  -1.095   0.2736    
## Gestazione                  32.5265     3.8179   8.520  < 2e-16 ***
## Lunghezza                   10.2951     0.3007  34.237  < 2e-16 ***
## Cranio                      10.4725     0.4261  24.580  < 2e-16 ***
## Tipo.partoTaglio cesareo   -29.5027    12.0848  -2.441   0.0147 *  
## OspedaleOspedale 2         -11.2216    13.4388  -0.835   0.4038    
## OspedaleOspedale 3          28.0984    13.4972   2.082   0.0375 *  
## SessoFemmina               -77.5473    11.1779  -6.938 5.07e-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.1 on 10 and 2489 DF,  p-value: < 2.2e-16
##              Peso N.gravidanze Gestazione Lunghezza Cranio
## Peso         1.00         0.00       0.59      0.80   0.70
## N.gravidanze 0.00         1.00      -0.10     -0.06   0.04
## Gestazione   0.59        -0.10       1.00      0.62   0.46
## Lunghezza    0.80        -0.06       0.62      1.00   0.60
## Cranio       0.70         0.04       0.46      0.60   1.00

## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto + Ospedale + Sesso, data = dati_neonati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1113.18  -181.16   -16.58   161.01  2620.19 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              -6600.7079   137.4857 -48.010  < 2e-16 ***
## N.gravidanze                12.3619     4.3325   2.853  0.00436 ** 
## Gestazione                  31.9909     3.7896   8.442  < 2e-16 ***
## Lunghezza                   10.3086     0.3004  34.316  < 2e-16 ***
## Cranio                      10.4922     0.4254  24.661  < 2e-16 ***
## Tipo.partoTaglio cesareo   -29.2803    12.0817  -2.424  0.01544 *  
## OspedaleOspedale 2         -11.0227    13.4363  -0.820  0.41209    
## OspedaleOspedale 3          28.6408    13.4886   2.123  0.03382 *  
## SessoFemmina               -77.4412    11.1756  -6.930 5.36e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 273.9 on 2491 degrees of freedom
## Multiple R-squared:  0.7287, Adjusted R-squared:  0.7278 
## F-statistic: 836.3 on 8 and 2491 DF,  p-value: < 2.2e-16

##                  GVIF Df GVIF^(1/(2*Df))
## N.gravidanze 1.025244  1        1.012544
## Gestazione   1.670237  1        1.292376
## Lunghezza    2.081921  1        1.442886
## Cranio       1.626507  1        1.275346
## Tipo.parto   1.003872  1        1.001934
## Ospedale     1.003038  2        1.000759
## Sesso        1.040337  1        1.019969
##                            Modello        R2 R2_corretto      AIC     RMSE
## 1                         Baseline 0.7288782   0.7277889 35172.09 273.3296
## 2                           Spline 0.7300810   0.7287786 35164.97 272.7227
## 3 Interazione Gestazione:Lunghezza 0.7316517   0.7304653 35148.38 271.9280
## 4     Interazione Gestazione:Sesso 0.7290567   0.7278588 35172.44 273.2396

Predizioni

Caratteristiche del nuovo neonato utilizzato per la previsione
Anni.madre N.gravidanze Fumatrici Gestazione Lunghezza Cranio Tipo.parto Ospedale Sesso
30 2 Non fumatrice 39 500 340 Parto naturale Ospedale 1 Femmina
## Peso previsto per il nuovo neonato: 3316 grammi
Intervallo di previsione al 95% del peso neonatale
fit lwr upr
3315.88 2778.17 3853.6

## `geom_smooth()` using formula = 'y ~ x'

Possibili miglioramenti futuri

Sebbene il modello lineare abbia ottenuto buone prestazioni (R² ≈ 0.73 e RMSE ≈ 273 g), il restante errore di previsione suggerisce la presenza di relazioni più complesse non completamente catturate dalla regressione lineare.

Possibili miglioramenti futuri potrebbero includere:

1. Trasformazioni non lineari

È stata valutata la possibilità di modellare relazioni non lineari tra la variabile risposta e i predittori mediante l’impiego di spline naturali. Tuttavia, tale approccio non ha evidenziato miglioramenti significativi nelle prestazioni del modello rispetto alla regressione lineare.

Poiché le spline rappresentano una classe di modelli sufficientemente flessibile per descrivere eventuali effetti non lineari, ulteriori trasformazioni della stessa natura (ad esempio termini quadratici) difficilmente apporterebbero benefici rilevanti.


2. Modelli più flessibili

Per migliorare esclusivamente la capacità predittiva potrebbero essere confrontati modelli non lineari come:

  • Random Forest
  • Gradient Boosting
  • XGBoost

Tuttavia, la regressione lineare rimane preferibile perchè è meglio garantire una migliore interpretazione dei risultati del modello.


Conclusione

Il modello finale rappresenta un buon compromesso tra interpretabilità e capacità predittiva. La selezione tramite AIC ha permesso di ottenere un modello più semplice senza perdita significativa di performance. Le variabili antropometriche del neonato e la durata della gestazione risultano i principali fattori associati al peso alla nascita. Il modello, in presenza di nuovi dati, predice con una buona accuratezza il peso di un neonato. Questo viene evidenziato dal grafico “Peso Reale dei neonati e previsione del modello”.

Eventuali miglioramenti delle prestazioni del modello saranno ricercati mediante l’impiego di modelli non lineari, in grado di catturare meglio le relazioni e le interazioni tra le variabili.