1. Caricamento dei dati e setup

# 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)

2. Analisi e Modellizzazione

2.1. Analisi preliminare

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"))
Statistiche Descrittive delle Misure Antropometriche
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"))
Analisi degli Outlier (|z-score| > 2)
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"))
Distribuzione dei Tipi di Parto per Ospedale
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"))
Risultati Test Chi-quadrato
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"))
Risultati T-test per Differenze tra Sessi
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)

Commento

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).

Parti Cesarei tra Ospedali

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.

Differenze tra Sessi

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


2.2. Modello di Regressione Lineare Multipla

Preparazione dei Dati

# 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

# 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"))
Coefficienti del Modello di Regressione
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"))
Statistiche del Modello
R_squared Adj_R_squared F_statistic P_value
value 0.727 0.726 949.047 0

Visualizzazione delle Relazioni Principali

# 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)")

Diagnostica del Modello

# 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"))
Test di Shapiro-Wilk sui Residui
Statistica P_value
W 0.974 0
# Plot dei residui
par(mfrow = c(2,2))
plot(model)

Interpretazione dei Risultati

Il modello di regressione lineare multipla mostra che:

  1. Significatività del modello: Il modello spiega il 72.7% della variabilità nel peso dei neonati (R² = 0.727).

  2. Fattori principali che influenzano il peso:

    • La durata della gestazione ha un effetto positivo significativo: ogni settimana aggiuntiva è associata a un aumento di 33 grammi
    • Il fumo materno è associato a una riduzione media del peso di 30 grammi
    • I neonati maschi pesano in media 78 grammi in più rispetto alle femmine
  3. Implicazioni cliniche:

    • Monitoraggio più attento delle gravidanze con durata inferiore a 37 settimane
    • Particolare attenzione alle madri fumatrici per il rischio di basso peso alla nascita
    • Considerare il sesso del nascituro nella valutazione del peso atteso
  4. Limitazioni del modello:

    • Il test di Shapiro-Wilk sui residui indica alcune deviazioni dalla normalità
    • Potrebbero esserci interazioni non considerate tra le variabili
    • Altri fattori non misurati potrebbero influenzare il peso alla nascita

2.3. Selezione del Modello Ottimale

Preparazione e Analisi dei Dati

# 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"))
Statistiche Descrittive delle Variabili Numeriche
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)

Costruzione dei Modelli

# 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"))
Confronto tra Modelli
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 del Modello Ottimale

# 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"))
Coefficienti del Modello Selezionato
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

Visualizzazione delle Relazioni Principali

# 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")

Interpretazione dei Risultati

La nostra analisi ha portato a diverse conclusioni importanti che possono guidare la pratica clinica:

  1. 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.

  2. Effetti principali

    • La durata della gestazione è il predittore più forte del peso alla nascita
    • Il sesso del neonato ha un effetto significativo, con i maschi che tendono ad avere un peso maggiore
    • Il fumo materno ha un impatto negativo sul peso, particolarmente nelle gestazioni più brevi
  3. Interazioni significative

    • L’effetto della gestazione sul peso varia in base al sesso del neonato
    • L’impatto del fumo è più pronunciato nelle gestazioni più brevi
    • Esiste una relazione non lineare tra gestazione e peso
  4. Implicazioni per la pratica clinica

    • È necessario considerare contemporaneamente più fattori per una valutazione accurata del peso atteso
    • Le gestanti fumatrici richiedono un monitoraggio più attento, specialmente nelle gestazioni più brevi
    • Le previsioni di peso devono essere aggiustate in base al sesso del nascituro
  5. Raccomandazioni per il monitoraggio

    • Intensificare il monitoraggio nelle gravidanze che presentano più fattori di rischio
    • Prestare particolare attenzione quando la gestazione è più breve della media
    • Considerare che l’effetto dei fattori di rischio non è costante durante la gravidanza

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.


2.4. Analisi della qualità del Modello

Metriche di Performance del Modello

# 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"))
Metriche di Performance del Modello
Metrica Valore
0.727
R² Aggiustato 0.726
RMSE (g) 274.274
MAE (g) 210.900

Analisi dei Residui

# 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 di Normalità dei Residui
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à")

Analisi dei Punti Influenti

# 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"))
Riepilogo dei Punti Influenti
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"))
Top 10 Osservazioni più Influenti
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:

A. Performance Globale del Modello

  • R² = 0.727: il modello spiega il 72.7% della variabilità nel peso
  • RMSE = 274 grammi: rappresenta l’errore medio di previsione
  • MAE = 211 grammi: indica la deviazione media assoluta

B. Analisi dei Residui

  • Il test di Shapiro-Wilk (p-value = <2e-16) indica alcune deviazioni dalla normalità
  • I grafici diagnostici mostrano una varianza relativamente costante
  • Sono presenti alcuni outlier che meritano attenzione

C. Punti Influenti

Abbiamo identificato: - 124 casi con alta Distanza di Cook - 152 punti con leverage elevato - 124 casi con DFFITS significativo

D. Implicazioni Cliniche

  1. Affidabilità delle Previsioni:
    • Il modello è più accurato per casi nella fascia centrale
    • L’errore medio di 274 grammi deve essere considerato nelle previsioni
  2. Gestione dei Casi Estremi:
    • I casi identificati come influenti richiedono particolare attenzione clinica
    • Per i neonati con caratteristiche simili ai punti influenti, si consiglia un monitoraggio più frequente
  3. Raccomandazioni Pratiche:
    • Utilizzare il modello come supporto, non come sostituto del giudizio clinico
    • Per i casi che si discostano significativamente dalle previsioni:
      • Verificare accuratamente tutte le misurazioni
      • Considerare fattori di rischio aggiuntivi
      • Implementare protocolli di monitoraggio specifici
  4. Limitazioni:
    • Le previsioni sono meno affidabili per i casi estremi
    • Il modello potrebbe non catturare alcune interazioni complesse
    • L’interpretazione richiede sempre l’expertise clinica ``` ________________________________________________________________________________________________________________

3. Previsioni e risultati

A. Caso Esempio: Neonata alla 39° settimana

# 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"))
Previsione del Peso alla Nascita
Stima Peso (g)
Peso Previsto -4498
Limite Inferiore -5102
Limite Superiore -3895

B. Analisi di Scenari Alternativi

# 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"))
Analisi di Scenari - Variazione del Peso Previsto
Scenario Peso Differenza
Base (39 settimane, F) -4498 0
38 settimane -4531 -33
40 settimane -4465 33
Madre fumatrice -4528 -30
Maschio -4420 78

Interpretazione dei Risultati

1. Previsione Base

Per una neonata alla 39° settimana di gestazione, con madre alla terza gravidanza:

  • Il peso previsto è di -4498 grammi
  • L’intervallo di predizione al 95% va da -5102 a -3895 grammi
  • L’ampiezza dell’intervallo (1207 grammi) indica il grado di incertezza della previsione

2. Impatto dei Diversi Fattori

  1. Settimana di Gestazione:
    • Una settimana in meno (38ª) comporta una riduzione di 33 grammi
    • Una settimana in più (40ª) comporta un aumento di 33 grammi
    • In media, ogni settimana di gestazione influenza il peso di circa 33 grammi
  2. Altri Fattori:
    • Il fumo materno riduce il peso atteso di 30 grammi
    • I maschi pesano mediamente 78 grammi in più delle femmine

3. Raccomandazioni Cliniche

  1. Monitoraggio:
    • Range normale atteso: -5102 - -3895 grammi
    • Attenzione particolare se:
      • Peso stimato vicino agli estremi dell’intervallo
      • Presenza di fattori di rischio multipli
      • Madre fumatrice
  2. Gestione del Rischio:
    • Monitoraggio più frequente per:
      • Gestazioni < 38 settimane
      • Madri fumatrici
      • Casi con multiple complicazioni
  3. Comunicazione con i Pazienti:
    • Spiegare il range di peso normale atteso
    • Enfatizzare l’importanza di evitare il fumo
    • Rassicurare sulla normale variabilità tra maschi e femmine
    • Ricordare che sono stime indicative che supportano, ma non sostituiscono, il giudizio clinico ``` ________________________________________________________________________________________________________________

4. Visualizzazioni delle Relazioni Chiave

A. Impatto della Gestazione sul Peso

# 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))

B. Effetto del Fumo sul Peso per Settimana di Gestazione

# 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))

C. Distribuzione del Peso per Sesso e Fumo

# 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))

D. Previsioni del Modello

# 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))

Interpretazione delle Visualizzazioni

A. Relazione Gestazione-Peso

  • Si osserva una forte relazione positiva tra settimane di gestazione e peso
  • La relazione è principalmente lineare, con una leggera curvatura nelle settimane estreme
  • La variabilità del peso aumenta leggermente con l’avanzare della gestazione

B. Impatto del Fumo

  • Le madri fumatrici tendono ad avere neonati con peso inferiore in tutte le settimane di gestazione
  • La differenza di peso tra fumatori e non fumatori è più marcata nelle ultime settimane
  • L’effetto negativo del fumo si mantiene costante attraverso le settimane di gestazione

C. Differenze per Sesso

  • I maschi mostrano un peso mediamente superiore rispetto alle femmine
  • L’effetto del fumo è dannoso indipendentemente dal sesso
  • La variabilità del peso è simile tra maschi e femmine

D. Previsioni del Modello

  • Le previsioni mostrano un aumento costante del peso con la gestazione
  • L’effetto combinato di sesso e fumo produce quattro traiettorie distinte
  • Le differenze tra gruppi si mantengono proporzionali attraverso le settimane

Implicazioni Cliniche

  1. Monitoraggio della Gestazione:
    • Particolare attenzione nelle settimane estreme di gestazione
    • Controlli più frequenti per le madri fumatrici
  2. Valutazione del Rischio:
    • Considerare l’effetto combinato di più fattori
    • Il fumo rappresenta un fattore di rischio significativo in ogni fase
  3. Comunicazione con i Pazienti:
    • Utilizzare i grafici per spiegare l’impatto del fumo
    • Evidenziare l’importanza di una gestazione completa
    • Spiegare le normali differenze attese tra maschi e femmine ```

5. Conclusioni

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. ```