Modello Statistico per la Previsione del Peso Neonatale

I dati raccolti prevedono una serie di variabili che potrebbero risultare significative durante la modellizzazione statistica.

Variabile oggetto di analisi (variabile risposta):

Variabili esplicative di focus:

2. Analisi preliminare e Modellizzazione

df <- read.csv("neonati.csv")
attach(df)
summary(df[ , -c(3,8,9,10)]) # overview ad esclusione delle categoriali
##    Anni.madre     N.gravidanze       Gestazione         Peso     
##  Min.   : 0.00   Min.   : 0.0000   Min.   :25.00   Min.   : 830  
##  1st Qu.:25.00   1st Qu.: 0.0000   1st Qu.:38.00   1st Qu.:2990  
##  Median :28.00   Median : 1.0000   Median :39.00   Median :3300  
##  Mean   :28.16   Mean   : 0.9812   Mean   :38.98   Mean   :3284  
##  3rd Qu.:32.00   3rd Qu.: 1.0000   3rd Qu.:40.00   3rd Qu.:3620  
##  Max.   :46.00   Max.   :12.0000   Max.   :43.00   Max.   :4930  
##    Lunghezza         Cranio   
##  Min.   :310.0   Min.   :235  
##  1st Qu.:480.0   1st Qu.:330  
##  Median :500.0   Median :340  
##  Mean   :494.7   Mean   :340  
##  3rd Qu.:510.0   3rd Qu.:350  
##  Max.   :565.0   Max.   :390

In primis, si consegue un’analisi esplorativa con l’obiettivo di comprendere come si distribuiscono i dati e se sono presenti anomalie e/o outliers. In questa sede, non si presterà particolare attenzione a differenze puntuali tra le variabili in termini di indici di posizione, varibilità e forma.

par(mfrow = c(1, 3), 
    mai = c(1, 1, 0.8, 0.8),
    mar = c(2,2,2,2))

# Anni 
boxplot(Anni.madre, 
        main = "Età della madre", 
        col = 5)

# N. Gravidanze
boxplot(N.gravidanze, 
        main = "Numero gravidanze passate", 
        col = 5)

# Periodo gestazione
boxplot(Gestazione, 
        main = "Durata gestazione (settimane)", 
        col = 5)

Osservando le variabili numeriche relative alle madri (età, numero di gravidanze passate, periodo gestazione):

  • l’età ha una distribuzione tendenzialmente simmetrica e assomiglia alla “normale”. Tuttavia, non mancano gli outliers e valori anomali. Nel campione sono presenti unità statistiche che non sono interpretabili (es. età in prossimità dello 0), può essere utile sostituirle con media/mediana prima della modellizzazione

    L’età media delle madri di questo campione si aggira attorno ai 28 anni. Il 75% delle donne non supera i 32 anni, ma non mancano le eccezioni

  • la gran parte delle donne é alla prima o seconda gravidanza (il 75% del campione statistico in esame). Sono presenti anche casistiche che in questo senso sono outliers. Va tenuta in considerazione la presenza di valori elevati, che potrebbero mettere in dubbio la credibilità fisiologica

  • il peridono di gestazione “nella norma” in questo campione é di circa 39 settimane. La distribuzione ha una forte asimmetria negativa, questo suggerisce la presenza, anche se tendenzialmente rara, di unità con un periodo sensibilmente più breve rispetto al grosso del campione (presenza di outliers). Non sono presenti casi di gestazione estremamente prolungata rispetto alla norma intuibile

par(mfrow = c(1, 3), 
    mai = c(1, 1, 0.8, 0.8),
    mar = c(2,2,2,2))

# Peso 
boxplot(Peso, 
        main = "Peso neonato (g)", 
        ylab = "Peso",
        col = 5)

# Lunghezza 
boxplot(Lunghezza, 
        main = "Lunghezza del neonato (mm)", 
        ylab = "Lunghezza",
        col = 5)

# Cranio
boxplot(Cranio, 
        main = "Diametro cranio (mm)", 
        ylab = "Diametro",
        col = 5)

shapiro.test(Peso); moments::skewness(Peso)
## 
##  Shapiro-Wilk normality test
## 
## data:  Peso
## W = 0.97066, p-value < 2.2e-16
## [1] -0.6470308
moments::skewness(Lunghezza); moments::skewness(Cranio)
## [1] -1.514699
## [1] -0.7850527

Analizzando, invece, le distribuzioni delle variabili che descrivono i neonati registrati:

  • il peso del neonato (variabile di interesse), pur non superando lo Shapiro-Wilk test (si rifiuterebbe l’ipotesi nulla perché p-value < 0,05), si presenta con una distribuzione in linea con la “normale”. Mediamente i neonati pesano 3,3 kg. La distribuzione é leggermente asimettrica negativa, con la coda più lunga verso sinistra per la presenza di outliers, individui che sono sensibilmente sottopeso rispetto al grosso del campione. Si registrano anche neonati che pesano più della norma campionaria

  • lunghezza e diametro del cranio sono simili di termini di distribuzione, etrambe asimettriche negative, con la maggior parte dei neonati che tendenzialmente hanno lunghezza di 500 mm e un diametro del cranio di 340 mm. In linea con gli outliers (inferiori, e superiori) della lunghezza, sono presenti i neonati con minori/maggiori dimensioni del cranio, rispetto al resto della distribuzione

library(patchwork)

# Fumatrici 
fumatrici_bar <- ggplot() +
  geom_bar( 
    aes(x = as.factor(df$Fumatrici),
        fill = as.factor(df$Fumatrici))) +
  labs(title = "Distribuzione fumatrici", x = NULL, y = "Frequenza") +
  scale_x_discrete(labels = c("0" = "No", "1" = "Si")) +
  theme_classic() +
  theme(legend.position = "none")

# Tipo parto 
parto_bar <- ggplot() +
  geom_bar( 
    aes(x = Tipo.parto,
        fill = Tipo.parto)) +
  labs(title = "Distribuzione per tipo parto", x=NULL, y = "Frequenza") +
  scale_x_discrete(labels = c("Ces" = "Cesario", "Nat" = "Naturale")) +
  theme_classic() +
  theme(legend.position = "none")

# Ospedale
ospedale_bar <- ggplot() +
  geom_bar( 
    aes(x = Ospedale,
        fill = Ospedale)) +
  labs(title = "Distribuzione per ospedale", x=NULL, y = "Frequenza") +
  theme_classic() +
  theme(legend.position = "none")


fumatrici_bar + parto_bar + ospedale_bar

Infine, si registra che le madri fumatrici sono in netta minoranza. Il parto globalmente più praticato in questo campione é quelo naturale. La frequenza dei parti é numercamente ben distribuiti tra i tre ospedali, ma domina l’Ospedale 2

Si fanno le seguenti ipotesi che si vogliono verificare tramite opportuni test:

  1. in alcuni ospedali si fanno più parti cesarei

Trattandosi di varibaili qualitative, é opportuno verificare il test Chi-Quadrato, ragionando sulle tabelle di contigenze.

In valore assoluto, in questo campione, é vero che in alcuni ospedali il parto cesario é più frequente. Tuttavia, effentuando il test, risulta che il p-value é superiore al livello di significatività (5%). Non si rifiuta l’ipotesi di indipendenza; tra le due variabili categoriali non c’é associazione statisticamente significativa, che potrebbe essere generalizzata.

test_ChiQuadrato <- chisq.test(Ospedale,Tipo.parto)
test_ChiQuadrato
## 
##  Pearson's Chi-squared test
## 
## data:  Ospedale and Tipo.parto
## X-squared = 1.0972, df = 2, p-value = 0.5778
test_ChiQuadrato$observed
##         Tipo.parto
## Ospedale Ces Nat
##     osp1 242 574
##     osp2 254 595
##     osp3 232 603
  1. la media del peso e della lunghezza di questo campione sono significativamente uguali a quelle della popolazione

La ricerca suggerisce che il peso e la lunghezza medi dei neonati della popolazione sono rispettivamente 3300 g e 505 mm. Si vuole effettuare un T-Test per confrontare le rispettive medie del campione e quelle della popolazione.

Nel primo caso, il risultato del test, con il p-value oltre la soglia del 5%, suggerisce che si accetta l’ipotesi nulla, quindi il peso medio campionario dei neonati si conferma significativamente uguale a quello della popolazione. L’intervallo di confidenza contiene la statistica sotto l’ipotesi nulla (media della popolazione).

Nel secondo caso, invece, si legge il contrario. Il p-value é inferiore al livello di significatività e la statistica sotto l’ipotesi nulla non é contenuta nell’intervallo di confidenza. Pertanto, la media campionaria della lunghezza dei neonati é significativamente diversa dalla media della popolazione.

peso_medio_pop <- 3300
lunghezza_media_pop <- 505


t.test(Peso,
       mu = peso_medio_pop,
       alternative = "two.sided",
       conf.level = 0.95) # livello di significatività al 5%
## 
##  One Sample t-test
## 
## data:  Peso
## t = -1.516, df = 2499, p-value = 0.1296
## alternative hypothesis: true mean is not equal to 3300
## 95 percent confidence interval:
##  3263.490 3304.672
## sample estimates:
## mean of x 
##  3284.081
t.test(Lunghezza,
       mu = lunghezza_media_pop,
       alternative = "two.sided",
       conf.level = 0.95)
## 
##  One Sample t-test
## 
## data:  Lunghezza
## t = -19.583, df = 2499, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 505
## 95 percent confidence interval:
##  493.6598 495.7242
## sample estimates:
## mean of x 
##   494.692
  1. le misure antropometriche sono significativamente diverse tra i due sessi

Eseguendo un T-Test per confronti multipli (gruppi indipedenti in base al sesso), su ciascuna misura antropometrica, l’ipotesi é confermata.

Per ciascuna misura, il p-value é sotto il livello di significatività del 5%, di conseguenza si rifiuta l’ipotesi nulla di uguaglianza delle medie. Tutte le misure sono significativamente differenti tra il gruppo dei maschi e il gruppo delle femmine

pairwise.t.test(Peso,
                Sesso,
                paired = F, # gruppi indipendenti (sesso diverso)
                pool.sd = T, # ponderazione varianze gruppi
                p.adjust.method = "bonferroni") # correzione p-value
## 
##  Pairwise comparisons using t tests with pooled SD 
## 
## data:  Peso and Sesso 
## 
##   F     
## M <2e-16
## 
## P value adjustment method: bonferroni
pairwise.t.test(Lunghezza,
                Sesso,
                paired = F, 
                pool.sd = T,
                p.adjust.method = "bonferroni") 
## 
##  Pairwise comparisons using t tests with pooled SD 
## 
## data:  Lunghezza and Sesso 
## 
##   F     
## M <2e-16
## 
## P value adjustment method: bonferroni
pairwise.t.test(Cranio,
                Sesso,
                paired = F, 
                pool.sd = T,
                p.adjust.method = "bonferroni") 
## 
##  Pairwise comparisons using t tests with pooled SD 
## 
## data:  Cranio and Sesso 
## 
##   F      
## M 1.7e-13
## 
## P value adjustment method: bonferroni

Creazione del Modello di Regressione

# Chr in Factor per poter manipolare variabili categoriali. Gestione dati errati
df$Tipo.parto <- as.factor(df$Tipo.parto)
df$Ospedale <- as.factor(df$Ospedale)
df$Sesso <- as.factor(df$Sesso)

df$Anni.madre[df$Anni.madre<13] <- median(Anni.madre)
?pairs
panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor, ...)
{
    par(usr = c(0, 1, 0, 1))
    r <- abs(cor(x, y))
    txt <- format(c(r, 0.123456789), digits = digits)[1]
    txt <- paste0(prefix, txt)
    if(missing(cex.cor)) cex.cor <- 0.8/strwidth(txt)
    text(0.5, 0.5, txt, cex = cex.cor * r)
}

pairs(df, upper.panel = panel.smooth, lower.panel = panel.cor)

par(mfrow=c(1,3))

boxplot(Peso~Fumatrici,
        main = "Peso in funzione del fumo",
        col=5)

boxplot(Peso~Tipo.parto,
        main = "Peso in funzione del parto",
        col=5)

boxplot(Peso~Sesso,
        main = "Peso in funzione del sesso",
        col=5)

Dalla prima visione della matrice di correlazione e degli scatterplot per ciascuna coppia di variabili, si posso intuire alcune considerazioni rispetto alla variabile di risposta peso:

  • relazione lineare e significativa correlazione positiva con le misure antropometriche quali lunghezza e diametro del cranio

  • apparentemente buona correlazione numerica positiva con il periodo di gestazione, anche se lo scatterplot mostra la potenziale presenza di un effetto non lineare

  • l’età delle madre e il numero di gravidenze non sembrerebbero essere particolarmente correlate alla variabile di risposta, nell’ottica della successiva modellizzazione

  • vanno successivamente valutati gli effetti di interazione e/o effetti non lineari e il contributo delle variabili categoriali

Si formula il primo modello:

mod_1 <- lm(Peso ~ Anni.madre+N.gravidanze+Fumatrici+Gestazione+Lunghezza+Cranio+Tipo.parto+Ospedale+Sesso)
summary(mod_1)
## 
## Call:
## lm(formula = Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + 
##     Lunghezza + Cranio + Tipo.parto + Ospedale + Sesso)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1124.40  -181.66   -14.42   160.91  2611.89 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -6738.4762   141.3087 -47.686  < 2e-16 ***
## Anni.madre        0.8921     1.1323   0.788   0.4308    
## N.gravidanze     11.2665     4.6608   2.417   0.0157 *  
## Fumatrici       -30.1631    27.5386  -1.095   0.2735    
## Gestazione       32.5696     3.8187   8.529  < 2e-16 ***
## Lunghezza        10.2945     0.3007  34.236  < 2e-16 ***
## Cranio           10.4707     0.4260  24.578  < 2e-16 ***
## Tipo.partoNat    29.5254    12.0844   2.443   0.0146 *  
## Ospedaleosp2    -11.2095    13.4379  -0.834   0.4043    
## Ospedaleosp3     28.0958    13.4957   2.082   0.0375 *  
## SessoM           77.5409    11.1776   6.937 5.08e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 273.9 on 2489 degrees of freedom
## Multiple R-squared:  0.7289, Adjusted R-squared:  0.7278 
## F-statistic: 669.2 on 10 and 2489 DF,  p-value: < 2.2e-16

Visto l’obiettivo e il focus della ricerca, si tenta di non considerare la variabile ospedale nel modello:

mod_2 <- update(mod_1, ~. -Ospedale)
summary(mod_2)

La riduzione della complessità del modello non ha portato ad un sostanziale peggioramento dell’adattamento. Si osserva, inolte, che é insignificante l’impatto della varibile esplicativa età, che verosimilmente può essere rimossa:

mod_3 <- update(mod_2, ~. -Anni.madre)
summary(mod_3)

Si valuta l’aggiunta dell’effetto non lineare sulla variabile gestazione per intuizione dalla lettura dello scatterplot/matrice di correlazione:

mod_4 <- update(mod_3, ~. +I(Gestazione^2))
summary(mod_4)

La performance del modello migliora leggermente e l’effetto non lineare sulla variabile gestazione statisticamente coglie meglio la relazione con il peso. Tuttavia, si preferisce la versione più semplice del modello (senza l’effetto non lineare).

Osservando le caratteristiche del modello 3, si intuisce quanto in realtà il fumo non impatti significativamente il peso neonatale. Pertanto, si verifica un ulteriore modello, trascurando la variabile esplicativa fumatrici:

mod_5 <- update(mod_3, ~. -Fumatrici)
summary(mod_5)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto + Sesso)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1129.31  -181.70   -16.31   161.07  2638.85 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -6707.2971   135.9911 -49.322  < 2e-16 ***
## N.gravidanze     12.7558     4.3366   2.941   0.0033 ** 
## Gestazione       32.2713     3.7941   8.506  < 2e-16 ***
## Lunghezza        10.2864     0.3007  34.207  < 2e-16 ***
## Cranio           10.5057     0.4260  24.659  < 2e-16 ***
## Tipo.partoNat    30.0342    12.0969   2.483   0.0131 *  
## SessoM           77.9285    11.1905   6.964 4.22e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 274.3 on 2493 degrees of freedom
## Multiple R-squared:  0.7277, Adjusted R-squared:  0.727 
## F-statistic:  1110 on 6 and 2493 DF,  p-value: < 2.2e-16
anova(mod_5,mod_3)
## Analysis of Variance Table
## 
## Model 1: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Tipo.parto + 
##     Sesso
## Model 2: Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto + Sesso
##   Res.Df       RSS Df Sum of Sq      F Pr(>F)
## 1   2493 187601677                           
## 2   2492 187501837  1     99840 1.3269 0.2495
BIC(mod_5,mod_3,mod_2,mod_1)
##       df      BIC
## mod_5  8 35221.75
## mod_3  9 35228.24
## mod_2 10 35235.35
## mod_1 12 35241.84

Si conferma l’intuizione. Da una breve verifica del modello emerge che é opportuno non includere la variabile esplicativa fumatrici nel modello. La bontà di adattamento del modello R^2 adj non é peggiorata; non sono state compromesse le variabili statisticmaente significative.

Così facendo, rimangono solo le variabili che spiegano significativamente la variabile risposta peso.

Per completezza, si verificano gli effetti delle possibili interazioni tra variabili esplicative:

mod_6 <- update(mod_5, ~. + N.gravidanze*Gestazione)
summary(mod_6)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto + Sesso + N.gravidanze:Gestazione)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1128.64  -183.39   -17.14   160.06  2637.68 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             -6615.8120   158.9903 -41.611  < 2e-16 ***
## N.gravidanze              -64.8781    70.0395  -0.926   0.3544    
## Gestazione                 29.8823     4.3614   6.852 9.17e-12 ***
## Lunghezza                  10.2860     0.3007  34.207  < 2e-16 ***
## Cranio                     10.5118     0.4261  24.672  < 2e-16 ***
## Tipo.partoNat              29.9535    12.0966   2.476   0.0133 *  
## SessoM                     77.8508    11.1902   6.957 4.42e-12 ***
## N.gravidanze:Gestazione     2.0010     1.8018   1.111   0.2669    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 274.3 on 2492 degrees of freedom
## Multiple R-squared:  0.7278, Adjusted R-squared:  0.727 
## F-statistic: 951.9 on 7 and 2492 DF,  p-value: < 2.2e-16

La modellizzazione dell’interazione tra il numero di gravidanze e il periodo di gestazione non mostra effetti statisticamente sensati e significativi sulla variabile di risposta, pertanto si predilige il modello senza interazioni.

Selezione del modello e analisi della qualità

Si sceglie il modello 5 come definitivo, con i migliori parametri di performance rispetto agli altri, e con un buon grado di semplicità.

Per questo modello si rileva che:

  • R^2 aggiustato é a 0,73

  • VIF delle variabili quantitative accettabile, il rischio di multicollinearità é contenuto

  • RMSE di 273,93. Non é il minimo tra i modelli, ma idoneo considerando tutti i criteri di valutazione osservati (ANOVA, BIC, …)

rmse <- function(x){
  rmse = sqrt(mean((residuals(x)^2)))
  return(rmse)
}

rmse(mod_3); rmse(mod_4); rmse(mod_5); rmse(mod_6)
## [1] 273.8626
## [1] 273.5909
## [1] 273.9355
## [1] 273.8678
BIC(mod_6,mod_5,mod_4,mod_3,mod_2,mod_1)
##       df      BIC
## mod_6  9 35228.34
## mod_5  8 35221.75
## mod_4 10 35231.10
## mod_3  9 35228.24
## mod_2 10 35235.35
## mod_1 12 35241.84
anova(mod_5,mod_4,mod_3)
## Analysis of Variance Table
## 
## Model 1: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Tipo.parto + 
##     Sesso
## Model 2: Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto + Sesso + I(Gestazione^2)
## Model 3: Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto + Sesso
##   Res.Df       RSS Df Sum of Sq      F  Pr(>F)  
## 1   2493 187601677                              
## 2   2491 187129989  2    471687 3.1395 0.04348 *
## 3   2492 187501837 -1   -371848 4.9499 0.02618 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
car:: vif(mod_5)
## N.gravidanze   Gestazione    Lunghezza       Cranio   Tipo.parto        Sesso 
##     1.024171     1.669258     2.080039     1.626199     1.003438     1.040060

Analisi dei residui del modello

par(mar=c(4,4,2,1))
par(mfrow = c(2,2))
plot(mod_5)

shapiro.test(residuals(mod_5))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mod_5)
## W = 0.97411, p-value < 2.2e-16
lmtest::bptest(mod_5)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_5
## BP = 90.981, df = 6, p-value < 2.2e-16
lmtest::dwtest(mod_5)
## 
##  Durbin-Watson test
## 
## data:  mod_5
## DW = 1.9533, p-value = 0.121
## alternative hypothesis: true autocorrelation is greater than 0

Analizzando i test numerici per un livello di significatività del 5%, in prima battuta si osserva che:

  • i residui non superano il test di normalità (Shapiro-Wilk)

  • i residui non superano il test di omoschedasticità (Breusch-Pagan)

  • i residui superano il test di indipendenza (Durbin-Watson)

Tuttavia, dall’analisi grafica emergono alcuni outliers, in particolare l’osservazione 1551, che impatta i test numerici dei residui. Complessivamente, al netto dell’osservazione citata, le assunzioni di normalità, omoschedasticità e indipendenza dei residui potrebbero essere date per buone ai fini predittivi.

df[1551,]
##      Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio
## 1551         35            1         0         38 4370       315    374
##      Tipo.parto Ospedale Sesso
## 1551        Nat     osp3     F
# Leverage 
par(mfrow=c(1,3))
lev <- hatvalues(mod_5)
plot(lev)

# Outliers
plot(rstudent(mod_5))
abline(h=c(-2, 2), col=2)
car:: outlierTest(mod_5)
##       rstudent unadjusted p-value Bonferroni p
## 1551 10.059389         2.3162e-23   5.7905e-20
## 155   5.011861         5.7689e-07   1.4422e-03
## 1306  4.801062         1.6717e-06   4.1792e-03
# Cook
cooks_dist <- cooks.distance(mod_5)
plot(cooks_dist)

L’outlier 1551 potrebbe essere un fenomeno anomalo dal punto di vista biologico, e non un dato errato. In assenza di ulteriori considerazioni mediche, potrebbe essere un caso reale e va considerato nel modello.

3. Previsioni e Risultati

Si implementa il modello per prevedere il peso di una neonata considerando una madre alla terza gravidanza che partorirà alla 39esima settimana.

predict(mod_5, 
        newdata = data.frame(
          N.gravidanze=2, # nel dataset 0 equivale ad essere alla prima gravidanza
          Gestazione=39, 
          Lunghezza = mean(Lunghezza), 
          Cranio = mean(Cranio), 
          Tipo.parto= "Nat", # tendenzialmente il più frequnete
          Sesso = "F"))
##        1 
## 3267.678

In questo caso, utilizzando la media sul dataset per i parametri che non sono stati forniti come input, il peso previsto é di 3.267 g (o 3,27 kg).

4. Visualizzazioni

L’impatto crescente del periodo di gestazione sul peso neonatale é analogo per entrambi i sessi, con la differenza che mediamente i maschi pesano di più.

L’effetto della lunghezza sul peso, invece, é rappresentato da una curva lineare più accentuta che cresce rapidamente all’aumentare della variabile esplicativa. Tale tendenza non appare particolarmente differente tra i due sessi, diversamente dal periodo di gestazione.

peso_gestazione_sesso <- ggplot() +
  geom_point(aes(
    x = Gestazione,
    y = Peso,
    col = Sesso),
    position = "jitter") +
  geom_smooth(aes(
      x = Gestazione,
      y = Peso,
      col = Sesso),
    method = "lm",
    se = T) +
  theme(legend.position = "none")

peso_lunghezza_sesso <- ggplot() +
  geom_point(aes(
    x = Lunghezza,
    y = Peso,
    col = Sesso),
    position = "jitter") +
  geom_smooth(aes(
      x = Lunghezza,
      y = Peso,
      col = Sesso),
    method = "lm",
    se = T)

peso_gestazione_sesso + peso_lunghezza_sesso
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'

Dai dati osservati, inoltre, si riporta che nel caso di periodo di gestazione inferiore a 35 settimane, si registra il peso neonatale più alto per le casistiche di parto cesario. Nell’intorno delle 40 settimane, tuttavia, la tipologia di parto non sembra avere impatti sul peso neonatale.

ggplot() +
  geom_point(aes(
    x = Gestazione,
    y = Peso,
    col = Tipo.parto),
    position = "jitter") +
  geom_smooth(aes(
      x = Gestazione,
      y = Peso,
      col = Tipo.parto),
    method = "lm",
    se = F)
## `geom_smooth()` using formula = 'y ~ x'

Come é emerso dalla fase di modellizzazione, il fatto di essere fumatrice o meno non ha un effetto statisticamente significativo sulla variabile studio in termini predittivi. In questo campione i due gruppi sono sbilanciati (più casi di madri non fumatrici); tuttavia, in corrispondenza del periodo mediano di gestazione (39 settimane) il peso dei neonati delle madri non fumatrici risulta essere superiore.

ggplot() +
  geom_point(aes(
    x = Gestazione,
    y = Peso,
    col = as.factor(Fumatrici)),
    position = "jitter") +
  geom_smooth(aes(
      x = Gestazione,
      y = Peso,
      col = as.factor(Fumatrici)),
    method = "lm",
    se = T) +
    labs(color = "Stato Fumatrici") +
  scale_color_discrete(name = "Stato Fumatrici",
                       labels = c("Non Fumatrice", "Fumatrice"))
## `geom_smooth()` using formula = 'y ~ x'