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:
# 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)
# 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 | - | Sì | 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) |
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:
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.
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.
# 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))
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.
# 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
Dalla matrice di correlazione e dallo scatterplot matrix possiamo osservare le seguenti relazioni principali tra le variabili:
Peso e Lunghezza:
Peso e Gestazione:
Peso e Cranio:
Correlazioni deboli:
Lunghezza e Gestazione:
# 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))
L’analisi delle variabili categoriali attraverso i grafici a torta ha evidenziato le seguenti osservazioni:
Fumatrici:
Tipo di parto:
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.
Sesso:
# 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.
# 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
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.
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.
# 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
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.
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.
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.
# 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 |
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.
#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
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à.
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
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.
# 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
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.
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.
Errore standard dei residui:
Significatività globale del modello:
Dai grafici diagnostici, emergono alcune considerazioni:
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.
Q-Q Plot:
Scale-Location:
Residuals vs Leverage:
# 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 %
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.
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.
Root Mean Squared Error (RMSE):
Mean Absolute Error (MAE):
# 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)
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.
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.
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.
# 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
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.
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).
Coerenza con il Modello:
# 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'
Relazione Lineare:
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à.
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.
Adeguatezza del Modello:
# 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()
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.
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.
Outlier:
Range di Peso:
# 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'
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.
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.
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.
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.
Differenze di pendenza:
# 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()
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.
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.
Presenza di Outlier:
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.
Pattern:
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:
Le settimane di gestazione sono emerse come il fattore con il maggiore impatto sul peso neonatale, sottolineando l’importanza di monitorare le gravidanze per prevenire situazioni a rischio.
Le misure antropometriche come lunghezza e cranio si sono dimostrate indicatori fondamentali, evidenziando la relazione tra lo sviluppo fisico e il peso del neonato.
Le previsioni del modello hanno mostrato un buon grado di affidabilità anche su dati ipotetici, aprendo la strada a possibili applicazioni cliniche.
Le rappresentazioni grafiche hanno aiutato a visualizzare le relazioni più significative tra le variabili, rendendo i risultati facilmente interpretabili.
Criticità e possibili miglioramenti:
Nonostante i risultati incoraggianti, il modello ha evidenziato alcune aree di miglioramento:
Eteroschedasticità nei residui: La varianza non costante rilevata dal test di Breusch-Pagan suggerisce che modelli alternativi, come quelli robusti, potrebbero affinare ulteriormente la precisione delle previsioni.
Deviazioni dalla normalità: Sebbene il test di Shapiro-Wilk abbia segnalato residui non perfettamente normali, l’impatto sulle previsioni è stato marginale.
Outlier e osservazioni influenti: Alcuni valori con elevato leverage richiederebbero un’analisi più approfondita per evitare possibili distorsioni.
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.