Questo progetto mira a sviluppare un modello statistico per prevedere il peso dei neonati alla nascita utilizzando variabili cliniche e demografiche raccolte in tre diversi ospedali. L’obiettivo è supportare decisioni cliniche e ottimizzare la gestione delle gravidanze a rischio.
dati <- read.csv("neonati.csv", sep=",", stringsAsFactors = T)
dati <- na.omit(dati)
dati <- dati %>%
select(Peso, everything())
summary(dati)
## Peso Anni.madre N.gravidanze Fumatrici
## Min. : 830 Min. : 0.00 Min. : 0.0000 Min. :0.0000
## 1st Qu.:2990 1st Qu.:25.00 1st Qu.: 0.0000 1st Qu.:0.0000
## Median :3300 Median :28.00 Median : 1.0000 Median :0.0000
## Mean :3284 Mean :28.16 Mean : 0.9812 Mean :0.0416
## 3rd Qu.:3620 3rd Qu.:32.00 3rd Qu.: 1.0000 3rd Qu.:0.0000
## Max. :4930 Max. :46.00 Max. :12.0000 Max. :1.0000
## Gestazione Lunghezza Cranio Tipo.parto Ospedale Sesso
## Min. :25.00 Min. :310.0 Min. :235 Ces: 728 osp1:816 F:1256
## 1st Qu.:38.00 1st Qu.:480.0 1st Qu.:330 Nat:1772 osp2:849 M:1244
## Median :39.00 Median :500.0 Median :340 osp3:835
## Mean :38.98 Mean :494.7 Mean :340
## 3rd Qu.:40.00 3rd Qu.:510.0 3rd Qu.:350
## Max. :43.00 Max. :565.0 Max. :390
head(dati, 5)
## Peso Anni.madre N.gravidanze Fumatrici Gestazione Lunghezza Cranio Tipo.parto
## 1 3380 26 0 0 42 490 325 Nat
## 2 3150 21 2 0 39 490 345 Nat
## 3 3640 34 3 0 38 500 375 Nat
## 4 3690 28 1 0 41 515 365 Nat
## 5 3700 20 0 0 38 480 335 Nat
## Ospedale Sesso
## 1 osp3 M
## 2 osp1 F
## 3 osp2 M
## 4 osp2 M
## 5 osp3 F
n <- nrow(dati)
cat(n)
## 2500
Il dataset contiene 2500 osservazioni totali e le seguenti 10 variabili:
In questa sezione si analizzerà ogni variabile in modo univariato, fornendo una descrizione generale di ciascuna.
# Funzione per analisi descrittiva di una variabile
descrizione_variabile <- function(x, nome) {
stats <- data.frame(
Statistica = c("Minimo", "1° Quartile", "Mediana", "3° Quartile", "Massimo",
"Media", "Deviazione standard", "Asimmetria", "Curtosi"),
Valore = c(round(min(x),2),
round(quantile(x, 0.25),2),
round(median(x),2),
round(quantile(x, 0.75),2),
round(max(x),2),
round(mean(x),2),
round(sd(x),2),
round(skewness(x),2),
round(kurtosis(x)-3,2))
)
kable(stats, caption = paste("Statistiche descrittive per", nome), align = "l")
}
La variabile Peso è di tipo quantitativo continuo e rappresenta il peso dei neonati alla nascita (misurato in grammi).
descrizione_variabile(dati$Peso, "Peso")
| Statistica | Valore |
|---|---|
| Minimo | 830.00 |
| 1° Quartile | 2990.00 |
| Mediana | 3300.00 |
| 3° Quartile | 3620.00 |
| Massimo | 4930.00 |
| Media | 3284.08 |
| Deviazione standard | 525.04 |
| Asimmetria | -0.65 |
| Curtosi | 2.03 |
hist(dati$Peso, main="Distribuzione Peso Neonati", xlab="Peso (g)", col="slategray")
boxplot(dati$Peso, main="Boxplot Peso (g)", col="slategray")
La variabile Peso mostra una leggera asimmetria negativa ed è leptocurtica. L’indice di curtosi positivo indica che la distribuzione è più concentrata intorno alla media rispetto a una distribuzione normale. Dal boxplot si osservano diversi outlier, in particolare valori più bassi.
La variabile Anni.madre è quantitativa continua e rappresenta l’età della madre al momento del parto.
descrizione_variabile(dati$Anni.madre, "Anni madre")
| Statistica | Valore |
|---|---|
| Minimo | 0.00 |
| 1° Quartile | 25.00 |
| Mediana | 28.00 |
| 3° Quartile | 32.00 |
| Massimo | 46.00 |
| Media | 28.16 |
| Deviazione standard | 5.27 |
| Asimmetria | 0.04 |
| Curtosi | 0.38 |
hist(dati$Anni.madre, main="Distribuzione Età Madre", xlab="Età", col="firebrick")
boxplot(dati$Anni.madre, main="Boxplot Età Madre", col="firebrick")
Questa variabile è sostanzialmente simmetrica e leggermente leptocurtica. Si osserva la presenza di pochi outliers. La media è di circa 28 anni, la deviazione standard di 5. L’età delle madri varia mediamente quindi tra i 23 e i 33 anni.
Dal boxplot e dai dati sommari si nota un valore minimo di 0 e controllando il dataset si osserva anche un altro valore anomalo (pari a 1). Questi valori sono sicuramente degli errori.
È una variabile quantitativa discreta che indica il numero di gravidanze già avute dalla madre.
descrizione_variabile(dati$N.gravidanze, "Numero gravidanze")
| Statistica | Valore |
|---|---|
| Minimo | 0.00 |
| 1° Quartile | 0.00 |
| Mediana | 1.00 |
| 3° Quartile | 1.00 |
| Massimo | 12.00 |
| Media | 0.98 |
| Deviazione standard | 1.28 |
| Asimmetria | 2.51 |
| Curtosi | 10.99 |
hist(dati$N.gravidanze, main="Distribuzione Numero Gravidanze", xlab="Numero di gravidanze", col="goldenrod")
boxplot(dati$N.gravidanze, main="Boxplot Età Madre", col="goldenrod")
La mediana è 1 e la media si avvicina anch’essa a 1. Nonostante ciò, la distribuzione presenta una forte asimmetria positiva (coda lunga a destra) ed è nettamente leptocurtica. Questo indica che la maggior parte delle madri ha avuto poche gravidanze, mentre pochi casi presentano un numero elevato di gravidanze.
È una variabile categorica dicotomica (dummy). Per questa variabile, di fatto qualitativa anche se rappresentata con numeri (0 e 1) ha senso calcolare la tabella delle frequenze.
kable(as.data.frame(prop.table(table(dati$Fumatrici))),
col.names = c("Madre fumatrice", "Frequenza relativa"),
digits = 2,
align = "l",
caption = "Frequenze relative delle madri fumatrici")
| Madre fumatrice | Frequenza relativa |
|---|---|
| 0 | 0.96 |
| 1 | 0.04 |
barplot(table(dati$Fumatrici),
names.arg = c("Non fumatrice","Fumatrice"),
col = c("lightblue","salmon"),
main = "Madri fumatrici")
La maggior parte delle madri del campione in oggetto non è fumatrice (quasi il 96%).
È una variabile quantitativa continua che indica il numero di settimane di gestazione.
descrizione_variabile(dati$Gestazione, "Gestazione")
| Statistica | Valore |
|---|---|
| Minimo | 25.00 |
| 1° Quartile | 38.00 |
| Mediana | 39.00 |
| 3° Quartile | 40.00 |
| Massimo | 43.00 |
| Media | 38.98 |
| Deviazione standard | 1.87 |
| Asimmetria | -2.07 |
| Curtosi | 8.26 |
hist(dati$Gestazione, main="Gestazione", xlab="Gestazione (settimane)", col="mediumseagreen")
boxplot(dati$Gestazione, main="Gestazione", col="mediumseagreen")
La gestazione media è di 39 settimane, si osserva però una netta asimmetria negativa e una distribuzione decisamente leptocurtica. L’asimmetria negativa indica la presenza di alcune gestazioni più brevi rispetto alla media, che generano una coda sinistra della distribuzione.
È quantitativa continua e misura la lunghezza del neonato alla nascita (in millimetri).
descrizione_variabile(dati$Lunghezza, "Lunghezza")
| Statistica | Valore |
|---|---|
| Minimo | 310.00 |
| 1° Quartile | 480.00 |
| Mediana | 500.00 |
| 3° Quartile | 510.00 |
| Massimo | 565.00 |
| Media | 494.69 |
| Deviazione standard | 26.32 |
| Asimmetria | -1.51 |
| Curtosi | 6.49 |
hist(dati$Lunghezza, main="Lunghezza", xlab="Lunghezza (mm)", col="steelblue")
boxplot(dati$Lunghezza, main="Lunghezza (mm)", col="steelblue")
La media della lunghezza dei neonati è di quasi 495 mm. La distribuzione è negativamente asimmetrica e l’indice di curtosi indica una distribuzione leptocurtica.
È anche questa una variabile quantitiativa continua, misurata in millimetri, che indica la lunghezza del diametro del cranio del neonato.
descrizione_variabile(dati$Cranio, "Cranio")
| Statistica | Valore |
|---|---|
| Minimo | 235.00 |
| 1° Quartile | 330.00 |
| Mediana | 340.00 |
| 3° Quartile | 350.00 |
| Massimo | 390.00 |
| Media | 340.03 |
| Deviazione standard | 16.43 |
| Asimmetria | -0.79 |
| Curtosi | 2.95 |
hist(dati$Cranio, main="Diametro del Cranio", xlab="Diametro (mm)", col="darkorange")
boxplot(dati$Cranio, main="Diametro del Cranio", col="darkorange")
Anche quesa distribuzione è asimmetrica (negativa) seppur più vicino alla simmetria rispetto alle altre distribuzioni. L’indice di curtosi è nuovamente positivo indicando una distribuzione leptocurtica.
Questa è una variabile qualitativa nominale (non ordinabile) e indica le due tipologie di parto: cesareo e naturale.
kable(as.data.frame(prop.table(table(dati$Tipo.parto))),
col.names = c("Tipo di parto", "Frequenza relativa"),
digits = 2,
align = "l",
caption = "Frequenze relative del tipo di parto")
| Tipo di parto | Frequenza relativa |
|---|---|
| Ces | 0.29 |
| Nat | 0.71 |
barplot(table(dati$Tipo.parto),
names.arg = c("Cesareo","Naturale"),
col = c("lightblue","lightgreen"),
main = "Tipologia di parto")
Dai dati si può osservare che più del 70% dei parti è di tipo naturale.
È una variabile qualitativa nominale che riassume i tre diversi ospedali in cui sono avvenuti i 2500 parti oggetto del dataset.
kable(as.data.frame(prop.table(table(dati$Ospedale))),
col.names = c("Ospedale", "Frequenza relativa"),
digits = 2,
align = "l",
caption = "Frequenze relative degli ospedali")
| Ospedale | Frequenza relativa |
|---|---|
| osp1 | 0.33 |
| osp2 | 0.34 |
| osp3 | 0.33 |
barplot(table(dati$Ospedale),
names.arg = c("Ospedale 1","Ospedale 2","Ospedale 3"),
col = c("pink","pink1","pink2"),
main = "Distribuzione per ospedale")
# Funzione per il calcolo dell'indice di eterogeneità di Gini
gini.index <- function(x){
ni <- table(x)
fi <- ni / length(x)
fi2 <- fi^2
J <- length(ni)
gini <- 1 - sum(fi2)
gini.normalizzato <- gini / ((J - 1) / J)
return(gini.normalizzato)
}
# Indice normalizzato di Gini
gini_ospedale <- gini.index(dati$Ospedale)
cat(gini_ospedale)
## 0.9998683
L’indice di Gini normalizzato vicinissimo a 1 indica quasi la massima eterogeneità possibile,con le tre diverse modalità equamente rappresentate dal campione (circa il 33% ciascuna).
È qualitativa nominale, indica il sesso dei neonati.
kable(as.data.frame(prop.table(table(dati$Sesso))),
col.names = c("Sesso", "Frequenza relativa"),
digits = 4,
align = "l",
caption = "Frequenze relative del genere")
| Sesso | Frequenza relativa |
|---|---|
| F | 0.5024 |
| M | 0.4976 |
barplot(table(dati$Sesso),
names.arg = c("Femmina", "Maschio"),
col = c("pink", "lightblue"),
main = "Distribuzione per genere")
Il dataset contiene un numero di neonati femmina appena superiore a quelli maschi (il 50,24% del campione è di sesso femminile).
Per analizzare la relazione tra ospedale e tipo di parto, si crea prima la tabella delle frequenze per le due variabili categoriche:
tabella <- table(dati$Ospedale, dati$Tipo.parto)
kable(tabella,
digits = 2,
align = "l",
caption = "Frequenze assolute tra ospedale e tipo di parto")
| Ces | Nat | |
|---|---|---|
| osp1 | 242 | 574 |
| osp2 | 254 | 595 |
| osp3 | 232 | 603 |
tabella_rel <- prop.table(tabella)
kable(tabella_rel,
digits = 2,
align = "l",
caption = "Frequenze relative tra ospedale e tipo di parto")
| Ces | Nat | |
|---|---|---|
| osp1 | 0.10 | 0.23 |
| osp2 | 0.10 | 0.24 |
| osp3 | 0.09 | 0.24 |
ggpubr::ggballoonplot(data=as.data.frame(tabella),
fill="blue")
Dato che entrambe le variabili sono categoriche, si effettua un test Chi-quadro per verificare l’indipendenza.
test.indipendenza <- chisq.test(tabella)
test.indipendenza
##
## Pearson's Chi-squared test
##
## data: tabella
## X-squared = 1.0972, df = 2, p-value = 0.5778
Il test restituisce un p-value di 0.58, quindi non si rifiuta l’ipotesi nulla di indipendenza tra ospedale e tipo di parto. Non emergono evidenze statistiche che la frequenza dei parti cesarei differisca tra i tre ospedali.
Per confrontare il campione con valori di riferimento della popolazione, sono stati utilizzati gli standard di crescita dell’Organizzazione Mondiale della Sanità (OMS/WHO), che separa però i dati tra i due generi. I valori sono consultabili ai seguenti link:
Dato che il campione in analisi comprende sia maschi che femmine, è stata calcolata la media delle mediane maschile e femminile (per peso e lunghezza) dalle tabelle di riferimento dell’OMS allegate. Convertendo i valori nelle stesse unità del dataset, si è ottenuto:
Questi valori sono stati utilizzati come riferimento per i t-test sul peso e sulla lunghezza dei neonati.
# Calcolo della media dei pesi di riferimento
peso_medio_M <- 3.3464*1000 # g maschi
peso_medio_F <- 3.2322*1000 # g femmine
peso_medio <- round((peso_medio_M + peso_medio_F)/2)
cat(peso_medio)
## 3289
# t-test sul peso rispetto alla media di riferimento
t.test(dati$Peso,
mu = peso_medio,
conf.level = 0.95,
alternative = "two.sided")
##
## One Sample t-test
##
## data: dati$Peso
## t = -0.46846, df = 2499, p-value = 0.6395
## alternative hypothesis: true mean is not equal to 3289
## 95 percent confidence interval:
## 3263.490 3304.672
## sample estimates:
## mean of x
## 3284.081
Con un p-value di 0.64, non si rifiuta l’ipotesi nulla: il peso medio dei neonati del campione non è significativamente diverso dalla media della popolazione.
# Calcolo della media delle lunghezze di riferimento
lunghezza_media_M <- 49.8842*10 # mm maschi
lunghezza_media_F <- 49.1477*10 # mm femmine
lunghezza_media <- round((lunghezza_media_M + lunghezza_media_F)/2)
cat(lunghezza_media)
## 495
# t-test sulla lunghezza rispetto alla media di riferimento
t.test(dati$Lunghezza,
mu = lunghezza_media,
conf.level = 0.95,
alternative = "two.sided")
##
## One Sample t-test
##
## data: dati$Lunghezza
## t = -0.58514, df = 2499, p-value = 0.5585
## alternative hypothesis: true mean is not equal to 495
## 95 percent confidence interval:
## 493.6598 495.7242
## sample estimates:
## mean of x
## 494.692
Con un p-value di 0.56, non si rifiuta l’ipotesi nulla: il campione non si discosta significativamente dalla popolazione nemmeno per quanto riguarda la lunghezza media alla nascita.
Si effettua un t-test tra due campioni indipendenti all’interno del campione di riferimento, partendo dal Peso.
boxplot(dati$Peso~dati$Sesso, main = "Peso condizionato al genere", xlab = "Sesso", ylab = "Peso (g)")
t.test(dati$Peso~dati$Sesso, data=dati)
##
## Welch Two Sample t-test
##
## data: dati$Peso by dati$Sesso
## t = -12.106, df = 2490.7, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
## -287.1051 -207.0615
## sample estimates:
## mean in group F mean in group M
## 3161.132 3408.215
Il t-test della variabile Peso condizionata al Sesso del neonato restituisce un p-value pari a zero e un intervallo di confidenza che non contiene 0, indicando di accettare l’ipotesi alternativa H1: la media del Peso tra i due generi è sensibilmente diversa.
Si procede analizzando la Lunghezza condizionata al genere.
boxplot(dati$Lunghezza~dati$Sesso, main = "Lunghezza condizionata al genere", xlab = "Sesso", ylab = "Lunghezza (mm)")
t.test(dati$Lunghezza~dati$Sesso, data=dati)
##
## Welch Two Sample t-test
##
## data: dati$Lunghezza by dati$Sesso
## t = -9.582, df = 2459.3, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
## -11.929470 -7.876273
## sample estimates:
## mean in group F mean in group M
## 489.7643 499.6672
Anche in questo caso si arriva alla stessa conclusione: il p-value nullo impone di rifiutare l’ipotesi nulla di uguaglianza delle medie della Lunghezza tra i due generi.
Infine, si studia la variabile Cranio.
boxplot(dati$Cranio~dati$Sesso, main = "Diametro del cranio condizionato al genere", xlab = "Sesso", ylab = "Diametro (mm)")
t.test(dati$Cranio~dati$Sesso, data=dati)
##
## Welch Two Sample t-test
##
## data: dati$Cranio by dati$Sesso
## t = -7.4102, df = 2491.4, p-value = 1.718e-13
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
## -6.089912 -3.541270
## sample estimates:
## mean in group F mean in group M
## 337.6330 342.4486
Il p-value molto basso indica che la differenza tra maschio e femmina è statisticamente significativa anche per quanto riguarda la misura del diametro del cranio con quasi 5 mm di differenza tra i due sessi.
In questo modello lineare la variabile risposta è il peso. Si effettua preeliminarmente un test di normalità sulla variabile risposta.
shapiro.test(dati$Peso)
##
## Shapiro-Wilk normality test
##
## data: dati$Peso
## W = 0.97066, p-value < 2.2e-16
Il test dà esito negativo, nel senso che la variabile Peso non si dispone normalmente. Come si è visto nella sezione sull’analisi descrittiva, questo probabilmente avviene a causa della lunga coda a sinistra mostrata dalla distribuzione della variabile, osservabile dal suo istogramma e legata all’asimmetria negativa. È probabile che questo abbia degli effetti sulla normalità dei residui.
Tramite la seguente funzione si indagano le corelazioni lineari tra le variabili.
panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor, ...)
{
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(missing(cex.cor)) cex.cor <- 1.4
text(0.5, 0.5, txt, cex = cex.cor * r)
}
pairs(dati,upper.panel = panel.smooth, lower.panel = panel.cor)
Dalla tabella che mette in relazione le variabili, che mostra sia il coefficiente di correlazione di Pearson sia gli scatterplot, si evidenzia una correlazione significativa della variabile risposta Peso con le variabili Lunghezza (0.80), Cranio (0.70) e Gestazione (0.59). Non sembra invece significativa la relazione con le altre variabili quantitative Anni.madre e N.gravidanze.
Inoltre, la variabile Lunghezza sembra correlata in maniera moderata con Gestazione (0.62) e Cranio (0.60).
Per capire meglio l’eventuale correlazione di Peso con le variabili categoriche, si analizzano i relativi boxplot rispetto a Ospedale, Tipo.parto e Fumatrici.
La correlazione con il genere è già stata evidenziata ed è risultata significativa. Quindi Sesso sarà una variabile esplicativa importante da considerare nel modello lineare, quantomeno come variabile di controllo.
boxplot(dati$Peso~dati$Tipo.parto, main = "Peso condizionato al tipo di parto", xlab = "Tipo di parto", ylab = "Peso (g)")
t.test(dati$Peso~dati$Tipo.parto)
##
## Welch Two Sample t-test
##
## data: dati$Peso by dati$Tipo.parto
## t = -0.12968, df = 1493, p-value = 0.8968
## alternative hypothesis: true difference in means between group Ces and group Nat is not equal to 0
## 95 percent confidence interval:
## -46.27992 40.54037
## sample estimates:
## mean in group Ces mean in group Nat
## 3282.047 3284.916
Al contrario, Tipo.parto (cesareo o naturale) non influisce sensibilmente sul Peso del neonato. Il test restituisce un p-value pari a 0.90, quindi non si rifiuta l’ipotesi nulla di uguaglianza tra le medie nei due casi. La differenza tra le medie delle due modalità di Tipo.parto non è quindi significativamente diversa da zero. Questa variabile potrà essere rimossa dal modello lineare.
In questo caso vanno eseguiti confronti multipli, essendo gli ospedali tre.
boxplot(dati$Peso~dati$Ospedale, main = "Peso condizionato all'ospedale", xlab = "Ospedale", ylab = "Peso (g)")
pairwise.t.test(dati$Peso, dati$Ospedale,
paired = F, # dati indipendenti
p.adjust.method = "bonferroni")
##
## Pairwise comparisons using t tests with pooled SD
##
## data: dati$Peso and dati$Ospedale
##
## osp1 osp2
## osp2 1.00 -
## osp3 0.33 0.33
##
## P value adjustment method: bonferroni
I p-value dei confronti multipli sono tutti superiori al livello di significatività del 5%, quindi non emergono differenze statisticamente significative tra i pesi medi dei neonati nei tre livelli della variabile Ospedale.
Anche questa variabile potrà quindi essere ignorata nel modello lineare.
boxplot(dati$Peso~dati$Fumatrici, main = "Peso condizionato a Fumatrici", xlab = "Madre fumatrice", ylab = "Peso (g)")
t.test(dati$Peso~dati$Fumatrici)
##
## Welch Two Sample t-test
##
## data: dati$Peso by dati$Fumatrici
## t = 1.034, df = 114.1, p-value = 0.3033
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -45.61354 145.22674
## sample estimates:
## mean in group 0 mean in group 1
## 3286.153 3236.346
Con un p-value pari a 0.30 non si rifiuta l’ipotesi nulla di uguaglianza tra le medie del peso dei neonati rispetto alla variabile Fumatrici.
In questo campione, quindi, non emerge un effetto statisticamente significativo del fumo materno sul peso alla nascita.
Sono entrambe variaibili quantitative, quindi si procede con la correlazione lineare.
mod_lin <- lm(Peso ~ Gestazione, data=dati)
summary(mod_lin)
##
## Call:
## lm(formula = Peso ~ Gestazione, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1603.61 -287.34 -11.07 280.46 1897.75
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3197.250 176.851 -18.08 <2e-16 ***
## Gestazione 166.272 4.532 36.69 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 423.3 on 2498 degrees of freedom
## Multiple R-squared: 0.3502, Adjusted R-squared: 0.3499
## F-statistic: 1346 on 1 and 2498 DF, p-value: < 2.2e-16
plot(dati$Gestazione, dati$Peso,
xlab = "Settimane di gestazione",
ylab = "Peso (g)",
main = "Peso vs Gestazione",
pch = 20, col = "steelblue")
abline(mod_lin, col="red", lwd=2)
Lo scatterplot mette in relazione le due variabili Peso e Gestazione. Il valore di \(\beta_1\) pari a 166 rappresenta il coefficiente angolare della retta di regressione: ciò significa che, in media, per ogni settimana aggiuntiva di gestazione il peso medio dei neonati aumenta di circa 166 grammi.
Si parte, comunque, inserendo tutte le variabili esplicative nel modello, che verranno eliminate progressivamente nei successivi modelli in base alle analisi fin qui svolte. Si utilizza quindi la procedura stepwise.
mod1 <- lm(Peso ~ ., data=dati)
summary(mod1)
##
## Call:
## lm(formula = Peso ~ ., data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1124.40 -181.66 -14.42 160.91 2611.89
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6738.4762 141.3087 -47.686 < 2e-16 ***
## Anni.madre 0.8921 1.1323 0.788 0.4308
## N.gravidanze 11.2665 4.6608 2.417 0.0157 *
## Fumatrici -30.1631 27.5386 -1.095 0.2735
## Gestazione 32.5696 3.8187 8.529 < 2e-16 ***
## Lunghezza 10.2945 0.3007 34.236 < 2e-16 ***
## Cranio 10.4707 0.4260 24.578 < 2e-16 ***
## Tipo.partoNat 29.5254 12.0844 2.443 0.0146 *
## Ospedaleosp2 -11.2095 13.4379 -0.834 0.4043
## Ospedaleosp3 28.0958 13.4957 2.082 0.0375 *
## SessoM 77.5409 11.1776 6.937 5.08e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 273.9 on 2489 degrees of freedom
## Multiple R-squared: 0.7289, Adjusted R-squared: 0.7278
## F-statistic: 669.2 on 10 and 2489 DF, p-value: < 2.2e-16
Si nota un Adjusted \(R^2\) del modello 1 pari a 0.7278 e una forte relazione con le variabili Gestazione, Lunghezza, Cranio e Sesso. In particolare, a parità delle altre variabili, un neonato maschio pesa in media circa 77 grammi in più rispetto a una femmina.
Emerge inoltre una significatività più debole per N.gravidanze, Tipo.partoNat (con circa 29 grammi di differenza rispetto al parto cesareo) e Ospedale3.
Non si osserva invece una relazione statisticamente significativa con Anni.madre e Fumatrici.
Come anticipato, si decide quindi di eliminare le due variabili qualitative Ospedale e Tipo.parto, ritenute poco informative sulla base dell’analisi precedente.
mod2 <- update(mod1, ~.-Ospedale - Tipo.parto)
summary(mod2)
##
## Call:
## lm(formula = Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione +
## Lunghezza + Cranio + Sesso, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1161.56 -181.19 -15.75 163.70 2630.75
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6714.4109 141.1515 -47.569 < 2e-16 ***
## Anni.madre 0.9585 1.1347 0.845 0.3984
## N.gravidanze 11.2756 4.6690 2.415 0.0158 *
## Fumatrici -30.2959 27.5971 -1.098 0.2724
## Gestazione 32.9331 3.8267 8.606 < 2e-16 ***
## Lunghezza 10.2342 0.3009 34.009 < 2e-16 ***
## Cranio 10.5177 0.4268 24.642 < 2e-16 ***
## SessoM 78.0845 11.2039 6.969 4.06e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.6 on 2492 degrees of freedom
## Multiple R-squared: 0.7272, Adjusted R-squared: 0.7264
## F-statistic: 949 on 7 and 2492 DF, p-value: < 2.2e-16
anova(mod2, mod1)
## Analysis of Variance Table
##
## Model 1: Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza +
## Cranio + Sesso
## Model 2: Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza +
## Cranio + Tipo.parto + Ospedale + Sesso
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2492 187919851
## 2 2489 186762521 3 1157330 5.1413 0.00152 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
BIC(mod2,mod1)
## df BIC
## mod2 9 35233.81
## mod1 12 35241.84
Il modello 2 ha un valore di Adjusted \(R^2\) pari a 0.7264, quindi inferiore di meno di due millesimi rispetto al modello 1, e presenta inoltre un BIC migliore.
Dal confronto tramite ANOVA risulta che l’inclusione delle variabili Tipo.parto e Ospedale migliora significativamente il modello (\(p = 0.0015\)). In particolare Tipo.parto risulta debolmente significativo, così come uno dei livelli della variabile Ospedale (osp3), mentre osp2 non risulta significativo.
Tuttavia il modello completo introduce 3 gradi di libertà aggiuntivi e l’incremento di Adjusted \(R^2\) è trascurabile (0.0014). Per principio di parsimonia si preferisce quindi continuare con il modello ridotto.
Si procede quindi con l’eliminazione della variabile Anni.madre.
mod3 <- update(mod2, ~.-Anni.madre)
summary(mod3)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza +
## Cranio + Sesso, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1150.3 -181.3 -15.7 163.0 2636.3
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6681.6714 135.7178 -49.232 < 2e-16 ***
## N.gravidanze 12.7185 4.3450 2.927 0.00345 **
## Fumatrici -30.4634 27.5948 -1.104 0.26972
## Gestazione 32.5914 3.8051 8.565 < 2e-16 ***
## Lunghezza 10.2341 0.3009 34.011 < 2e-16 ***
## Cranio 10.5359 0.4262 24.718 < 2e-16 ***
## SessoM 78.1713 11.2028 6.978 3.83e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.6 on 2493 degrees of freedom
## Multiple R-squared: 0.7271, Adjusted R-squared: 0.7265
## F-statistic: 1107 on 6 and 2493 DF, p-value: < 2.2e-16
anova(mod3, mod2)
## Analysis of Variance Table
##
## Model 1: Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio +
## Sesso
## Model 2: Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza +
## Cranio + Sesso
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2493 187973654
## 2 2492 187919851 1 53803 0.7135 0.3984
BIC(mod3, mod2)
## df BIC
## mod3 8 35226.70
## mod2 9 35233.81
L’Adjusted \(R^2\) ora vale 0.7265, sostanzialmente identico al modello 2. L’ANOVA mostra che la rimozione della variabile Anni.madre non modifica significativamente il modello lineare, mentre il BIC migliora leggermente. Si preferisce quindi proseguire con il modello 3 e si procede all’eliminazione della variabile Fumatrici.
mod4 <- update(mod3, ~.-Fumatrici)
summary(mod4)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1149.44 -180.81 -15.58 163.64 2639.72
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6681.1445 135.7229 -49.226 < 2e-16 ***
## N.gravidanze 12.4750 4.3396 2.875 0.00408 **
## Gestazione 32.3321 3.7980 8.513 < 2e-16 ***
## Lunghezza 10.2486 0.3006 34.090 < 2e-16 ***
## Cranio 10.5402 0.4262 24.728 < 2e-16 ***
## SessoM 77.9927 11.2021 6.962 4.26e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.6 on 2494 degrees of freedom
## Multiple R-squared: 0.727, Adjusted R-squared: 0.7265
## F-statistic: 1328 on 5 and 2494 DF, p-value: < 2.2e-16
anova(mod4, mod3)
## Analysis of Variance Table
##
## Model 1: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso
## Model 2: Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio +
## Sesso
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2494 188065546
## 2 2493 187973654 1 91892 1.2187 0.2697
BIC(mod4, mod3)
## df BIC
## mod4 7 35220.1
## mod3 8 35226.7
Anche per questo modello, il valore di Adjusted \(R^2\) rimane sostanzialmente costante rispetto al precedente (0.7265). L’ANOVA conferma la non significatività del parametro (p-value = 0.27) e il BIC migliora ulteriormente. La variabile Fumatrici, così come Anni.madre, non risulta statisticamente significativa.
Durante la selezione del modello, alcune variabili poco informative (Anni della madre, Fumatrici, Tipo parto e Ospedale) sono quindi state eliminate seguendo i criteri di parsimonia e BIC. Questa riduzione ha rafforzato l’effetto stimato di N.gravidanze, che ora risulta più significativo.
Si prova a eliminare la variabile N.gravidanze.
mod5 <- update(mod4, ~.-N.gravidanze)
summary(mod5)
##
## Call:
## lm(formula = Peso ~ Gestazione + Lunghezza + Cranio + Sesso,
## data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1138.2 -184.3 -17.6 163.3 2627.3
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6651.1188 135.5172 -49.080 < 2e-16 ***
## Gestazione 31.2737 3.7856 8.261 2.31e-16 ***
## Lunghezza 10.2054 0.3007 33.939 < 2e-16 ***
## Cranio 10.6704 0.4245 25.139 < 2e-16 ***
## SessoM 79.1049 11.2117 7.056 2.22e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 275 on 2495 degrees of freedom
## Multiple R-squared: 0.7261, Adjusted R-squared: 0.7257
## F-statistic: 1654 on 4 and 2495 DF, p-value: < 2.2e-16
anova(mod5, mod4)
## Analysis of Variance Table
##
## Model 1: Peso ~ Gestazione + Lunghezza + Cranio + Sesso
## Model 2: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2495 188688687
## 2 2494 188065546 1 623141 8.2637 0.004079 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
BIC(mod5, mod4)
## df BIC
## mod5 6 35220.54
## mod4 7 35220.10
Eliminando N.gravidanze, il valore di Adjusted \(R^2\) rimane sostanzialmente costante, ma il BIC peggiora leggermente, quindi non è giustificata la rimozione di questa variabile. Si mantiene il modello 4.
Dagli scatterplot sembrava emergere un effetto non lineare tra Peso e Gestazione. Per verificarlo, si aggiunge una dipendenza quadratica della Gestazione nel modello.
mod6 <- update(mod4, ~.+I(Gestazione^2))
summary(mod6)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso + I(Gestazione^2), data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1144.11 -181.17 -13.16 165.73 2662.56
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4650.2268 898.1706 -5.177 2.43e-07 ***
## N.gravidanze 12.5660 4.3361 2.898 0.00379 **
## Gestazione -81.0486 49.7127 -1.630 0.10316
## Lunghezza 10.3534 0.3039 34.074 < 2e-16 ***
## Cranio 10.6363 0.4280 24.854 < 2e-16 ***
## SessoM 75.7900 11.2340 6.747 1.88e-11 ***
## I(Gestazione^2) 1.5136 0.6617 2.287 0.02226 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.4 on 2493 degrees of freedom
## Multiple R-squared: 0.7276, Adjusted R-squared: 0.7269
## F-statistic: 1110 on 6 and 2493 DF, p-value: < 2.2e-16
anova(mod4, mod6)
## Analysis of Variance Table
##
## Model 1: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso
## Model 2: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso +
## I(Gestazione^2)
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2494 188065546
## 2 2493 187671672 1 393875 5.2322 0.02226 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
BIC(mod6, mod4)
## df BIC
## mod6 8 35222.68
## mod4 7 35220.10
L’Adjusted \(R^2\) vale ora 0.7269, migliorando di poco, e anche il BIC aumenta leggermente, dimostrando che l’effetto curvilineo è debole. Si decide quindi di ignorare l’effetto quadratico per mantenere un modello più semplice e parsimonioso.
Data la moderata correlazione tra Lunghezza e Cranio, si verifica se esiste un effetto interattivo tra le due variabili esplicative sul Peso. Questo permette di testare se l’effetto della Lunghezza sul risultato dipende dal valore di Cranio (o viceversa), cioè se esiste un effetto moltiplicativo tra le due variabili.
mod7 <- update(mod4, ~.+Lunghezza:Cranio)
summary(mod7)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso + Lunghezza:Cranio, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1150.74 -180.48 -13.62 165.82 2866.17
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.801e+03 1.018e+03 -1.770 0.07685 .
## N.gravidanze 1.295e+01 4.321e+00 2.996 0.00276 **
## Gestazione 3.810e+01 3.964e+00 9.610 < 2e-16 ***
## Lunghezza -3.047e-01 2.202e+00 -0.138 0.88996
## Cranio -4.759e+00 3.191e+00 -1.491 0.13601
## SessoM 7.327e+01 1.119e+01 6.545 7.20e-11 ***
## Lunghezza:Cranio 3.158e-02 6.528e-03 4.838 1.39e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 273.4 on 2493 degrees of freedom
## Multiple R-squared: 0.7295, Adjusted R-squared: 0.7289
## F-statistic: 1121 on 6 and 2493 DF, p-value: < 2.2e-16
BIC(mod7, mod4)
## df BIC
## mod7 8 35204.57
## mod4 7 35220.10
anova(mod7, mod4)
## Analysis of Variance Table
##
## Model 1: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso +
## Lunghezza:Cranio
## Model 2: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2493 186316621
## 2 2494 188065546 -1 -1748926 23.401 1.395e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
L’effetto combinato di Lunghezza e Cranio sul Peso non è semplicemente additivo. Neonati più lunghi con cranio più grande hanno un peso maggiore di quanto ci si aspetterebbe sommando gli effetti singoli. Questo giustifica l’inclusione dell’interazione tra le due variabili nel modello.
Intuendo però una dipendenza della Lunghezza dalla Gestazione, si verifica se l’effetto combinato di questa interazione sia superiore a quella appena osservata.
mod8 <- update(mod4, ~.+Gestazione:Lunghezza)
summary(mod8)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso + Gestazione:Lunghezza, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1133.50 -179.45 -11.74 168.77 2653.34
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.991e+03 9.202e+02 -2.163 0.030619 *
## N.gravidanze 1.304e+01 4.319e+00 3.020 0.002551 **
## Gestazione -9.396e+01 2.480e+01 -3.789 0.000155 ***
## Lunghezza -8.111e-02 2.027e+00 -0.040 0.968082
## Cranio 1.076e+01 4.262e-01 25.245 < 2e-16 ***
## SessoM 7.228e+01 1.120e+01 6.454 1.31e-10 ***
## Gestazione:Lunghezza 2.729e-01 5.295e-02 5.153 2.76e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 273.2 on 2493 degrees of freedom
## Multiple R-squared: 0.7299, Adjusted R-squared: 0.7292
## F-statistic: 1123 on 6 and 2493 DF, p-value: < 2.2e-16
anova(mod8, mod4)
## Analysis of Variance Table
##
## Model 1: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso +
## Gestazione:Lunghezza
## Model 2: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2493 186083565
## 2 2494 188065546 -1 -1981981 26.553 2.765e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
L’Adjusted \(R^2\) vale 0.7292 (il modello spiega quasi il 73% della variabilità) e l’ANOVA conferma la significatività dell’interazione. L’effetto combinato di Gestazione e Lunghezza è più forte e più significativo.
BIC(mod1, mod2, mod3, mod4, mod5, mod6, mod7, mod8)
## df BIC
## mod1 12 35241.84
## mod2 9 35233.81
## mod3 8 35226.70
## mod4 7 35220.10
## mod5 6 35220.54
## mod6 8 35222.68
## mod7 8 35204.57
## mod8 8 35201.44
Il confronto multiplo BIC tra tutti i modelli fa preferire l’ultimo, il modello 8, che ha un migliore Adjusted \(R^2\) rispetto al modello 7 e il valor BIC migliore tra tutti.
Si verifica, infine, se ci sono problemi di multicollinearità nei modelli.
vif(mod4)
## N.gravidanze Gestazione Lunghezza Cranio Sesso
## 1.023475 1.669189 2.074689 1.624465 1.040054
vif(mod8)
## N.gravidanze Gestazione Lunghezza
## 1.024145 71.896088 95.264171
## Cranio Sesso Gestazione:Lunghezza
## 1.640863 1.050345 262.766336
Nel modello finale (mod8) le variabili Gestazione e Lunghezza (e la loro interazione) mostrano una multicollinearità elevata (VIF molto alti) proprio a causa della presenza dell’inserimento del fattore di interazione. Le altre variabili hanno valori inferiori a 5.
Nel modello senza interazioni (mod4), invece, non si osservano problemi di multicollinearità, con tutti i VIF minori di 5.
Si decide, comunque, di utilizzare mod8 sia per il miglior Adjusted \(R^2\), sia per il BIC più parsimonioso.
Scelto il modello 8 si procede alla previsione del peso di una neonata noti il sesso (femmina), una madre alla terza gravidanza e una gestazione di 39 settimane. Dato che il modello scelto prevede anche la dipendenza dalle variabili Lunghezza e Cranio si inserisce la media femminile.
cat(round(predict(mod8, newdata = data.frame(
N.gravidanze = 2,
Gestazione = 39,
Lunghezza = mean(dati$Lunghezza[dati$Sesso=="F"]),
Cranio = mean(dati$Cranio[dati$Sesso=="F"]),
Sesso = "F"))))
## 3176
Il modello stima che il peso della neonata sarà di 3176 grammi.
I residui devono rispettare criteri di normalità, omoschedasticità, incorrelazione e media di zero.
par(mfrow=c(2,2))
plot(mod8)
Nel primo grafico i residui dovrebbero essere sparsi casualmente attorno a zero e sembrano esserlo. Nel secondo, i residui confrontati con i quantili di una normale seguono la bisettrice, con una netta eccezione come l’osservazione 1551 e qualche valore iniziale e finale (meno evidenti). Nel terzo grafico la dispersione dei residui permette di valutare se la varianza è costante. Nell’ultimo grafico, alcuni punti presentano valori di leverage elevati: valori sopra 0.5 indicano avvertimento, sopra 1 rappresentano allarme. Sempre l’osservazione 1551 sembra dare problemi.
I valori di leva (leverage) misurano quanto un’osservazione è distante dalle altre nello spazio delle variabili esplicative. Un leverage elevato indica che l’osservazione possiede combinazioni di valori delle variabili indipendenti relativamente rare nel campione e potrebbe quindi avere una maggiore capacità di influenzare la stima dei coefficienti del modello.
Utilizzando la soglia teorica è possibile individuare le osservazioni potenzialmente influenti. Dal grafico emerge che solo un numero limitato di punti supera tale soglia.
lev <- hatvalues(mod8)
plot(lev)
p = sum(lev)
soglia = 2*p/n
abline(h=soglia, col=2)
cat(sum(lev > soglia))
## 125
125 osservazioni su 2500 osservazioni totali superano la soglia di leverage. Tuttavia, la presenza di valori di leva elevati non implica necessariamente che l’osservazione sia problematica: è necessario verificare anche il loro impatto effettivo sulle stime del modello attraverso altre misure di influenza, come la distanza di Cook.
Gli outliers nei residui rappresentano osservazioni per le quali il valore osservato della variabile risposta si discosta in modo rilevante da quello previsto dal modello. In genere, valori dei residui studentizzati superiori a 2 in valore assoluto indicano potenziali anomalie.
plot(rstudent(mod8))
abline(h=c(-2,2), col=2)
outlierTest(mod8)
## rstudent unadjusted p-value Bonferroni p
## 1551 10.160278 8.6136e-24 2.1534e-20
## 155 5.042472 4.9259e-07 1.2315e-03
## 1306 4.751668 2.1321e-06 5.3303e-03
Nel modello analizzato emergono solo poche osservazioni che superano queste soglie, indicando che la maggior parte dei dati è ben spiegata dalla relazione lineare stimata. L’outlierTest conferma la presenza di un numero molto limitato di osservazioni anomale (precisamente 3).
In un dataset di dimensioni relativamente grandi come quello analizzato (2500 osservazioni), la presenza di pochi outliers è fisiologica e non rappresenta necessariamente un problema per la stabilità del modello.
Per valutare l’influenza delle singole osservazioni sulle stime del modello di regressione si utilizza la distanza di Cook, una misura che combina l’informazione proveniente dai residui e dai valori di leva.
cook<-cooks.distance(mod8)
plot(cook)
abline(h=0.5, col=2)
cat(max(cook))
## 0.7277768
Una regola empirica comunemente utilizzata considera potenzialmente influenti le osservazioni con distanza di Cook superiore a 0.5, mentre valori superiori a 1 indicano casi fortemente influenti. Nel modello analizzato si osserva un solo punto con valore relativamente elevato (0.73), ma comunque inferiore alla soglia critica pari a 1 (sempre l’osservazione 1551).
Infine si valutano i residui del modello tramite tre test classici: il Breusch-Pagan per l’omoschedasticità, il Durbin-Watson per l’autocorrelazione e il Shapiro-Wilk per la normalità.
bptest(mod8)
##
## studentized Breusch-Pagan test
##
## data: mod8
## BP = 90.217, df = 6, p-value < 2.2e-16
dwtest(mod8)
##
## Durbin-Watson test
##
## data: mod8
## DW = 1.9529, p-value = 0.1192
## alternative hypothesis: true autocorrelation is greater than 0
shapiro.test(residuals(mod8))
##
## Shapiro-Wilk normality test
##
## data: residuals(mod8)
## W = 0.97344, p-value < 2.2e-16
plot(density(residuals(mod8)))
Dai risultati emerge che la varianza dei residui non è costante (caso di eteroschedasticità), i residui non mostrano autocorrelazione, ma la loro distribuzione non è perfettamente normale, con una coda destra più lunga Si rifiutano dunque le ipotesi di normalità e di omoschedasticità sui residui.
ggplot(data=dati)+
geom_point(aes(x=Gestazione,
y=Peso,
col=Sesso), position="jitter")+
geom_smooth(aes(x=Gestazione,
y=Peso,
col=Sesso), se=F, method = "lm")+
geom_smooth(aes(x=Gestazione,
y=Peso), col="black", se=F, method = "lm")+
theme_classic()
Questo grafico mette in relazione il Peso con la Gestazione. Le rette di regressione, per i maschi e per le femmine, hanno la stessa pendenza ma si deduce che i maschi pesano mediamente di più, avendo l’intercetta più in alto.
ggplot(data=dati)+
geom_point(aes(x=Cranio,
y=Peso,
col=Sesso), position="jitter")+
geom_smooth(aes(x=Cranio,
y=Peso,
col=Sesso), se=F, method = "lm")+
geom_smooth(aes(x=Cranio,
y=Peso), col="black", se=F, method = "lm")+
theme_classic()
Anche per questo grafico, che mette in relazione Peso e Cranio, le pendenze delle rette per i maschi e per le femmine sembrano simili e si conferma la correlazione positiva le due variabili.
L’analisi condotta sul dataset di 2500 neonati ha permesso di sviluppare un modello di regressione lineare multipla per stimare il peso alla nascita basandosi su variabili cliniche e demografiche. Dalla fase di analisi preliminare emerge che alcune variabili quantitative, come Gestazione, Lunghezza e Cranio, sono fortemente correlate con il peso del neonato, mentre variabili come Anni.madre, Fumatrici, Tipo di parto e Ospedale risultano poco influenti. Tra le variabili qualitative, il Sesso del neonato mostra un impatto significativo sul peso, con i maschi mediamente più pesanti delle femmine.
Il modello finale (mod8) include le variabili principali e l’interazione tra Gestazione e Lunghezza, ottenendo il miglior Adjusted \(R^2\) e il valore BIC più parsimonioso tra tutti i modelli implementati. Nonostante la presenza di multicollinearità tra le variabili principali e l’interazione, il modello consente stime interpretabili e predizioni affidabili.
Dall’analisi dei residui si osserva che non vi sono problemi significativi di autocorrelazione (Durbin-Watson). La distribuzione dei residui non è però perfettamente normale, con una coda destra leggermente più pesante (Shapiro-Wilk). La varianza dei residui non è costante (Breusch-Pagan), indicando eteroschedasticità. I valori di leverage e la distanza di Cook evidenziano pochi punti con impatto moderato, ma nessuno influenza in modo critico le stime del modello.
In termini di previsione, il modello permette di stimare con precisione il peso dei neonati in scenari pratici. Ad esempio, stimando il peso di una neonata di una madre alla terza gravidanza con 39 settimane di gestazione, il modello predice circa 3176 grammi, in linea con le medie di riferimento della popolazione.
Nonostante alcune violazioni delle ipotesi classiche della regressione, il modello sviluppato fornisce uno strumento utile per Neonatal Health Solutions per prevedere il peso dei neonati e identificare casi a rischio, pianificare risorse ospedaliere e interventi clinici in modo più mirato.