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)
}
}
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:
NA sono stati sostituiti con la
stessa mediana.# 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%
## `geom_smooth()` using formula = 'y ~ x'
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.
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.
\[ F=\frac{\text{variabilità tra i gruppi}}{\text{variabilità all'interno dei gruppi}} \]
Fonti
Variabili
Entrambe le variabili sono qualitative; pertanto il test corretto è il test χ² di indipendenza.
Ipotesi
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.
Variabili
È opportuno utilizzare un One Sample t-test.
Ipotesi
Peso:
Lunghezza:
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à.
Variabili
È opportuno utilizzare un t-test per campioni indipendenti (Welch).
Ipotesi
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.
Variabili
È opportuno utilizzare un t-test per campioni indipendenti.
Ipotesi
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.
Variabili
È opportuno utilizzare un t-test per campioni indipendenti.
Ipotesi
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.
Variabili
È opportuno utilizzare un One-Way ANOVA.
Ipotesi
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à.
Variabili
È opportuno utilizzare un One-Way ANOVA.
Ipotesi
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.
Variabili
È opportuno utilizzare il test di correlazione di Pearson, che restituisce un coefficiente compreso tra:
Ipotesi
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
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.
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).
È 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:
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:
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.
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² | 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.
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.
I grafici diagnostici evidenziano un comportamento complessivamente adeguato del modello.
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.
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.
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
Il grafico evidenzia alcune osservazioni influenti:
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
| 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
| fit | lwr | upr |
|---|---|---|
| 3315.88 | 2778.17 | 3853.6 |
## `geom_smooth()` using formula = 'y ~ x'
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:
È 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.
Per migliorare esclusivamente la capacità predittiva potrebbero essere confrontati modelli non lineari come:
Tuttavia, la regressione lineare rimane preferibile perchè è meglio garantire una migliore interpretazione dei risultati del modello.
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.