1 Introduzione

Il presente progetto ha l’obiettivo di costruire un modello statistico per prevedere il peso dei neonati alla nascita, utilizzando variabili cliniche e demografiche raccolte da tre ospedali.

Il peso alla nascita rappresenta un indicatore importante dello stato di salute neonatale. Una previsione accurata può supportare il personale medico nell’identificazione precoce di situazioni potenzialmente critiche e nella pianificazione delle risorse ospedaliere.

2 Obiettivi del progetto

Gli obiettivi principali dell’analisi sono:

3 Caricamento dei dati

dati=read.csv("neonati.csv")
n = nrow(dati)
kable(summary(dati)) |>
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE
  )
Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio Tipo.parto Ospedale Sesso
Min. : 0.00 Min. : 0.0000 Min. :0.0000 Min. :25.00 Min. : 830 Min. :310.0 Min. :235 Length:2500 Length:2500 Length:2500
1st Qu.:25.00 1st Qu.: 0.0000 1st Qu.:0.0000 1st Qu.:38.00 1st Qu.:2990 1st Qu.:480.0 1st Qu.:330 Class :character Class :character Class :character
Median :28.00 Median : 1.0000 Median :0.0000 Median :39.00 Median :3300 Median :500.0 Median :340 Mode :character Mode :character Mode :character
Mean :28.16 Mean : 0.9812 Mean :0.0416 Mean :38.98 Mean :3284 Mean :494.7 Mean :340 NA NA NA
3rd Qu.:32.00 3rd Qu.: 1.0000 3rd Qu.:0.0000 3rd Qu.:40.00 3rd Qu.:3620 3rd Qu.:510.0 3rd Qu.:350 NA NA NA
Max. :46.00 Max. :12.0000 Max. :1.0000 Max. :43.00 Max. :4930 Max. :565.0 Max. :390 NA NA NA
str(dati)
## 'data.frame':    2500 obs. of  10 variables:
##  $ Anni.madre  : int  26 21 34 28 20 32 26 25 22 23 ...
##  $ N.gravidanze: int  0 2 3 1 0 0 1 0 1 0 ...
##  $ Fumatrici   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Gestazione  : int  42 39 38 41 38 40 39 40 40 41 ...
##  $ Peso        : int  3380 3150 3640 3690 3700 3200 3100 3580 3670 3700 ...
##  $ Lunghezza   : int  490 490 500 515 480 495 480 510 500 510 ...
##  $ Cranio      : int  325 345 375 365 335 340 345 349 335 362 ...
##  $ Tipo.parto  : chr  "Nat" "Nat" "Nat" "Nat" ...
##  $ Ospedale    : chr  "osp3" "osp1" "osp2" "osp2" ...
##  $ Sesso       : chr  "M" "F" "M" "M" ...
colSums(is.na(dati))
##   Anni.madre N.gravidanze    Fumatrici   Gestazione         Peso    Lunghezza 
##            0            0            0            0            0            0 
##       Cranio   Tipo.parto     Ospedale        Sesso 
##            0            0            0            0

4 Preparazione dei dati

In questa sezione vengono controllati i tipi delle variabili e vengono trasformate in fattori le variabili categoriche.

# Esempio di preparazione dei dati.
# Decommentare e adattare i nomi delle variabili al dataset reale.

dati <- dati |>
  mutate(
    Fumatrici = factor(Fumatrici, levels = c(0, 1), labels = c("No", "Si")),
    Tipo.parto = factor(Tipo.parto),
    Ospedale = factor(Ospedale),
    Sesso = factor(Sesso)
  )

5 Statistica descrittiva

Dall’analisi delle variabili quantitative emerge che il peso medio dei neonati è pari a circa 3284 grammi, con una mediana di 3300 grammi. La vicinanza tra media e mediana suggerisce una distribuzione sostanzialmente simmetrica.

La deviazione standard del peso, pari a circa 525 grammi, indica una variabilità moderata all’interno del campione. I quartili (Q1 = 2990, Q3 = 3620) confermano una dispersione contenuta dei dati.

Anche le altre misure antropometriche, come lunghezza e circonferenza cranica, mostrano valori medi rispettivamente pari a circa 495 mm e 340 mm, con distribuzioni equilibrate e senza evidenti asimmetrie.

Per quanto riguarda la durata della gestazione, il valore medio è pari a circa 39 settimane, con una mediana anch’essa pari a 39, indicando che la maggior parte delle nascite avviene a termine.

L’età media delle madri è pari a circa 28 anni, con una dispersione moderata (deviazione standard di circa 5 anni), suggerendo una buona variabilità nel campione.

Infine, il numero medio di gravidanze è pari a circa 1, con una mediana di 1, evidenziando come la maggior parte delle madri si trovi alla prima o seconda gravidanza.

Nel complesso, non emergono valori estremamente anomali dalle statistiche riassuntive, suggerendo una buona qualità del dataset.

L’analisi delle variabili qualitative evidenzia una distribuzione complessivamente equilibrata tra le principali categorie. Per quanto riguarda il sesso del neonato, si osserva una ripartizione pressoché uniforme tra maschi e femmine, con percentuali pari rispettivamente a circa il 49.8% e il 50.2%, indicando un campione bilanciato sotto questo profilo. La distribuzione tra i diversi ospedali risulta anch’essa omogenea, con ciascuna struttura che contribuisce a circa un terzo delle osservazioni. Questo aspetto garantisce una buona rappresentatività del campione rispetto ai centri coinvolti. In relazione al tipo di parto, si rileva una prevalenza di parti naturali (circa 71%) rispetto ai cesarei (circa 29%), dato coerente con quanto generalmente osservato nella pratica clinica. Infine, la variabile relativa al fumo materno evidenzia una netta predominanza di madri non fumatrici (circa 96%), mentre la quota di fumatrici risulta contenuta (circa 4%). Questa distribuzione riflette un comportamento atteso nella popolazione, ma suggerisce anche una possibile limitata variabilità per questa variabile nelle analisi successive. Nel complesso, le variabili categoriali presentano una distribuzione plausibile e coerente, risultando adeguate per le successive analisi inferenziali.

# Tabella descrittiva per variabili quantitative
variabili_num <- c("Peso", "Lunghezza", "Gestazione", "Cranio", "Anni.madre", "N.gravidanze")

stat_num <- dati |>
  summarise(across(
    all_of(variabili_num),
    list(
      media = ~mean(.x),
      mediana = ~median(.x),
      sd = ~sd(.x),
      q1 = ~quantile(.x, 0.25),
      q3 = ~quantile(.x, 0.75)
    )
  ))

kable(stat_num, digits = 2)|>
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE
  )
Peso_media Peso_mediana Peso_sd Peso_q1 Peso_q3 Lunghezza_media Lunghezza_mediana Lunghezza_sd Lunghezza_q1 Lunghezza_q3 Gestazione_media Gestazione_mediana Gestazione_sd Gestazione_q1 Gestazione_q3 Cranio_media Cranio_mediana Cranio_sd Cranio_q1 Cranio_q3 Anni.madre_media Anni.madre_mediana Anni.madre_sd Anni.madre_q1 Anni.madre_q3 N.gravidanze_media N.gravidanze_mediana N.gravidanze_sd N.gravidanze_q1 N.gravidanze_q3
3284.08 3300 525.04 2990 3620 494.69 500 26.32 480 510 38.98 39 1.87 38 40 340.03 340 16.43 330 350 28.16 28 5.27 25 32 0.98 1 1.28 0 1
# Tabella di frequenza per variabili qualitative
variabili_cat <- c("Fumatrici", "Tipo.parto", "Ospedale", "Sesso")

tab_freq <- lapply(variabili_cat, function(v) {
  freq_ass <- table(dati[[v]])
  freq_rel <- freq_ass / nrow(dati)
  
  data.frame(
    Variabile = v,
    Categoria = names(freq_ass),
    Frequenza = as.vector(freq_ass),
    Frequenza_relativa = round(as.vector(freq_rel), 3),
    Percentuale = round(as.vector(freq_rel * 100), 2)
  )
}) |>
  dplyr::bind_rows()

kable(tab_freq)|>
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE
  )
Variabile Categoria Frequenza Frequenza_relativa Percentuale
Fumatrici No 2396 0.958 95.84
Fumatrici Si 104 0.042 4.16
Tipo.parto Ces 728 0.291 29.12
Tipo.parto Nat 1772 0.709 70.88
Ospedale osp1 816 0.326 32.64
Ospedale osp2 849 0.340 33.96
Ospedale osp3 835 0.334 33.40
Sesso F 1256 0.502 50.24
Sesso M 1244 0.498 49.76

6 grafici statistica descrittiva

L’analisi dei boxplot delle principali variabili quantitative evidenzia una distribuzione complessivamente regolare, con una tendenza centrale ben definita e una dispersione contenuta per la maggior parte delle osservazioni. In particolare, il peso alla nascita presenta una distribuzione centrata intorno a valori tipici, con una mediana pari a circa 3300 grammi e un intervallo interquartile compreso tra circa 3000 e 3600 grammi. Analogamente, anche le variabili lunghezza, circonferenza cranica e durata della gestazione mostrano distribuzioni coerenti con il contesto clinico e una variabilità moderata. Tuttavia, in tutte le variabili analizzate si osserva la presenza di valori anomali (outlier), rappresentati dai punti al di fuori dei baffi del boxplot. Tali osservazioni risultano particolarmente evidenti soprattutto nella parte inferiore della distribuzione per alcune variabili, suggerendo la presenza di valori estremi più frequenti tra le osservazioni più basse. L’analisi dei valori minimi e massimi non evidenzia la presenza di dati implausibili o incoerenti. Al contrario, i valori estremi osservati risultano compatibili con la naturale variabilità del fenomeno, potendo essere associati, ad esempio, a nascite premature o a neonati con dimensioni superiori alla media. Pertanto, la presenza di outlier non viene interpretata come indicativa di errori nei dati, ma come espressione della variabilità intrinseca del contesto reale. Di conseguenza, tali osservazioni verranno mantenute nel dataset e considerate nelle successive analisi, in particolare nella costruzione del modello di regressione.

boxplot(dati$Peso, main = "Boxplot Peso")

boxplot(dati$Lunghezza, main = "Boxplot Lunghezza")

boxplot(dati$Gestazione, main = "Boxplot Gestazione")

boxplot(dati$Cranio, main = "Boxplot Cranio")

6.1 altri grafici descrittivi per capire al meglio il dataset

#istogramma del peso
hist(dati$Peso,
     main = "Distribuzione del peso alla nascita",
     xlab = "Peso (grammi)",
     breaks = 30)

#Boxplot peso per sesso 
boxplot(Peso ~ Sesso, data = dati,
        main = "Peso per sesso",
        xlab = "Sesso",
        ylab = "Peso")

#Boxplot peso per fumo
boxplot(Peso~Fumatrici,data=dati,
        main="Peso per fumatrici",
        xlab="Fumatrici",
        ylab="Peso")

7 Test d’ipotesi

7.1 Differenze nella frequenza dei parti cesarei tra ospedali

Si vuole verificare se il tipo di parto sia indipendente dall’ospedale di nascita.

  • Ipotesi nulla \(H_0\): tipo di parto e ospedale sono indipendenti.
  • Ipotesi alternativa \(H_1\): tipo di parto e ospedale non sono indipendenti.

analizziamo i risultati ottenuti: Il valore del p-value è pari a 0.5778, superiore al livello di significatività del 5%.

Pertanto, non si rifiuta l’ipotesi nulla di indipendenza tra ospedale di nascita e tipo di parto.

Non emergono evidenze statisticamente significative per affermare che la distribuzione tra parti naturali e cesarei differisca tra i diversi ospedali. I dati suggeriscono quindi che il tipo di parto sia sostanzialmente indipendente dalla struttura ospedaliera considerata.

tabella_parti=table(dati$Ospedale, dati$Tipo.parto)
test_chi=chisq.test(tabella_parti)
test_chi
## 
##  Pearson's Chi-squared test
## 
## data:  tabella_parti
## X-squared = 1.0972, df = 2, p-value = 0.5778

7.2 Confronto della media del peso e della lunghezza con il valore della popolazione

test per il peso le mie ipotesi sono: H₀: μ = 3300 H₁: μ ≠ 3300 Il valore del p-value risulta pari a 0.1296, superiore al livello di significatività del 5%. Pertanto, non si rifiuta l’ipotesi nulla. Non emergono evidenze statisticamente significative per affermare che la media del peso nel campione sia diversa da 3300 grammi. Questo risultato è coerente anche con l’intervallo di confidenza al 95% ([3263.49 ; 3304.67]), che include il valore di riferimento della popolazione. Si può quindi concludere che la media osservata nel campione è compatibile con quella della popolazione, considerando la variabilità campionaria.

test per la lunghezza le mie ipotesi sono: H₀: μ = 500 H₁: μ ≠ 500

Il valore del p-value risulta estremamente inferiore al livello di significatività del 5% (p-value < 2.2e-16), pertanto si rifiuta l’ipotesi nulla.

Si conclude che la lunghezza media nel campione è statisticamente diversa da 500 mm.

Questo risultato è coerente anche con l’intervallo di confidenza al 95% ([493.66 ; 495.72]), che non include il valore di riferimento.

La lunghezza media osservata nel campione (circa 494.7 mm) risulta quindi significativamente inferiore al valore ipotizzato.

#test per il peso
media_popolazione_peso=3300
t.test(dati$Peso,
       mu=3300,
       conf.level=0.95,
       alternative = "two.sided")
## 
##  One Sample t-test
## 
## data:  dati$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
#test per la lunghezza
media_popolazione_lunghezza=500
t.test(dati$Lunghezza,
       mu=500,
       conf.level=0.95,
       alternative = "two.sided")
## 
##  One Sample t-test
## 
## data:  dati$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

7.3 Differenze antropometriche tra maschi e femmine

Le misure antropometriche sono significativamente diverse tra i due sessi Per verificare se le misure antropometriche differiscono tra i due sessi, sono stati effettuati t-test per campioni indipendenti. Poiché sono stati eseguiti più test, è stata considerata una correzione per confronti multipli tramite il metodo di Bonferroni. Per quanto riguarda il peso alla nascita, il test evidenzia un valore del p-value estremamente inferiore al livello di significatività del 5% (p-value < 2.2e-16). Anche dopo correzione, il risultato rimane altamente significativo. Si rifiuta quindi l’ipotesi nulla e si conclude che esiste una differenza statisticamente significativa tra maschi e femmine. In particolare, il peso medio è pari a circa 3161 g per le femmine e 3408 g per i maschi. Analogamente, per la lunghezza, il test mostra una differenza significativa (p-value < 2.2e-16), che rimane tale anche dopo correzione. I maschi presentano una lunghezza media maggiore (circa 500 mm) rispetto alle femmine (circa 490 mm). Anche per la circonferenza cranica, il test evidenzia una differenza significativa (p-value = 1.7e-13), che permane dopo l’applicazione della correzione di Bonferroni. I valori medi risultano pari a circa 337.6 mm per le femmine e 342.4 mm per i maschi. Nel complesso, i risultati indicano che le misure antropometriche differiscono significativamente tra i due sessi, e tali differenze risultano robuste anche considerando la correzione per confronti multipli.

#test per il peso dato il sesso
t.test(Peso ~ Sesso, data = dati)
## 
##  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
#test per la lunghezza dato il sesso
t.test(Lunghezza~Sesso,data=dati)
## 
##  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
#test per il diametro del cranio dato il sesso
t.test(Cranio~Sesso,data=dati)
## 
##  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
# Poiché sono stati effettuati più test statistici sulle diverse misure antropometriche,
# si applica la correzione di Bonferroni ai p-value per controllare l’inflazione del rischio
# di errore di tipo I (falsi positivi) e garantire una maggiore accuratezza nell’interpretazione dei risultati.

p_values <- c(
  t.test(Peso ~ Sesso, data = dati)$p.value,
  t.test(Lunghezza ~ Sesso, data = dati)$p.value,
  t.test(Cranio ~ Sesso, data = dati)$p.value
)

p.adjust(p_values, method = "bonferroni")
## [1] 2.408923e-32 6.711728e-21 5.153084e-13

8 Modello di regressione lineare multipla

L’obiettivo è prevedere il peso alla nascita del neonato utilizzando le variabili cliniche e demografiche disponibili.

È stato stimato un modello di regressione lineare multipla al fine di analizzare l’impatto delle diverse variabili sul peso alla nascita.

Il modello risulta complessivamente significativo (p-value < 2.2e-16) e presenta un coefficiente di determinazione R² pari a 0.73, indicando che circa il 73% della variabilità del peso è spiegata dalle variabili incluse.

Dall’analisi dei coefficienti emerge che alcune variabili risultano statisticamente significative, mentre altre non mostrano un effetto rilevante.

In particolare, la durata della gestazione risulta altamente significativa (p-value < 2e-16) e presenta un coefficiente positivo: un aumento di una settimana di gestazione è associato, in media, a un incremento del peso di circa 32.6 grammi, coerentemente con le aspettative cliniche.

Anche la lunghezza e la circonferenza cranica risultano fortemente significative (p-value < 2e-16), indicando che neonati con dimensioni maggiori tendono ad avere un peso più elevato.

Il sesso del neonato risulta anch’esso significativo (p-value < 0.001), con un coefficiente positivo per i maschi: a parità delle altre condizioni, i neonati maschi pesano in media circa 77.5 grammi in più rispetto alle femmine.

Tra le variabili con significatività più moderata, si osserva che il numero di gravidanze e il tipo di parto risultano significativi, mentre per quanto riguarda l’ospedale, solo una delle strutture mostra un effetto statisticamente rilevante rispetto alla categoria di riferimento.

Al contrario, l’età della madre e il fumo materno non risultano statisticamente significativi, suggerendo che, una volta controllato per le altre variabili, non emergono evidenze di un loro effetto diretto sul peso alla nascita.

Nel complesso, il modello evidenzia come le principali determinanti del peso alla nascita siano le caratteristiche fisiche del neonato, la durata della gestazione e il sesso, mentre altri fattori mostrano un impatto più limitato o non significativo.

Alla luce dei risultati ottenuti, si procederà all’applicazione di opportune tecniche di selezione e miglioramento del modello, con l’obiettivo di ottenere una specificazione più parsimoniosa, mantenendo solo le variabili statisticamente rilevanti e verificando la bontà complessiva del modello attraverso adeguate analisi diagnostiche.

#controlliamo se il peso segue una distribuzione normale
shapiro.test(dati$Peso)
## 
##  Shapiro-Wilk normality test
## 
## data:  dati$Peso
## W = 0.97066, p-value < 2.2e-16
#Il test di Shapiro-Will evidenzia un p-value estremamente ridotto, portando al rifiuto #dell’ipotesi di normalità. Tuttavia, data l’elevata numerosità del campione (n = 2500), il test #risulta particolarmente sensibile anche a minime deviazioni dalla normalità. Pertanto, tale #risultato non viene considerato problematico ai fini dell’analisi, anche alla luce del Teorema #del Limite Centrale, che garantisce la robustezza dei metodi statistici utilizzati.


mod_1 <- lm(Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione +
  Lunghezza + Cranio + Tipo.parto + Ospedale + Sesso,  data = dati)
summary(mod_1)
## 
## Call:
## lm(formula = Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + 
##     Lunghezza + Cranio + Tipo.parto + Ospedale + Sesso, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1124.40  -181.66   -14.42   160.91  2611.89 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -6738.4762   141.3087 -47.686  < 2e-16 ***
## Anni.madre        0.8921     1.1323   0.788   0.4308    
## N.gravidanze     11.2665     4.6608   2.417   0.0157 *  
## FumatriciSi     -30.1631    27.5386  -1.095   0.2735    
## Gestazione       32.5696     3.8187   8.529  < 2e-16 ***
## Lunghezza        10.2945     0.3007  34.236  < 2e-16 ***
## Cranio           10.4707     0.4260  24.578  < 2e-16 ***
## Tipo.partoNat    29.5254    12.0844   2.443   0.0146 *  
## Ospedaleosp2    -11.2095    13.4379  -0.834   0.4043    
## Ospedaleosp3     28.0958    13.4957   2.082   0.0375 *  
## SessoM           77.5409    11.1776   6.937 5.08e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 273.9 on 2489 degrees of freedom
## Multiple R-squared:  0.7289, Adjusted R-squared:  0.7278 
## F-statistic: 669.2 on 10 and 2489 DF,  p-value: < 2.2e-16

9 Selezione del modello migliore

Al fine di individuare un modello più parsimonioso, è stata applicata una procedura di selezione stepwise basata sul criterio di informazione bayesiano (BIC), che penalizza maggiormente la complessità del modello rispetto ad altri criteri.

La procedura ha portato all’eliminazione delle variabili non rilevanti, quali età della madre, fumo materno, tipo di parto e ospedale, suggerendo che queste non contribuiscono in modo significativo alla spiegazione del peso alla nascita una volta considerate le altre variabili.

Il modello finale include le variabili numero di gravidanze, durata della gestazione, lunghezza, circonferenza cranica e sesso del neonato, che risultano le principali determinanti del peso.

Questo risultato è coerente con l’analisi precedente, confermando il ruolo centrale delle caratteristiche fisiche del neonato e della gestazione, mentre altri fattori mostrano un impatto più limitato.

Rispetto al modello completo, si osserva che il valore di R² rimane sostanzialmente invariato (da circa 0.729 a 0.727), indicando una perdita minima di capacità esplicativa.

Tuttavia, il modello BIC risulta significativamente più parsimonioso, avendo eliminato variabili non significative come età della madre, fumo materno, tipo di parto e ospedale.

Pertanto, il modello selezionato rappresenta un buon compromesso tra accuratezza e semplicità, migliorando l’interpretabilità e riducendo il rischio di overfitting

#vediamo prima la correlazione tra le varibiali numeriche a livello grafico
vars_num <- dati[, c("Peso", "Lunghezza", "Cranio",
                     "Gestazione", "Anni.madre", "N.gravidanze")]

panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor, ...)
{
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(0, 1, 0, 1))
  r <- (cor(x, y))
  txt <- format(c(r, 1), digits = digits)[1]
  txt <- paste0(prefix, txt)
  if(missing(cex.cor)) cex.cor <- 0.8/strwidth(txt)
  text(0.5, 0.5, txt, cex = 1.5)
}
#correlazioni
pairs(vars_num,lower.panel=panel.cor, upper.panel=panel.smooth)

stepwise.mod=MASS::stepAIC(mod_1,
              direction="both",
              k=log(n))
## Start:  AIC=28139.32
## Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza + 
##     Cranio + Tipo.parto + Ospedale + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Anni.madre    1     46578 186809099 28132
## - Fumatrici     1     90019 186852540 28133
## - Ospedale      2    685979 187448501 28133
## - N.gravidanze  1    438452 187200974 28137
## - Tipo.parto    1    447929 187210450 28138
## <none>                      186762521 28139
## - Sesso         1   3611021 190373542 28179
## - Gestazione    1   5458403 192220925 28204
## - Cranio        1  45326172 232088693 28675
## - Lunghezza     1  87951062 274713583 29096
## 
## Step:  AIC=28132.12
## Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto + Ospedale + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Fumatrici     1     90897 186899996 28126
## - Ospedale      2    692738 187501837 28126
## - Tipo.parto    1    448222 187257321 28130
## <none>                      186809099 28132
## - N.gravidanze  1    633756 187442855 28133
## + Anni.madre    1     46578 186762521 28139
## - Sesso         1   3618736 190427835 28172
## - Gestazione    1   5412879 192221978 28196
## - Cranio        1  45588236 232397335 28670
## - Lunghezza     1  87950050 274759149 29089
## 
## Step:  AIC=28125.51
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Tipo.parto + 
##     Ospedale + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Ospedale      2    701680 187601677 28119
## - Tipo.parto    1    440684 187340680 28124
## <none>                      186899996 28126
## - N.gravidanze  1    610840 187510837 28126
## + Fumatrici     1     90897 186809099 28132
## + Anni.madre    1     47456 186852540 28133
## - Sesso         1   3602797 190502794 28165
## - Gestazione    1   5346781 192246777 28188
## - Cranio        1  45632149 232532146 28664
## - Lunghezza     1  88355030 275255027 29086
## 
## Step:  AIC=28119.23
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Tipo.parto + 
##     Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Tipo.parto    1    463870 188065546 28118
## <none>                      187601677 28119
## - N.gravidanze  1    651066 188252743 28120
## + Ospedale      2    701680 186899996 28126
## + Fumatrici     1     99840 187501837 28126
## + Anni.madre    1     54392 187547285 28126
## - Sesso         1   3649259 191250936 28160
## - Gestazione    1   5444109 193045786 28183
## - Cranio        1  45758101 233359778 28657
## - Lunghezza     1  88054432 275656108 29074
## 
## Step:  AIC=28117.58
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## <none>                      188065546 28118
## - N.gravidanze  1    623141 188688687 28118
## + Tipo.parto    1    463870 187601677 28119
## + Ospedale      2    724866 187340680 28124
## + Fumatrici     1     91892 187973654 28124
## + Anni.madre    1     54816 188010731 28125
## - Sesso         1   3655292 191720838 28158
## - Gestazione    1   5464853 193530399 28181
## - Cranio        1  46108583 234174130 28658
## - Lunghezza     1  87632762 275698308 29066
#vediamo i dettagli del modello migliore trovato
mod_2=lm(Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso,data=dati)
summary(mod_2)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Sesso, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1149.44  -180.81   -15.58   163.64  2639.72 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -6681.1445   135.7229 -49.226  < 2e-16 ***
## N.gravidanze    12.4750     4.3396   2.875  0.00408 ** 
## Gestazione      32.3321     3.7980   8.513  < 2e-16 ***
## Lunghezza       10.2486     0.3006  34.090  < 2e-16 ***
## Cranio          10.5402     0.4262  24.728  < 2e-16 ***
## SessoM          77.9927    11.2021   6.962 4.26e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 274.6 on 2494 degrees of freedom
## Multiple R-squared:  0.727,  Adjusted R-squared:  0.7265 
## F-statistic:  1328 on 5 and 2494 DF,  p-value: < 2.2e-16

10 Valutazione del modello finale e Diagnostica dei residui

analisi grafica dei resuidi

Il grafico Residuals vs Fitted non evidenzia pattern sistematici rilevanti, suggerendo che l’ipotesi di linearità è complessivamente soddisfatta, sebbene si osservi una lieve curvatura.

Il Q-Q plot mostra una distribuzione dei residui approssimativamente normale, con alcune deviazioni nelle code, riconducibili alla presenza di valori estremi.

Il grafico Scale-Location evidenzia una leggera eteroschedasticità, indicando una variabilità dei residui moderatamente crescente al variare dei valori stimati.

Infine, l’analisi dei valori influenti tramite il grafico Residuals vs Leverage non evidenzia osservazioni particolarmente critiche, suggerendo che il modello non è influenzato in modo significativo da singoli punti.

Nel complesso, le ipotesi del modello risultano ragionevolmente soddisfatte, rendendo il modello adeguato per fini descrittivi e predittivi.

##ANALISI DEL LEVERAGE L’analisi del leverage evidenzia la presenza di diverse osservazioni con valori superiori alla soglia teorica. Tuttavia, tali valori risultano complessivamente contenuti e distribuiti su un numero elevato di osservazioni, caratteristica tipica di dataset di grandi dimensioni. Non si osservano punti con leverage estremamente elevato tali da destare particolare preoccupazione. Pertanto, non emergono criticità rilevanti in termini di leverage, e il modello risulta stabile rispetto alla presenza di tali osservazioni.

##ANALISI DEGLI OUTLIER Il grafico dei residui studentizzati mostra che la maggior parte delle osservazioni si colloca all’interno dell’intervallo [-2 ; 2], indicando un comportamento coerente con le ipotesi del modello. Sono presenti alcune osservazioni che si discostano da tale intervallo, identificabili come possibili outlier, tra cui un caso particolarmente estremo. Tuttavia, il numero di tali osservazioni è molto limitato rispetto alla dimensione complessiva del campione. Pertanto, la presenza di questi outlier non appare tale da compromettere la validità complessiva del modello.

##ANALISI DELLA DISTANZA DI COOK L’analisi della Cook’s distance evidenzia un valore massimo pari a circa 0.83, inferiore alla soglia critica di 1. Ciò indica la presenza di alcune osservazioni con una certa influenza sulle stime del modello, ma non tale da comprometterne la stabilità complessiva. In particolare, tale valore risulta coerente con la presenza di un numero limitato di outlier precedentemente individuati. Nel complesso, non emergono osservazioni fortemente influenti in grado di alterare in modo significativo i risultati del modello.

##TEST SUI RESIDUI Nel complesso, l’analisi diagnostica evidenzia alcune deviazioni dalle ipotesi teoriche del modello, in particolare una lieve eteroschedasticità e una non perfetta normalità dei residui. Tuttavia, tali criticità risultano contenute e non compromettono in modo significativo la validità del modello, anche alla luce della numerosità elevata del campione. Inoltre, non si rilevano problemi di autocorrelazione né la presenza di osservazioni fortemente influenti. Pertanto, il modello può essere considerato adeguato e robusto sia dal punto di vista descrittivo che predittivo.

#calcoliamo il RMSE
rmse <- sqrt(mean(residuals(mod_2)^2))
rmse
## [1] 274.274
#analisi dei resudui graficamente
par(mfrow=c(2,2))
plot(mod_2)

#LEVERAGE
lev=hatvalues(mod_2)
plot(lev)
p=sum(lev)
soglia=2*p/n
abline(h=soglia,col=2)
lev[lev>soglia]
##          13          15          34          67          89          96 
## 0.005630918 0.007050422 0.006744143 0.005891590 0.012816470 0.005351586 
##         101         106         131         134         151         155 
## 0.007526751 0.014479871 0.007229339 0.007552819 0.010883937 0.007207682 
##         161         189         190         204         205         206 
## 0.020335483 0.004893297 0.005366557 0.014490604 0.005351634 0.009476652 
##         220         294         305         310         312         315 
## 0.007393997 0.005912765 0.005442061 0.028812123 0.013169272 0.005385800 
##         378         440         442         445         486         492 
## 0.015934061 0.005404736 0.007723662 0.007509382 0.005164446 0.008274018 
##         497         516         582         587         592         614 
## 0.005166306 0.013079851 0.011665555 0.008412325 0.006384116 0.005299262 
##         638         656         657         684         697         702 
## 0.006688287 0.005927777 0.005322685 0.008818987 0.005863826 0.005202259 
##         729         748         750         757         765         805 
## 0.005023115 0.008565543 0.006942097 0.008145491 0.006070298 0.014356657 
##         828         893         895         913         928         946 
## 0.007179817 0.005075205 0.005295896 0.005571144 0.022742332 0.006909044 
##         947         956         985        1008        1014        1049 
## 0.008409465 0.007784123 0.007039416 0.005343037 0.008470133 0.004956169 
##        1067        1091        1106        1130        1166        1181 
## 0.008465430 0.008933360 0.005967317 0.031728597 0.005513559 0.005677676 
##        1188        1200        1219        1238        1248        1273 
## 0.006477203 0.005492370 0.030694311 0.005908078 0.014622914 0.007085831 
##        1291        1293        1311        1321        1325        1356 
## 0.006117497 0.006073639 0.009625908 0.009293111 0.004857169 0.005303442 
##        1357        1385        1395        1400        1402        1411 
## 0.006965051 0.012636943 0.005126697 0.005925069 0.004811441 0.008048184 
##        1420        1428        1429        1450        1505        1551 
## 0.005155654 0.008192811 0.021757172 0.015104831 0.013330439 0.048769569 
##        1553        1556        1573        1593        1606        1610 
## 0.008504889 0.005919673 0.005047204 0.005623758 0.005001812 0.008722184 
##        1617        1619        1628        1686        1693        1701 
## 0.004866796 0.015067498 0.005069731 0.009349313 0.005077858 0.010842957 
##        1712        1718        1727        1735        1780        1781 
## 0.006992084 0.006958857 0.013300523 0.004884846 0.025538678 0.016832361 
##        1809        1827        1868        1892        1962        1967 
## 0.008707504 0.006065698 0.005205637 0.005332812 0.005540442 0.005337356 
##        1977        2037        2040        2046        2086        2089 
## 0.006927281 0.004889127 0.011494872 0.005471670 0.013193090 0.006293550 
##        2098        2114        2115        2120        2140        2146 
## 0.005094455 0.013316875 0.011772090 0.018659995 0.006244232 0.005802168 
##        2148        2149        2157        2175        2200        2215 
## 0.007926839 0.013583436 0.005907225 0.032527273 0.011670024 0.004892265 
##        2216        2220        2221        2224        2225        2244 
## 0.008117864 0.005414040 0.021628717 0.005838076 0.005591261 0.006929217 
##        2257        2307        2317        2318        2337        2359 
## 0.006170254 0.013965608 0.007673614 0.004831118 0.005230450 0.010067364 
##        2408        2422        2436        2437        2452        2458 
## 0.009696691 0.021532808 0.004986522 0.023943328 0.023838489 0.008506087 
##        2471        2478 
## 0.020903740 0.005775173
#vediamo i valori outliers
plot(rstudent(mod_2))
abline(h=c(-2,2),col=2)
outlierTest(mod_2)
##       rstudent unadjusted p-value Bonferroni p
## 1551 10.051908         2.4906e-23   6.2265e-20
## 155   5.027798         5.3138e-07   1.3285e-03
## 1306  4.827238         1.4681e-06   3.6702e-03
#distnza di cook
cook=cooks.distance(mod_2)
plot(cook)
max(cook)
## [1] 0.8300965
#effetuiamo i test sui resuidi
bptest(mod_2)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_2
## BP = 90.253, df = 5, p-value < 2.2e-16
dwtest(mod_2)
## 
##  Durbin-Watson test
## 
## data:  mod_2
## DW = 1.9535, p-value = 0.1224
## alternative hypothesis: true autocorrelation is greater than 0
shapiro.test(residuals(mod_2))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mod_2)
## W = 0.97408, p-value < 2.2e-16

11 Previsione su un nuovo caso

Una volta validato il modello, è stato utilizzato per effettuare una previsione del peso alla nascita.

In particolare, si è considerato il caso di una neonata alla terza gravidanza, con una durata della gestazione pari a 39 settimane.

Poiché alcune variabili incluse nel modello, come la lunghezza e la circonferenza cranica, non sono note a priori, sono stati utilizzati i rispettivi valori medi campionari.

La stima ottenuta attraverso il modello fornisce un valore previsto del peso pari a circa 3271 grammi.

Tale valore risulta coerente con la media osservata nel campione, suggerendo che il modello produce previsioni realistiche.

Questo esempio evidenzia come il modello possa essere utilizzato per effettuare previsioni pratiche, fornendo un supporto utile nella pianificazione clinica e nella valutazione dei casi.

mean_lunghezza <- mean(dati$Lunghezza)
mean_cranio <- mean(dati$Cranio)
#creaione di un nuovo dataset con le varibaili di interesse
nuovo <- data.frame(
  N.gravidanze = 3,
  Gestazione = 39,
  Lunghezza = mean_lunghezza,
  Cranio = mean_cranio,
  Sesso = "F"
)
predict(mod_2, newdata = nuovo)
##       1 
## 3271.09

analisi Grafica I grafici mostrano l’andamento del peso previsto alla nascita in funzione delle settimane di gestazione, mantenendo costanti le altre variabili del modello. Si osserva una chiara relazione positiva tra la durata della gravidanza e il peso previsto: all’aumentare delle settimane di gestazione aumenta il peso stimato dal modello. Tale risultato conferma quanto emerso dall’analisi di regressione, evidenziando l’importanza della gestazione come principale determinante del peso alla nascita. Inoltre, distinguendo i neonati per sesso, emerge che i maschi presentano valori di peso previsto sistematicamente superiori rispetto alle femmine, a parità delle altre condizioni considerate. Questo risultato risulta coerente con la significatività della variabile Sesso nel modello finale. Le curve appaiono pressoché parallele, suggerendo che l’effetto della gestazione sul peso alla nascita sia simile per entrambi i sessi, mentre la differenza tra maschi e femmine tende a mantenersi relativamente costante. Nel complesso, le visualizzazioni confermano i risultati ottenuti tramite il modello di regressione e consentono di rappresentare in modo immediato e intuitivo le principali relazioni tra le variabili considerate.

gest_seq <- seq(37, 42, by = 0.5)

nuovi_dati <- data.frame(
  N.gravidanze = 3,
  Gestazione = gest_seq,
  Lunghezza = mean_lunghezza,
  Cranio = mean_cranio,
  Sesso = "F"
)

nuovi_dati$Peso_previsto <- predict(mod_2, newdata = nuovi_dati)

#grafico
ggplot(nuovi_dati,
       aes(x = Gestazione,
           y = Peso_previsto)) +
  geom_line(linewidth = 1.2, color = "blue") +
  geom_point(size = 2) +
  labs(
    title = "Peso previsto in funzione della gestazione",
    x = "Settimane di gestazione",
    y = "Peso previsto (grammi)"
  ) +
  theme_minimal()

#differenza tra maschi e femmine
nuovi_dati2 <- expand.grid(
  Gestazione = gest_seq,
  Sesso = c("F", "M")
)

nuovi_dati2$N.gravidanze <- 3
nuovi_dati2$Lunghezza <- mean_lunghezza
nuovi_dati2$Cranio <- mean_cranio
nuovi_dati2$Peso_previsto <- predict(mod_2, newdata = nuovi_dati2)

ggplot(nuovi_dati2,
       aes(x = Gestazione,
           y = Peso_previsto,
           color = Sesso,
           group = Sesso)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 2) +
  labs(
    title = "Peso previsto per sesso e settimane di gestazione",
    x = "Settimane di gestazione",
    y = "Peso previsto (grammi)"
  ) +
  theme_minimal()

## CONCLUSIONI # Conclusioni

Nel presente progetto è stato sviluppato un modello statistico per la previsione del peso neonatale alla nascita, utilizzando informazioni cliniche e demografiche raccolte da tre ospedali.

L’analisi descrittiva iniziale ha evidenziato un dataset complessivamente coerente e privo di anomalie rilevanti, con distribuzioni plausibili sia per le variabili quantitative sia per quelle qualitative. La presenza di alcuni outlier è risultata compatibile con la naturale variabilità del fenomeno osservato e non è stata interpretata come indicativa di errori nei dati. Successivamente, sono state verificate diverse ipotesi statistiche tramite opportuni test inferenziali. In particolare, non sono emerse differenze significative nella frequenza dei parti cesarei tra i diversi ospedali, mentre sono state riscontrate differenze significative tra maschi e femmine nelle principali misure antropometriche. Inoltre, il peso medio del campione è risultato compatibile con il valore di riferimento della popolazione, mentre la lunghezza media è risultata significativamente inferiore rispetto al valore ipotizzato. È stato quindi costruito un modello di regressione lineare multipla per spiegare il peso alla nascita in funzione delle variabili disponibili. Il modello completo ha evidenziato come le principali determinanti del peso siano la durata della gestazione, la lunghezza, la circonferenza cranica e il sesso del neonato. Attraverso una procedura di selezione basata sul criterio BIC, è stato individuato un modello più parsimonioso che mantiene un’elevata capacità esplicativa, con un coefficiente di determinazione R² pari a circa 0.73. Tale risultato indica che il modello è in grado di spiegare una quota elevata della variabilità del peso neonatale. L’analisi diagnostica dei residui ha mostrato una situazione complessivamente soddisfacente: non sono emersi problemi rilevanti di osservazioni influenti o autocorrelazione, mentre le lievi deviazioni dalla normalità e dall’omoschedasticità non risultano tali da compromettere la validità del modello, anche considerando la numerosità elevata del campione. Infine, il modello è stato utilizzato per effettuare previsioni pratiche su nuovi casi clinici e le visualizzazioni grafiche hanno consentito di rappresentare in modo intuitivo le principali relazioni tra le variabili, evidenziando in particolare l’effetto positivo della durata della gestazione sul peso previsto alla nascita. Nel complesso, il progetto mostra come l’utilizzo di strumenti statistici e modelli predittivi possa fornire un valido supporto nell’ambito della salute neonatale, contribuendo a migliorare la pianificazione clinica, l’identificazione precoce dei fattori di rischio e l’ottimizzazione delle risorse ospedaliere.