Questo documento presenta l’analisi del peso dei neonati utilizzando R. L’obiettivo è costruire un modello di regressione lineare multipla per stimare il peso del neonato in base a diverse variabili materne e neonatali.
Il dataset “neonati.csv” è stato caricato in R. Le prime righe del dataset e la sua struttura sono state esaminate per comprendere le variabili e i loro tipi.
setwd("C:/Users/Admin/Desktop/Master AI") # Impostare la directory
dati <- read.csv("neonati.csv", stringsAsFactors = TRUE, sep = ",") # Caricare i dati
str(dati)
## 'data.frame': 2500 obs. of 10 variables:
## $ Anni.madre : int 26 21 34 28 20 32 26 25 22 23 ...
## $ N.gravidanze: int 0 2 3 1 0 0 1 0 1 0 ...
## $ Fumatrici : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Gestazione : int 42 39 38 41 38 40 39 40 40 41 ...
## $ Peso : int 3380 3150 3640 3690 3700 3200 3100 3580 3670 3700 ...
## $ Lunghezza : int 490 490 500 515 480 495 480 510 500 510 ...
## $ Cranio : int 325 345 375 365 335 340 345 349 335 362 ...
## $ Tipo.parto : 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 ...
Il dataset è composto da 2500 osservazioni su 10 variabili. Le prime sette variabili sono di tipo numerico intero e rappresentano caratteristiche materne e neonatali, mentre le ultime tre variabili sono categoriche.
Analizziamo le statistiche di queste variabili:
kable(summary(dati)) # Riepilogo statistico del dataset
| Anni.madre | N.gravidanze | Fumatrici | Gestazione | Peso | Lunghezza | Cranio | Tipo.parto | Ospedale | Sesso | |
|---|---|---|---|---|---|---|---|---|---|---|
| Min. : 0.00 | Min. : 0.0000 | Min. :0.0000 | Min. :25.00 | Min. : 830 | Min. :310.0 | Min. :235 | Ces: 728 | osp1:816 | F:1256 | |
| 1st Qu.:25.00 | 1st Qu.: 0.0000 | 1st Qu.:0.0000 | 1st Qu.:38.00 | 1st Qu.:2990 | 1st Qu.:480.0 | 1st Qu.:330 | Nat:1772 | osp2:849 | M:1244 | |
| Median :28.00 | Median : 1.0000 | Median :0.0000 | Median :39.00 | Median :3300 | Median :500.0 | Median :340 | NA | osp3:835 | NA | |
| Mean :28.16 | Mean : 0.9812 | Mean :0.0416 | Mean :38.98 | Mean :3284 | Mean :494.7 | Mean :340 | NA | NA | NA | |
| 3rd Qu.:32.00 | 3rd Qu.: 1.0000 | 3rd Qu.:0.0000 | 3rd Qu.:40.00 | 3rd Qu.:3620 | 3rd Qu.:510.0 | 3rd Qu.:350 | NA | NA | NA | |
| Max. :46.00 | Max. :12.0000 | Max. :1.0000 | Max. :43.00 | Max. :4930 | Max. :565.0 | Max. :390 | NA | NA | NA |
Durante l’esplorazione iniziale dei dati, è stata rilevata
un’anomalia nella variabile Anni.madre:
Per verificare la presenza di osservazioni con età materna sospetta, si esegue il seguente filtro:
kable(dati[dati$Anni.madre < 12 | dati$Anni.madre > 50, ])
| Anni.madre | N.gravidanze | Fumatrici | Gestazione | Peso | Lunghezza | Cranio | Tipo.parto | Ospedale | Sesso | |
|---|---|---|---|---|---|---|---|---|---|---|
| 1152 | 1 | 1 | 0 | 41 | 3250 | 490 | 350 | Nat | osp2 | F |
| 1380 | 0 | 0 | 0 | 39 | 3060 | 490 | 330 | Nat | osp3 | M |
Dall’output è emersa una osservazione con Anni.madre = 0 ed una osservazione con Anni.madre = 1. Poiché l’età pari a 0 o 1 rappresenta un chiaro errore di inserimento e non vi sono informazioni aggiuntive per correggere il valore, si è deciso di escludere i record dal dataset:
dati <- dati[dati$Anni.madre != 0 & dati$Anni.madre != 1, ]
summary(dati$Anni.madre)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 13.00 25.00 28.00 28.19 32.00 46.00
attach(dati) # Rende le variabili accessibili
# Verifica asimmetria e curtosi della variabile Peso
skewness <- moments::skewness(Peso)
kurtosis <- moments::kurtosis(Peso) - 3
tab <- data.frame(
Statistica = c("Skewness", "Kurtosis (excess)"),
Valore = round(c(skewness, kurtosis), 3)
)
# Stampa tabella
kable(tab, caption = "Skewness e Kurtosi della variabile Peso")
| Statistica | Valore |
|---|---|
| Skewness | -0.647 |
| Kurtosis (excess) | 2.029 |
L’asimmetria (skewness) risulta pari a -0.647, indicando una lieve asimmetria negativa: la distribuzione del peso tende leggermente verso sinistra. Tuttavia, il valore è vicino a zero, quindi possiamo considerare la distribuzione quasi simmetrica.
La curtosi, pari a 2.03, è positiva e superiore a zero, suggerendo una distribuzione più appuntita rispetto a quella normale (leptocurtica).
Dunque, la distribuzione del peso si discosta leggermente dalla normalità, ma non in modo marcato.
Variabili Numeriche
Si definisce una funzione analisi_descrittiva() per
calcolare statistiche descrittive (media, mediana, deviazione standard,
quartili, asimmetria, curtosi) per le variabili numeriche.
analisi_descrittiva <- function(x, nome_var = "Variabile") {
# Calcolo delle statistiche
media <- mean(x, na.rm = TRUE)
mediana <- median(x, na.rm = TRUE)
deviazione <- sd(x, na.rm = TRUE)
quartili <- quantile(x, probs = c(0.25, 0.75), na.rm = TRUE)
asimmetria <- moments::skewness(x, na.rm = TRUE)
curtosi <- moments::kurtosis(x, na.rm = TRUE) - 3
# Crea un data frame con i risultati
risultati <- data.frame(
Variabile = nome_var,
Media = media,
Mediana = mediana,
DeviazioneStandard = deviazione,
Quartile_25 = unname(quartili[1]), # Usa unname per rimuovere i nomi
Quartile_75 = unname(quartili[2]), # Usa unname per rimuovere i nomi
Asimmetria = asimmetria,
Curtosi = curtosi
)
return(risultati)
}
# Calcola le statistiche per ogni variabile e combina i risultati
risultati_peso <- analisi_descrittiva(dati$Peso, "Peso")
risultati_anni_madre <- analisi_descrittiva(dati$Anni.madre, "Anni.madre")
risultati_n_gravidanze <- analisi_descrittiva(dati$N.gravidanze, "Numero Gravidanze")
risultati_gestazione <- analisi_descrittiva(dati$Gestazione, "Gestazione")
risultati_lunghezza <- analisi_descrittiva(dati$Lunghezza, "Lunghezza")
risultati_cranio <- analisi_descrittiva(dati$Cranio, "Diametro Cranio")
# Combina tutti i risultati in un unico data frame
analisi_completa <- rbind(risultati_peso, risultati_anni_madre, risultati_n_gravidanze,
risultati_gestazione, risultati_lunghezza, risultati_cranio)
# Usa kable per creare la tabella
kable(analisi_completa)
| Variabile | Media | Mediana | DeviazioneStandard | Quartile_25 | Quartile_75 | Asimmetria | Curtosi |
|---|---|---|---|---|---|---|---|
| Peso | 3284.1841473 | 3300 | 525.229374 | 2990 | 3620 | -0.6474036 | 2.0287531 |
| Anni.madre | 28.1861489 | 28 | 5.217206 | 25 | 32 | 0.1510624 | -0.1056061 |
| Numero Gravidanze | 0.9815853 | 1 | 1.280949 | 0 | 1 | 2.5134123 | 10.9816269 |
| Gestazione | 38.9795837 | 39 | 1.868950 | 38 | 40 | -2.0651309 | 8.2555158 |
| Lunghezza | 494.6957566 | 500 | 26.328847 | 480 | 510 | -1.5145746 | 6.4809304 |
| Diametro Cranio | 340.0292234 | 340 | 16.429469 | 330 | 350 | -0.7850906 | 2.9448704 |
Questi risultati forniscono un quadro chiaro e dettagliato delle caratteristiche statistiche delle variabili analizzate, utile per interpretazioni più approfondite e per guidare ulteriori analisi dei dati.
Variabili Categoriche
analisi_categorica <- function(x, nome_var = "Variabile") {
# Frequenze assolute e relative
freq_ass <- table(x)
freq_rel <- prop.table(freq_ass)
# Crea il dataframe per la tabella
freq_df <- data.frame(
Categoria = names(freq_ass),
Fr_Assoluta = as.integer(freq_ass),
Fr_Relativa = round(as.numeric(freq_rel), 3)
)
# Formatta i nomi delle colonne
colnames(freq_df) <- c(nome_var, "Fr. Assoluta", "Fr. Relativa")
# Stampa la tabella
kable(freq_df, caption = paste("Distribuzione della variabile", nome_var), align = "lcc", escape = FALSE)
}
analisi_categorica(dati$Sesso, "Sesso")
| Sesso | Fr. Assoluta | Fr. Relativa |
|---|---|---|
| F | 1255 | 0.502 |
| M | 1243 | 0.498 |
analisi_categorica(dati$Fumatrici, "Fumatrici")
| Fumatrici | Fr. Assoluta | Fr. Relativa |
|---|---|---|
| 0 | 2394 | 0.958 |
| 1 | 104 | 0.042 |
analisi_categorica(dati$Tipo.parto, "Tipo_Parto")
| Tipo_Parto | Fr. Assoluta | Fr. Relativa |
|---|---|---|
| Ces | 728 | 0.291 |
| Nat | 1770 | 0.709 |
analisi_categorica(dati$Ospedale, "Ospedale")
| Ospedale | Fr. Assoluta | Fr. Relativa |
|---|---|---|
| osp1 | 816 | 0.327 |
| osp2 | 848 | 0.339 |
| osp3 | 834 | 0.334 |
Quindi possiamo osservare: - Sesso: quasi perfettamente
bilanciato tra Femmine (50.2%) e Maschi (49.8%). -
Fumatrici: fortemente sbilanciato, con la maggior parte non
fumatrice (95.8%). - Tipo.parto: prevalentemente naturale
(70.9%). - Ospedale: molto uniforme tra i tre ospedali
(circa 33% ciascuno).
# Calcolo del test
tab_parto_ospedale <- table(dati$Tipo.parto, dati$Ospedale)
chi_test <- chisq.test(tab_parto_ospedale)
Risultato Test del Chi-quadrato
Il test del Chi-quadrato non ha evidenziato un’associazione significativa tra il tipo di parto e l’ospedale (p = 0.578). Pertanto, non ci sono differenze statisticamente significative nella distribuzione del tipo di parto tra i diversi ospedali.
Tramite ricerca sul web e consultando gli Standard di Crescita dell’Organizzazione Mondiale della Sanità (WHO Child Growth Standards) (https://www.cdc.gov/growthcharts/who-growth-charts.htm) è stato possibile stabilire dei valori di riferimento per la media del peso e della lunghezza neonatale da utilizzare come confronto con i nostri dati. A tale scopo, abbiamo utilizzato un valore di peso medio di 3300 grammi (3.3 kg) e una lunghezza media di 500 millimetri (50 cm), che rappresentano le mediane tipiche per i neonati secondo queste fonti.
Test t per confronto con la popolazione
# Test t per Peso
pop_media_peso <- 3300
test_peso <- t.test(dati$Peso, mu = pop_media_peso, alternative = "two.sided")
# Test t per Lunghezza
pop_media_lunghezza <- 500
test_lunghezza <- t.test(dati$Lunghezza, mu = pop_media_lunghezza, alternative = "two.sided")
Peso alla nascita:
Lunghezza alla nascita:
La media del peso dei neonati non differisce significativamente dalla media teorica della popolazione, con p = 0.13. Non si rifiuta l’ipotesi nulla.
La lunghezza media dei neonati è significativamente inferiore rispetto alla media ipotizzata di 500 mm (p < 0.001). Si rifiuta l’ipotesi nulla.
Test t per confronto tra sessi
# Test t tra sessi
test_peso_sesso <- t.test(Peso ~ Sesso, data = dati)
test_lung_sesso <- t.test(Lunghezza ~ Sesso, data = dati)
test_cranio_sesso <- t.test(Cranio ~ Sesso, data = dati)
# Estrazione e pulizia risultati
estrai_info <- function(test) {
list(
media_F = round(test$estimate["mean in group F"], 1),
media_M = round(test$estimate["mean in group M"], 1),
t = round(test$statistic, 3),
p = format.pval(test$p.value, digits = 4, eps = 0.0001),
ci = round(test$conf.int, 2)
)
}
peso <- estrai_info(test_peso_sesso)
lung <- estrai_info(test_lung_sesso)
cranio <- estrai_info(test_cranio_sesso)
Peso alla nascita:
Lunghezza alla nascita:
Circonferenza cranica:
I maschi hanno un peso medio significativamente maggiore rispetto alle femmine (p < 0.001). Differenza media: circa 247 g.
Anche la lunghezza media è maggiore nei maschi rispetto alle femmine, con una differenza significativa (p < 0.001).
La circonferenza cranica media è maggiore nei maschi, con differenza significativa (p < 0.001).
È stato verificato il numero di dati mancanti per ciascuna variabile. In questo caso, non è stato riscontrato nessun dato mancante.
kable(colSums(is.na(dati))) # Numero di dati mancanti per colonna
| x | |
|---|---|
| Anni.madre | 0 |
| N.gravidanze | 0 |
| Fumatrici | 0 |
| Gestazione | 0 |
| Peso | 0 |
| Lunghezza | 0 |
| Cranio | 0 |
| Tipo.parto | 0 |
| Ospedale | 0 |
| Sesso | 0 |
È stato costruito un modello di regressione lineare multipla per stimare il peso del neonato.
Correlazione: È stata visualizzata la matrice di correlazione tra le variabili per identificare eventuali forti correlazioni.
dati_numeric <- dati[sapply(dati, is.numeric)]
panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor, ...) {
par(usr = c(0, 1, 0, 1))
r <- cor(x, y)
txt <- format(c(r, 0.123456789), digits = digits)[1]
txt <- paste0(prefix, txt)
if (missing(cex.cor)) cex.cor <- 0.8 / strwidth(txt)
text(0.5, 0.5, txt, cex = cex.cor, col = "red") # Aggiunto colore rosso
}
pairs(dati_numeric, lower.panel = panel.cor, upper.panel = panel.smooth)
La matrice di correlazione permette di valutare la relazione lineare tra le variabili numeriche del dataset. Dall’analisi si nota che il peso del neonato è moderatamente correlato sia con la lunghezza che con il diametro cranico, suggerendo che neonati più lunghi e con cranio più ampio tendono ad avere un peso maggiore. Anche la durata della gestazione mostra una correlazione positiva, seppur più debole, con il peso, indicando che un maggior numero di settimane di gestazione è associato a un lieve aumento del peso alla nascita. Le relazioni tra le altre variabili numeriche risultano contenute e non segnalano particolari problemi di multicollinearità. Le variabili categoriali non sono incluse nella matrice in quanto la correlazione di Pearson si applica esclusivamente a variabili numeriche continue.
Verifica di Normalità: È stato effettuato uno Shapiro-Wilk test per verificare la normalità della variabile Peso.
shapiro.test(Peso) #non Normale
##
## Shapiro-Wilk normality test
##
## data: Peso
## W = 0.97068, p-value < 2.2e-16
Il test ha evidenziato che la variabile non è normalmente distribuita.
Costruzione e Selezione del Modello: Sono stati creati e confrontati diversi modelli utilizzando ANOVA e BIC per selezionare il modello più parsimonioso e con buona capacità predittiva. P.S. Qui ho deciso di lasciare l’output della console per semplicità di codice
mod1 <- lm(Peso ~ .-Tipo.parto -Ospedale, data = dati)
summary(mod1)
##
## Call:
## lm(formula = Peso ~ . - Tipo.parto - Ospedale, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1160.6 -181.3 -15.7 163.6 2630.7
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6712.2405 141.3339 -47.492 < 2e-16 ***
## Anni.madre 0.8803 1.1491 0.766 0.444
## N.gravidanze 11.3789 4.6767 2.433 0.015 *
## Fumatrici -30.3958 27.6080 -1.101 0.271
## Gestazione 32.9472 3.8288 8.605 < 2e-16 ***
## Lunghezza 10.2316 0.3011 33.979 < 2e-16 ***
## Cranio 10.5198 0.4271 24.633 < 2e-16 ***
## SessoM 78.0787 11.2132 6.963 4.24e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.7 on 2490 degrees of freedom
## Multiple R-squared: 0.7272, Adjusted R-squared: 0.7264
## F-statistic: 948.3 on 7 and 2490 DF, p-value: < 2.2e-16
car::vif(mod1) # Verifica multicollinearità
## Anni.madre N.gravidanze Fumatrici Gestazione Lunghezza Cranio
## 1.189264 1.187447 1.006692 1.694331 2.079749 1.628987
## Sesso
## 1.040493
Il modello iniziale mod1 è stato costruito per
analizzare l’effetto di alcune variabili esplicative sul peso neonatale
(Peso), escludendo fin da subito le variabili
Tipo.parto e Ospedale, che non hanno valore
predittivo diretto nella pratica e potrebbero introdurre variabilità non
generalizzabile.
Coefficiente di Determinazione:
R² = 0.7272 e Adjusted R² = 0.7264 indicano un buon livello di spiegazione della variabilità del peso neonatale da parte del modello.
L’F-statistic è molto elevato (948.3), con un p-value < 2.2e-16, confermando che il modello nel suo complesso è altamente significativo.
Significatività delle Variabili: Dal summary del modello, risultano statisticamente significative (p < 0.05) le seguenti variabili:
N.gravidanze (p = 0.015)
Gestazione, Lunghezza,
Cranio e SessoM (p << 0.001)
Queste variabili mostrano una relazione lineare importante con il peso del neonato:
Ogni settimana in più di gestazione è associata a un aumento medio del peso.
Lunghezza e circonferenza cranica sono entrambe predittori molto forti del peso alla nascita.
I neonati maschi tendono ad avere un peso medio superiore rispetto alle femmine.
Anche il numero di gravidanze precedenti risulta avere un’influenza, seppur meno marcata.
Le variabili Anni.madre e Fumatrici non
risultano significative (p > 0.05), suggerendo che in questo dataset
non hanno un impatto rilevante sul peso neonatale, se controlliamo per
le altre covariate.
Verifica della Multicollinearità: I valori di VIF sono tutti inferiori a 2.1, indicando assenza di multicollinearità preoccupante. Questo rafforza l’affidabilità delle stime dei coefficienti.
mod2 <- update(mod1, ~ . -Anni.madre -Fumatrici )
summary(mod2)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1149.37 -180.98 -15.57 163.69 2639.09
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6681.7251 135.8036 -49.201 < 2e-16 ***
## N.gravidanze 12.4554 4.3416 2.869 0.00415 **
## Gestazione 32.3827 3.8008 8.520 < 2e-16 ***
## Lunghezza 10.2455 0.3008 34.059 < 2e-16 ***
## Cranio 10.5410 0.4265 24.717 < 2e-16 ***
## SessoM 77.9807 11.2111 6.956 4.47e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.7 on 2492 degrees of freedom
## Multiple R-squared: 0.727, Adjusted R-squared: 0.7265
## F-statistic: 1327 on 5 and 2492 DF, p-value: < 2.2e-16
car::vif(mod2)
## N.gravidanze Gestazione Lunghezza Cranio Sesso
## 1.023462 1.669779 2.075747 1.624568 1.040184
#confronto tra mod1 e mod2
anova(mod1, mod2)
## Analysis of Variance Table
##
## Model 1: Peso ~ (Anni.madre + N.gravidanze + Fumatrici + Gestazione +
## Lunghezza + Cranio + Tipo.parto + Ospedale + Sesso) - Tipo.parto -
## Ospedale
## Model 2: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2490 187905214
## 2 2492 188042054 -2 -136840 0.9067 0.404
BIC(mod1, mod2)
## df BIC
## mod1 9 35207.48
## mod2 7 35193.65
Il modello mod2 è stato ottenuto semplificando
mod1 tramite la rimozione delle variabili non significative
Anni.madre e Fumatrici, con l’obiettivo di
mantenere una buona capacità predittiva riducendo la complessità del
modello.
mod2:Tutte le variabili rimaste (N.gravidanze,
Gestazione, Lunghezza, Cranio,
Sesso) risultano altamente significative (p <
0.01), suggerendo un’influenza rilevante sul peso neonatale.
I coefficienti mantengono segno e dimensioni simili rispetto a
mod1, a conferma della robustezza del modello anche dopo la
rimozione delle variabili non informative.
R²: passa da 0.7272 (mod1) a 0.7270
(mod2)
R² aggiustato: da 0.7264 a 0.7265
→ La capacità esplicativa rimane sostanzialmente invariata.
F-statistic: pari a 1327 con p < 2.2e-16 → modello globalmente molto significativo.
L’indice VIF per tutte le variabili in mod2 è < 2.1,
ben al di sotto della soglia critica di 5, indicando assenza di
collinearità tra i predittori.
La rimozione delle variabili superflue potrebbe aver contribuito a
migliorare la stabilità del modello.
ANOVA (anova(mod1, mod2))
p-value = 0.404 → la differenza tra i due modelli non è
statisticamente significativa.
La semplificazione non comporta perdita sostanziale di
informazione.
BIC (BIC(mod1, mod2))
mod1: 35207.48
mod2: 35193.65
→ Il valore più basso per mod2 suggerisce una preferenza
per il modello più semplice.
mod2 rappresenta una versione più parsimoniosa di
mod1, senza perdita rilevante di capacità predittiva.
I criteri di selezione del modello (R², BIC, ANOVA) indicano che la
rimozione di variabili non significative è giustificata.
Pertanto, mod2 risulta preferibile per interpretazione e
predizione.
L’analisi dei residui del modello mod2 è stata condotta per verificarne le assunzioni.
# Analisi dei residui
par(mfrow=c(2,2))
plot(mod2)
I grafici plot(mod2) mostrano:
Residuals vs Fitted: Si osserva una tendenza alla dispersione crescente dei residui all’aumentare dei valori fitted, indicando una potenziale eteroschedasticità, ulteriormente suggerita dalla curvatura. Sono presenti anche alcuni punti estremi.
Q-Q residuals: I residui si discostano leggermente dalla linea ideale, segnalando una possibile violazione dell’assunzione di normalità. Questo è confermato dal test di Shapiro-Wilk (W = 0.974, p < 2.2e-16), che rigetta l’ipotesi di normalità dei residui.
Scale-Location: La dispersione dei residui standardizzati rispetto ai valori fitted non è del tutto omogenea, suggerendo una lieve eteroschedasticità.
Residuals vs Leverage: Alcune osservazioni mostrano valori di leverage elevati, in particolare la numero 1551, che potrebbe influenzare in modo rilevante il modello.
shapiro.test(residuals(mod2))
##
## Shapiro-Wilk normality test
##
## data: residuals(mod2)
## W = 0.97414, p-value < 2.2e-16
lmtest::bptest(mod2)
##
## studentized Breusch-Pagan test
##
## data: mod2
## BP = 90.297, df = 5, p-value < 2.2e-16
lmtest::dwtest(mod2)
##
## Durbin-Watson test
##
## data: mod2
## DW = 1.9532, p-value = 0.1209
## alternative hypothesis: true autocorrelation is greater than 0
Il test di Shapiro–Wilk restituisce W = 0.97 e p‑value < 2.2e‑16, indicando che i residui si discostano significativamente da una distribuzione normale. La deviazione è evidente anche nella QQ‑plot, soprattutto nelle code estreme.
Il test di Breusch-Pagan (bptest, BP = 90.3, df = 5, p < 2.2e-16) indica una significativa eteroschedasticità.
Il test di Durbin-Watson (dwtest, DW = 1.9532, p = 0.1209) non fornisce evidenza significativa di autocorrelazione dei residui.
#leverage
par(mfrow=c(2,2))
lev<-hatvalues(mod2)
plot(lev)
p<-sum(lev)
n<-length(lev)
soglia=2*p/n
abline(h=soglia,col=2)
lev[lev>soglia]
#outliers
plot(rstudent(mod2))
abline(h=c(-2,2))
#distanza di cook
cook<-cooks.distance(mod2)
plot(cook,ylim = c(0,1))
car::outlierTest(mod2)
## rstudent unadjusted p-value Bonferroni p
## 1551 10.046230 2.6345e-23 6.5810e-20
## 155 5.025345 5.3818e-07 1.3444e-03
## 1306 4.824963 1.4848e-06 3.7092e-03
Punti di Leva (Leverage): Il grafico dei leverage
plot(lev) mostra alcuni punti con valori di leverage
superiori alla soglia (2*p/n ≈ 0.004). Le osservazioni con leverage
elevato sono state identificate e includono, tra le altre, 15, 155, e
161.
Outlier: Il grafico degli outliers mostra che l’osservazione 1551 supera ampiamente la soglia di ±2, configurandosi come outlier significativo, come confermato anche dal test di Bonferroni (t = 10.05, p < 2e-16). Anche le osservazioni 155 e 1306 risultano potenzialmente influenti, con p-value corretti significativi.
Distanza di Cook: Il grafico della distanza di Cook
plot(cook) mostra che alcune osservazioni, in particolare
la 1551, esercitano un’influenza considerevole sul modello.
Conclusioni: L’analisi dei residui suggerisce alcune violazioni delle assunzioni del modello lineare, in particolare la normalità e l’omoschedasticità. Sono stati identificati diversi punti con elevato leverage e outlier influenti (in primis l’osservazione 1551), che potrebbero influenzare le stime dei coefficienti e la validità delle inferenze del modello.
kable(dati[1551, ])
| Anni.madre | N.gravidanze | Fumatrici | Gestazione | Peso | Lunghezza | Cranio | Tipo.parto | Ospedale | Sesso | |
|---|---|---|---|---|---|---|---|---|---|---|
| 1553 | 30 | 4 | 0 | 35 | 4520 | 520 | 360 | Nat | osp2 | F |
È stato verificato il dato grezzo relativo all’osservazione n. 1551 e, sebbene i valori risultino biologicamente plausibili, la combinazione risulta molto rara e distante rispetto alla distribuzione generale del dataset. Questa anomalia ha generato un residuo molto elevato, indicando una forte deviazione dal modello atteso.
Considerata l’influenza rilevante di questo dato sull’adattamento del modello, con effetti distorsivi sulle stime dei coefficienti e violazioni delle assunzioni di normalità e omoschedasticità, si è deciso di escludere temporaneamente l’osservazione dalle analisi successive. Tale scelta è stata fatta per ottenere un modello più stabile e rappresentativo della popolazione generale.
dati_no1551 <- dati[rownames(dati) != "1551", ]
mod2_no1551 <- lm(Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso, data = dati_no1551)
summary(mod2_no1551)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso, data = dati_no1551)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1165.68 -179.74 -12.42 162.92 1410.68
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6683.8326 133.1602 -50.194 < 2e-16 ***
## N.gravidanze 13.1448 4.2576 3.087 0.00204 **
## Gestazione 29.6341 3.7369 7.930 3.27e-15 ***
## Lunghezza 10.8899 0.3019 36.077 < 2e-16 ***
## Cranio 9.9192 0.4227 23.465 < 2e-16 ***
## SessoM 78.1376 10.9929 7.108 1.53e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 269.3 on 2491 degrees of freedom
## Multiple R-squared: 0.7372, Adjusted R-squared: 0.7367
## F-statistic: 1398 on 5 and 2491 DF, p-value: < 2.2e-16
par(mfrow=c(2,2))
plot(mod2_no1551)
shapiro.test(residuals(mod2_no1551))
##
## Shapiro-Wilk normality test
##
## data: residuals(mod2_no1551)
## W = 0.98891, p-value = 5.23e-13
lmtest::bptest(mod2_no1551)
##
## studentized Breusch-Pagan test
##
## data: mod2_no1551
## BP = 11.343, df = 5, p-value = 0.04499
lmtest::dwtest(mod2_no1551)
##
## Durbin-Watson test
##
## data: mod2_no1551
## DW = 1.9536, p-value = 0.1227
## alternative hypothesis: true autocorrelation is greater than 0
#leverage
par(mfrow=c(2,2))
lev<-hatvalues(mod2_no1551)
plot(lev)
p<-sum(lev)
n<-length(lev)
soglia=2*p/n
abline(h=soglia,col=2)
lev[lev>soglia]
#outliers
plot(rstudent(mod2_no1551))
abline(h=c(-2,2))
car::outlierTest(mod2_no1551)
#distanza di cook
cook<-cooks.distance(mod2_no1551)
plot(cook,ylim = c(0,1))
La rimozione dell’osservazione 1551 ha eliminato l’outlier più
estremo e influente dal dataset, come confermato dall’assenza del punto
‘1551’ nei nuovi grafici diagnostici di Cook’s distance e nell’output di
outlierTest. Questo ha portato a un modello marginalmente più stabile
(lieve riduzione dell’errore standard dei residui). Tuttavia, nonostante
questa pulizia del dato, il modello lineare standard mod2_no1551
continua a mostrare significative violazioni delle assunzioni
fondamentali: i residui non sono distribuiti normalmente (p-value di
Shapiro-Wilk << 0.05). È ancora presente eteroschedasticità
(p-value di Breusch-Pagan < 0.05). Dato il persistere
dell’eteroschedasticità e la non normalità dei residui nel
mod2_no1551, e considerando le relazioni non lineari
osservate tra Peso e variabili come Gestazione e Lunghezza, si è deciso
di affinare il modello provando a trasformare la variabile x
Lunghezza e Gestazione come suggerito dai
grafici:
mod2_no1551_quad <- update(mod2_no1551, ~ . + I(Lunghezza^2) + I(Gestazione^2))
summary(mod2_no1551_quad)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso + I(Lunghezza^2) + I(Gestazione^2), data = dati_no1551)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1187.6 -180.9 -12.4 164.2 1319.9
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.811e+03 9.024e+02 -3.115 0.001860 **
## N.gravidanze 1.438e+01 4.219e+00 3.408 0.000664 ***
## Gestazione 2.000e+02 6.621e+01 3.020 0.002552 **
## Lunghezza -1.925e+01 4.537e+00 -4.244 2.28e-05 ***
## Cranio 1.010e+01 4.204e-01 24.011 < 2e-16 ***
## SessoM 7.339e+01 1.093e+01 6.715 2.32e-11 ***
## I(Lunghezza^2) 3.090e-02 4.621e-03 6.687 2.80e-11 ***
## I(Gestazione^2) -2.130e+00 8.678e-01 -2.454 0.014198 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 266.7 on 2489 degrees of freedom
## Multiple R-squared: 0.7426, Adjusted R-squared: 0.7419
## F-statistic: 1026 on 7 and 2489 DF, p-value: < 2.2e-16
BIC(mod2_no1551,mod2_no1551_quad)
## df BIC
## mod2_no1551 7 35081.40
## mod2_no1551_quad 9 35045.21
par(mfrow=c(2,2))
plot(mod2_no1551_quad)
shapiro.test(residuals(mod2_no1551_quad))
##
## Shapiro-Wilk normality test
##
## data: residuals(mod2_no1551_quad)
## W = 0.99048, p-value = 8.393e-12
lmtest::bptest(mod2_no1551_quad)
##
## studentized Breusch-Pagan test
##
## data: mod2_no1551_quad
## BP = 17.125, df = 7, p-value = 0.01661
lmtest::dwtest(mod2_no1551_quad)
##
## Durbin-Watson test
##
## data: mod2_no1551_quad
## DW = 1.9496, p-value = 0.104
## alternative hypothesis: true autocorrelation is greater than 0
#leverage
par(mfrow=c(2,2))
lev<-hatvalues(mod2_no1551_quad)
plot(lev)
p<-sum(lev)
n<-length(lev)
soglia=2*p/n
abline(h=soglia,col=2)
lev[lev>soglia]
#outliers
plot(rstudent(mod2_no1551_quad))
abline(h=c(-2,2))
car::outlierTest(mod2_no1551_quad)
#distanza di cook
cook<-cooks.distance(mod2_no1551_quad)
plot(cook,ylim = c(0,1))
Il modello mod2_no1551_quad è stato sviluppato
includendo termini quadratici per Lunghezza e
Gestazione. Questa estensione mira a catturare potenziali
relazioni non lineari tra il peso alla nascita e le variabili
esplicative.
Il modello mostra una buona capacità esplicativa, con un R-quadro Multiplo pari a 0.7426 e un R-quadro Aggiustato di 0.7419, indicando che circa il 74.2% della variabilità del peso alla nascita è spiegata dai predittori inclusi. Il test F complessivo (F-statistic: 1026, p-value < 2.2e-16) risulta altamente significativo, a conferma della validità statistica del modello nel suo insieme.
L’aggiunta dei termini quadratici ha migliorato il valore del BIC (da
35081.40 a 35045.21), suggerendo che mod2_no1551_quad
rappresenta una versione più parsimoniosa e meglio adattata rispetto al
modello lineare senza termini quadratici.
Tutti i predittori inclusi nel modello sono risultati statisticamente
significativi (p-values molto bassi). Questo evidenzia l’importanza di
ciascuna variabile nel predire il peso alla nascita. La significatività
dei termini quadratici I(Lunghezza^2) e
I(Gestazione^2) conferma l’esistenza di relazioni non
lineari.
L’analisi dei residui è stata condotta per valutare l’aderenza del modello alle assunzioni della regressione lineare:
Normalità dei Residui: Il Q-Q plot dei residui mostra deviazioni dalla linea teorica nelle code, e il test di Shapiro-Wilk (p-value = 8.393e-12) indica che i residui non sono normalmente distribuiti.
Omoschedasticità: I grafici “Residui vs Fitted” e “Scale-Location” mostrano un chiaro fenomeno di eteroschedasticità (aumento della dispersione dei residui all’aumentare dei valori predetti). Questa violazione è statisticamente supportata dal test di Breusch-Pagan (p-value = 0.01661).
Autocorrelazione: Il test di Durbin-Watson (p-value = 0.104) suggerisce l’assenza di autocorrelazione significativa nei residui, essendo il valore DW prossimo a 2.
Outlier e Punti Influenzanti: Nonostante la rimozione precedente di un outlier significativo, i grafici della Distanza di Cook e del Leverage indicano la presenza di alcuni punti che, pur non essendo estremi, esercitano una certa influenza sul modello.
Conclusioni sul Modello: Il modello mod2_no1551_quad è altamente predittivo per il peso alla nascita e incorpora efficacemente le relazioni non lineari. Tuttavia, le violazioni delle assunzioni di normalità e, in particolare, di omoschedasticità dei residui sono significative. Sebbene il modello sia robusto dal punto di vista descrittivo e predittivo, queste violazioni potrebbero compromettere l’affidabilità delle inferenze statistiche e degli standard error dei coefficienti.
Per effettuare una previsione pratica, si è considerato lo scenario di una neonata (Sesso Femminile) alla terza gravidanza della madre, con una gestazione di 39 settimane. Poiché i valori di Lunghezza e Diametro Cranio non erano forniti nella richiesta, sono state utilizzate le medie di queste variabili, calcolate precedentemente tramite la funzione analisi_descrittiva, per ottenere una stima del peso neonatale.
# Estrazione delle medie di lunghezza e cranio
media_lunghezza_pratica <- analisi_completa[analisi_completa$Variabile == "Lunghezza", "Media"]
media_cranio_pratica <- analisi_completa[analisi_completa$Variabile == "Diametro Cranio", "Media"]
## Creazione di un nuovo dataframe con le caratteristiche specificate
nuovi_dati_previsione_pratica_medie <- data.frame(
N.gravidanze = 3,
Gestazione = 39,
Lunghezza = media_lunghezza_pratica, # Usa la media calcolata
Cranio = media_cranio_pratica, # Usa la media calcolata
Sesso = factor("F", levels = c("F", "M")) # Assicurati che i livelli siano corretti
)
# Codifica della variabile Sesso per corrispondere al modello (se il modello usa SessoM)
nuovi_dati_previsione_pratica_medie$SessoM <- ifelse(nuovi_dati_previsione_pratica_medie$Sesso == "M", 1, 0)
# Previsione con il modello mod2_no1551_quad, inclusi gli intervalli di confidenza
previsione_risultati_completa <- predict(mod2_no1551_quad, newdata = nuovi_dati_previsione_pratica_medie,
interval = "prediction", level = 0.95)
Risultato della Previsione: Il peso previsto per una neonata con madre alla terza gravidanza, che partorisce alla 39esima settimana, con una lunghezza media (494.7 mm) e un diametro cranico medio (340 mm) del nostro dataset, è di circa **3262.7 grammi con un intervallo di confidenza al 95% = [2739.2g, 3786.1g].
ggplot(data = dati_no1551) +
geom_point(aes(x = Gestazione,
y = Peso,
col = Fumatrici), position = "jitter") +
geom_smooth(aes(x = Gestazione,
y = Peso,
col = Fumatrici), se = FALSE, method = "lm") +
labs(title = "Relazione tra Durata della Gestazione e Peso alla Nascita",
x = "Durata della Gestazione (settimane)",
y = "Peso alla Nascita (grammi)",
color = "Fumo") +
theme_minimal()
ggplot(data = dati_no1551) +
geom_point(aes(x = Gestazione,
y = Peso,
col = Sesso), position = "jitter") +
geom_smooth(aes(x = Gestazione,
y = Peso,
col = Sesso), se = FALSE, method = "lm") +
labs(title = "Relazione tra Durata della Gestazione e Peso alla Nascita",
x = "Durata della Gestazione (settimane)",
y = "Peso alla Nascita (grammi)",
color = "Sesso") +
theme_minimal()
ggplot(data = dati_no1551) +
geom_point(aes(x = N.gravidanze,
y = Peso,
col = Fumatrici), position = "jitter") +
geom_smooth(aes(x = N.gravidanze,
y = Peso,
col = Fumatrici), se = FALSE, method = "lm") +
labs(title = "Relazione tra N.gravidanze e Peso alla Nascita",
x = "N.gravidanze",
y = "Peso alla Nascita (grammi)",
color = "Fumo") +
theme_minimal()
ggplot(data = dati_no1551) +
geom_point(aes(x = N.gravidanze,
y = Peso,
col = Sesso), position = "jitter") +
geom_smooth(aes(x = N.gravidanze,
y = Peso,
col = Sesso), se = FALSE, method = "lm") +
labs(title = "Relazione tra N.gravidanze e Peso alla Nascita",
x = "N.gravidanze",
y = "Peso alla Nascita (grammi)",
color = "Sesso") +
theme_minimal()
In questo studio, è stato sviluppato un modello di regressione
lineare mod2_no1551_quad con l’obiettivo di predire il peso
alla nascita. Il modello si è dimostrato altamente performante,
spiegando circa il 74% della varianza del peso e identificando
predittori significativi, inclusi effetti non lineari per la lunghezza e
la gestazione.
Nonostante l’ottima capacità predittiva e il miglioramento del modello grazie all’introduzione di termini quadratici, l’analisi diagnostica ha rivelato la presenza di eteroschedasticità e la non-normalità dei residui, violazioni che possono influenzare l’affidabilità delle inferenze statistiche.
In futuro, per affrontare queste limitazioni e migliorare l’affidabilità del modello, sarebbe opportuno esplorare l’applicazione di un Modello Lineare Generalizzato (GLM), che permetterebbe di gestire in modo più appropriato la distribuzione e la varianza dei dati. Nonostante queste sfide metodologiche, il modello attuale fornisce già uno strumento pratico e robusto per stimare il peso alla nascita in base a diverse caratteristiche chiave.