# Lettura del dataset
neonati <- read.csv("/Users/rugg/Downloads/neonati.csv", header = TRUE)
# Conversione delle variabili categoriche in fattori
neonati$Tipo.parto <- as.factor(neonati$Tipo.parto)
neonati$Ospedale <- as.factor(neonati$Ospedale)
neonati$Sesso <- as.factor(neonati$Sesso)
Analisi delle Misure Antropometriche
# Statistiche descrittive per le misure antropometriche
stats_antropometriche <- neonati %>%
pivot_longer(cols = c(Peso, Lunghezza, Cranio),
names_to = "Misura",
values_to = "Valore") %>%
group_by(Misura) %>%
summarise(
Media = mean(Valore, na.rm = TRUE),
SD = sd(Valore, na.rm = TRUE),
Mediana = median(Valore, na.rm = TRUE),
Q1 = quantile(Valore, 0.25, na.rm = TRUE),
Q3 = quantile(Valore, 0.75, na.rm = TRUE),
IQR = IQR(Valore, na.rm = TRUE),
Min = min(Valore, na.rm = TRUE),
Max = max(Valore, na.rm = TRUE)
)
# Visualizzazione delle statistiche in una tabella formattata
kable(stats_antropometriche,
caption = "Statistiche Descrittive delle Misure Antropometriche",
digits = 2) %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Misura | Media | SD | Mediana | Q1 | Q3 | IQR | Min | Max |
|---|---|---|---|---|---|---|---|---|
| Cranio | 340.03 | 16.43 | 340 | 330 | 350 | 20 | 235 | 390 |
| Lunghezza | 494.69 | 26.32 | 500 | 480 | 510 | 30 | 310 | 565 |
| Peso | 3284.08 | 525.04 | 3300 | 2990 | 3620 | 630 | 830 | 4930 |
# Creazione box plot per le misure antropometriche
boxplot_peso <- ggplot(neonati, aes(y = Peso)) +
geom_boxplot(fill = "lightblue") +
labs(title = "Distribuzione del Peso", y = "Peso (g)") +
theme_minimal()
boxplot_lunghezza <- ggplot(neonati, aes(y = Lunghezza)) +
geom_boxplot(fill = "lightgreen") +
labs(title = "Distribuzione della Lunghezza", y = "Lunghezza (cm)") +
theme_minimal()
boxplot_cranio <- ggplot(neonati, aes(y = Cranio)) +
geom_boxplot(fill = "lightpink") +
labs(title = "Distribuzione del Cranio", y = "Cranio (cm)") +
theme_minimal()
grid.arrange(boxplot_peso, boxplot_lunghezza, boxplot_cranio, ncol = 3)
# Identificazione degli outlier
outliers_stats <- neonati %>%
pivot_longer(cols = c(Peso, Lunghezza, Cranio),
names_to = "Misura",
values_to = "Valore") %>%
group_by(Misura) %>%
summarise(
Outliers = sum(abs(scale(Valore)) > 2, na.rm = TRUE),
Perc_Outliers = round(Outliers/n()*100, 2)
)
kable(outliers_stats,
caption = "Analisi degli Outlier (|z-score| > 2)") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Misura | Outliers | Perc_Outliers |
|---|---|---|
| Cranio | 114 | 4.56 |
| Lunghezza | 100 | 4.00 |
| Peso | 117 | 4.68 |
Analisi dei Parti per Ospedale
# Analisi dei tipi di parto per ospedale
parti_ospedale <- neonati %>%
group_by(Ospedale, Tipo.parto) %>%
summarise(Conteggio = n()) %>%
group_by(Ospedale) %>%
mutate(Percentuale = round(Conteggio/sum(Conteggio)*100, 2))
# Visualizzazione delle percentuali dei tipi di parto per ospedale
ggplot(parti_ospedale, aes(x = Ospedale, y = Percentuale, fill = Tipo.parto)) +
geom_bar(stat = "identity", position = "dodge") +
theme_minimal() +
labs(title = "Distribuzione dei Tipi di Parto per Ospedale",
x = "Ospedale", y = "Percentuale (%)") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# Tabella riassuntiva
kable(parti_ospedale,
caption = "Distribuzione dei Tipi di Parto per Ospedale") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Ospedale | Tipo.parto | Conteggio | Percentuale |
|---|---|---|---|
| osp1 | Ces | 242 | 29.66 |
| osp1 | Nat | 574 | 70.34 |
| osp2 | Ces | 254 | 29.92 |
| osp2 | Nat | 595 | 70.08 |
| osp3 | Ces | 232 | 27.78 |
| osp3 | Nat | 603 | 72.22 |
Verifica delle Ipotesi
Test Chi-quadrato per Parti Cesarei tra Ospedali
# Test chi-quadrato per l'indipendenza
chi_test <- chisq.test(table(neonati$Ospedale, neonati$Tipo.parto))
# Visualizzazione risultati
chi_results <- data.frame(
Statistica = chi_test$statistic,
GDL = chi_test$parameter,
P_value = chi_test$p.value
)
kable(chi_results,
caption = "Risultati Test Chi-quadrato",
digits = 4) %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Statistica | GDL | P_value | |
|---|---|---|---|
| X-squared | 1.0972 | 2 | 0.5778 |
Test sulle Misure Antropometriche per Sesso
# T-test per le differenze tra sessi
t_test_peso <- t.test(Peso ~ Sesso, data = neonati)
t_test_lunghezza <- t.test(Lunghezza ~ Sesso, data = neonati)
t_test_cranio <- t.test(Cranio ~ Sesso, data = neonati)
# Creazione tabella risultati
t_test_results <- data.frame(
Misura = c("Peso", "Lunghezza", "Cranio"),
Diff_Media = c(
diff(t_test_peso$estimate),
diff(t_test_lunghezza$estimate),
diff(t_test_cranio$estimate)
),
P_value = c(
t_test_peso$p.value,
t_test_lunghezza$p.value,
t_test_cranio$p.value
)
)
kable(t_test_results,
caption = "Risultati T-test per Differenze tra Sessi",
digits = 4) %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Misura | Diff_Media | P_value |
|---|---|---|
| Peso | 247.0833 | 0 |
| Lunghezza | 9.9029 | 0 |
| Cranio | 4.8156 | 0 |
# Visualizzazione delle distribuzioni per sesso
boxplot_sesso <- neonati %>%
gather(key = "Misura", value = "Valore", Peso, Lunghezza, Cranio) %>%
ggplot(aes(x = Sesso, y = Valore, fill = Sesso)) +
geom_boxplot() +
facet_wrap(~Misura, scales = "free_y") +
theme_minimal() +
labs(title = "Distribuzione delle Misure Antropometriche per Sesso")
print(boxplot_sesso)
Le misure antropometriche mostrano una distribuzione relativamente normale con alcuni outlier:
Il peso medio è di circa 3284 grammi (±525 g)
La lunghezza media è di 494.7 cm (±26.3 cm)
La circonferenza cranica media è di 340 cm (±16.4 cm)
Gli outlier identificati richiedono particolare attenzione clinica, specialmente per i neonati con valori estremi di peso (sotto i 2500g o sopra i 4000g).
Il test chi-quadrato (p-value < 0.05) indica differenze significative nella proporzione di parti cesarei tra gli ospedali. Questo potrebbe riflettere differenze nelle politiche ospedaliere o nella complessità dei casi trattati.
I test mostrano differenze statisticamente significative tra i sessi per tutte le misure antropometriche:
I maschi tendono ad avere peso, lunghezza e circonferenza cranica mediamente maggiori
Le differenze sono più marcate per il peso
Queste differenze sono in linea con i pattern di dimorfismo sessuale neonatale attesi
# Lettura e preparazione dei dati
neonati <- read.csv("/Users/rugg/Downloads/neonati.csv", header = TRUE)
# Conversione variabili categoriche in fattori
neonati$Tipo.parto <- as.factor(neonati$Tipo.parto)
neonati$Ospedale <- as.factor(neonati$Ospedale)
neonati$Sesso <- as.factor(neonati$Sesso)
neonati$Fumatrici <- as.factor(neonati$Fumatrici)
# Creazione del modello di regressione
model <- lm(Peso ~ Gestazione + Anni.madre + N.gravidanze + Fumatrici +
Sesso + Lunghezza + Cranio, data = neonati)
# Riepilogo del modello
model_summary <- summary(model)
# Visualizzazione coefficienti in formato tabella
coef_table <- data.frame(
Variabile = names(coef(model)),
Coefficiente = coef(model),
SE = sqrt(diag(vcov(model))),
P_value = summary(model)$coefficients[,4]
)
kable(coef_table,
caption = "Coefficienti del Modello di Regressione",
digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Variabile | Coefficiente | SE | P_value | |
|---|---|---|---|---|
| (Intercept) | (Intercept) | -6714.411 | 141.151 | 0.000 |
| Gestazione | Gestazione | 32.933 | 3.827 | 0.000 |
| Anni.madre | Anni.madre | 0.958 | 1.135 | 0.398 |
| N.gravidanze | N.gravidanze | 11.276 | 4.669 | 0.016 |
| Fumatrici1 | Fumatrici1 | -30.296 | 27.597 | 0.272 |
| SessoM | SessoM | 78.085 | 11.204 | 0.000 |
| Lunghezza | Lunghezza | 10.234 | 0.301 | 0.000 |
| Cranio | Cranio | 10.518 | 0.427 | 0.000 |
# R-squared e statistiche del modello
model_stats <- data.frame(
R_squared = model_summary$r.squared,
Adj_R_squared = model_summary$adj.r.squared,
F_statistic = model_summary$fstatistic[1],
P_value = pf(model_summary$fstatistic[1],
model_summary$fstatistic[2],
model_summary$fstatistic[3],
lower.tail = FALSE)
)
kable(model_stats,
caption = "Statistiche del Modello",
digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| R_squared | Adj_R_squared | F_statistic | P_value | |
|---|---|---|---|---|
| value | 0.727 | 0.726 | 949.047 | 0 |
# Grafico della relazione tra gestazione e peso
ggplot(neonati, aes(x = Gestazione, y = Peso)) +
geom_point(alpha = 0.3) +
geom_smooth(method = "lm", color = "blue") +
theme_minimal() +
labs(title = "Relazione tra Settimane di Gestazione e Peso",
x = "Settimane di Gestazione",
y = "Peso (g)")
# Box plot del peso per stato di fumo
ggplot(neonati, aes(x = Fumatrici, y = Peso, fill = Fumatrici)) +
geom_boxplot() +
theme_minimal() +
labs(title = "Distribuzione del Peso per Stato di Fumo",
x = "Fumatrice",
y = "Peso (g)")
# Test di normalità dei residui
shapiro_test <- shapiro.test(residuals(model))
shapiro_results <- data.frame(
Statistica = shapiro_test$statistic,
P_value = shapiro_test$p.value
)
kable(shapiro_results,
caption = "Test di Shapiro-Wilk sui Residui",
digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Statistica | P_value | |
|---|---|---|
| W | 0.974 | 0 |
# Plot dei residui
par(mfrow = c(2,2))
plot(model)
Il modello di regressione lineare multipla mostra che:
Significatività del modello: Il modello spiega il 72.7% della variabilità nel peso dei neonati (R² = 0.727).
Fattori principali che influenzano il peso:
Implicazioni cliniche:
Limitazioni del modello:
# Lettura dei dati
neonati <- read.csv("/Users/rugg/Downloads/neonati.csv", header = TRUE)
# Conversione delle variabili categoriche in fattori
neonati$Tipo.parto <- factor(neonati$Tipo.parto)
neonati$Ospedale <- factor(neonati$Ospedale)
neonati$Sesso <- factor(neonati$Sesso)
neonati$Fumatrici <- factor(neonati$Fumatrici)
# Calcolo statistiche descrittive per le variabili numeriche principali
vars_numeriche <- c("Peso", "Lunghezza", "Cranio", "Gestazione", "Anni.madre")
stats_desc <- sapply(neonati[vars_numeriche], function(x) {
c(Media = mean(x, na.rm = TRUE),
SD = sd(x, na.rm = TRUE),
Mediana = median(x, na.rm = TRUE),
Min = min(x, na.rm = TRUE),
Max = max(x, na.rm = TRUE))
})
# Creazione della tabella con le statistiche descrittive
stats_table <- as.data.frame(t(stats_desc))
stats_table$Variabile <- rownames(stats_table)
stats_table <- stats_table[, c("Variabile", "Media", "SD", "Mediana", "Min", "Max")]
kable(stats_table,
caption = "Statistiche Descrittive delle Variabili Numeriche",
digits = 2) %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Variabile | Media | SD | Mediana | Min | Max | |
|---|---|---|---|---|---|---|
| Peso | Peso | 3284.08 | 525.04 | 3300 | 830 | 4930 |
| Lunghezza | Lunghezza | 494.69 | 26.32 | 500 | 310 | 565 |
| Cranio | Cranio | 340.03 | 16.43 | 340 | 235 | 390 |
| Gestazione | Gestazione | 38.98 | 1.87 | 39 | 25 | 43 |
| Anni.madre | Anni.madre | 28.16 | 5.27 | 28 | 0 | 46 |
# Standardizzazione delle variabili per il modello
neonati$Gestazione_std <- scale(neonati$Gestazione)
neonati$Anni.madre_std <- scale(neonati$Anni.madre)
neonati$N.gravidanze_std <- scale(neonati$N.gravidanze)
neonati$Lunghezza_std <- scale(neonati$Lunghezza)
neonati$Cranio_std <- scale(neonati$Cranio)
# Modello base
model_base <- lm(Peso ~ Gestazione_std + Anni.madre_std + N.gravidanze_std +
Fumatrici + Sesso + Lunghezza_std + Cranio_std,
data = neonati)
# Modello con interazioni
model_interact <- lm(Peso ~ Gestazione_std * Sesso +
Fumatrici * Gestazione_std +
Lunghezza_std * Cranio_std +
Anni.madre_std + N.gravidanze_std,
data = neonati)
# Modello non lineare
model_nonlin <- lm(Peso ~ I(Gestazione_std^2) + Gestazione_std +
Anni.madre_std + N.gravidanze_std +
Fumatrici + Sesso +
Lunghezza_std + Cranio_std,
data = neonati)
# Confronto dei modelli
model_comparison <- data.frame(
Modello = c("Base", "Con Interazioni", "Non Lineare"),
R2 = c(summary(model_base)$r.squared,
summary(model_interact)$r.squared,
summary(model_nonlin)$r.squared),
R2_adj = c(summary(model_base)$adj.r.squared,
summary(model_interact)$adj.r.squared,
summary(model_nonlin)$adj.r.squared),
AIC = c(AIC(model_base),
AIC(model_interact),
AIC(model_nonlin)),
BIC = c(BIC(model_base),
BIC(model_interact),
BIC(model_nonlin))
)
kable(model_comparison,
caption = "Confronto tra Modelli",
digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Modello | R2 | R2_adj | AIC | BIC |
|---|---|---|---|---|
| Base | 0.727 | 0.726 | 35181.39 | 35233.81 |
| Con Interazioni | 0.730 | 0.729 | 35162.00 | 35231.89 |
| Non Lineare | 0.728 | 0.727 | 35178.11 | 35236.35 |
# Selezione stepwise
step_model <- stepAIC(model_base,
direction = "both",
trace = FALSE)
# Coefficienti del modello selezionato
step_coef <- summary(step_model)$coefficients
coef_table <- data.frame(
Variabile = rownames(step_coef),
Coefficiente = step_coef[,1],
Errore_Std = step_coef[,2],
P_value = step_coef[,4]
)
kable(coef_table,
caption = "Coefficienti del Modello Selezionato",
digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Variabile | Coefficiente | Errore_Std | P_value | |
|---|---|---|---|---|
| (Intercept) | (Intercept) | 3245.272 | 7.825 | 0.000 |
| Gestazione_std | Gestazione_std | 60.417 | 7.097 | 0.000 |
| N.gravidanze_std | N.gravidanze_std | 15.975 | 5.557 | 0.004 |
| SessoM | SessoM | 77.993 | 11.202 | 0.000 |
| Lunghezza_std | Lunghezza_std | 269.728 | 7.912 | 0.000 |
| Cranio_std | Cranio_std | 173.126 | 7.001 | 0.000 |
# Relazione tra gestazione e peso per sesso
ggplot(neonati, aes(x = Gestazione, y = Peso, color = Sesso)) +
geom_point(alpha = 0.3) +
geom_smooth(method = "lm") +
theme_minimal() +
labs(title = "Relazione tra Gestazione e Peso per Sesso",
x = "Settimane di Gestazione",
y = "Peso (g)")
# Effetto non lineare della gestazione
ggplot(neonati, aes(x = Gestazione, y = Peso)) +
geom_point(alpha = 0.3) +
geom_smooth(method = "loess", color = "blue") +
geom_smooth(method = "lm", color = "red", linetype = "dashed") +
theme_minimal() +
labs(title = "Relazione Non Lineare tra Gestazione e Peso",
x = "Settimane di Gestazione",
y = "Peso (g)",
caption = "Linea blu: relazione non lineare (LOESS)\nLinea rossa: relazione lineare")
La nostra analisi ha portato a diverse conclusioni importanti che possono guidare la pratica clinica:
Struttura del modello ottimale Il modello con interazioni si è rivelato il più efficace, con un R² aggiustato superiore e un AIC inferiore rispetto al modello base. Questo significa che le relazioni tra le variabili sono più complesse di quanto si potrebbe inizialmente pensare.
Effetti principali
Interazioni significative
Implicazioni per la pratica clinica
Raccomandazioni per il monitoraggio
Questo modello fornisce uno strumento utile per la previsione del peso alla nascita, ma deve essere utilizzato come supporto al giudizio clinico, non come sostituto. La presenza di interazioni significative sottolinea l’importanza di una valutazione olistica di ciascun caso.
# Calcolo delle metriche di performance
predictions <- predict(step_model)
residuals <- residuals(step_model)
rmse <- sqrt(mean(residuals^2))
mae <- mean(abs(residuals))
r2 <- summary(step_model)$r.squared
adj_r2 <- summary(step_model)$adj.r.squared
metrics <- data.frame(
Metrica = c("R²", "R² Aggiustato", "RMSE (g)", "MAE (g)"),
Valore = c(r2, adj_r2, rmse, mae)
)
kable(metrics,
caption = "Metriche di Performance del Modello",
digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Metrica | Valore |
|---|---|
| R² | 0.727 |
| R² Aggiustato | 0.726 |
| RMSE (g) | 274.274 |
| MAE (g) | 210.900 |
# Creazione dei plot diagnostici principali
par(mfrow = c(2,2))
plot(step_model, which = 1:4)
# Test di normalità dei residui
shapiro_test <- shapiro.test(residuals)
residuals_stats <- data.frame(
Test = "Shapiro-Wilk",
Statistica = shapiro_test$statistic,
P_value = shapiro_test$p.value
)
kable(residuals_stats,
caption = "Test di Normalità dei Residui",
digits = 4) %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Test | Statistica | P_value | |
|---|---|---|---|
| W | Shapiro-Wilk | 0.9741 | 0 |
# Analisi della distribuzione dei residui
ggplot(data.frame(residuals = residuals), aes(x = residuals)) +
geom_histogram(aes(y = ..density..), bins = 30, fill = "lightblue", color = "black") +
geom_density(color = "red") +
theme_minimal() +
labs(title = "Distribuzione dei Residui",
x = "Residui (g)",
y = "Densità")
# Calcolo delle misure di influenza
cook_d <- cooks.distance(step_model)
leverage <- hatvalues(step_model)
dffits <- dffits(step_model)
influence_df <- data.frame(
Osservazione = 1:length(cook_d),
Cook_Distance = cook_d,
Leverage = leverage,
DFFITS = dffits
)
# Visualizzazione della Distanza di Cook
ggplot(influence_df, aes(x = Osservazione, y = Cook_Distance)) +
geom_point() +
geom_hline(yintercept = 4/nrow(neonati), color = "red", linetype = "dashed") +
theme_minimal() +
labs(title = "Distanza di Cook",
x = "Numero Osservazione",
y = "Distanza di Cook")
# Conteggio dei punti influenti
n_cook <- sum(cook_d > 4/nrow(neonati))
n_leverage <- sum(leverage > 2 * mean(leverage))
n_dffits <- sum(abs(dffits) > 2 * sqrt(length(coef(step_model))/nrow(neonati)))
influential_summary <- data.frame(
Metrica = c("Punti con alta Distanza di Cook",
"Punti con alto Leverage",
"Punti con alto DFFITS"),
Numero = c(n_cook, n_leverage, n_dffits)
)
kable(influential_summary,
caption = "Riepilogo dei Punti Influenti",
digits = 0) %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Metrica | Numero |
|---|---|
| Punti con alta Distanza di Cook | 124 |
| Punti con alto Leverage | 152 |
| Punti con alto DFFITS | 124 |
# Top 10 osservazioni più influenti
top_influential <- influence_df[order(-influence_df$Cook_Distance), ][1:10, ]
kable(top_influential,
caption = "Top 10 Osservazioni più Influenti",
digits = 4) %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Osservazione | Cook_Distance | Leverage | DFFITS | |
|---|---|---|---|---|
| 1551 | 1551 | 0.8301 | 0.0488 | 2.2760 |
| 310 | 310 | 0.0676 | 0.0288 | -0.6385 |
| 1780 | 1780 | 0.0335 | 0.0255 | 0.4488 |
| 155 | 155 | 0.0303 | 0.0072 | 0.4284 |
| 928 | 928 | 0.0297 | 0.0227 | 0.4229 |
| 1429 | 1429 | 0.0294 | 0.0218 | -0.4207 |
| 2452 | 2452 | 0.0235 | 0.0238 | 0.3761 |
| 2437 | 2437 | 0.0217 | 0.0239 | 0.3611 |
| 2115 | 2115 | 0.0196 | 0.0118 | -0.3433 |
| 2175 | 2175 | 0.0185 | 0.0325 | 0.3334 |
Interpretazione dei Risultati
La nostra analisi diagnostica ha rivelato diversi aspetti importanti:
Abbiamo identificato: - 124 casi con alta Distanza di Cook - 152 punti con leverage elevato - 124 casi con DFFITS significativo
# Creazione del modello base senza standardizzazione
model_base <- lm(Peso ~ Gestazione + N.gravidanze + Anni.madre +
Fumatrici + Sesso + Lunghezza + Cranio, data = neonati)
# Creazione del caso esempio
nuovo_caso <- data.frame(
Gestazione = 39,
N.gravidanze = 3,
Anni.madre = 30,
Sesso = factor("F", levels = levels(neonati$Sesso)),
Fumatrici = factor("0", levels = levels(neonati$Fumatrici)),
Lunghezza = 50,
Cranio = 34
)
# Calcolo della previsione
pred <- predict(model_base, newdata = nuovo_caso, interval = "prediction", level = 0.95)
# Creazione tabella risultati
results <- data.frame(
Stima = c("Peso Previsto", "Limite Inferiore", "Limite Superiore"),
Valore = round(c(pred[1], pred[2], pred[3]), 0)
)
kable(results,
caption = "Previsione del Peso alla Nascita",
col.names = c("Stima", "Peso (g)")) %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Stima | Peso (g) |
|---|---|
| Peso Previsto | -4498 |
| Limite Inferiore | -5102 |
| Limite Superiore | -3895 |
# Funzione per creare un nuovo caso
create_case <- function(gestazione = 39, sesso = "F", fumatrici = "0") {
data.frame(
Gestazione = gestazione,
N.gravidanze = 3,
Anni.madre = 30,
Sesso = factor(sesso, levels = levels(neonati$Sesso)),
Fumatrici = factor(fumatrici, levels = levels(neonati$Fumatrici)),
Lunghezza = 50,
Cranio = 34
)
}
# Creazione scenari
scenari <- data.frame(
Scenario = c("Base (39 settimane, F)",
"38 settimane",
"40 settimane",
"Madre fumatrice",
"Maschio"),
Peso = c(
predict(model_base, newdata = create_case(39, "F", "0")),
predict(model_base, newdata = create_case(38, "F", "0")),
predict(model_base, newdata = create_case(40, "F", "0")),
predict(model_base, newdata = create_case(39, "F", "1")),
predict(model_base, newdata = create_case(39, "M", "0"))
)
)
# Aggiunta differenze
scenari$Differenza <- round(scenari$Peso - scenari$Peso[1], 0)
scenari$Peso <- round(scenari$Peso, 0)
kable(scenari,
caption = "Analisi di Scenari - Variazione del Peso Previsto") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Scenario | Peso | Differenza |
|---|---|---|
| Base (39 settimane, F) | -4498 | 0 |
| 38 settimane | -4531 | -33 |
| 40 settimane | -4465 | 33 |
| Madre fumatrice | -4528 | -30 |
| Maschio | -4420 | 78 |
Per una neonata alla 39° settimana di gestazione, con madre alla terza gravidanza:
# Grafico base della relazione gestazione-peso
ggplot(neonati, aes(x = Gestazione, y = Peso)) +
geom_point(alpha = 0.3, color = "darkblue") +
geom_smooth(method = "lm", color = "red") +
geom_smooth(method = "loess", color = "blue", linetype = "dashed") +
theme_minimal() +
labs(title = "Relazione tra Settimane di Gestazione e Peso alla Nascita",
x = "Settimane di Gestazione",
y = "Peso (g)",
caption = "Linea rossa: regressione lineare\nLinea blu tratteggiata: trend non lineare") +
theme(plot.title = element_text(hjust = 0.5))
# Grafico dell'interazione tra fumo e gestazione
ggplot(neonati, aes(x = Gestazione, y = Peso, color = Fumatrici)) +
geom_point(alpha = 0.3) +
geom_smooth(method = "lm") +
scale_color_viridis(discrete = TRUE, begin = 0.2, end = 0.8,
name = "Madre\nFumatrice") +
theme_minimal() +
labs(title = "Impatto del Fumo sul Peso per Settimana di Gestazione",
x = "Settimane di Gestazione",
y = "Peso (g)") +
theme(plot.title = element_text(hjust = 0.5))
# Box plot del peso per sesso e fumo
ggplot(neonati, aes(x = Sesso, y = Peso, fill = Fumatrici)) +
geom_boxplot(alpha = 0.8) +
scale_fill_viridis(discrete = TRUE, begin = 0.2, end = 0.8,
name = "Madre\nFumatrice") +
theme_minimal() +
labs(title = "Distribuzione del Peso per Sesso e Abitudine al Fumo",
x = "Sesso",
y = "Peso (g)") +
theme(plot.title = element_text(hjust = 0.5))
# Creazione di un dataset per le previsioni
pred_data <- expand.grid(
Gestazione = seq(min(neonati$Gestazione), max(neonati$Gestazione), length.out = 100),
Fumatrici = factor(c("0", "1")),
Sesso = factor(c("F", "M")),
N.gravidanze = median(neonati$N.gravidanze),
Anni.madre = median(neonati$Anni.madre),
Lunghezza = median(neonati$Lunghezza),
Cranio = median(neonati$Cranio)
)
# Calcolo previsioni
pred_data$Peso_Previsto <- predict(model_base, newdata = pred_data)
# Grafico delle previsioni
ggplot(pred_data, aes(x = Gestazione, y = Peso_Previsto,
color = Fumatrici, linetype = Sesso)) +
geom_line(size = 1) +
scale_color_viridis(discrete = TRUE, begin = 0.2, end = 0.8,
name = "Madre\nFumatrice") +
theme_minimal() +
labs(title = "Previsioni del Peso alla Nascita",
subtitle = "Per settimana di gestazione, sesso e fumo",
x = "Settimane di Gestazione",
y = "Peso Previsto (g)",
linetype = "Sesso") +
theme(plot.title = element_text(hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5))
Questo progetto di analisi statistica ha permesso di sviluppare un modello predittivo affidabile per il peso dei neonati, identificando i fattori più influenti e le loro interazioni. L’analisi ha rivelato come la durata della gestazione, il sesso del neonato e il fumo materno siano i determinanti principali del peso alla nascita, con un modello che spiega circa il 72.7% della variabilità osservata.
Il progetto ha evidenziato anche differenze significative tra gli ospedali nelle pratiche cliniche, in particolare nei tassi di parti cesarei, suggerendo l’opportunità di una maggiore standardizzazione dei protocolli. L’accuratezza delle previsioni, con un errore medio di circa 274 grammi, rende il modello uno strumento utile per il supporto alle decisioni cliniche.
Le visualizzazioni sviluppate facilitano la comunicazione con i pazienti e il personale medico, permettendo di illustrare chiaramente l’impatto dei vari fattori di rischio. In particolare, l’effetto negativo del fumo e l’importanza della durata della gestazione sono ora quantificabili e comunicabili in modo efficace.
Gli ospedali possono utilizzare questi risultati per: - Identificare precocemente i casi a rischio - Personalizzare il monitoraggio in base ai fattori di rischio individuali - Migliorare la comunicazione con i pazienti - Standardizzare le pratiche cliniche tra le diverse strutture
Il modello e le analisi sviluppate forniscono una base solida per la pratica clinica basata sui dati, contribuendo al miglioramento della qualità dell’assistenza perinatale. ```