1- Introduzione

In questa analisi statistica, si esamineranno i fattori clinici e demografici correlati al peso neonatale alla nascita, utilizzando un dataset con 2500 osservazioni provenienti da tre ospedali. L’obiettivo principale è prevedere con precisione il peso di un neonato in base a variabili chiave quali età della madre, numero di gravidanze, abitudine al fumo, durata della gestazione, lunghezza, diametro cranico, tipo di parto e ospedale di nascita.

La possibilità di realizzare un modello predittivo accurato del peso neonatale fornisce un supporto ai medici e al personale sanitario nella gestione delle gravidanze ad alto rischio, contribuendo ad anticipare eventuali complicazioni ed ottimizzare le risorse ospedaliere. Identificare i fattori di rischio che incidono maggiormente sul basso peso alla nascita permette inoltre di pianificare interventi mirati di prevenzione, migliorando la qualità delle cure prenatali e riducendo possibili esiti avversi come la prematurità o il ritardo di crescita intrauterina.

Durante lo studio l’Analisi è stata scomposta in diverse fasi:

  1. Analisi descrittiva e verifica delle distribuzioni delle variabili.
  2. Test di ipotesi (ad esempio, confronto tra ospedali, differenze tra maschi e femmine, ecc.).
  3. Costruzione di un modello di regressione lineare multipla per la previsione del peso alla nascita.
  4. Selezione e validazione del modello (tramite criteri AIC/BIC e diagnostica sui residui).
  5. Interpretazione dei risultati e individuazione dei fattori più influenti sul peso neonatale.

Installazione dei pacchetti necessari e caricamento.

# Caricamento dei pacchetti

if (!require(tidyverse)) install.packages("tidyverse")
## Loading required package: tidyverse
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
if (!require(car)) install.packages("car")
## Loading required package: car
## Loading required package: carData
## 
## Attaching package: 'car'
## 
## The following object is masked from 'package:dplyr':
## 
##     recode
## 
## The following object is masked from 'package:purrr':
## 
##     some
if (!require(lmtest)) install.packages("lmtest")
## Loading required package: lmtest
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
if (!require(MASS)) install.packages("MASS")
## Loading required package: MASS
## 
## Attaching package: 'MASS'
## 
## The following object is masked from 'package:dplyr':
## 
##     select
if (!require(moments)) install.packages("moments")
## Loading required package: moments
if (!require(corrplot)) install.packages("corrplot")
## Loading required package: corrplot
## corrplot 0.95 loaded
library(tidyverse)
library(car)
library(lmtest)
library(MASS)
library(moments)
library(corrplot)

2- Caricamento del dataset e controllo iniziale

# Caricamento del dataset e controllo iniziale
dati <- read.csv("C:/Users/milan/Desktop/Master Profession Ai/Statistica_inferenziale/neonati.csv", stringsAsFactors = TRUE)

# Eliminazione della riga con Anni.madre == 0
dati <- dati[dati$Anni.madre != 0, ]

# Controllo dimensioni e struttura aggiornate
dim(dati)        # Numero di righe e colonne dopo la rimozione
## [1] 2499   10
str(dati)        # Struttura del dataset aggiornato
## 'data.frame':    2499 obs. of  10 variables:
##  $ Anni.madre  : int  26 21 34 28 20 32 26 25 22 23 ...
##  $ N.gravidanze: int  0 2 3 1 0 0 1 0 1 0 ...
##  $ Fumatrici   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Gestazione  : int  42 39 38 41 38 40 39 40 40 41 ...
##  $ Peso        : int  3380 3150 3640 3690 3700 3200 3100 3580 3670 3700 ...
##  $ Lunghezza   : int  490 490 500 515 480 495 480 510 500 510 ...
##  $ Cranio      : int  325 345 375 365 335 340 345 349 335 362 ...
##  $ Tipo.parto  : Factor w/ 2 levels "Ces","Nat": 2 2 2 2 2 2 2 2 1 1 ...
##  $ Ospedale    : Factor w/ 3 levels "osp1","osp2",..: 3 1 2 2 3 2 3 1 2 2 ...
##  $ Sesso       : Factor w/ 2 levels "F","M": 2 1 2 2 1 1 1 2 1 1 ...
summary(dati)    # Statistiche descrittive aggiornate
##    Anni.madre     N.gravidanze       Fumatrici         Gestazione   
##  Min.   : 1.00   Min.   : 0.0000   Min.   :0.00000   Min.   :25.00  
##  1st Qu.:25.00   1st Qu.: 0.0000   1st Qu.:0.00000   1st Qu.:38.00  
##  Median :28.00   Median : 1.0000   Median :0.00000   Median :39.00  
##  Mean   :28.18   Mean   : 0.9816   Mean   :0.04162   Mean   :38.98  
##  3rd Qu.:32.00   3rd Qu.: 1.0000   3rd Qu.:0.00000   3rd Qu.:40.00  
##  Max.   :46.00   Max.   :12.0000   Max.   :1.00000   Max.   :43.00  
##       Peso        Lunghezza         Cranio    Tipo.parto Ospedale   Sesso   
##  Min.   : 830   Min.   :310.0   Min.   :235   Ces: 728   osp1:816   F:1256  
##  1st Qu.:2990   1st Qu.:480.0   1st Qu.:330   Nat:1771   osp2:849   M:1243  
##  Median :3300   Median :500.0   Median :340              osp3:834           
##  Mean   :3284   Mean   :494.7   Mean   :340                                 
##  3rd Qu.:3620   3rd Qu.:510.0   3rd Qu.:350                                 
##  Max.   :4930   Max.   :565.0   Max.   :390
# Visualizza le prime righe del dataset
head(dati)
##   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
Variabile Tipo
Anni.madre int
N.gravidanze int
Fumatrici factor (0/1)
Gestazione int
Peso int
Lunghezza int
Cranio int
Tipo.parto factor
Ospedale factor
Sesso factor
Variabile Min 1° Quartile Mediana Media 3° Quartile Max Livelli
Anni.madre 1 25 28 28.16 32 46 Numerica
N.gravidanze 0 0 1 0.98 1 12 Numerica
Fumatrici No - - No: 2396, Sì: 104 - Categoriale
Gestazione 25 38 39 38.98 40 43 Numerica
Peso (grammi) 830 2990 3300 3284.08 3620 4930 Numerica
Lunghezza (mm) 310 480 500 494.69 510 565 Numerica
Cranio (mm) 235 330 340 340.00 350 390 Numerica
Tipo di parto Ces: 728 - - Nat: 1772 - - Cesareo: 728, Naturale: 1772
Ospedale osp1: 816 - - osp2: 849, osp3: 835 - - osp1: 816, osp2: 849, osp3: 835
Sesso F: 1256 - - M: 1244 - - Femmine: 1256, Maschi: 1244
# Definizione delle variabili
variabili <- data.frame(
  Variabile = c("Anni.madre", "N.gravidanze", "Fumatrici", "Gestazione", "Peso", 
                "Lunghezza", "Cranio", "Tipo.parto", "Ospedale", "Sesso"),
  Tipo = c(
    "Quantitativa",     # Anni.madre
    "Quantitativa",     # N.gravidanze
    "Categorica",       # Fumatrici
    "Quantitativa",     # Gestazione
    "Quantitativa",     # Peso
    "Quantitativa",     # Lunghezza
    "Quantitativa",     # Cranio
    "Categorica",       # Tipo.parto
    "Categorica",       # Ospedale
    "Categorica"        # Sesso
  ),
  Descrizione = c(
    "Età della madre in anni",
    "Numero di gravidanze avute dalla madre",
    "Indica se la madre è fumatrice (1) o non fumatrice (0)",
    "Settimane di gestazione",
    "Peso del neonato alla nascita, in grammi",
    "Lunghezza del neonato, misurata in millimetri",
    "Diametro craniale (spesso misurato via ecografie)",
    "Tipo di parto: Naturale (Nat) o Cesareo (Ces)",
    "Ospedale di nascita (osp1, osp2, osp3)",
    "Sesso del neonato: Maschio (M) o Femmina (F)"
  )
)

# Stampa della tabella aggiornata
print(variabili)
##       Variabile         Tipo
## 1    Anni.madre Quantitativa
## 2  N.gravidanze Quantitativa
## 3     Fumatrici   Categorica
## 4    Gestazione Quantitativa
## 5          Peso Quantitativa
## 6     Lunghezza Quantitativa
## 7        Cranio Quantitativa
## 8    Tipo.parto   Categorica
## 9      Ospedale   Categorica
## 10        Sesso   Categorica
##                                               Descrizione
## 1                                 Età della madre in anni
## 2                  Numero di gravidanze avute dalla madre
## 3  Indica se la madre è fumatrice (1) o non fumatrice (0)
## 4                                 Settimane di gestazione
## 5                Peso del neonato alla nascita, in grammi
## 6           Lunghezza del neonato, misurata in millimetri
## 7       Diametro craniale (spesso misurato via ecografie)
## 8           Tipo di parto: Naturale (Nat) o Cesareo (Ces)
## 9                  Ospedale di nascita (osp1, osp2, osp3)
## 10           Sesso del neonato: Maschio (M) o Femmina (F)
Variabile Tipo Descrizione
Anni.madre Quantitativa Età della madre in anni
N.gravidanze Quantitativa Numero di gravidanze avute dalla madre
Fumatrici Categorica Indica se la madre è fumatrice (1) o non fumatrice (0)
Gestazione Quantitativa Settimane di gestazione
Peso Quantitativa Peso del neonato alla nascita, in grammi
Lunghezza Quantitativa Lunghezza del neonato, misurata in millimetri
Cranio Quantitativa Diametro craniale (spesso misurato via ecografie)
Tipo.parto Categorica Tipo di parto: Naturale (Nat) o Cesareo (Ces)
Ospedale Categorica Ospedale di nascita (osp1, osp2, osp3)
Sesso Categorica Sesso del neonato: Maschio (M) o Femmina (F)

Commento sull’analisi iniziale dei dati

Il dataset è composto da 2499 osservazioni (dopo aver tolto la riga con il valore 0) e 10 variabili, con una combinazione di variabili quantitative e categoriche, ciascuna ben definita per descrivere il contesto clinico e demografico delle nascite. Ecco un riepilogo delle principali osservazioni emerse dall’analisi iniziale:

  1. Variabili quantitative:

    • Età della madre (Anni.madre): La distribuzione copre un range, con un’età minima di 1 anno (già corretta eliminando il valore anomalo di 0). La media è 28.18 anni, mentre il massimo è 46 anni.

    • Settimane di gestazione (Gestazione): Il range varia da 25 a 43 settimane, riflettendo casi di nascite premature (<37 settimane) e gravidanze a termine o oltre.

    • Peso neonatale (Peso): La media è di circa 3284 g, con un minimo di 830 g (neonati prematuri o con basso peso) e un massimo di 4930 g (neonati di peso elevato).

    • Lunghezza e cranio: La lunghezza media è di 494.69 mm e il diametro cranico medio è di 340 mm, con variazioni contenute che sembrano realistiche per neonati.

  2. Variabili categoriali:

    • Fumatrici: Solo il 4% delle madri nel campione sono fumatrici, evidenziando un campione fortemente sbilanciato in questa categoria.

    • Tipo di parto: Circa il 29% dei parti sono cesarei (728 su 2499), mentre il restante è naturale. Questa distribuzione appare bilanciata e in linea con la pratica medica.

    • Ospedali: I tre ospedali sono rappresentati in modo equilibrato (osp1: 816, osp2: 849, osp3: 835).

    • Sesso del neonato: La distribuzione tra maschi (1244) e femmine (1256) è bilanciata.

3- Analisi descrittiva preliminare

Istogramma variabili Quantitative

# Apri una finestra grafica
x11()

# Imposta layout
par(mfrow = c(2, 3))  # 2 righe, 3 colonne

# Lista delle variabili quantitative
variabili_quantitative <- c("Anni.madre", "N.gravidanze", "Gestazione", "Peso", "Lunghezza", "Cranio")

# Limiti personalizzati per ciascuna variabile
xlim_values <- list(
  "Anni.madre" = c(10, 50),
  "N.gravidanze" = c(0, 12),
  "Gestazione" = c(25, 45),
  "Peso" = c(1000, 5000),
  "Lunghezza" = c(300, 600),
  "Cranio" = c(200, 400)
)

# Limiti personalizzati per l'asse Y
ylim_values <- list(
  "Anni.madre" = c(0, 600),
  "N.gravidanze" = c(0, 1500),
  "Gestazione" = c(0, NA),  # Limite dinamico calcolato automaticamente
  "Peso" = c(0, 600),
  "Lunghezza" = c(0, 700),
  "Cranio" = c(0, NA)  # Limite dinamico calcolato automaticamente
)

# Colori diversi per ciascun istogramma
colori <- c("skyblue", "orange", "lightgreen", "tomato", "purple", "gold")

# Ciclo per creare gli istogrammi con limiti personalizzati e colori diversi
for (i in seq_along(variabili_quantitative)) {
  var <- variabili_quantitative[i]
  
  # Calcola dinamicamente ylim se non specificato
  y_lim <- if (is.na(ylim_values[[var]][2])) {
    c(0, max(hist(dati[[var]], plot = FALSE)$counts) * 1.2)
  } else {
    ylim_values[[var]]
  }
  
  # Istogramma con limiti personalizzati
  hist(dati[[var]],
       main = paste("Distribuzione di", var),
       xlab = var,
       col = colori[i],         # Colore specifico per ciascun istogramma
       breaks = 20,
       xlim = xlim_values[[var]],  # Limiti personalizzati per l'asse X
       ylim = y_lim)              # Limiti personalizzati o dinamici per l'asse Y
}

# Reset layout
par(mfrow = c(1, 1))

Commento sull’analisi iniziale delle distribuzioni

L’analisi delle distribuzioni delle variabili quantitative nel dataset ha permesso di identificare i seguenti pattern principali:

  • Anni.madre: La distribuzione è simmetrica e si avvicina a una normale, indicando che l’età delle madri è ben distribuita nel campione.

  • N.gravidanze: La distribuzione è fortemente asimmetrica positiva (skewed right), con un’elevata frequenza di madri con poche gravidanze.

  • Gestazione: La distribuzione è asimmetrica negativa (skewed left), riflettendo la concentrazione di gravidanze a termine tra le 38 e 40 settimane.

  • Peso: La distribuzione è leggermente asimmetrica positiva, con un’alta concentrazione di neonati tra 3000 e 3500 grammi.

Matrice di Correlazione

# Calcolo della matrice di correlazione
num_vars <- dati[, c("Anni.madre", "N.gravidanze", "Gestazione", "Peso", "Lunghezza", "Cranio")]
cor_matrix <- cor(num_vars)

# Stampa della matrice numerica
print(cor_matrix)
##               Anni.madre N.gravidanze Gestazione         Peso   Lunghezza
## Anni.madre    1.00000000  0.381220884 -0.1364258 -0.023518120 -0.06424092
## N.gravidanze  0.38122088  1.000000000 -0.1015007  0.002276741 -0.06046588
## Gestazione   -0.13642580 -0.101500657  1.0000000  0.591792099  0.61892515
## Peso         -0.02351812  0.002276741  0.5917921  1.000000000  0.79604039
## Lunghezza    -0.06424092 -0.060465881  0.6189251  0.796040389  1.00000000
## Cranio        0.01485745  0.038827247  0.4608659  0.704775475  0.60334626
##                  Cranio
## Anni.madre   0.01485745
## N.gravidanze 0.03882725
## Gestazione   0.46086591
## Peso         0.70477547
## Lunghezza    0.60334626
## Cranio       1.00000000
# Scatterplot Matrix + Correlazione con pairs
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, use = "complete.obs")
  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)
}

pairs(num_vars, lower.panel = panel.cor, upper.panel = panel.smooth, main = "Scatterplot Matrix + Correlazione")
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter

Interpretazione della Matrice di Correlazione

Dalla matrice di correlazione e dallo scatterplot matrix possiamo osservare le seguenti relazioni principali tra le variabili:

  1. Peso e Lunghezza:

    • La correlazione più forte è osservata tra Peso e Lunghezza, con un coefficiente di correlazione pari a 0.80. Questo indica una relazione positiva molto forte, coerente con l’ipotesi che neonati più lunghi tendano ad avere un peso maggiore.
  2. Peso e Gestazione:

    • Una correlazione moderatamente forte è presente tra Peso e Gestazione (0.59). Questo è in linea con l’aspettativa clinica che una durata maggiore della gravidanza sia associata a un aumento del peso neonatale.
  3. Peso e Cranio:

    • Il diametro cranico è anch’esso fortemente correlato al peso, con un coefficiente pari a 0.70. Questo risultato conferma l’importanza delle misure antropometriche come predittori del peso alla nascita.
  4. Correlazioni deboli:

    • Le variabili Anni.madre e N.gravidanze mostrano correlazioni molto deboli con il peso (rispettivamente -0.02 e 0.002). Questo suggerisce che il contributo di queste variabili al modello predittivo potrebbe essere limitato.
  5. Lunghezza e Gestazione:

    • Una correlazione moderata è presente tra Lunghezza e Gestazione (0.62), indicando che una gestazione più lunga è spesso associata a una maggiore lunghezza neonatale.

Analisi frequenze per variabili categoriche

# Definizione delle variabili categoriali
variabili_categoriali <- c("Fumatrici", "Tipo.parto", "Ospedale", "Sesso")

# Creazione dei grafici a torta
x11()

par(mfrow = c(2, 2))  # Layout per 4 grafici

for (i in seq_along(variabili_categoriali)) {
  var <- variabili_categoriali[i]
  freq_table <- table(dati[[var]])
  
  pie(freq_table, 
      main = paste("Distribuzione di", var), 
      col = rainbow(length(freq_table)), 
      labels = paste0(names(freq_table), " (", round(prop.table(freq_table) * 100, 1), "%)"))
}

par(mfrow = c(1, 1))

Commento sull’analisi delle variabili categoriali

L’analisi delle variabili categoriali attraverso i grafici a torta ha evidenziato le seguenti osservazioni:

  1. Fumatrici:

    • La maggior parte delle madri nel campione non è fumatrice (95.8%), con una piccola percentuale (4.2%) di fumatrici.
  2. Tipo di parto:

    • I parti naturali rappresentano circa il 70.9% del totale, mentre i parti cesarei sono il 29.1%.
  3. Ospedale:

    • La distribuzione dei neonati tra i tre ospedali è quasi equamente bilanciata:

      • osp1: 32.7%

      • osp2: 34.0%

      • osp3: 33.4%

    • Questo assicura che i risultati non siano influenzati da una sovrarappresentazione di uno specifico ospedale.

  4. Sesso:

    • La distribuzione tra maschi e femmine è praticamente bilanciata, con una leggera prevalenza di femmine (50.3%) rispetto ai maschi (49.7%).

Ipotesi

In alcuni ospedali si fanno più parti cesarei?

# Tabella di contingenza
tab_parto_osp <- table(dati$Ospedale, dati$Tipo.parto)

# Test del chi-quadrato
chi_test <- chisq.test(tab_parto_osp)

# Risultati
print(tab_parto_osp)
##       
##        Ces Nat
##   osp1 242 574
##   osp2 254 595
##   osp3 232 602
print(chi_test)
## 
##  Pearson's Chi-squared test
## 
## data:  tab_parto_osp
## X-squared = 1.0604, df = 2, p-value = 0.5885
  • Risultati:

    • La tabella di contingenza mostra che i parti cesarei sono distribuiti come segue: osp1 (242), osp2 (254), osp3 (232).

    • Il test del chi-quadrato ha restituito un valore di chi-quadro pari a 1.0604, con 2 gradi di libertà (df) e un p-value di 0.5885.

  • Interpretazione:

    • Poiché il p-value è maggiore di 0.05, non possiamo rifiutare l’ipotesi nulla (H0H_0H0​).

    • Concludiamo che non ci sono differenze significative nella proporzione di parti cesarei tra i tre ospedali.

La media del peso e della lunghezza di questo campione di nenonati è significativamente uguale a quella della popolazione?

# One-sample t-test per il Peso
t_test_peso <- t.test(dati$Peso, mu = 3200, alternative = "two.sided")

# One-sample t-test per la Lunghezza
t_test_lunghezza <- t.test(dati$Lunghezza, mu = 500, alternative = "two.sided")

# Risultati
print(t_test_peso)
## 
##  One Sample t-test
## 
## data:  dati$Peso
## t = 8.0127, df = 2498, p-value = 1.704e-15
## alternative hypothesis: true mean is not equal to 3200
## 95 percent confidence interval:
##  3263.572 3304.769
## sample estimates:
## mean of x 
##   3284.17
print(t_test_lunghezza)
## 
##  One Sample t-test
## 
## data:  dati$Lunghezza
## t = -10.077, df = 2498, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 500
## 95 percent confidence interval:
##  493.6613 495.7265
## sample estimates:
## mean of x 
##  494.6939

Peso

  • Risultati:

    • Il t-test ha restituito un valore di t pari a 8.0127, con 2498 gradi di libertà (df) e un p-value di 1.704 × 10^-15.

    • La media campionaria del peso è 3284.17 g, mentre il valore atteso della popolazione era 3200 g.

  • Interpretazione:

    • Poiché il p-value è molto inferiore a 0.05, possiamo rifiutare l’ipotesi nulla (H0H_0H0​).

    • La media del peso nel campione è significativamente diversa da quella della popolazione.

Lunghezza

  • Risultati:

    • Il t-test ha restituito un valore di t pari a -10.077, con 2498 gradi di libertà (df) e un p-value inferiore a 2.2 × 10^-16.

    • La media campionaria della lunghezza è 494.69 mm, mentre il valore atteso della popolazione era 500 mm.

  • Interpretazione:

    • Poiché il p-value è molto inferiore a 0.05, possiamo rifiutare l’ipotesi nulla (H0H_0H0​).

    • La media della lunghezza nel campione è significativamente diversa da quella della popolazione.

le misure antropometriche sono significativamente diverse tra i due sessi?

# T-test per il Peso
t_test_peso_sesso <- t.test(Peso ~ Sesso, data = dati, var.equal = FALSE)

# T-test per la Lunghezza
t_test_lunghezza_sesso <- t.test(Lunghezza ~ Sesso, data = dati, var.equal = FALSE)

# T-test per il Cranio
t_test_cranio_sesso <- t.test(Cranio ~ Sesso, data = dati, var.equal = FALSE)

# Risultati
print(t_test_peso_sesso)
## 
##  Welch Two Sample t-test
## 
## data:  Peso by Sesso
## t = -12.116, df = 2490, 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.3966 -207.3302
## sample estimates:
## mean in group F mean in group M 
##        3161.132        3408.496
print(t_test_lunghezza_sesso)
## 
##  Welch Two Sample t-test
## 
## data:  Lunghezza by Sesso
## t = -9.5864, df = 2459, 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.937899  -7.883398
## sample estimates:
## mean in group F mean in group M 
##        489.7643        499.6750
print(t_test_cranio_sesso)
## 
##  Welch Two Sample t-test
## 
## data:  Cranio by Sesso
## t = -7.4237, df = 2490.6, p-value = 1.555e-13
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
##  -6.100260 -3.550953
## sample estimates:
## mean in group F mean in group M 
##        337.6330        342.4586

Peso

  • Risultati:

    • Il t-test ha restituito un valore di t pari a -12.116, con 2490 gradi di libertà (df) e un p-value inferiore a 2.2 × 10^-16.

    • La media del peso è 3161.13 g per le femmine e 3408.50 g per i maschi.

  • Interpretazione:

    • Poiché il p-value è molto inferiore a 0.05, possiamo rifiutare l’ipotesi nulla (H0H_0H0​).

    • Il peso medio dei neonati maschi è significativamente superiore a quello delle femmine.

Lunghezza

  • Risultati:

    • Il t-test ha restituito un valore di t pari a -9.5864, con 2459 gradi di libertà (df) e un p-value inferiore a 2.2 × 10^-16.

    • La media della lunghezza è 489.76 mm per le femmine e 499.68 mm per i maschi.

  • Interpretazione:

    • Poiché il p-value è molto inferiore a 0.05, possiamo rifiutare l’ipotesi nulla (H0H_0H0​).

    • La lunghezza media dei neonati maschi è significativamente superiore a quella delle femmine.

Cranio

  • Risultati:

    • Il t-test ha restituito un valore di t pari a -7.4237, con 2490.6 gradi di libertà (df) e un p-value pari a 1.555 × 10^-13.

    • La media del diametro cranico è 337.63 mm per le femmine e 342.46 mm per i maschi.

  • Interpretazione:

    • Poiché il p-value è molto inferiore a 0.05, possiamo rifiutare l’ipotesi nulla (H0H_0H0​).

    • Il diametro cranico medio dei neonati maschi è significativamente superiore a quello delle femmine.

Crezione del modello di Regressione

- Introduzione al Modello

# Creazione del modello di regressione lineare multipla
modello <- lm(Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione +
                Lunghezza + Cranio + Tipo.parto + Ospedale + Sesso, 
              data = dati)

# Riepilogo del modello
summary(modello)
## 
## Call:
## lm(formula = Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + 
##     Lunghezza + Cranio + Tipo.parto + Ospedale + Sesso, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1123.78  -181.66   -14.68   160.85  2612.15 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -6736.2566   141.4463 -47.624  < 2e-16 ***
## Anni.madre        0.8428     1.1394   0.740   0.4596    
## N.gravidanze     11.3151     4.6632   2.426   0.0153 *  
## Fumatrici       -30.2121    27.5435  -1.097   0.2728    
## Gestazione       32.5558     3.8195   8.524  < 2e-16 ***
## Lunghezza        10.2945     0.3007  34.231  < 2e-16 ***
## Cranio           10.4695     0.4261  24.570  < 2e-16 ***
## Tipo.partoNat    29.5837    12.0873   2.447   0.0145 *  
## Ospedaleosp2    -11.2033    13.4402  -0.834   0.4046    
## Ospedaleosp3     28.2392    13.5030   2.091   0.0366 *  
## SessoM           77.6415    11.1824   6.943 4.87e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 274 on 2488 degrees of freedom
## Multiple R-squared:  0.7289, Adjusted R-squared:  0.7278 
## F-statistic: 668.9 on 10 and 2488 DF,  p-value: < 2.2e-16
# Diagnostica del modello
par(mfrow = c(2, 2))  # Layout per i grafici diagnostici
plot(modello)

par(mfrow = c(1, 1))  # Reset layout
Variabile Coefficiente (beta) Significatività (p-value) Interpretazione
Intercept -6736.26 < 2e-16 *** Punto di partenza teorico
Anni.madre 0.84 0.45 Non si g nificativo
N.gravidanze 11.32 0.01 * Ogni gravidanza aumenta il peso di 11.3 g
Fumatrici -30.21 0.27 Non si g nificativo
Gestazione 32.56 < 2e-16 *** Ogni settimana di gestazione aumenta il peso di 32.6 g
Lunghezza 10.29 < 2e-16 *** Ogni mm in più aumenta il peso di 10.3 g
Cranio 10.47 < 2e-16 *** Ogni mm in più aumenta il peso di 10.5 g
Tipo . partoNat 29.58 0.01 * Parti naturali aumentano il peso di 29.6 g
Ospedaleosp2 -11.20 0.40 Non si g nificativo
Ospedaleosp3 28.24 0.03 * Neonati osp3 pesano 28.2 g in più rispetto a osp1
SessoM 77.64 4.87e-12 *** Neonati maschi pesano 77.6 g in più rispetto alle femmine

Commento sui risultati del modello Iniziale

Performance del Modello:

  • Multiple R-squared: 0.7289. Questo valore indica che il 72.89% della variabilità del peso neonatale è spiegata dal modello. Si tratta di un valore elevato, che riflette una buona capacità predittiva.

  • Adjusted R-squared: 0.7278. Il valore leggermente inferiore tiene conto del numero di variabili nel modello, confermando che il modello è robusto.

  • Coefficiente di Significatività delle Variabili:

    • Le variabili Gestazione, Lunghezza, Cranio e Sesso risultano altamente significative (p-value < 0.001), indicando un forte impatto sul peso del neonato.

    • Le variabili N.gravidanze, Tipo.partoNat e Ospedaleosp3 sono significative a un livello inferiore (p-value < 0.05).

    • Le variabili Anni.madre, Fumatrici, e Ospedaleosp2 non mostrano significatività statistica (p-value > 0.05), suggerendo che il loro contributo al modello potrebbe essere marginale o nullo.

  • Diagnostica dei Residui:

    • Grafico Residuals vs Fitted: Non emergono pattern evidenti, ma alcuni outlier (es. 1551) potrebbero influenzare il modello.

    • Q-Q Plot: Mostra una discreta deviazione dalla normalità, specialmente alle code, suggerendo la presenza di outlier.

    • Scale-Location: La varianza dei residui non sembra completamente omogenea.

    • Residuals vs Leverage: Alcune osservazioni con alta leva (es. 1551 e 1920) potrebbero avere un impatto sproporzionato sul modello.

  • Conclusioni del Modello Iniziale:

Le conclusioni del modello iniziale evidenziano diversi aspetti importanti. Tra i punti di forza, spicca il fatto che le principali variabili predittive del peso neonatale, come Gestazione, Lunghezza, Cranio e Sesso, risultano altamente significative, confermando le ipotesi iniziali e allineandosi alle aspettative cliniche.

Tuttavia, ci sono anche delle aree di miglioramento su cui concentrare l’attenzione. In particolare, è necessario affrontare la presenza di outlier, che potrebbero influenzare negativamente l’affidabilità delle stime del modello. Inoltre, occorre verificare con maggiore attenzione la normalità dei residui e l’omogeneità della loro varianza, aspetti fondamentali per la validità del modello lineare.

Revisione del modello di Regressione Lineare multipla

- VIF

#Valutazione della Multicollinearità (VIF)

library(car)
vif(modello)
##                  GVIF Df GVIF^(1/(2*Df))
## Anni.madre   1.188402  1        1.090139
## N.gravidanze 1.186990  1        1.089490
## Fumatrici    1.007395  1        1.003691
## Gestazione   1.695954  1        1.302288
## Lunghezza    2.085728  1        1.444205
## Cranio       1.630645  1        1.276967
## Tipo.parto   1.004229  1        1.002112
## Ospedale     1.004221  2        1.001054
## Sesso        1.040772  1        1.020182

Commento sul VIF

I risultati mostrano che tutti i valori di GVIF^(1/(2*Df)) sono inferiori a 5. Questo indica:

  • Nessuna multicollinearità preoccupante tra le variabili indipendenti.

  • È sicuro procedere con l’analisi del modello senza dover rimuovere o trasformare le variabili a causa di instabilità.

- Selezione Stepwise

step(modello, direction = "both", k = log(nrow(dati)))
## Start:  AIC=28128.94
## Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza + 
##     Cranio + Tipo.parto + Ospedale + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Anni.madre    1     41063 186792064 28122
## - Fumatrici     1     90310 186841312 28122
## - Ospedale      2    690600 187441602 28123
## - N.gravidanze  1    441930 187192932 28127
## - Tipo.parto    1    449632 187200634 28127
## <none>                      186751002 28129
## - Sesso         1   3618489 190369491 28169
## - Gestazione    1   5453321 192204322 28193
## - Cranio        1  45312767 232063769 28664
## - Lunghezza     1  87950684 274701686 29086
## 
## Step:  AIC=28121.67
## Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto + Ospedale + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Fumatrici     1     91194 186883258 28115
## - Ospedale      2    698129 187490193 28115
## - Tipo.parto    1    450278 187242343 28120
## <none>                      186792064 28122
## - N.gravidanze  1    630509 187422573 28122
## + Anni.madre    1     41063 186751002 28129
## - Sesso         1   3627858 190419922 28162
## - Gestazione    1   5414416 192206480 28185
## - Cranio        1  45557501 232349565 28659
## - Lunghezza     1  87949663 274741727 29078
## 
## Step:  AIC=28115.06
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Tipo.parto + 
##     Ospedale + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Ospedale      2    707067 187590325 28109
## - Tipo.parto    1    442694 187325952 28113
## <none>                      186883258 28115
## - N.gravidanze  1    607635 187490893 28115
## + Fumatrici     1     91194 186792064 28122
## + Anni.madre    1     41946 186841312 28122
## - Sesso         1   3611791 190495049 28155
## - Gestazione    1   5348163 192231421 28178
## - Cranio        1  45601703 232484961 28653
## - Lunghezza     1  88355042 275238300 29075
## 
## Step:  AIC=28108.85
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Tipo.parto + 
##     Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Tipo.parto    1    465632 188055957 28107
## <none>                      187590325 28109
## - N.gravidanze  1    648446 188238771 28110
## + Ospedale      2    707067 186883258 28115
## + Fumatrici     1    100132 187490193 28115
## + Anni.madre    1     49673 187540652 28116
## - Sesso         1   3656477 191246802 28149
## - Gestazione    1   5445558 193035883 28173
## - Cranio        1  45732191 233322516 28646
## - Lunghezza     1  88053368 275643693 29063
## 
## Step:  AIC=28107.22
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## <none>                      188055957 28107
## - N.gravidanze  1    620719 188676676 28108
## + Tipo.parto    1    465632 187590325 28109
## + Ospedale      2    730006 187325952 28113
## + Fumatrici     1     92136 187963822 28114
## + Anni.madre    1     50508 188005449 28114
## - Sesso         1   3661791 191717748 28148
## - Gestazione    1   5466218 193522175 28171
## - Cranio        1  46085055 234141012 28647
## - Lunghezza     1  87630512 275686469 29055
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Sesso, data = dati)
## 
## Coefficients:
##  (Intercept)  N.gravidanze    Gestazione     Lunghezza        Cranio  
##     -6680.59         12.45         32.34         10.25         10.54  
##       SessoM  
##        78.08

Risultati della selezione Stepwise

  • Modello finale selezionato:

    • Variabili incluse: N.gravidanze, Gestazione, Lunghezza, Cranio, Sesso.

    • Variabili escluse: Anni.madre, Fumatrici, Ospedale, Tipo.parto.

    • Questo modello è stato scelto utilizzando il criterio AIC, che bilancia bontà di adattamento e semplicità del modello.

  • Coefficiente del modello finale:

    Coefficients: (Intercept) N.gravidanze Gestazione Lunghezza Cranio SessoM -6680.59 12.45 32.34 10.25 10.54 78.08

    • Ogni variabile ha un’interpretazione specifica:

      • N.gravidanze: Ogni gravidanza aggiuntiva è associata a un aumento medio del peso del neonato di 12.45 grammi.

      • Gestazione: Ogni settimana di gestazione aumenta il peso medio di 32.34 grammi.

      • Lunghezza: Ogni millimetro in più di lunghezza è associato a un incremento di 10.25 grammi.

      • Cranio: Ogni millimetro in più di diametro cranico aumenta il peso di 10.54 grammi.

      • SessoM: I neonati maschi pesano in media 78.08 grammi in più rispetto alle femmine.

- Diagnostica del modello finale

# Creazione del modello finale con le variabili selezionate dallo stepwise
modello_finale <- lm(Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso, data = dati)

# Riepilogo del modello finale
summary(modello_finale)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Sesso, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1149.48  -180.96   -15.52   163.62  2639.77 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -6680.5886   135.7556 -49.210  < 2e-16 ***
## N.gravidanze    12.4521     4.3409   2.869  0.00416 ** 
## Gestazione      32.3363     3.7986   8.513  < 2e-16 ***
## Lunghezza       10.2484     0.3007  34.084  < 2e-16 ***
## Cranio          10.5383     0.4264  24.717  < 2e-16 ***
## SessoM          78.0811    11.2068   6.967 4.12e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 274.7 on 2493 degrees of freedom
## Multiple R-squared:  0.727,  Adjusted R-squared:  0.7264 
## F-statistic:  1328 on 5 and 2493 DF,  p-value: < 2.2e-16
# Diagnostica del modello finale
par(mfrow = c(2, 2))  # Layout per i grafici diagnostici
plot(modello_finale)

par(mfrow = c(1, 1))  # Reset layout

Riepilogo del modello finale

  1. Coefficiente di determinazione (R² e R² aggiustato):

    • R² = 0.727: Il modello spiega circa il 72.7% della variabilità del peso neonatale, un valore molto buono per un modello di regressione.

    • R² aggiustato = 0.7264: Considera il numero di variabili nel modello ed è anch’esso alto, confermando la buona capacità esplicativa.

  2. Significatività delle variabili:

    • N.gravidanze (p = 0.00416): Ogni gravidanza aggiuntiva aumenta il peso del neonato di circa 12.45 grammi.

    • Gestazione (p < 2e-16): Ogni settimana in più di gestazione incrementa il peso medio di 32.34 grammi.

    • Lunghezza (p < 2e-16): Ogni millimetro in più di lunghezza è associato a un aumento di 10.25 grammi.

    • Cranio (p < 2e-16): Ogni millimetro in più di diametro cranico incrementa il peso di 10.54 grammi.

    • SessoM (p = 4.12e-12): I neonati maschi pesano in media 78.08 grammi in più rispetto alle femmine.

  3. Errore standard dei residui:

    • 274.7: L’errore standard medio dei residui indica che, in media, le previsioni del peso differiscono dai valori osservati di circa 274.7 grammi.
  4. Significatività globale del modello:

    • F-statistic = 1328, p-value < 2.2e-16: Il modello è altamente significativo nel suo complesso.

Grafici diagnostici

Dai grafici diagnostici, emergono alcune considerazioni:

  1. Residuals vs Fitted:

    • Non ci sono pattern evidenti, suggerendo che la relazione tra le variabili indipendenti e il peso è ben modellata.

    • Alcuni outlier (es. osservazione 1551) meritano ulteriori analisi.

  2. Q-Q Plot:

    • I residui seguono approssimativamente la distribuzione normale, ma ci sono deviazioni agli estremi (outlier).
  3. Scale-Location:

    • La varianza dei residui appare abbastanza omogenea.
  4. Residuals vs Leverage:

    • Ci sono alcune osservazioni con alto leverage (es. 1551), che potrebbero influenzare il modello in modo significativo.

- Test dei risultati e delle metriche di errore del modello

# Valutazione della normalità dei residui con il test di Shapiro-Wilk
shapiro_test <- shapiro.test(residuals(modello_finale))
cat("Test di Shapiro-Wilk per la normalità dei residui:\n")
## Test di Shapiro-Wilk per la normalità dei residui:
print(shapiro_test)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(modello_finale)
## W = 0.9741, p-value < 2.2e-16
# Verifica della presenza di eteroschedasticità con il test di Breusch-Pagan
library(lmtest)
bptest_test <- bptest(modello_finale)
cat("Test di Breusch-Pagan per l'eteroschedasticità:\n")
## Test di Breusch-Pagan per l'eteroschedasticità:
print(bptest_test)
## 
##  studentized Breusch-Pagan test
## 
## data:  modello_finale
## BP = 90.179, df = 5, p-value < 2.2e-16
# Calcolo del Root Mean Squared Error (RMSE)
rmse <- sqrt(mean(residuals(modello_finale)^2))
cat("RMSE del modello finale:", rmse, "\n")
## RMSE del modello finale: 274.3219
# Calcolo del Mean Absolute Error (MAE)
mae <- mean(abs(residuals(modello_finale)))
cat("MAE del modello finale:", mae, "\n")
## MAE del modello finale: 210.9465
# Verifica del range dei valori osservati e percentuale RMSE
# Calcolo del range dei valori osservati
range_valori <- range(dati$Peso)  # Peso è la variabile target
range_osservato <- diff(range_valori)  # Differenza tra massimo e minimo

# Calcolo della percentuale di RMSE rispetto al range
percentuale_rmse <- (rmse / range_osservato) * 100

# Output del range e della percentuale RMSE
cat("Range osservato del peso neonatale:", range_valori, "\n")
## Range osservato del peso neonatale: 830 4930
cat("Range totale (in grammi):", range_osservato, "\n")
## Range totale (in grammi): 4100
cat("Percentuale RMSE rispetto al range:", round(percentuale_rmse, 2), "%\n")
## Percentuale RMSE rispetto al range: 6.69 %

Commento sui risultati dei test e delle metriche di errore del modello

  1. Test di Shapiro-Wilk per la normalità dei residui:

    • Il p-value molto basso (< 2.2e-16) indica che i residui non seguono una distribuzione normale.

    • Sebbene il modello di regressione lineare presuma normalità dei residui, un piccolo scostamento da questa ipotesi non è necessariamente problematico per quanto riguarda le previsioni, ma potrebbe influenzare l’affidabilità dei test statistici sui coefficienti.

  2. Test di Breusch-Pagan per l’eteroschedasticità:

    • Anche in questo caso, il p-value molto basso (< 2.2e-16) suggerisce che c’è presenza di eteroschedasticità nei dati.

    • L’eteroschedasticità implica che la varianza dei residui non è costante, il che potrebbe ridurre l’efficienza delle stime. Una possibile soluzione sarebbe utilizzare un modello robusto (ad esempio Weighted Least Squares o Generalized Least Squares) per mitigare questo problema.

  3. Root Mean Squared Error (RMSE):

    • Il valore di RMSE di 274.32 grammi rappresenta l’errore medio quadratico del modello. Quando confrontato con il range del peso neonatale osservato (4100 grammi), il RMSE corrisponde al 6.69% del range. Questo è un risultato accettabile, indicando una buona capacità predittiva del modello.
  4. Mean Absolute Error (MAE):

    • Il MAE, pari a 210.95 grammi, misura l’errore medio assoluto. Questo è un valore leggermente inferiore al RMSE, come previsto, ed è un indicatore utile per interpretare quanto il modello si discosta in media dai valori reali.

- Identificazione leverage, outlier e distanza di Cook

# Calcolo dei leverage
lev <- hatvalues(modello_finale)
soglia_leverage <- 2 * (length(coefficients(modello_finale)) / nrow(dati))
cat("Soglia di leverage:", soglia_leverage, "\n")
## Soglia di leverage: 0.004801921
cat("Osservazioni con leverage elevato:\n")
## Osservazioni con leverage elevato:
print(which(lev > soglia_leverage))
##   13   15   34   67   89   96  101  106  131  134  151  155  161  189  190  204 
##   13   15   34   67   89   96  101  106  131  134  151  155  161  189  190  204 
##  205  206  220  294  305  310  312  315  378  440  442  445  486  492  497  516 
##  205  206  220  294  305  310  312  315  378  440  442  445  486  492  497  516 
##  582  587  592  614  638  656  657  684  697  702  729  748  750  757  765  805 
##  582  587  592  614  638  656  657  684  697  702  729  748  750  757  765  805 
##  828  893  895  913  928  946  947  956  985 1008 1014 1049 1067 1091 1106 1130 
##  828  893  895  913  928  946  947  956  985 1008 1014 1049 1067 1091 1106 1130 
## 1166 1181 1188 1200 1219 1238 1248 1273 1291 1293 1311 1321 1325 1356 1357 1385 
## 1166 1181 1188 1200 1219 1238 1248 1273 1291 1293 1311 1321 1325 1356 1357 1384 
## 1395 1400 1402 1411 1420 1428 1429 1450 1505 1551 1553 1556 1573 1593 1606 1610 
## 1394 1399 1401 1410 1419 1427 1428 1449 1504 1550 1552 1555 1572 1592 1605 1609 
## 1617 1619 1628 1686 1693 1701 1712 1718 1727 1735 1780 1781 1809 1827 1868 1892 
## 1616 1618 1627 1685 1692 1700 1711 1717 1726 1734 1779 1780 1808 1826 1867 1891 
## 1962 1967 1977 2037 2040 2046 2086 2089 2098 2114 2115 2120 2140 2146 2148 2149 
## 1961 1966 1976 2036 2039 2045 2085 2088 2097 2113 2114 2119 2139 2145 2147 2148 
## 2157 2175 2200 2215 2216 2220 2221 2224 2225 2244 2257 2307 2317 2318 2337 2359 
## 2156 2174 2199 2214 2215 2219 2220 2223 2224 2243 2256 2306 2316 2317 2336 2358 
## 2408 2422 2436 2437 2452 2458 2471 2478 
## 2407 2421 2435 2436 2451 2457 2470 2477
# Plot dei leverage
plot(lev, main = "Valori di Leverage", ylab = "Leverage", xlab = "Osservazioni")
abline(h = soglia_leverage, col = "red", lty = 2)

# Identificazione di outlier nei residui studentizzati
residui_studentizzati <- rstudent(modello_finale)
cat("Outlier nei residui studentizzati:\n")
## Outlier nei residui studentizzati:
print(which(abs(residui_studentizzati) > 2))
##    5   90  119  130  146  155  262  295  310  318  329  361  364  375  377  390 
##    5   90  119  130  146  155  262  295  310  318  329  361  364  375  377  390 
##  403  418  455  460  472  616  623  632  633  648  653  684  709  762  791  850 
##  403  418  455  460  472  616  623  632  633  648  653  684  709  762  791  850 
##  890  928  950  980 1036 1132 1137 1192 1207 1230 1268 1287 1293 1297 1306 1341 
##  890  928  950  980 1036 1132 1137 1192 1207 1230 1268 1287 1293 1297 1306 1341 
## 1395 1399 1429 1433 1499 1519 1541 1551 1553 1585 1588 1593 1635 1639 1694 1702 
## 1394 1398 1428 1432 1498 1518 1540 1550 1552 1584 1587 1592 1634 1638 1693 1701 
## 1712 1718 1780 1837 1838 1856 1868 1915 1920 1937 1944 1962 1963 1993 2012 2023 
## 1711 1717 1779 1836 1837 1855 1867 1914 1919 1936 1943 1961 1962 1992 2011 2022 
## 2040 2076 2115 2123 2135 2151 2179 2185 2195 2204 2219 2225 2287 2315 2343 2370 
## 2039 2075 2114 2122 2134 2150 2178 2184 2194 2203 2218 2224 2286 2314 2342 2369 
## 2392 2398 2424 2437 2452 
## 2391 2397 2423 2436 2451
# Plot dei residui studentizzati
plot(residui_studentizzati, main = "Residui Studentizzati", ylab = "Residui", xlab = "Osservazioni")
abline(h = c(-2, 2), col = "red", lty = 2)

# Calcolo della distanza di Cook
cook_dist <- cooks.distance(modello_finale)
cat("Osservazioni con distanza di Cook elevata (>1):\n")
## Osservazioni con distanza di Cook elevata (>1):
print(which(cook_dist > 1))
## named integer(0)
# Plot della distanza di Cook
plot(cook_dist, main = "Distanza di Cook", ylab = "Distanza di Cook", xlab = "Osservazioni")
abline(h = 1, col = "red", lty = 2)

1. Grafico dei Valori di Leverage

  • Interpretazione:
    Il leverage indica quanto una singola osservazione influenza la stima dei coefficienti di regressione. Osservazioni con leverage elevato (sopra la soglia calcolata) possono influenzare significativamente il modello.

  • Risultati:

    • La soglia di leverage calcolata è 0.0048.

    • Diverse osservazioni superano questa soglia. Tuttavia, nessuna sembra avere leverage estremamente elevato, il che indica che queste osservazioni devono essere monitorate ma non necessariamente rimosse.

2. Grafico dei Residui Studentizzati

  • Interpretazione:
    I residui studentizzati vengono utilizzati per identificare outlier. Residui al di fuori dell’intervallo [-2, 2] indicano osservazioni potenzialmente anomale.

  • Risultati:

    • Diversi punti escono da questo intervallo (es. osservazione 1551), il che suggerisce la presenza di outlier.

    • Questi outlier possono indicare deviazioni significative dai valori predetti, e potrebbero essere indagati ulteriormente.

3. Grafico della Distanza di Cook

  • Interpretazione:
    La distanza di Cook misura quanto un’osservazione influisce simultaneamente su tutti i coefficienti del modello. Osservazioni con valori di distanza superiori a 1 sono considerate influenti.

  • Risultati:

    • Nessuna osservazione supera la soglia di 1.

    • Questo indica che, pur avendo alcune osservazioni con leverage elevato e residui anomali, nessuna influenza significativamente l’intero modello.

4- Previsioni e Risultati

Previsione

# Creazione di un nuovo dato ipotetico con valori plausibili
nuova_obs <- data.frame(
  N.gravidanze = 3,
  Gestazione = 39,
  Lunghezza = 500,   
  Cranio = 350,      
  Sesso = factor("F", levels = c("F", "M"))
)

# Previsione con il modello finale
previsione <- predict(modello_finale, newdata = nuova_obs)

# Validazione del risultato
if (previsione < 0) {
    cat("Attenzione: il modello ha prodotto un valore negativo, che non è plausibile.\n")
} else {
    cat("La previsione del peso del neonato è di:", round(previsione, 2), "grammi\n")
}
## La previsione del peso del neonato è di: 3430.51 grammi

Analisi del Risultato

  1. Conformità al Range Osservato:

    • Il valore previsto rientra nel range del peso neonatale osservato nel dataset (830-4930 grammi).

    • Questo dimostra che il modello è in grado di fare previsioni realistiche se i dati di input sono plausibili.

  2. Valori Utilizzati:

    • N.gravidanze: 3 (nel range 0-12).

    • Gestazione: 39 settimane (nel range 25-43).

    • Lunghezza: 500 mm (nel range 310-565 mm).

    • Cranio: 350 mm (nel range 235-390 mm).

    • Sesso: “F” (fattore correttamente definito con i livelli originali).

  3. Coerenza con il Modello:

    • Il modello ha combinato le variabili in modo coerente, utilizzando i coefficienti stimati per prevedere un valore realistico.

5- Visualizzazioni

- Relazione tra Gestazione e Peso Neonatale

# Scatter plot: Gestazione vs Peso previsto
library(ggplot2)
ggplot(dati, aes(x = Gestazione, y = Peso)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", color = "blue", se = FALSE) +
  labs(
    title = "Relazione tra Gestazione e Peso Neonatale",
    x = "Settimane di Gestazione",
    y = "Peso del Neonato (grammi)"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Osservazioni dal grafico:

  1. Relazione Lineare:

    • La linea di regressione (in blu) indica una tendenza lineare tra le settimane di gestazione e il peso neonatale. Questo conferma che, in media, un aumento delle settimane di gestazione è associato a un incremento del peso alla nascita.
  2. Distribuzione dei Dati:

    • La densità dei punti è maggiore tra le 37 e le 40 settimane di gestazione, indicando che la maggior parte dei neonati nasce a termine.

    • Per durate di gestazione inferiori a 37 settimane (parti prematuri), il peso neonatale è generalmente inferiore e mostra una maggiore variabilità.

  3. Eccezioni:

    • Sono presenti alcuni punti al di sotto della linea di regressione, che rappresentano neonati con un peso inferiore rispetto a quanto previsto dalla relazione lineare. Questo potrebbe essere dovuto a fattori aggiuntivi non inclusi nel modello (es. fumo materno, problemi di salute).

    • Anche nei neonati con gestazione superiore a 40 settimane, il peso previsto varia, indicando che l’aumento della gestazione oltre un certo punto non porta sempre a un aumento significativo del peso.

  4. Adeguatezza del Modello:

    • La linea di regressione cattura bene la tendenza generale, ma alcune variazioni individuali rimangono non spiegate, come indicato dai punti più lontani dalla linea.

- Impatto del sesso sul Peso Neonatale

# Boxplot: Sesso vs Peso
ggplot(dati, aes(x = Sesso, y = Peso, fill = Sesso)) +
  geom_boxplot(alpha = 0.7) +
  labs(
    title = "Distribuzione del Peso Neonatale per Sesso",
    x = "Sesso",
    y = "Peso del Neonato (grammi)"
  ) +
  theme_minimal()

Osservazioni dal grafico:

  1. Differenze tra i Sessi:

    • I neonati maschi (M) tendono ad avere un peso leggermente più alto rispetto alle femmine (F), come indicato dal valore mediano più elevato per i maschi.

    • Questo è in linea con quanto osservato nel modello, dove il sesso maschile risultava avere un effetto positivo significativo sul peso neonatale.

  2. Distribuzione:

    • Entrambe le distribuzioni mostrano un intervallo interquartile (IQR) simile, suggerendo che la variabilità del peso è comparabile tra maschi e femmine.

    • I dati sono abbastanza simmetrici, senza segni evidenti di asimmetria.

  3. Outlier:

    • Sono presenti alcuni outlier in entrambe le categorie, con valori particolarmente bassi e alti. Questi potrebbero rappresentare neonati prematuri o altri casi particolari.
  4. Range di Peso:

    • La maggior parte dei neonati maschi e femmine si colloca tra circa 2500 e 4000 grammi, con qualche estensione verso il basso (soprattutto per le femmine) e verso l’alto (più evidente per i maschi).

- Effetto combinato di Gestazione e Fumo sul Peso Neonatale

# Creazione del peso previsto
dati$fumo_factor <- factor(dati$Fumatrici, levels = c(0, 1), labels = c("Non fumatrici", "Fumatrici"))

# Interazione: Gestazione e Fumo
ggplot(dati, aes(x = Gestazione, y = Peso, color = fumo_factor)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(
    title = "Effetto Combinato di Gestazione e Fumo sul Peso Neonatale",
    x = "Settimane di Gestazione",
    y = "Peso del Neonato (grammi)",
    color = "Fumo Materno"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Commento sul grafico: Effetto combinato di Gestazione e Fumo sul Peso Neonatale

Il grafico rappresenta la relazione tra le settimane di gestazione e il peso neonatale, suddivisa per due gruppi: madri fumatrici e non fumatrici. Ogni linea di tendenza rappresenta la relazione media per ciascun gruppo.

Osservazioni principali:

  1. Relazione tra Gestazione e Peso:

    • Entrambi i gruppi mostrano un trend positivo: all’aumentare delle settimane di gestazione, il peso del neonato aumenta.

    • Questo conferma l’importanza della durata della gestazione come uno dei principali fattori determinanti del peso neonatale.

  2. Impatto del Fumo Materno:

    • Le madri non fumatrici tendono ad avere neonati con un peso medio maggiore rispetto a quelli delle madri fumatrici, a parità di settimane di gestazione.

    • Questo evidenzia l’effetto negativo del fumo materno sul peso neonatale.

  3. Distribuzione dei Dati:

    • Per entrambi i gruppi, c’è una certa variabilità nei pesi neonatali, anche a parità di settimane di gestazione.

    • La variabilità sembra leggermente più alta nelle ultime settimane di gestazione.

  4. Differenze di pendenza:

    • Le linee di tendenza per i due gruppi mostrano una pendenza simile, suggerendo che l’effetto del prolungarsi della gestazione è consistente tra i due gruppi, ma il livello di partenza (intercetta) è inferiore per le madri fumatrici.

- Residui del Modello

# Residuals plot
ggplot(data.frame(fitted = fitted(modello_finale), residuals = residuals(modello_finale)), aes(x = fitted, y = residuals)) +
  geom_point(alpha = 0.6) +
  geom_hline(yintercept = 0, color = "red", linetype = "dashed") +
  labs(
    title = "Residui Standardizzati vs Valori Predetti",
    x = "Valori Predetti",
    y = "Residui Standardizzati"
  ) +
  theme_minimal()

Commento sul grafico: Residui Standardizzati vs Valori Predetti

Il grafico rappresenta la relazione tra i residui standardizzati e i valori predetti dal modello finale. Questo tipo di grafico è essenziale per diagnosticare eventuali problemi di specificazione del modello o di violazione delle sue assunzioni.

Osservazioni principali:

  1. Distribuzione dei Residui:

    • I residui standardizzati si distribuiscono in modo abbastanza casuale attorno alla linea orizzontale rossa (y = 0), che rappresenta l’assenza di errore sistematico.

    • Questo suggerisce che il modello non presenta evidenti problemi di specificazione, ma ci sono alcune eccezioni.

  2. Presenza di Outlier:

    • Alcuni punti si discostano in modo significativo dal resto, con residui molto grandi o molto piccoli (sia positivi che negativi). Questi potrebbero rappresentare outlier o osservazioni influenti che meritano un’ulteriore analisi.
  3. Varianza dei Residui:

    • La varianza sembra relativamente costante lungo l’intervallo dei valori predetti, anche se c’è una leggera tendenza a una maggiore dispersione per valori predetti molto bassi o molto alti.

    • Questo indica che l’assunzione di omoschedasticità è quasi rispettata, ma potrebbe essere migliorata.

  4. Pattern:

    • Non emergono pattern evidenti (come una curva o un funnel), il che è un segno positivo per il modello. Tuttavia, un’ulteriore analisi dei residui estremi potrebbe essere utile per migliorare il modello.

6- Conclusioni

Il progetto di previsione del peso neonatale ha rappresentato un’importante occasione per applicare strumenti statistici avanzati a una problematica concreta e di grande rilevanza clinica. Siamo partiti dall’obiettivo di identificare i principali fattori che influenzano il peso alla nascita, costruendo un modello predittivo in grado di supportare il personale sanitario nella gestione delle gravidanze.

Il lavoro ha messo in luce risultati che, da un lato, confermano le aspettative cliniche e, dall’altro, forniscono spunti interessanti per futuri approfondimenti. Tra i fattori più rilevanti, la durata della gestazione, la lunghezza e il diametro craniale del neonato si sono rivelati fondamentali, insieme a variabili come il numero di gravidanze precedenti e il sesso del neonato. Il modello ha dimostrato una buona capacità di spiegare la variabilità del peso, con un R² del 72.7% e un errore medio (RMSE) accettabile, confermando la sua validità anche in termini pratici.

Risultati principali e punti di forza:

Criticità e possibili miglioramenti:

Nonostante i risultati incoraggianti, il modello ha evidenziato alcune aree di miglioramento:

Implicazioni pratiche:

Il modello sviluppato offre un valido supporto decisionale per il personale medico, consentendo di identificare gravidanze a rischio e pianificare interventi tempestivi. Inoltre, Neonatal Health Solutions potrà sfruttare questi risultati per migliorare la gestione delle risorse ospedaliere e promuovere politiche di prevenzione mirate.