L’obiettivo di questo studio è sviluppare un modello statistico capace di prevedere con precisione il peso neonatale alla nascita, utilizzando dati clinici raccolti da tre ospedali. Il progetto si propone di migliorare la gestione delle gravidanze ad alto rischio, ottimizzare l’allocazione delle risorse ospedaliere e garantire esiti più favorevoli per la salute neonatale.
Nella prima fase, esploreremo le variabili attraverso un’analisi descrittiva per comprenderne la distribuzione e identificare eventuali outlier o anomalie.
Età della madre: Categoria di tipo quantitativo continuo, rappresenta
l’età della madre in anni.
Numero di gravidanze: Categoria di tipo quantitativo discreto,
rappresenta il numero di gravidanze della madre.
Fumo materno: Categoria di tipo qualitativo binario (dummy), con valori
0 (non fumatrice) e 1 (fumatrice).
Durata della gravidanza: Categoria di tipo quantitativo continuo,
rappresenta la durata della gravidanza in settimane.
Peso del neonato: Categoria di tipo quantitativo continuo, rappresenta
il peso del neonato alla nascita in grammi.
Lunghezza e diametro del cranio: Categoria di tipo quantitativo
continuo, rappresenta la lunghezza e la circonferenza del cranio del
neonato, misurabile tramite ecografie durante la gravidanza.
Tipo di parto: Categoria di tipo qualitativo nominale, con valori
‘naturale’ o ‘cesareo’.
Ospedale di nascita: Categoria di tipo qualitativo nominale, con valori
che rappresentano gli ospedali 1, 2 o 3.
Sesso del neonato: Categoria di tipo qualitativo nominale, con valori
‘M’ (maschio) o ‘F’ (femmina).
colSums(is.na(dataset))
## Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza
## 0 0 0 0 0 0
## Cranio Tipo.parto Ospedale Sesso
## 0 0 0 0
summary(dataset)
## Anni.madre N.gravidanze Fumatrici Gestazione
## Min. : 0.00 Min. : 0.0000 Min. :0.0000 Min. :25.00
## 1st Qu.:25.00 1st Qu.: 0.0000 1st Qu.:0.0000 1st Qu.:38.00
## Median :28.00 Median : 1.0000 Median :0.0000 Median :39.00
## Mean :28.16 Mean : 0.9812 Mean :0.0416 Mean :38.98
## 3rd Qu.:32.00 3rd Qu.: 1.0000 3rd Qu.:0.0000 3rd Qu.:40.00
## Max. :46.00 Max. :12.0000 Max. :1.0000 Max. :43.00
## Peso Lunghezza Cranio Tipo.parto 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:1772 osp2:849 M:1244
## Median :3300 Median :500.0 Median :340 osp3:835
## Mean :3284 Mean :494.7 Mean :340
## 3rd Qu.:3620 3rd Qu.:510.0 3rd Qu.:350
## Max. :4930 Max. :565.0 Max. :390
str(dataset)
## 'data.frame': 2500 obs. of 10 variables:
## $ Anni.madre : int 26 21 34 28 20 32 26 25 22 23 ...
## $ N.gravidanze: int 0 2 3 1 0 0 1 0 1 0 ...
## $ Fumatrici : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Gestazione : int 42 39 38 41 38 40 39 40 40 41 ...
## $ Peso : int 3380 3150 3640 3690 3700 3200 3100 3580 3670 3700 ...
## $ Lunghezza : int 490 490 500 515 480 495 480 510 500 510 ...
## $ Cranio : int 325 345 375 365 335 340 345 349 335 362 ...
## $ Tipo.parto : 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 ...
dataset$Fumatrici <- as.factor(dataset$Fumatrici)
Fisiologicamente il primo parto può coincidere con il primo ciclo,non prima, il minimo anni madre 0 è sicuramente un valore erratto.Allo stesso modo una gravidanza di una donna pari o inferiore a 14 risulta un valore errato.Identifichiamo i valori anomali e li eliminiamo dal nostro campione
colore_punti <- ifelse(dataset$Anni.madre < 14, "darkred", "lightblue")
plot(dataset$Anni.madre, pch=20, col=colore_punti, bg=colore_punti,
main="Grafico con evidenza degli outliers", xlab="Indice delle osservazioni", ylab="Anni della madre")
neonati <- subset(dataset, Anni.madre > 14)
colore_punti <- ifelse(neonati$Anni.madre < 14, "darkred", "lightblue")
plot(neonati$Anni.madre, pch=20, col=colore_punti, bg=colore_punti,
main="Grafico normalizzato", xlab="Indice delle osservazioni", ylab="Anni della madre")
visualizziamo graficamente anche come si distribuiscono le altre variabili per cercare di identificare altre anomalie.
# Crea gli scatterplot
plot(jitter(neonati$Peso, factor = 0.5), pch=20, col="black", main = "Peso")
plot(jitter(neonati$Anni.madre, factor = 0.5), pch=20, col="lightblue3", main = "Anni Madre")
plot(jitter(neonati$N.gravidanze, factor = 0.5), pch=20, col="grey3", main = "Numero Gravidanze")
plot(jitter(neonati$Gestazione, factor = 0.2), pch=20, col="darkgrey", main = "Gestazione")
plot(jitter(neonati$Lunghezza, factor = 0.2), pch=20, col="blue3", main = "Lunghezza")
plot(jitter(neonati$Cranio, factor = 0.2), pch=20, col="blue1", main = "Cranio")
Dall’osservazione grafica, considerando una singola variabile alla
volta, non siamo in grado di identificare anomalie dovute ad
errori.
Proviamo a confrontare la combinazione delle principarli variabili:
Peso-Lunghezza
Peso- Settimana di gestazione
plot(neonati$Gestazione, neonati$Peso, pch=21, col="royalblue3")
plot(neonati$Lunghezza, neonati$Peso, pch=20, col="royalblue4")
n <- nrow(neonati)
Notiamo subito un numero di osservazioni molto bassa legate a gestazione prossime alle 25 settimane, i dati sembrano essere pochi e concentrati verso il limite inferiore di peso (1000g o meno). Questo potrebbe riflettere un fenomeno reale (prematurità estrema). Punti isolati e outliers: Si possono osservare alcuni punti lontani dal resto dei dati, ad esempio per pesi superiori a 5000g o molto inferiori rispetto alla media in determinate settimane. Potrebbero essere veri outlier o errori di registrazione.
In base alla nostra esperienza clinica possiamo affermare con ragionevole certezza che un neonato di circa 4500g con una lunghezza di circa 320mm è un dato anomalo, prima di escluderlo dal campione verifichiamo anche la settimana in cui idealmente tale osservazione ricade
anomalia <- which(neonati$Lunghezza<350 & neonati$Peso > 4000)
kable(neonati[1546, ],caption = "Informazioni sull'Osservazione Anomala (ID 1546)")
| Anni.madre | N.gravidanze | Fumatrici | Gestazione | Peso | Lunghezza | Cranio | Tipo.parto | Ospedale | Sesso | |
|---|---|---|---|---|---|---|---|---|---|---|
| 1551 | 35 | 1 | 0 | 38 | 4370 | 315 | 374 | Nat | osp3 | F |
Si ritiene tale valore anomalo e presumibilmente un errore di rilevazione, escludiamo tale osservazione dal nostro campione.
neonati <- neonati[-1546, ]
#Salviamo il numero di righe del nostro dataset nella variabile n
n <- nrow(neonati)
Verifichiamo la significatività dei dati del campione rispetto alla popolazione, in Italia un bambino pesa in media alla nascita 3,3kg con qualche differenza tra maschi e femmine (i maschi pesano circa 150 grammi in più), mentre non ci sono particolari differenze per quanto riguarda la lunghezza, pari mediamente a 50 centimetri. ( Fonte https://www.ospedalebambinogesu.it/)
Saggiamo l’ipotesi che i valori della media di peso e lunghezza del nostro dataset siano significativamente uguali a quelli della popolazione.
shapiro.test(neonati$Peso) # Controlla la normalità
##
## Shapiro-Wilk normality test
##
## data: neonati$Peso
## W = 0.97055, p-value < 2.2e-16
qqnorm(neonati$Peso) # Q-Q plot
qqline(neonati$Peso) # Linea di riferimento
print(shapiro.test(neonati$Peso))
##
## Shapiro-Wilk normality test
##
## data: neonati$Peso
## W = 0.97055, p-value < 2.2e-16
kable("il peso approssima una distribuzione normale,per questo utilizzeremo lo t test")
| x |
|---|
| il peso approssima una distribuzione normale,per questo utilizzeremo lo t test |
# Eseguiamo lo T-test Dato che non conosco la devizione standard della popolazione
test <- t.test(neonati$Peso,
mu = 3300,
conf.level = 0.95,
alternative = "two.sided")
p_valuePeso <- test$p.value
print(p_valuePeso)
## [1] 0.1225962
Il P-Value è pari a 0.12. Non rifiutiamo l’ipotesi nulla. La media del campione non è significativamente diversa da 330
Ripetiamo l’analisi considerando ora la Lunghezza:
shapiro.test(neonati$Lunghezza) # Controlla la normalità
##
## Shapiro-Wilk normality test
##
## data: neonati$Lunghezza
## W = 0.91542, p-value < 2.2e-16
qqnorm(neonati$Lunghezza) # Q-Q plot
qqline(neonati$Lunghezza) # Linea di riferimento
test <- t.test(neonati$Lunghezza,
mu = 500,
conf.level = 0.95,
alternative = "two.sided")
p_valueLunghezza <- test$p.value
print(p_valueLunghezza)
## [1] 4.388815e-23
Il P-Value è pari a 4.388815 × 10⁻²³. Non rifiutiamo l’ipotesi nulla. La media del campione non è significativamente diversa da 500
kable(combined_table,
caption = "Tabella Combinata: Tipo di Parto vs Ospedale (Valori Assoluti e Percentuali)")
| osp1 | osp2 | osp3 | |
|---|---|---|---|
| Ces | 241 (30%) | 254 (30%) | 232 (28%) |
| Nat | 574 (70%) | 592 (70%) | 601 (72%) |
ggplot(data = neonati, aes(x = Ospedale, fill = Tipo.parto)) +
geom_bar(position = "dodge") +
labs(title = "Confronto tra Tipo di Parto e Ospedale",
x = "Ospedale", y = "Numero di Parto",
fill = "Tipo di Parto") +
theme_minimal()
test_chi_square <-chi_square_test <- chisq.test(contingency_tableParto)
print(test_chi_square)
##
## Pearson's Chi-squared test
##
## data: contingency_tableParto
## X-squared = 1.0629, df = 2, p-value = 0.5878
il numero di parti cesarei o naturali non sembra essere condizionato dall’ospedale.Il risultato del test del chi-quadro suggerisce che non c’è evidenza di una relazione significativa tra il tipo di parto e l’ospedale.
boxplot_sesso <- neonati %>%
pivot_longer(
cols = c(Peso, Lunghezza, Cranio),
names_to = "Misura",
values_to = "Valore") %>%
ggplot(aes(x = Sesso, y = Valore, fill = Sesso)) +
geom_boxplot() +
facet_wrap(~Misura, scales = "free_y") +
scale_fill_manual(values = c("F" = "lightpink", "M" = "lightblue")) + # Personalizzazione colori
theme_minimal() +
labs(
title = "Distribuzione delle Misure Antropometriche per Sesso",
x = "Sesso",
y = "Valore"
)
print(boxplot_sesso)
kable(tabella_riassuntiva)
| Misura | Sesso | Minimo | Q1 | Mediana | Media | Q3 | Massimo |
|---|---|---|---|---|---|---|---|
| Cranio | F | 235 | 330 | 340 | 337.6042 | 348 | 390 |
| Cranio | M | 265 | 334 | 343 | 342.4303 | 352 | 390 |
| Lunghezza | F | 310 | 480 | 490 | 489.9194 | 505 | 565 |
| Lunghezza | M | 320 | 490 | 500 | 499.6825 | 515 | 560 |
| Peso | F | 830 | 2900 | 3160 | 3160.4166 | 3470 | 4930 |
| Peso | M | 980 | 3150 | 3430 | 3408.2998 | 3720 | 4810 |
I test mostrano differenze statisticamente significative tra i sessi per tutte le misure antropometriche:
I maschi tendono ad avere peso e lunghezza mediamente maggiori.
Saggiamo quanto detto con un test d’ipotesi:
t_test_peso_sesso <- t.test(Peso ~ Sesso, data = neonati, alternative = "two.sided", conf.level = 0.95)
t_test_peso_sesso
##
## Welch Two Sample t-test
##
## data: Peso by Sesso
## t = -12.133, df = 2485.3, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
## -287.9467 -207.8196
## sample estimates:
## mean in group F mean in group M
## 3160.417 3408.300
Non si ha bisogno di un valore di riferimento come mu perché si sta confrontando le medie dei due gruppi. Il test eseguito per la variabile peso rafforza quanto affermato in precedenza, valori di T pari a -12.13 e un p-value inferiore a 2.2×10−16 dimsostrano che si rifiuta l’ipotesi nulla e si può affermare che il peso tra i neonati e neonate è significativamente diverso
# Test t per confrontare la lunghezza media tra maschi e femmine
t_test_lunghezza_sesso <- t.test(Lunghezza ~ Sesso, data = neonati, alternative = "two.sided", conf.level = 0.95)
# Visualizzare i risultati
t_test_lunghezza_sesso
##
## Welch Two Sample t-test
##
## data: Lunghezza by Sesso
## t = -9.5125, df = 2462.6, 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.775709 -7.750532
## sample estimates:
## mean in group F mean in group M
## 489.9194 499.6825
Il test eseguito per la variabile lunghezza rafforza quanto affermato in precedenza, valori di T pari a -9.52 e un p-value inferiore a 2.2×10−16 dimsostrano che si rifiuta l’ipotesi nulla e si può affermare che la lunghezza tra i neonati e neonate è significativamente diversa
Procediamo alla realizzazione della matrice di correlazione sul dataset
panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor=0.8, ...)
{
par(usr = c(0, 1, 0, 1))
r <- abs(cor(x, y))
txt <- format(c(r, 0.123456789), digits = digits)[1]
txt <- paste0(prefix, txt)
if(r>=0.1) cex.cor <- 1.4
text(0.5, 0.5, txt, cex = cex.cor)
}
pairs(x=neonati[,1:10],lower.panel=panel.cor, upper.panel=panel.smooth)
Dalla matrice di correlazione possiamo vedere che i regressori che hanno una correlazione importante con la variabile Peso sono: Lunghezza, Cranio, Gestazione e in piccola parte Sesso. La variabile Fumo risulta non essere statisticamente rilevante ma nonostate ciò la inseriremo nel primo modello con tutte le variabili al pari degli altri regressori non significativi
model1 <- lm(Peso~Anni.madre+N.gravidanze+Fumatrici+Gestazione+Lunghezza+Cranio+Tipo.parto+Ospedale+Sesso, data = neonati)
# Riepilogo del modello
summary(model1)
##
## Call:
## lm(formula = Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione +
## Lunghezza + Cranio + Tipo.parto + Ospedale + Sesso, data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1136.97 -181.35 -13.45 159.70 1407.28
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6728.2252 138.9222 -48.432 < 2e-16 ***
## Anni.madre 0.5497 1.1313 0.486 0.62711
## N.gravidanze 12.4577 4.5839 2.718 0.00662 **
## Fumatrici1 -27.3340 27.0381 -1.011 0.31214
## Gestazione 29.7683 3.7607 7.916 3.67e-15 ***
## Lunghezza 10.9316 0.3023 36.164 < 2e-16 ***
## Cranio 9.8593 0.4233 23.290 < 2e-16 ***
## Tipo.partoNat 29.6117 11.8729 2.494 0.01269 *
## Ospedaleosp2 -11.6421 13.2089 -0.881 0.37820
## Ospedaleosp3 25.2401 13.2608 1.903 0.05711 .
## SessoM 77.6921 10.9838 7.073 1.96e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 268.9 on 2483 degrees of freedom
## Multiple R-squared: 0.7387, Adjusted R-squared: 0.7377
## F-statistic: 702.1 on 10 and 2483 DF, p-value: < 2.2e-16
Nella tabella dei coefficienti vengono mostrate le stime dei coefficienti beta di tutte le variabili che rappresentano gli effetti marginali di ogni singola variabile sulla variabile risposta Per ogni stima bisogna concentrarsi su segno, valore e significatività.
N.gravidanze: il numero di gravidanze precedenti della madre ha effetto positivo e elevato, con p-value sotto la soglia del 5% quindi effetto significativo.
Gestazione: coefficiente alto e positivo con p-value prossimo allo zero quindi significatività altissima dunque per ogni settimana di gestazione si ha un aumento di peso di 29.7g
Lunghezza: coefficiente alto e positivo con p-value prossimo allo zero quindi significatività altissima dunque per ogni centimetro si ha un aumento di peso di circa 10.9g
Cranio: coefficiente alto e positivo con p-value prossimo allo zero,per ogni centimetro di circonferenza del cranio del neonato si ha un aumento di peso di 9.8g
Tipo.parto: il tipo di parto naturale avviene per neonati con peso maggiore (coefficiente positivo alto e p-value sotto la soglia del 5% quindi differenza significativa)
Sesso: il valore Maschio della variabile sesso ha un coefficiente altissimo e p-value prossimo allo zero quindi effetto molto significativo
La variabile Fumatrice S/N non pare avere effetti significativi sul peso del neonato/a. Una madre fumatrice partorirà un neonato con un peso inferiore di 27g rispetto a una non fumatrice.Benchè tale aspetto accenda un campanello d’allarme sui rischi del fumo in genere, in termini di significatività tale variabile risulta meno importante e superfula per la nostra regressione.
Il R-squared (Multiple R-squared) di 0.7387 suggerisce che il modello spiega circa il 74% della variabilità nel peso del neonato, il che è un buon risultato.
Il modello di regressione individuato è in grado di spiegare il 74% della variabilità ma risulta essere un modello pesante con diverse variabili regressorie con impatto marginale oppure quasi nullo. Proveremo a migliorare il modello
Creiamo il model2 che avrà tutte le variabili tranne quelle che risultano non statisticamente rilevanti e vediamo che differenze ci sono rispetto a quello completo.
model2 <- lm(Peso~N.gravidanze+Gestazione+Lunghezza+Cranio+Sesso, data = neonati)
# Riepilogo del modello
summary(model2)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso, data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1165.65 -180.13 -12.61 163.33 1410.68
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6683.5939 133.2707 -50.151 < 2e-16 ***
## N.gravidanze 13.1481 4.2614 3.085 0.00206 **
## Gestazione 29.6378 3.7392 7.926 3.38e-15 ***
## Lunghezza 10.8897 0.3022 36.040 < 2e-16 ***
## Cranio 9.9184 0.4234 23.424 < 2e-16 ***
## SessoM 78.1027 11.0050 7.097 1.66e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 269.5 on 2488 degrees of freedom
## Multiple R-squared: 0.737, Adjusted R-squared: 0.7365
## F-statistic: 1395 on 5 and 2488 DF, p-value: < 2.2e-16
Il R-squared (Multiple R-squared) di 0.737 suggerisce che il modello spiega circa il 74% della variabilità nel peso del neonato, il che è ottimo risultato considerando la riduzione dealle variabili.
Proviamo a ridurre ancora la complessità del modello escludendo altre variabili regressorie che hanno meno impatto come N.gravidanze
model3 <- lm(Peso ~ Lunghezza + Cranio + Sesso+Gestazione, data = neonati)
# Riepilogo del modello
summary(model3)
##
## Call:
## lm(formula = Peso ~ Lunghezza + Cranio + Sesso + Gestazione,
## data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1153.7 -182.7 -14.9 164.0 1391.1
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6651.8461 133.1001 -49.976 < 2e-16 ***
## Lunghezza 10.8407 0.3023 35.866 < 2e-16 ***
## Cranio 10.0590 0.4217 23.853 < 2e-16 ***
## SessoM 79.2928 11.0171 7.197 8.10e-13 ***
## Gestazione 28.5356 3.7285 7.653 2.78e-14 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 270 on 2489 degrees of freedom
## Multiple R-squared: 0.736, Adjusted R-squared: 0.7356
## F-statistic: 1735 on 4 and 2489 DF, p-value: < 2.2e-16
Proviamo ad aggiungere un effetto quadratico, saggiamo l’importanza della lunghezza sul nostro modello di regressione. Tuttavia il modello non sembra migliorare
model4 <- lm(Peso ~ I(Lunghezza^2) + Cranio + Sesso+Gestazione, data = neonati)
# Riepilogo del modello
summary(model4)
##
## Call:
## lm(formula = Peso ~ I(Lunghezza^2) + Cranio + Sesso + Gestazione,
## data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1161.18 -182.76 -13.85 165.40 1355.80
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.201e+03 1.427e+02 -29.440 < 2e-16 ***
## I(Lunghezza^2) 1.126e-02 3.081e-04 36.549 < 2e-16 ***
## Cranio 1.012e+01 4.171e-01 24.250 < 2e-16 ***
## SessoM 7.613e+01 1.095e+01 6.951 4.62e-12 ***
## Gestazione 3.189e+01 3.651e+00 8.734 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 268.2 on 2489 degrees of freedom
## Multiple R-squared: 0.7395, Adjusted R-squared: 0.739
## F-statistic: 1766 on 4 and 2489 DF, p-value: < 2.2e-16
Proviamo ad aggiungere un effetto quadratico solo alla gestazione,l’aumento di peso è più marcato nei mesi finali della gestazione
model5 <- lm(Peso ~ Lunghezza + Cranio + Sesso+I(Gestazione^2), data = neonati)
# Riepilogo del modello
summary(model5)
##
## Call:
## lm(formula = Peso ~ Lunghezza + Cranio + Sesso + I(Gestazione^2),
## data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1151.00 -182.56 -15.71 165.21 1395.21
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.139e+03 1.216e+02 -50.503 < 2e-16 ***
## Lunghezza 1.085e+01 3.002e-01 36.133 < 2e-16 ***
## Cranio 1.007e+01 4.211e-01 23.925 < 2e-16 ***
## SessoM 7.870e+01 1.101e+01 7.146 1.17e-12 ***
## I(Gestazione^2) 3.887e-01 4.959e-02 7.839 6.68e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 269.8 on 2489 degrees of freedom
## Multiple R-squared: 0.7363, Adjusted R-squared: 0.7359
## F-statistic: 1738 on 4 and 2489 DF, p-value: < 2.2e-16
Il R-squared (Multiple R-squared) dei vari modelli continua ad assestarsi attorno al 0.729 suggerendo che i modelli spiegano circa il 73% della variabilità nel peso del neonato, il che è ottimo risultato considerando la riduzione dealle variabili rispetto al modello iniziale .
Proviamo ad utilizzare altri criteri di valutazione, AIC e BIC. Il modello con i criteri di informazione più bassi è di solito il modello migliore. Tra i due criteri di valutazione ( AIC e BIC ), propenderemo per dare più affidabilità al criterio BIC, dato che rispetto all’AIC previlegia modelli con minor variabili.
kable(results_table_Model, caption = "Confronto tra AIC e BIC dei modelli")
| Model | AIC | BIC |
|---|---|---|
| model1 | 34995.46 | 35065.32 |
| model2 | 35001.53 | 35042.29 |
| model3 | 35009.06 | 35043.99 |
| model4 | 34976.57 | 35011.50 |
| model5 | 35006.25 | 35041.18 |
In questo caso il criterio di informazione di Akaike (AIC) e di Bayes (BIC) convergono, sceglieremo il Model3 e andremo ora a saggiare la diagnostica dei residui subito dopo aver valutato anche andiamo l’MSE, l’RMSE e il MAE
kable(metrics_table, caption = "Confronto tra le metriche dei modelli")
| Model | MSE | RMSE | MAE |
|---|---|---|---|
| model1 | 71995.64 | 268.3200 | 208.8612 |
| model2 | 72461.14 | 269.1861 | 209.9016 |
| model3 | 72738.39 | 269.7006 | 210.3216 |
| model4 | 71797.08 | 267.9498 | 209.0188 |
| model5 | 72656.42 | 269.5485 | 210.1906 |
# Residui
residuals <- residuals(model3)
# Valori predetti
fitted_values <- fitted(model3)
plot(model3)
shapiro.test(residuals(model3))
##
## Shapiro-Wilk normality test
##
## data: residuals(model3)
## W = 0.98872, p-value = 3.898e-13
bptest(model3)
##
## studentized Breusch-Pagan test
##
## data: model3
## BP = 9.508, df = 4, p-value = 0.04958
dwtest(model3)
##
## Durbin-Watson test
##
## data: model3
## DW = 1.9568, p-value = 0.1399
## alternative hypothesis: true autocorrelation is greater than 0
Interpretazione dei Risultati:
Shapiro-Wilk Normality Test: W=0.98807,p-value=1.363×10−13, ciò indica che i residui non sono normalmente distribuiti
Breusch-Pagan Test:BP=11.416,df=3,p-value=0.009678, ciò identifica che il modello soffre di eteroschedasticità.
Durbin-Watson Test:DW=1.9717,p-value=0.2393, ciò significa che i residui sono indipendenti
A questo punto è importante identificare i valori influenti che sono outlier. Tali valori sono le osservazioni 155, 1306,1399 e 310. Tali osservazioni richiedono un analisi ad hoc per capire se possono essere ritenuti errori oppure no.
## rstudent unadjusted p-value Bonferroni p
## 155 5.197759 2.1810e-07 0.00054394
## 1306 4.887089 1.0885e-06 0.00271460
## 1399 -4.293281 1.8280e-05 0.04558900
## rstudent unadjusted p-value Bonferroni p
## 155 5.197759 2.1810e-07 0.00054394
## 1306 4.887089 1.0885e-06 0.00271460
## 1399 -4.293281 1.8280e-05 0.04558900
| Anni.madre | N.gravidanze | Fumatrici | Gestazione | Peso | Lunghezza | Cranio | Tipo.parto | Ospedale | Sesso | |
|---|---|---|---|---|---|---|---|---|---|---|
| 155 | 30 | 0 | 0 | 36 | 3610 | 410 | 330 | Nat | osp1 | M |
| 1306 | 23 | 0 | 0 | 41 | 4900 | 510 | 352 | Nat | osp2 | F |
| 1399 | 42 | 2 | 0 | 38 | 2560 | 525 | 349 | Ces | osp2 | M |
Andiamo ora a stimare il peso di una neonata considerando una madre alla terza gravidanza (quindi N.gravidanze=2), non fumatrice, che partorirà alla 39esima settimana
predizione_peso <- predict(model3, dati.test_nenonata)
predizione_peso
## 1
## 3244.867
Il peso stimato per la neonata di una madre non fumatrice alla 39^ settimana secondo il modello 3 è pari a 3,244Kg
Di seguiti mostriamo 3 dei grafici maggiormente rappresentativi. Due mostrano la relazione tra Peso e due tra le variabili maggiormente significative, Lunghezza e gestazione. Il terzo invece mostra la distribuzione del peso neonatale tra madri fumatrici e non fumatrici,lo scopo di quest’ultimo grafico è quello di voler documentare un aspetto che, pur non statisticamente rilevante,ma tenuto in considerazione in ottica di saggiare l’effetto del fumo sulla salute umana. Sarà oggetto di studi separati approfondire la questione.
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
boxplot_fumo_sesso
Questo progetto di analisi statistica ha portato allo sviluppo di un modello predittivo affidabile per stimare il peso dei neonati, identificando i principali fattori che influenzano tale variabile e le loro interazioni. L’analisi ha evidenziato come la durata della gestazione, il sesso del neonato siano i principali determinanti del peso alla nascita, con un modello in grado di spiegare circa il 73% della variabilità osservata. In termini pratici,la previsione del peso della neonata per una madre non fumatrice alla 39^ settimana, secondo il nostro modello di regressione lineare, ha prodotto un risultato di 3,254 kg. Questo peso è all’interno dei range normali per neonati a termine. Il modello ha incluso variabili come la lunghezza, la circonferenza cranica e il numero di gravidanze, tutte rilevanti per la stima del peso. Tuttavia, va sottolineato che altre variabili, non incluse nel modello, potrebbero influenzare il peso della neonata. Per migliorare la precisione delle previsioni, sarebbe utile esplorare ulteriori variabili e testare modelli più complessi.