Importa il dataset “neonati.csv” e controlla che sia stato letto correttamente dal software

setwd("C:/Users/csant/Desktop/ProfessionAI/Statistica Inferenziale")
df <- read.csv("neonati.csv")

EDA

Descrivi il dataset, la sua composizione, il tipo di variabili e l’obiettivo dello studio

print(sum(is.na.data.frame(df)))
## [1] 0

Non ci sono valori mancanti

str(df)
## '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  : chr  "Nat" "Nat" "Nat" "Nat" ...
##  $ Ospedale    : chr  "osp3" "osp1" "osp2" "osp2" ...
##  $ Sesso       : chr  "M" "F" "M" "M" ...

Il dataset è composto da 2500 osservazioni e 10 variabili. Ci sono 6 variabili quantitative (Anni.madre, N.gravidanze, Gestazione, Peso, Lunghezza e Cranio) e 4 variabili qualitative di cui 1 già codificata (Fumatrici) e altre sotto forma di stringa (Tipo.parto, Ospedale, Sesso)

Indaga le variabili effettuando una breve analisi descrittiva, utilizzando indici e strumenti grafici che conosci

cont_var <- c("Peso", "Lunghezza", "Cranio", "Anni.madre")
lista_grafici_cont <- list()

cont_var <- c("Peso", "Lunghezza", "Cranio", "Anni.madre")
lista_grafici_cont <- list()

for (colonna in cont_var){
  media <- mean(df[[colonna]])
  max_y <- max(hist(df[[colonna]], breaks=20, plot=FALSE)$counts) # Calcola l'altezza massima dei bins
  
  grafico <- ggplot(data=df) +
    geom_histogram(aes(x=.data[[colonna]]), 
                   fill = "white", 
                   color = "black",
                   bins = 20) +
    labs(title= paste("Istogramma di", colonna),
         x=colonna,
         y="Freq. Ass.") +
    theme_light() +
    geom_vline(xintercept=media, color="red") +
    annotate("text", 
             label=paste("Media =", round(media, 2)), 
             x=media, 
             y=max_y*0.9, # Posiziona il testo al 90% dell'altezza massima dell'istogramma
             color="red", 
             hjust=-0.1) # Aggiusta leggermente l'orizzontalità
  
  lista_grafici_cont[[colonna]] <- grafico
}

for (grafico in lista_grafici_cont) {
  print(grafico)
}

PESO La variabile indica il peso del neonato alla nascita registrato in grammi. Si nota che gran parte delle osservazioni presenta un peso compreso sui 3000 gr, con una media del campione pari a circa 3284 gr

LUNGHEZZA La variabile indica la lunghezza del neonato in mm. Dal grafico si vede che la maggior parte dei nascituri ha una lunghezza intorno ai 500 mm con una media di 494.69 mm

CRANIO La variabile sta ad indicare il diametro del cranio del neonato, misurato in mm. Si può notare che la maggior parte dei bambini nasce con un cranio il cui diametro va dai 320 ai 360 mm con una media di circa 340 mm

ANNI.MADRE Gran parte delle donne presenti all’interno del campione ha un età compresa tra i 24 e i 32 anni con una media di 28.16 anni. Visualizzando il grafico si nota la presenza di osservazioni con un’età inferiore ai 10 anni, il che porta a pensare ad errori di misurazione. In seguito si procede alla rimozione di tali osservazioni dal dataset

del_oss <- which(df$Anni.madre<10)
del_oss
## [1] 1152 1380
df<-df[-del_oss,]
dis_var <- c("N.gravidanze", "Gestazione")
lista_grafici_dis <- list()

for (colonna in dis_var) {
  tab_freq <- table(df[[colonna]])
  modalità <- as.numeric(names(tab_freq))
  frq <- as.numeric(tab_freq)
  prc <- round(frq / sum(frq), 3)
  df_bar <- data.frame(modalità, prc)
  
  max_prc <- max(prc) # Calcola il massimo della frequenza relativa
  media <- round(mean(df[[colonna]]), 2) # Calcola la media della colonna
  
  grafico <- ggplot(data = df_bar) +
    geom_bar(aes(x = modalità, y = prc),
             stat = "identity",
             fill = "white",
             color = "black") +
    labs(title = paste("Barplot di", colonna),
         x = colonna,
         y = "Freq. Rel.") +
    theme_light() +
    annotate("text", 
             x = max(modalità), # Posiziona il testo accanto alla barra più alta
             y = max_prc * 0.9, # Poco sotto il massimo delle barre
             label = paste("Media =", media), 
             color = "red", 
             hjust = 1) # Aggiusta l'orizzontalità per allinearlo
  
  lista_grafici_dis[[colonna]] <- grafico
}

# Stampa i grafici
for (grafico in lista_grafici_dis) {
  print(grafico)
}

N.GRAVIDANZE La variabile indica il numero di gravidanze sostenute precedentemente alla raccolta dei dati. Circa il 40% del campione è composto da donne alla prima gravidanza

GESTAZIONE La variabile sta ad indicare il numero di settimane di gestazione per la gravidanza in atto al momento della raccolta dei dati. Per il 30% del campione è stata registrata una durata della gestazione pari a 40 settimane, ovvero circa 9.2 mesi. Inoltre si riscontra una media pari 38.98 settimane di gestazione, in linea con le tempistiche comunicate dal Ministero della Salute

var_qual <- c("Tipo.parto", "Ospedale", "Sesso", "Fumatrici")
df$Fumatrici <- ifelse(df$Fumatrici==0, "No Fum.", "Fum")
lista_grafici_qual <-list()
for (colonna in var_qual) {
  tab_freq <- table(df[[colonna]])
  modalità <- rownames(tab_freq)
  frq <- c()
  for (i in seq(length(tab_freq))){ 
    frq <- c(frq, tab_freq[[i]])
  }
  prc <- round(frq/sum(frq),3)
  df_pie = data.frame(modalità, prc)
  grafico <- ggplot(df_pie, aes(x="", y=prc, fill=modalità))+
    geom_bar(stat="identity", width=1) +
    coord_polar("y", start=0)+
    geom_text(aes(label = paste0(prc, "%")), position = position_stack(vjust=0.5))+
    labs(title=paste("Pie chart di", colonna))+
    theme_void()
  lista_grafici_qual[[colonna]] <- grafico
}

for (grafico in lista_grafici_qual) {
  print(grafico)
}

TEST STATISTICI

Relazione tra Peso e variabili quantitative:

# Test di correlazione 1: Anni.madre vs Peso
cor_test1 <- cor.test(df$Anni.madre, df$Peso)
cor_label1 <- paste0("r = ", round(cor_test1$estimate, 3), 
                     "\nP = ", signif(cor_test1$p.value, 3))

# Test di correlazione 2: N.gravidanze vs Peso
cor_test2 <- cor.test(df$N.gravidanze, df$Peso)
cor_label2 <- paste0("r = ", round(cor_test2$estimate, 3), 
                     "\nP = ", signif(cor_test2$p.value, 3))

# Grafico 1: Anni.madre vs Peso
plot1 <- ggplot(data = df) +
  geom_point(aes(x = Anni.madre, y = Peso)) +
  theme_light() +
  labs(title = "Relazione tra Anni.madre e Peso") +
  annotate("text", 
           x = max(df$Anni.madre, na.rm = TRUE) * 0.9, 
           y = max(df$Peso, na.rm = TRUE) * 0.95, 
           label = cor_label1, 
           hjust = 1, size = 5, color = "red")

# Grafico 2: N.gravidanze vs Peso
plot2 <- ggplot(data = df) +
  geom_point(aes(x = N.gravidanze, y = Peso)) +
  theme_light() +
  labs(title = "Relazione tra N.gravidanze e Peso") +
  annotate("text", 
           x = max(df$N.gravidanze, na.rm = TRUE) * 0.9, 
           y = max(df$Peso, na.rm = TRUE) * 0.95, 
           label = cor_label2, 
           hjust = 1, size = 5, color = "red")

# Visualizzazione dei grafici affiancati
grid.arrange(plot1, plot2, ncol = 2)

Per entrambi i test di correlazione non si rigetta l’ipoteso nulla, per cui non ci sono evidenze di una correlazione lineare tra le variabili

Relazione tra peso e fumo:

df$Fumatrici <- as.factor(df$Fumatrici)

# Eseguo il t-test
t_test_result <- t.test(Peso ~ Fumatrici, data = df)

# Estraggo i risultati del t-test in un testo leggibile
test_result_text <- paste0(
  "t = ", round(t_test_result$statistic, 2), 
  "\ndf = ", round(t_test_result$parameter, 2), 
  "\np-value = ", signif(t_test_result$p.value, 3)
)

# Creo il boxplot e aggiungo il testo in rosso
ggplot(data = df) +
  geom_boxplot(aes(x = Fumatrici, y = Peso)) +
  annotate("text", x = 1.5, y = max(df$Peso) * 0.95, label = test_result_text, hjust = 0.5, size = 5, color = "red") +
  theme_light() +
  labs(title = "Boxplot con risultati del t-test", x = "Fumatrici", y = "Peso")

Non si rifiuta l’ipotesi nulla secondo cui il campione è estratto da una popolazione in cui il peso dei nati da mamme fumatrici, in media, è uguale a quello dei neonati da mamme non fumatrici

MODELLO

Encoding

df$Tipo.parto_ces <- ifelse(df$Tipo.parto=="Ces", 1, 0)
df$Sesso_m <- ifelse(df$Sesso=="M",1, 0)
df$Ospedale1 <- ifelse(df$Ospedale=="osp1", 1, 0)
df$Ospedale2 <- ifelse(df$Ospedale=="osp2", 1 ,0)
df$Fumatrici <- ifelse(df$Fumatrici=="Fum",1,0)
df$Tipo.parto<-NULL
df$Ospedale<-NULL
df$Sesso<-NULL

Modello con tutte le variabili:

mod1 <- lm(Peso~., df)
summary(mod1)
## 
## Call:
## lm(formula = Peso ~ ., data = df)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1123.26  -181.53   -14.45   161.05  2611.89 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    -6677.9129   141.3984 -47.228  < 2e-16 ***
## Anni.madre         0.8018     1.1467   0.699  0.48449    
## N.gravidanze      11.3812     4.6686   2.438  0.01485 *  
## Fumatrici        -30.2741    27.5492  -1.099  0.27191    
## Gestazione        32.5773     3.8208   8.526  < 2e-16 ***
## Lunghezza         10.2922     0.3009  34.207  < 2e-16 ***
## Cranio            10.4722     0.4263  24.567  < 2e-16 ***
## Tipo.parto_ces   -29.6335    12.0905  -2.451  0.01432 *  
## Sesso_m           77.5723    11.1865   6.934 5.18e-12 ***
## Ospedale1        -28.2495    13.5054  -2.092  0.03657 *  
## Ospedale2        -39.3408    13.3838  -2.939  0.00332 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 274 on 2487 degrees of freedom
## Multiple R-squared:  0.7289, Adjusted R-squared:  0.7278 
## F-statistic: 668.7 on 10 and 2487 DF,  p-value: < 2.2e-16

Interpretazione dei coefficienti:

mod1 <- update(mod1, . ~ . - Anni.madre - Fumatrici)

Ora si valuteranno eventuali relazioni non lineari tra la variabile Peso e le variabili quantitative, attraverso degli scatter-plot

variabili <- c("N.gravidanze", "Gestazione", "Lunghezza", "Cranio")

for (var in variabili) {
  gg <- ggplot(df, aes(x = Peso, y = !!sym(var))) +
    geom_point() +
    labs(title = paste("Peso vs", var), x = "Peso", y = var) +
    theme_minimal()
  print(gg)
}

Non sembrano esserci particolari evidenze di relazioni non lineari tra le variabili

Si passa, ora, alla valutazione di possibili effetti interazione tra le variabili L’idea è quella di considerare gli effetti del diametro del cranio e la lunghezza a seconda del sesso del neonato a causa delle differenze biologiche

mod2 <- update(mod1, . ~ . + Cranio:Sesso_m + Lunghezza:Sesso_m)
summary(mod2)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto_ces + Sesso_m + Ospedale1 + Ospedale2 + Cranio:Sesso_m + 
##     Lunghezza:Sesso_m, data = df)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1126.16  -179.68   -15.57   160.39  2542.38 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -6476.3416   174.2611 -37.165  < 2e-16 ***
## N.gravidanze         12.6319     4.3353   2.914  0.00360 ** 
## Gestazione           32.2913     3.7948   8.509  < 2e-16 ***
## Lunghezza             9.8800     0.3779  26.143  < 2e-16 ***
## Cranio               10.5670     0.5800  18.218  < 2e-16 ***
## Tipo.parto_ces      -29.9122    12.0919  -2.474  0.01344 *  
## Sesso_m            -336.1235   249.2982  -1.348  0.17769    
## Ospedale1           -29.0970    13.5015  -2.155  0.03125 *  
## Ospedale2           -39.5767    13.3766  -2.959  0.00312 ** 
## Cranio:Sesso_m       -0.2255     0.8414  -0.268  0.78873    
## Lunghezza:Sesso_m     0.9897     0.5324   1.859  0.06313 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 273.9 on 2487 degrees of freedom
## Multiple R-squared:  0.7292, Adjusted R-squared:  0.7281 
## F-statistic: 669.7 on 10 and 2487 DF,  p-value: < 2.2e-16

Si procede all’eliminazione dell’effetto interazione tra Cranio e Sesso in quanto non significativo

mod2 <- update(mod2, . ~ . - Cranio:Sesso_m)
summary(mod2)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto_ces + Sesso_m + Ospedale1 + Ospedale2 + Lunghezza:Sesso_m, 
##     data = df)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1125.75  -180.44   -14.99   160.50  2552.59 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -6459.7376   162.8443 -39.668  < 2e-16 ***
## N.gravidanze         12.6042     4.3333   2.909  0.00366 ** 
## Gestazione           32.3232     3.7922   8.524  < 2e-16 ***
## Lunghezza             9.9165     0.3525  28.134  < 2e-16 ***
## Cranio               10.4614     0.4256  24.579  < 2e-16 ***
## Tipo.parto_ces      -29.7854    12.0804  -2.466  0.01375 *  
## Sesso_m            -370.9609   212.6825  -1.744  0.08125 .  
## Ospedale1           -29.2343    13.4892  -2.167  0.03031 *  
## Ospedale2           -39.6524    13.3711  -2.966  0.00305 ** 
## Lunghezza:Sesso_m     0.9051     0.4287   2.111  0.03484 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 273.8 on 2488 degrees of freedom
## Multiple R-squared:  0.7292, Adjusted R-squared:  0.7282 
## F-statistic: 744.4 on 9 and 2488 DF,  p-value: < 2.2e-16

Come da ipotesi iniziale, ad un incremento unitario del diametro del cranio (in mm) è associato un incremento del peso per i maschi maggiore di 0.9 rispetto alle femmine

Inoltre, gli effetti degli incrementi unitari di Lunghezza e Cranio sul Peso possono essere diversi a seconda della fase di gestazione

mod3 <- update(mod2, . ~ . + Cranio:Gestazione + Lunghezza:Gestazione)
summary(mod3)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto_ces + Sesso_m + Ospedale1 + Ospedale2 + Lunghezza:Sesso_m + 
##     Gestazione:Cranio + Gestazione:Lunghezza, data = df)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1111.19  -180.98   -11.23   160.23  2627.19 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          -289.88102 1105.95615  -0.262  0.79326    
## N.gravidanze           13.16807    4.30870   3.056  0.00227 ** 
## Gestazione           -134.04317   29.71628  -4.511 6.76e-06 ***
## Lunghezza               9.68690    3.75643   2.579  0.00997 ** 
## Cranio                 -8.29203    6.42519  -1.291  0.19698    
## Tipo.parto_ces        -28.44580   12.01095  -2.368  0.01795 *  
## Sesso_m              -227.62363  214.07559  -1.063  0.28776    
## Ospedale1             -30.12508   13.41126  -2.246  0.02478 *  
## Ospedale2             -38.55530   13.29453  -2.900  0.00376 ** 
## Lunghezza:Sesso_m       0.60413    0.43188   1.399  0.16199    
## Gestazione:Cranio       0.49155    0.16609   2.960  0.00311 ** 
## Gestazione:Lunghezza    0.01480    0.09779   0.151  0.87973    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 272.2 on 2486 degrees of freedom
## Multiple R-squared:  0.7326, Adjusted R-squared:  0.7314 
## F-statistic: 619.3 on 11 and 2486 DF,  p-value: < 2.2e-16

Si elimina l’effetto interazione tra Gestazione e Lunghezza perchè non significativo

mod3 <- update(mod3, . ~ . - Gestazione:Lunghezza)
summary(mod3)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto_ces + Sesso_m + Ospedale1 + Ospedale2 + Lunghezza:Sesso_m + 
##     Gestazione:Cranio, data = df)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1111.65  -181.00   -11.47   160.10  2628.13 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -286.78964 1105.55024  -0.259  0.79534    
## N.gravidanze        13.16530    4.30781   3.056  0.00227 ** 
## Gestazione        -134.01702   29.70994  -4.511 6.76e-06 ***
## Lunghezza           10.25282    0.35534  28.854  < 2e-16 ***
## Cranio              -9.10808    3.49277  -2.608  0.00917 ** 
## Tipo.parto_ces     -28.45331   12.00849  -2.369  0.01789 *  
## Sesso_m           -231.06313  212.82384  -1.086  0.27772    
## Ospedale1          -30.15342   13.40732  -2.249  0.02460 *  
## Ospedale2          -38.58702   13.29027  -2.903  0.00372 ** 
## Lunghezza:Sesso_m    0.61122    0.42924   1.424  0.15458    
## Gestazione:Cranio    0.51259    0.09081   5.644 1.85e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 272.1 on 2487 degrees of freedom
## Multiple R-squared:  0.7326, Adjusted R-squared:  0.7315 
## F-statistic: 681.5 on 10 and 2487 DF,  p-value: < 2.2e-16

Non è significativa l’interazione tra Sesso e Lunghezza

mod3 <- update(mod3, . ~ . - Sesso_m:Lunghezza)
summary(mod3)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto_ces + Sesso_m + Ospedale1 + Ospedale2 + Gestazione:Cranio, 
##     data = df)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1102.79  -181.11   -11.67   161.68  2675.01 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -224.27159 1104.90623  -0.203  0.83917    
## N.gravidanze        13.00405    4.30721   3.019  0.00256 ** 
## Gestazione        -139.29724   29.48371  -4.725 2.43e-06 ***
## Lunghezza           10.52218    0.30086  34.973  < 2e-16 ***
## Cranio              -9.68667    3.46977  -2.792  0.00528 ** 
## Tipo.parto_ces     -28.16143   12.00922  -2.345  0.01911 *  
## Sesso_m             71.57291   11.15549   6.416 1.67e-10 ***
## Ospedale1          -29.88706   13.40878  -2.229  0.02591 *  
## Ospedale2          -38.57652   13.29301  -2.902  0.00374 ** 
## Gestazione:Cranio    0.52828    0.09016   5.859 5.26e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 272.2 on 2488 degrees of freedom
## Multiple R-squared:  0.7324, Adjusted R-squared:  0.7314 
## F-statistic: 756.6 on 9 and 2488 DF,  p-value: < 2.2e-16

Il coefficiente di Gestazione:Lunghezza è positivo, quindi all’aumentare della gestazione, ad un incremento di 1mm del diametro del cranio, è associato, in media, un incremento del peso sempre maggiore, pari a 0.5*Gestazione

Si nota un incremento dell’R2 aggiustato rispetto al modello che include la sola interazione tra Sesso e Lunghezza (mod2). Questo modello spiega circa il 73% della variabilità del peso dei neonati.

Si sottopongono i tre modelli alla procedura BIC al fine di individuare il modello più parsimonioso

kable(BIC(mod1, mod2, mod3))
df BIC
mod1 10 35201.52
mod2 11 35204.87
mod3 11 35175.11

Il modello 3, con l’interazione tra Gestazione e Cranio, ha un BIC più basso e verrà preso d’ora in avanti come modello di riferimento

VERIFICA DELLE ASSUNZIONI

MULTICOLLINEARITÁ

kable(vif(mod3, type = "predictor"))
## GVIFs computed for predictors
GVIF Df GVIF^(1/(2*Df)) Interacts With Other Predictors
N.gravidanze 1.025968 1 1.012901 Gestazione, Lunghezza, Cranio, Tipo.parto_ces, Sesso_m, Ospedale1, Ospedale2
Gestazione 2.143686 3 1.135517 Cranio N.gravidanze, Lunghezza, Tipo.parto_ces, Sesso_m, Ospedale1, Ospedale2
Lunghezza 2.114847 1 1.454251 N.gravidanze, Gestazione, Cranio, Tipo.parto_ces, Sesso_m, Ospedale1, Ospedale2
Cranio 2.143686 3 1.135517 Gestazione N.gravidanze, Lunghezza, Tipo.parto_ces, Sesso_m, Ospedale1, Ospedale2
Tipo.parto_ces 1.004155 1 1.002075 N.gravidanze, Gestazione, Lunghezza, Cranio, Sesso_m, Ospedale1, Ospedale2
Sesso_m 1.048959 1 1.024187 N.gravidanze, Gestazione, Lunghezza, Cranio, Tipo.parto_ces, Ospedale1, Ospedale2
Ospedale1 1.333402 1 1.154730 N.gravidanze, Gestazione, Lunghezza, Cranio, Tipo.parto_ces, Sesso_m, Ospedale2
Ospedale2 1.335959 1 1.155837 N.gravidanze, Gestazione, Lunghezza, Cranio, Tipo.parto_ces, Sesso_m, Ospedale1

Non ci sono problemi

DIAGNOSTICA DEI RESIDUI

plot(mod1)

  • Assunzione degli errori a media 0 rispettata, non visualizzo dei pattern

  • Assunzione distribuzione normale errori non perfettamente rispettata, problema nelle code che presentano osservazioni che si discostano dalla bisettrice

  • Assunzione omoschedasticità rispettata, visualizzo una nube casuale di punti

  • Osservazione 1551 da monitorare

kable(df[1551,])
Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio Tipo.parto_ces Sesso_m Ospedale1 Ospedale2
1553 30 4 0 35 4520 520 360 0 0 0 1

L’ID 1551 ha un peso superiore alla media (condizionata al sesso e alla gestazione)

df$Peso[rownames(df) == "1551"] > mean(df$Peso[df$Sesso_m == 0 & df$Gestazione == 38])
## [1] TRUE

PREVISIONE

Ho utilizzato media condizionata e moda per imputare i valori non ancora conosciuti

prd <- data.frame(Cranio = mean(df$Cranio[df$Sesso_m==0 & df$Gestazione==39]), Sesso_m = 0, Gestazione = 39, Lunghezza = mean(df$Lunghezza[df$Sesso_m==0 & df$Gestazione==39]), N.gravidanze = 2, Tipo.parto_ces = 0, Ospedale1 = 0, Ospedale2 = 0)
kable(predict(mod3, newdata=prd))
x
3252.509

VISUALIZZAZIONI

ggplot(data = df) +
  geom_point(aes(y = predict(mod3), x = Gestazione, color = factor(Fumatrici))) +
  labs(title = "Impatto di settimane di gestazione e fumo sul peso",
       x = "Settimane di gestazione",
       y = "Peso Previsto",
       color = "Fumatrici") +  # Titolo della legenda
  scale_color_manual(values = c("0" = "blue", "1" = "red"),  # Colori per 0 e 1
                     labels = c("0" = "Non fumatrice", "1" = "Fumatrice")) +  # Etichette leggibili
  theme_light()

Dal grafico si evince una correlazione positiva tra peso previsto e settimane di gestazione. Non ci sono evidenze di relazioni con l’essere o meno fumatrice