INTRODUZIONE

Lo scopo di questo progetto è lo svuluppo di un modello statistico che possa prevedere con precisione il peso dei neonati alla nascita. La base dati è stata raccolta su 2500 neonati di 3 diversi ospedali.

library(ggplot2)
library(moments)
library(dplyr)
## 
## Caricamento pacchetto: 'dplyr'
## I seguenti oggetti sono mascherati da 'package:stats':
## 
##     filter, lag
## I seguenti oggetti sono mascherati da 'package:base':
## 
##     intersect, setdiff, setequal, union
library(zoo)
## 
## Caricamento pacchetto: 'zoo'
## I seguenti oggetti sono mascherati da 'package:base':
## 
##     as.Date, as.Date.numeric
library(MASS)
## Warning: il pacchetto 'MASS' è stato creato con R versione 4.5.2
## 
## Caricamento pacchetto: 'MASS'
## Il seguente oggetto è mascherato da 'package:dplyr':
## 
##     select
library(car)
## Warning: il pacchetto 'car' è stato creato con R versione 4.5.2
## Caricamento del pacchetto richiesto: carData
## Warning: il pacchetto 'carData' è stato creato con R versione 4.5.2
## 
## Caricamento pacchetto: 'car'
## Il seguente oggetto è mascherato da 'package:dplyr':
## 
##     recode
setwd("C:/Users/Utente/OneDrive/Desktop")

# Carico il dataset in R

dati <- read.csv("neonati.csv")

ANALISI PRELIMINARE

Di seguito verrà svolta una veloce analisi descrittiva delle variabili prese in considerazione.

Anni madre: quantitativa discreta su scala di rapporti. N. Gravidanze: quantitativa discreta su scala di rapporti. Fumatrici: qualitativa binaria dummy. Gestazione: quantitativa discreta su scala di rapporti. Peso: quantitativa continua su scala di rapporti. Lunghezza: quantitativa continua su scala di rapporti. Cranio: quantitativa continua su scala di rapporti. Parto: qualitativa binaria. Ospedale: qualitativa su scala nominale. Sesso: qualitativa binaria.

summary(dati)
##    Anni.madre     N.gravidanze       Fumatrici        Gestazione   
##  Min.   : 0.00   Min.   : 0.0000   Min.   :0.0000   Min.   :25.00  
##  1st Qu.:25.00   1st Qu.: 0.0000   1st Qu.:0.0000   1st Qu.:38.00  
##  Median :28.00   Median : 1.0000   Median :0.0000   Median :39.00  
##  Mean   :28.16   Mean   : 0.9812   Mean   :0.0416   Mean   :38.98  
##  3rd Qu.:32.00   3rd Qu.: 1.0000   3rd Qu.:0.0000   3rd Qu.:40.00  
##  Max.   :46.00   Max.   :12.0000   Max.   :1.0000   Max.   :43.00  
##       Peso        Lunghezza         Cranio     Tipo.parto       
##  Min.   : 830   Min.   :310.0   Min.   :235   Length:2500       
##  1st Qu.:2990   1st Qu.:480.0   1st Qu.:330   Class :character  
##  Median :3300   Median :500.0   Median :340   Mode  :character  
##  Mean   :3284   Mean   :494.7   Mean   :340                     
##  3rd Qu.:3620   3rd Qu.:510.0   3rd Qu.:350                     
##  Max.   :4930   Max.   :565.0   Max.   :390                     
##    Ospedale            Sesso          
##  Length:2500        Length:2500       
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 

Dai risultati del summary probabilmente ci saranno degli outlier nella variabile “Anni.madre” (è impossibile abbia 0 anni una madre al momento del parto) e anche nella variabile “N.gravidanze” (probabilmente il dato 12 gravidanze sarà un outlier).

Al fine di approfondire la distribuzione e la presenza di outlier per le variabili “Anni.madre”, “N.gravidanze”, “Gestazione”, “Peso”, “Lunghezza” e “Cranio” saranno utilizzati dei boxplots:

boxplot_var <- c("Anni.madre", "N.gravidanze", "Gestazione", "Peso", "Lunghezza", "Cranio")

for (i in boxplot_var) {

  graphs <- ggplot(dati, aes_string(y = i)) +
    geom_boxplot() +
    labs(x = i, title = paste("Boxplot di", i))

  print(graphs)
}
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Nei boxplot precedenti è riassunta la distribuzione delle variabili e sottolineano la presenza di molti outlier.

Prima di procedere, riassumiamo anche la distribuzione delle variabili qualitative utilizzando anche dei grafici a barre per dare un indicazione visiva:

barplot_var <- c("Fumatrici", "Tipo.parto", "Ospedale", "Sesso")

for (i in barplot_var) {
  cat("\nTabella di", i, "\n")
  print(table(dati[[i]]))
  cat("Percentuali:\n")
  print(round(prop.table(table(dati[[i]])) * 100, 2))
  
   graphs<- ggplot(dati, aes(x = .data[[i]])) +
    geom_bar(fill = "steelblue") +
    labs(
      x = i,
      y = "Frequenza",
      title = paste("Distribuzione di", i)
    ) +
    theme_minimal()

  print(graphs)
}
## 
## Tabella di Fumatrici 
## 
##    0    1 
## 2396  104 
## Percentuali:
## 
##     0     1 
## 95.84  4.16

## 
## Tabella di Tipo.parto 
## 
##  Ces  Nat 
##  728 1772 
## Percentuali:
## 
##   Ces   Nat 
## 29.12 70.88

## 
## Tabella di Ospedale 
## 
## osp1 osp2 osp3 
##  816  849  835 
## Percentuali:
## 
##  osp1  osp2  osp3 
## 32.64 33.96 33.40

## 
## Tabella di Sesso 
## 
##    F    M 
## 1256 1244 
## Percentuali:
## 
##     F     M 
## 50.24 49.76

Per saggiare l’ipotesi che in alcuni ospedali si fanno più parti cesarei verrà utilizzato il test chi-quadrato:

chisq.test(dati$Ospedale,dati$Tipo.parto)
## 
##  Pearson's Chi-squared test
## 
## data:  dati$Ospedale and dati$Tipo.parto
## X-squared = 1.0972, df = 2, p-value = 0.5778

Dal test chi-quadrato si ottiene un p-value maggiore di 0.05 dunque NON si rifiuta l’ipotesi nulla e perciò non c’è evidenza statistica che in alcuni ospedali ci siano più parti cesarei. Al fine di visualizzare la situazione graficamente in seguito un barplot con la % di parti cesarei rispetto all’ospedale.

perc <- prop.table(table(dati$Ospedale, dati$Tipo.parto),
                   margin = 1)[, "Ces"] * 100

df_plot <- data.frame(
  Ospedale = names(perc),
  Perc_cesarei = as.numeric(perc)
)

ggplot(df_plot, aes(x = Ospedale, y = Perc_cesarei)) +
  geom_col(fill = "steelblue") +
  geom_text(aes(label = paste0(round(Perc_cesarei, 1), "%")),
            vjust = -0.3) +
  ylim(0, 100) +
  labs(
    x = "Ospedale",
    y = "Percentuale di parti cesarei",
    title = "Percentuale di parti cesarei per ospedale"
  ) +
  theme_minimal()

Il grafico conferma il risultato del test chi-quadrato, infatti la percentale di parti cesarei per ospedale è molto simile.

Dalla letteratura, il peso medio e la lunghezza media di un neonato in Italia è di rispettivamente 3255 g e 496 mm (National, longitudinal NASCITA birth cohort study to investigate the health of Italian children and potential influencing factors; C. Pandolfini, A. Clavenna, M. Cartabia, R. Campi, M. Bonati).

Prima di tutto si controlla se i dati di “Peso”, “Lunghezza” e “Cranio” si distribuiscono secondo una distribuzione normale tramite lo Shapiro test:

shapiro.test(dati$Peso)
## 
##  Shapiro-Wilk normality test
## 
## data:  dati$Peso
## W = 0.97066, p-value < 2.2e-16
shapiro.test(dati$Lunghezza)
## 
##  Shapiro-Wilk normality test
## 
## data:  dati$Lunghezza
## W = 0.90941, p-value < 2.2e-16
shapiro.test(dati$Cranio)
## 
##  Shapiro-Wilk normality test
## 
## data:  dati$Cranio
## W = 0.96357, p-value < 2.2e-16

Al fine di saggiare l’ipotesi che la media del peso e della lunghezza di questo campione di neonati sono significativamente uguali a quelle della popolazione utilizzerò il t-test poichè la distribuzione dei dati non è normale come si può vedere dai risultati dello Shapiro-Wilk test.

t.test(dati$Peso,
       mu = 3255,
       alternative = "two.sided",
       conf.level = 0.95)
## 
##  One Sample t-test
## 
## data:  dati$Peso
## t = 2.7694, df = 2499, p-value = 0.005658
## alternative hypothesis: true mean is not equal to 3255
## 95 percent confidence interval:
##  3263.490 3304.672
## sample estimates:
## mean of x 
##  3284.081
t.test(dati$Lunghezza,
       mu = 496,
       alternative = "two.sided",
       conf.level = 0.95)
## 
##  One Sample t-test
## 
## data:  dati$Lunghezza
## t = -2.4849, df = 2499, p-value = 0.01302
## alternative hypothesis: true mean is not equal to 496
## 95 percent confidence interval:
##  493.6598 495.7242
## sample estimates:
## mean of x 
##   494.692

Il p-value risultante da entrambi i t-test riportano un p-value minore di 0.05 perciò si rifiuta l’ipotesi nulla e quindi c’è evidenza statistica che la media del nostro campione è diversa da quella della popolazione (valore da letteratura). In particolare il peso medio della popolazione risulta minore all’estremo inferiore dell’intervallo di confidenza dei pesi del nostro campione mentre la lunghezza media della popolazione risulta maggiore all’estremo superiore dell’intervallo di confidenza del nostro campione.

Al fine di saggiare l’ipotesi che le misure antropometriche sono significativamente diverse tra i due sessi si utilizzerà il t-test per confronto tra gruppi indipendenti; anche se i campioni non seguono una distribuzione normale si può procedere considerando la numerosità del campione e dunque l’applicabilità del test è assicurata dal teorema dei limiti centrali.

# Peso alla nascita
t.test(Peso ~ Sesso, data = dati)
## 
##  Welch Two Sample t-test
## 
## data:  Peso by Sesso
## t = -12.106, df = 2490.7, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
##  -287.1051 -207.0615
## sample estimates:
## mean in group F mean in group M 
##        3161.132        3408.215
# Lunghezza
t.test(Lunghezza ~ Sesso, data = dati)
## 
##  Welch Two Sample t-test
## 
## data:  Lunghezza by Sesso
## t = -9.582, df = 2459.3, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
##  -11.929470  -7.876273
## sample estimates:
## mean in group F mean in group M 
##        489.7643        499.6672
# Diametro cranico
t.test(Cranio ~ Sesso, data = dati)
## 
##  Welch Two Sample t-test
## 
## data:  Cranio by Sesso
## t = -7.4102, df = 2491.4, p-value = 1.718e-13
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
##  -6.089912 -3.541270
## sample estimates:
## mean in group F mean in group M 
##        337.6330        342.4486

Tutti i t-test per campioni indipendenti riportano un p-value minore di 0.05 dunque si rifiuta l’ipotesi nulla e perciò abbiamo la conferma che le misure antropometriche sono significativamente diverse tra i due sessi.

Prima di procedere con la creazione del modello vediamo graficamente tramite alcuni scatterplot se c’è correlazione tra le variabili numeriche e la variabile “Peso”, per le stesse variabili viene fatta anche la matrice di correlazione.

plot(dati$Peso,dati$Anni.madre)

plot(dati$Peso,dati$N.gravidanze)

plot(dati$Peso,dati$Gestazione)

plot(dati$Peso,dati$Lunghezza)

plot(dati$Peso,dati$Cranio)

idx <- which(names(dati) %in% barplot_var)
dati_num <- dati[, -idx, drop = FALSE]

cor_mat <- cor(dati_num, use = "complete.obs", method = "pearson")
round(cor_mat, 2)
##              Anni.madre N.gravidanze Gestazione  Peso Lunghezza Cranio
## Anni.madre         1.00         0.38      -0.14 -0.02     -0.06   0.02
## N.gravidanze       0.38         1.00      -0.10  0.00     -0.06   0.04
## Gestazione        -0.14        -0.10       1.00  0.59      0.62   0.46
## Peso              -0.02         0.00       0.59  1.00      0.80   0.70
## Lunghezza         -0.06        -0.06       0.62  0.80      1.00   0.60
## Cranio             0.02         0.04       0.46  0.70      0.60   1.00

Come si può notare sia dagli scatterplot che dalla matrice di correlazione le variabile “Anni.madre” e “N.gravidanze” sono indipendenti dalla variabile “Peso”; mentre per le altre variabili (“Gestazione”, “Lunghezza” e “Cranio”) si possono notare trend positivi e perciò sono correlate positivamente con coefficienti di correlazione >0.5.

Di seguito, per la valutazione delle variabili qualitative, si vedranno dei boxplot e dei test di significatività tra gruppi.

dati$Fumatrici <- factor(dati$Fumatrici, levels = c(0, 1), labels = c("No", "Sì"))

vars <- c("Fumatrici", "Tipo.parto", "Ospedale", "Sesso")

for (v in vars) {

  # Se è numerica con soli 2 valori (0/1), convertila in factor
  if (is.numeric(dati[[v]]) && length(unique(dati[[v]])) == 2) {
    dati[[v]] <- factor(dati[[v]])
  }

  p <- ggplot(dati, aes(x = .data[[v]], y = Peso)) +
    geom_boxplot() +
    labs(
      title = paste("Peso vs", v),
      x = v,
      y = "Peso"
    ) +
    theme_minimal()

  if (v == "Ospedale") {
    p <- p + theme(axis.text.x = element_text(angle = 45, hjust = 1))
  }

  print(p)
}

dati$Fumatrici <- factor(dati$Fumatrici, levels = c("No", "Sì"), labels = c(0, 1))

summary(aov(Peso ~ Ospedale, data = dati))
##               Df    Sum Sq Mean Sq F value Pr(>F)
## Ospedale       2    936237  468118   1.699  0.183
## Residuals   2497 687952305  275512
t.test(Peso ~ Fumatrici, data = dati)
## 
##  Welch Two Sample t-test
## 
## data:  Peso by Fumatrici
## t = 1.034, df = 114.1, p-value = 0.3033
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
##  -45.61354 145.22674
## sample estimates:
## mean in group 0 mean in group 1 
##        3286.153        3236.346
t.test(Peso ~ Sesso, data = dati)
## 
##  Welch Two Sample t-test
## 
## data:  Peso by Sesso
## t = -12.106, df = 2490.7, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
##  -287.1051 -207.0615
## sample estimates:
## mean in group F mean in group M 
##        3161.132        3408.215
t.test(Peso ~ Tipo.parto, data = dati)
## 
##  Welch Two Sample t-test
## 
## data:  Peso by Tipo.parto
## t = -0.12968, df = 1493, p-value = 0.8968
## alternative hypothesis: true difference in means between group Ces and group Nat is not equal to 0
## 95 percent confidence interval:
##  -46.27992  40.54037
## sample estimates:
## mean in group Ces mean in group Nat 
##          3282.047          3284.916
cat(
  "Risultati test per Peso:\n",
  "Ospedale (ANOVA): p =", 0.183, "\n",
  "Fumatrici (t-test): p =", 0.3033, "\n",
  "Sesso (t-test): p <", 2.2e-16, "\n",
  "Tipo.parto (t-test): p =", 0.8968, "\n"
)
## Risultati test per Peso:
##  Ospedale (ANOVA): p = 0.183 
##  Fumatrici (t-test): p = 0.3033 
##  Sesso (t-test): p < 2.2e-16 
##  Tipo.parto (t-test): p = 0.8968

Si noti che la variabile “Sesso” è l’unica in cui la differenza di peso tra i gruppi è statisticamente significativa dunque sarà l’unica, tra queste, che ci si aspetta di trovare nel modello finale.

Al fine di sviluppare un modello, si partirà dalla crezione di questo inserento tutte le variabile anche se, come abbiamo visto, alcune feature sono ininfluenti sul nostro target. Fatto ciò si procederà con l’ottimizzazione del modello (si proverà ad utilizzare anche la procedura automatica del pacchetto “mass”):

mod1 <- lm(Peso ~ ., data=dati)
summary(mod1)
## 
## Call:
## lm(formula = Peso ~ ., data = dati)
## 
## 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 *  
## Fumatrici1      -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
rmse <- sqrt(mean(residuals(mod1)^2))
rmse
## [1] 273.3222

Dal summary del modello generato possiamo vedere che le variabili quantitative significative sono “Lunghezza”, “Cranio” e “Gestazione” (come si era già visto dagli scatterplot e dalla matrice di correlazione) e la variabile qualitativa “Sesso” (come visto dal boxplot e dal t-test). Si ottiene un R2 complessivo del 73% ed un RMSE di 273.3, che non è male, ma nella fase di miglioramento del modello si procederà col rimuovere le variabili superflue al fine di ridurre la complessità del modello mantenendone alta la performance.

Si procede perciò col togliere la variabile “Anni.madre”, “Fumatrici” e “Ospedale”. Si lasciano momentaneamente le variabili “N.Gravidanze” e “Tipo.parto”.

mod2 <- update(mod1,.~.-Fumatrici - Anni.madre -Ospedale)
summary(mod2)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto + Sesso, data = dati)
## 
## 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
rmse <- sqrt(mean(residuals(mod2)^2))
rmse
## [1] 273.9355

Il nuovo modello mantiene un R2 del 73% e un RMSE di 274 però con meno feature e perciò risultando meno complesso; è stato deciso di mantenere la variabile “Tipo.parto” per vedere il suo comportamente con la rimozione delle altre variabili ma in realtà è una variabile correlata a Gestazione poichè è ragionevole supporre che un parto cesareo avvenga con un numero di settimane di gestazione minore in molti casi mentre un parto naturale in condizioni di settimane di gestazione maggiore. Per procedere con metodo si studieranno ora le perfomance del modello ottenuto.

AIC(mod2,mod1)
##      df      AIC
## mod2  8 35175.16
## mod1 12 35171.95
BIC(mod2,mod1)
##      df      BIC
## mod2  8 35221.75
## mod1 12 35241.84
car::vif(mod2)
## N.gravidanze   Gestazione    Lunghezza       Cranio   Tipo.parto        Sesso 
##     1.024171     1.669258     2.080039     1.626199     1.003438     1.040060

In seguito alle valutazioni fatte non si nota una grossa differenza tra il modello 1 e il modello 2, infatti nel caso dell’AIC è più performante il modello 1 mentre nel caso del BIC è il contrario, in questo caso si tende a preferire il modello meno complesso perciò il modello 2. Tramite la valutazione della multicollinearità si nota che nessun valore supera il valore soglia di 5 perciò non c’è multicollinearità (sfata la supposizione di dipendenza tra “Gestazione” e “Tipo.parto”).

Si continua con l’ottimizzazione: prima togliendo la variabile “Tipo.parto” e valutando il modello e poi togliendo la variabile “N.gravidanze” e valutando il modello.

mod3 <- update(mod2,.~.-Tipo.parto)
summary(mod3)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Sesso, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1149.44  -180.81   -15.58   163.64  2639.72 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -6681.1445   135.7229 -49.226  < 2e-16 ***
## N.gravidanze    12.4750     4.3396   2.875  0.00408 ** 
## Gestazione      32.3321     3.7980   8.513  < 2e-16 ***
## Lunghezza       10.2486     0.3006  34.090  < 2e-16 ***
## Cranio          10.5402     0.4262  24.728  < 2e-16 ***
## SessoM          77.9927    11.2021   6.962 4.26e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 274.6 on 2494 degrees of freedom
## Multiple R-squared:  0.727,  Adjusted R-squared:  0.7265 
## F-statistic:  1328 on 5 and 2494 DF,  p-value: < 2.2e-16
rmse <- sqrt(mean(residuals(mod3)^2))
rmse
## [1] 274.274

R2 continua a rimanere vicino al 73% (72.65%) e l’RMSE abbastanza stabile (274.3) ma con una variabile in meno.

mod4 <- update(mod3,.~.-N.gravidanze)
summary(mod4)
## 
## Call:
## lm(formula = Peso ~ Gestazione + Lunghezza + Cranio + Sesso, 
##     data = dati)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1138.2  -184.3   -17.6   163.3  2627.3 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -6651.1188   135.5172 -49.080  < 2e-16 ***
## Gestazione     31.2737     3.7856   8.261 2.31e-16 ***
## Lunghezza      10.2054     0.3007  33.939  < 2e-16 ***
## Cranio         10.6704     0.4245  25.139  < 2e-16 ***
## SessoM         79.1049    11.2117   7.056 2.22e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 275 on 2495 degrees of freedom
## Multiple R-squared:  0.7261, Adjusted R-squared:  0.7257 
## F-statistic:  1654 on 4 and 2495 DF,  p-value: < 2.2e-16
rmse <- sqrt(mean(residuals(mod4)^2))
rmse
## [1] 274.728

Anche il modello 4 continua a manenere un R2 intorno al 73% (72.6%) e un RMSE di 274.7.

Si mettono a confronto ora le perfomance dei 4 modelli.

AIC(mod4,mod3,mod2,mod1)
##      df      AIC
## mod4  6 35185.60
## mod3  7 35179.33
## mod2  8 35175.16
## mod1 12 35171.95
BIC(mod4,mod3,mod2,mod1)
##      df      BIC
## mod4  6 35220.54
## mod3  7 35220.10
## mod2  8 35221.75
## mod1 12 35241.84
car::vif(mod4)
## Gestazione  Lunghezza     Cranio      Sesso 
##   1.653502   2.069517   1.606131   1.038813

Si riconferma che i valori di AIC e BIC tra i modelli sono simili e che il modello AIC tende a preferire il modello 1 mentre il BIC il modello 3/4 ma a parità di questi valori (sono molto simili tra loro) si preferisce il modello meno complesso perciò il modello 4.

Al fine di confermare viene provata la procedura stepwise automatica del pacchetto “MASS” sia con metodo AIC (k=2), sia con metodo BIC (k=loh(2500)).

mod_aic <- MASS::stepAIC(mod1, direction = "both", k = 2)
## Start:  AIC=28075.26
## Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza + 
##     Cranio + Tipo.parto + Ospedale + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Anni.madre    1     46578 186809099 28074
## - Fumatrici     1     90019 186852540 28075
## <none>                      186762521 28075
## - N.gravidanze  1    438452 187200974 28079
## - Tipo.parto    1    447929 187210450 28079
## - Ospedale      2    685979 187448501 28080
## - Sesso         1   3611021 190373542 28121
## - Gestazione    1   5458403 192220925 28145
## - Cranio        1  45326172 232088693 28617
## - Lunghezza     1  87951062 274713583 29038
## 
## Step:  AIC=28073.88
## Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto + Ospedale + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Fumatrici     1     90897 186899996 28073
## <none>                      186809099 28074
## + Anni.madre    1     46578 186762521 28075
## - Tipo.parto    1    448222 187257321 28078
## - Ospedale      2    692738 187501837 28079
## - N.gravidanze  1    633756 187442855 28080
## - Sesso         1   3618736 190427835 28120
## - Gestazione    1   5412879 192221978 28143
## - Cranio        1  45588236 232397335 28618
## - Lunghezza     1  87950050 274759149 29036
## 
## Step:  AIC=28073.1
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Tipo.parto + 
##     Ospedale + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## <none>                      186899996 28073
## + Fumatrici     1     90897 186809099 28074
## + Anni.madre    1     47456 186852540 28075
## - Tipo.parto    1    440684 187340680 28077
## - Ospedale      2    701680 187601677 28079
## - N.gravidanze  1    610840 187510837 28079
## - Sesso         1   3602797 190502794 28119
## - Gestazione    1   5346781 192246777 28142
## - Cranio        1  45632149 232532146 28617
## - Lunghezza     1  88355030 275255027 29039
summary(mod_aic)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto + Ospedale + Sesso, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1113.18  -181.16   -16.58   161.01  2620.19 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -6707.4293   135.9438 -49.340  < 2e-16 ***
## N.gravidanze     12.3619     4.3325   2.853  0.00436 ** 
## Gestazione       31.9909     3.7896   8.442  < 2e-16 ***
## Lunghezza        10.3086     0.3004  34.316  < 2e-16 ***
## Cranio           10.4922     0.4254  24.661  < 2e-16 ***
## Tipo.partoNat    29.2803    12.0817   2.424  0.01544 *  
## Ospedaleosp2    -11.0227    13.4363  -0.820  0.41209    
## Ospedaleosp3     28.6408    13.4886   2.123  0.03382 *  
## SessoM           77.4412    11.1756   6.930 5.36e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 273.9 on 2491 degrees of freedom
## Multiple R-squared:  0.7287, Adjusted R-squared:  0.7278 
## F-statistic: 836.3 on 8 and 2491 DF,  p-value: < 2.2e-16
mod_bic <- MASS::stepAIC(mod1, direction = "both", k = log(2500))
## Start:  AIC=28139.32
## Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza + 
##     Cranio + Tipo.parto + Ospedale + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Anni.madre    1     46578 186809099 28132
## - Fumatrici     1     90019 186852540 28133
## - Ospedale      2    685979 187448501 28133
## - N.gravidanze  1    438452 187200974 28137
## - Tipo.parto    1    447929 187210450 28138
## <none>                      186762521 28139
## - Sesso         1   3611021 190373542 28179
## - Gestazione    1   5458403 192220925 28204
## - Cranio        1  45326172 232088693 28675
## - Lunghezza     1  87951062 274713583 29096
## 
## Step:  AIC=28132.12
## Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio + 
##     Tipo.parto + Ospedale + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Fumatrici     1     90897 186899996 28126
## - Ospedale      2    692738 187501837 28126
## - Tipo.parto    1    448222 187257321 28130
## <none>                      186809099 28132
## - N.gravidanze  1    633756 187442855 28133
## + Anni.madre    1     46578 186762521 28139
## - Sesso         1   3618736 190427835 28172
## - Gestazione    1   5412879 192221978 28196
## - Cranio        1  45588236 232397335 28670
## - Lunghezza     1  87950050 274759149 29089
## 
## Step:  AIC=28125.51
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Tipo.parto + 
##     Ospedale + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Ospedale      2    701680 187601677 28119
## - Tipo.parto    1    440684 187340680 28124
## <none>                      186899996 28126
## - N.gravidanze  1    610840 187510837 28126
## + Fumatrici     1     90897 186809099 28132
## + Anni.madre    1     47456 186852540 28133
## - Sesso         1   3602797 190502794 28165
## - Gestazione    1   5346781 192246777 28188
## - Cranio        1  45632149 232532146 28664
## - Lunghezza     1  88355030 275255027 29086
## 
## Step:  AIC=28119.23
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Tipo.parto + 
##     Sesso
## 
##                Df Sum of Sq       RSS   AIC
## - Tipo.parto    1    463870 188065546 28118
## <none>                      187601677 28119
## - N.gravidanze  1    651066 188252743 28120
## + Ospedale      2    701680 186899996 28126
## + Fumatrici     1     99840 187501837 28126
## + Anni.madre    1     54392 187547285 28126
## - Sesso         1   3649259 191250936 28160
## - Gestazione    1   5444109 193045786 28183
## - Cranio        1  45758101 233359778 28657
## - Lunghezza     1  88054432 275656108 29074
## 
## Step:  AIC=28117.58
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso
## 
##                Df Sum of Sq       RSS   AIC
## <none>                      188065546 28118
## - N.gravidanze  1    623141 188688687 28118
## + Tipo.parto    1    463870 187601677 28119
## + Ospedale      2    724866 187340680 28124
## + Fumatrici     1     91892 187973654 28124
## + Anni.madre    1     54816 188010731 28125
## - Sesso         1   3655292 191720838 28158
## - Gestazione    1   5464853 193530399 28181
## - Cranio        1  46108583 234174130 28658
## - Lunghezza     1  87632762 275698308 29066
summary(mod_bic)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + 
##     Sesso, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1149.44  -180.81   -15.58   163.64  2639.72 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -6681.1445   135.7229 -49.226  < 2e-16 ***
## N.gravidanze    12.4750     4.3396   2.875  0.00408 ** 
## Gestazione      32.3321     3.7980   8.513  < 2e-16 ***
## Lunghezza       10.2486     0.3006  34.090  < 2e-16 ***
## Cranio          10.5402     0.4262  24.728  < 2e-16 ***
## SessoM          77.9927    11.2021   6.962 4.26e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 274.6 on 2494 degrees of freedom
## Multiple R-squared:  0.727,  Adjusted R-squared:  0.7265 
## F-statistic:  1328 on 5 and 2494 DF,  p-value: < 2.2e-16

In entrambi i casi non si arriva ad una conclusione uguale al modello 4, ma osservando gli R2 delle due procedure stepwise AIC e BIC, rispettivamente 72.8% e 72.7%, e confrontandolo con l’R2 del modello 4 (72.6%) si preferisce quest’ultimo poichè con un R2 simile ma meno complesso.

Si procede ora col valutare le interazione tra variabili ed eventuali effetti quadratici:

mod5 <- update(mod4,.~+ (Cranio + Lunghezza + Sesso + Gestazione)^2)
summary(mod5)
## 
## Call:
## lm(formula = Peso ~ Cranio + Lunghezza + Sesso + Gestazione + 
##     Cranio:Lunghezza + Cranio:Sesso + Cranio:Gestazione + Lunghezza:Sesso + 
##     Lunghezza:Gestazione + Sesso:Gestazione, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1135.66  -182.34   -12.52   164.15  2540.69 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)   
## (Intercept)          -3.160e+02  1.123e+03  -0.281  0.77852   
## Cranio               -6.736e+00  7.004e+00  -0.962  0.33628   
## Lunghezza             1.171e+01  4.991e+00   2.346  0.01908 * 
## SessoM               -3.258e+01  2.795e+02  -0.117  0.90722   
## Gestazione           -1.750e+02  6.351e+01  -2.756  0.00589 **
## Cranio:Lunghezza     -9.316e-03  1.402e-02  -0.665  0.50634   
## Cranio:SessoM        -6.507e-01  8.709e-01  -0.747  0.45502   
## Cranio:Gestazione     5.822e-01  2.019e-01   2.884  0.00396 **
## Lunghezza:SessoM      9.677e-01  6.068e-01   1.595  0.11090   
## Lunghezza:Gestazione  3.781e-02  1.072e-01   0.353  0.72428   
## SessoM:Gestazione    -3.898e+00  7.691e+00  -0.507  0.61233   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 273.3 on 2489 degrees of freedom
## Multiple R-squared:  0.7301, Adjusted R-squared:  0.729 
## F-statistic: 673.3 on 10 and 2489 DF,  p-value: < 2.2e-16
rmse <- sqrt(mean(residuals(mod5)^2))
rmse
## [1] 272.7078
mod6 <- lm(Peso ~ (Cranio + Lunghezza + Gestazione + Sesso)^2 +
              I(Cranio^2) + I(Lunghezza^2) + I(Gestazione^2),
            data=dati)
summary(mod6)
## 
## Call:
## lm(formula = Peso ~ (Cranio + Lunghezza + Gestazione + Sesso)^2 + 
##     I(Cranio^2) + I(Lunghezza^2) + I(Gestazione^2), data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1153.69  -180.99   -10.79   166.96  1315.06 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          -2.402e+02  1.203e+03  -0.200  0.84176    
## Cranio               -2.284e+01  1.033e+01  -2.212  0.02709 *  
## Lunghezza            -5.322e+00  5.980e+00  -0.890  0.37355    
## Gestazione            1.803e+02  7.639e+01   2.361  0.01832 *  
## SessoM               -3.857e+01  2.740e+02  -0.141  0.88809    
## I(Cranio^2)           5.042e-02  1.879e-02   2.683  0.00733 ** 
## I(Lunghezza^2)        5.749e-02  6.712e-03   8.566  < 2e-16 ***
## I(Gestazione^2)      -4.659e+00  1.631e+00  -2.858  0.00430 ** 
## Cranio:Lunghezza     -8.438e-02  1.687e-02  -5.001 6.10e-07 ***
## Cranio:Gestazione     1.045e+00  2.091e-01   4.996 6.25e-07 ***
## Cranio:SessoM         2.046e-01  8.577e-01   0.239  0.81145    
## Lunghezza:Gestazione -2.925e-01  1.977e-01  -1.480  0.13903    
## Lunghezza:SessoM     -7.240e-01  6.145e-01  -1.178  0.23882    
## Gestazione:SessoM     1.031e+01  7.663e+00   1.346  0.17857    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 267.1 on 2486 degrees of freedom
## Multiple R-squared:  0.7426, Adjusted R-squared:  0.7413 
## F-statistic: 551.8 on 13 and 2486 DF,  p-value: < 2.2e-16
rmse <- sqrt(mean(residuals(mod6)^2))
rmse
## [1] 266.3072
mod7 <- update(mod6,.~.-Cranio -Lunghezza - Gestazione - Sesso -Cranio:Sesso - Lunghezza:Gestazione - Lunghezza:Sesso - Gestazione:Sesso)
summary(mod7)
## 
## Call:
## lm(formula = Peso ~ I(Cranio^2) + I(Lunghezza^2) + I(Gestazione^2) + 
##     Cranio:Lunghezza + Cranio:Gestazione, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1118.18  -176.14    -7.27   162.56  1255.40 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -1.995e+03  7.021e+01 -28.412  < 2e-16 ***
## I(Cranio^2)        2.777e-02  1.072e-02   2.591  0.00962 ** 
## I(Lunghezza^2)     4.780e-02  4.434e-03  10.780  < 2e-16 ***
## I(Gestazione^2)   -4.498e+00  7.824e-01  -5.749 1.01e-08 ***
## Cranio:Lunghezza  -1.059e-01  1.271e-02  -8.328  < 2e-16 ***
## Cranio:Gestazione  1.132e+00  1.774e-01   6.380 2.10e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 269.9 on 2494 degrees of freedom
## Multiple R-squared:  0.7363, Adjusted R-squared:  0.7357 
## F-statistic:  1392 on 5 and 2494 DF,  p-value: < 2.2e-16
rmse <- sqrt(mean(residuals(mod7)^2))
rmse
## [1] 269.583
summary(mod4)
## 
## Call:
## lm(formula = Peso ~ Gestazione + Lunghezza + Cranio + Sesso, 
##     data = dati)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1138.2  -184.3   -17.6   163.3  2627.3 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -6651.1188   135.5172 -49.080  < 2e-16 ***
## Gestazione     31.2737     3.7856   8.261 2.31e-16 ***
## Lunghezza      10.2054     0.3007  33.939  < 2e-16 ***
## Cranio         10.6704     0.4245  25.139  < 2e-16 ***
## SessoM         79.1049    11.2117   7.056 2.22e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 275 on 2495 degrees of freedom
## Multiple R-squared:  0.7261, Adjusted R-squared:  0.7257 
## F-statistic:  1654 on 4 and 2495 DF,  p-value: < 2.2e-16
rmse <- sqrt(mean(residuals(mod4)^2))
rmse
## [1] 274.728

Si può notare che il beneficio su R2 non è rilevante perciò si opterà per tenere il modello 4 con un R2 del 72.6% (RMSE=274.73 g) avendo una performance simile agli altri modelli ottenuti ma una semplicità maggiore. Si sottolinea comunque il fatto che un RMSE di 275 grammi circa significa un errore potenziale di più o meno questa cifra che comparate con il peso medio (3284 g) significa un errore di più o meno 8.4% che non è poco. Tuttavia l’RMSE degli altri modelli testati è molto simile perciò si continua a preferire la semplicità del modello 4.

mod10 <- update(mod4,.~.-Gestazione -Sesso)
summary(mod4)
## 
## Call:
## lm(formula = Peso ~ Gestazione + Lunghezza + Cranio + Sesso, 
##     data = dati)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1138.2  -184.3   -17.6   163.3  2627.3 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -6651.1188   135.5172 -49.080  < 2e-16 ***
## Gestazione     31.2737     3.7856   8.261 2.31e-16 ***
## Lunghezza      10.2054     0.3007  33.939  < 2e-16 ***
## Cranio         10.6704     0.4245  25.139  < 2e-16 ***
## SessoM         79.1049    11.2117   7.056 2.22e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 275 on 2495 degrees of freedom
## Multiple R-squared:  0.7261, Adjusted R-squared:  0.7257 
## F-statistic:  1654 on 4 and 2495 DF,  p-value: < 2.2e-16
summary(mod10)
## 
## Call:
## lm(formula = Peso ~ Lunghezza + Cranio, data = dati)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1295.09  -184.36   -11.95   162.85  2792.61 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -6306.9134   124.8791  -50.50   <2e-16 ***
## Lunghezza      11.6312     0.2682   43.37   <2e-16 ***
## Cranio         11.2847     0.4298   26.26   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 281.4 on 2497 degrees of freedom
## Multiple R-squared:  0.7129, Adjusted R-squared:  0.7127 
## F-statistic:  3101 on 2 and 2497 DF,  p-value: < 2.2e-16

Provando a rimuovere invece le variabili rimaste si ottengono i seguenti R2:

Di conseguenza “Cranio” e “LUnghezza” sono le features più impattanti ed importanti mentre “Gestazione” e “Sesso” si potrebbero togliere ma si possono considerare variabili di controllo importanti.

Si procede con un analisi dei residui del modello finale (modello 4) e valutazione della presenza di leverage o outliers (come visto inizialmente probabilmente ce ne saranno):

par(mfrow=c(2,2))
plot(mod4)

shapiro.test(residuals(mod4))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mod4)
## W = 0.9742, p-value < 2.2e-16
lmtest::bptest(mod4)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod4
## BP = 89.148, df = 4, p-value < 2.2e-16
lmtest::dwtest(mod4)
## 
##  Durbin-Watson test
## 
## data:  mod4
## DW = 1.9557, p-value = 0.1337
## alternative hypothesis: true autocorrelation is greater than 0
n=length(dati$Peso)
n
## [1] 2500
# Leverage
lev <- hatvalues(mod4)
plot(lev)
p <- sum(lev)
soglia = 2*p/n
abline(h=soglia,col=2)
lev[lev>soglia]
##          15          34          42          61          67          96 
## 0.006144457 0.006237758 0.004252678 0.004587185 0.005345322 0.004801899 
##         101         106         117         131         151         155 
## 0.007185969 0.012812305 0.004746840 0.006964953 0.010847336 0.006670119 
##         190         205         206         220         249         295 
## 0.005288500 0.005297016 0.009402903 0.007376867 0.004655679 0.004008437 
##         304         305         310         312         315         348 
## 0.004419003 0.005382162 0.028757757 0.013126063 0.005342858 0.004187962 
##         378         383         445         471         486         492 
## 0.015366923 0.004305772 0.007094099 0.004289364 0.004740595 0.008175223 
##         565         587         592         615         629         638 
## 0.004635950 0.008375235 0.006313937 0.004575867 0.004041054 0.006216787 
##         656         666         684         697         702         726 
## 0.004735898 0.004345904 0.008750225 0.005809934 0.004719868 0.004038656 
##         748         750         765         805         821         895 
## 0.008236046 0.006712718 0.006049647 0.014303716 0.004039952 0.005203974 
##         928         947         956         964         968         991 
## 0.022095348 0.007803378 0.007670034 0.004618460 0.004075295 0.004259145 
##        1014        1067        1091        1096        1130        1157 
## 0.008221844 0.007868942 0.008927908 0.004268008 0.006561457 0.004080725 
##        1166        1181        1188        1200        1238        1248 
## 0.004020427 0.005586402 0.006404596 0.005445729 0.005374725 0.014573080 
##        1273        1283        1293        1294        1356        1357 
## 0.007080183 0.004055883 0.005555616 0.004735838 0.005285646 0.006526609 
##        1361        1385        1395        1400        1402        1420 
## 0.004080786 0.012017154 0.004646054 0.005559147 0.004788164 0.005130876 
##        1428        1429        1551        1553        1556        1560 
## 0.008191659 0.021037040 0.048521821 0.006810651 0.005868384 0.004588261 
##        1593        1606        1610        1619        1628        1634 
## 0.004855489 0.004746852 0.007761683 0.014504316 0.004663751 0.004527422 
##        1686        1692        1693        1701        1712        1735 
## 0.008715871 0.004260736 0.005041490 0.010197488 0.006945920 0.004370535 
##        1780        1802        1806        1809        1827        1858 
## 0.025528862 0.004005956 0.004090967 0.008388773 0.006008547 0.004328741 
##        1868        1893        1911        1920        1977        2037 
## 0.004746360 0.004245302 0.004481835 0.004131544 0.005384125 0.004234559 
##        2040        2066        2089        2114        2115        2120 
## 0.011429685 0.004013637 0.006252340 0.012850646 0.011763363 0.018002540 
##        2140        2149        2175        2200        2215        2216 
## 0.006090376 0.013033782 0.021167345 0.011030260 0.004833388 0.007548562 
##        2220        2224        2225        2257        2307        2318 
## 0.004023907 0.005780067 0.005408611 0.005767952 0.013898144 0.004770755 
##        2337        2359        2391        2408        2437        2452 
## 0.004700477 0.004750437 0.004386621 0.009632048 0.023757012 0.023227398 
##        2458        2476        2478 
## 0.008002531 0.004070348 0.005745434
# Outliers
plot(rstudent(mod4))
abline(h=c(-2,2))
car::outlierTest(mod4)
##      rstudent unadjusted p-value Bonferroni p
## 1551 9.986149         4.7193e-23   1.1798e-19
## 155  4.951276         7.8654e-07   1.9663e-03
## 1306 4.781188         1.8440e-06   4.6100e-03
# Distanza di Cook
cook <- cooks.distance(mod4)
plot(cook)

In seguito allo Shapiro Ttest si rifiuta l’ipotesi di normalità perciò i residui non sono distribuiti normalmente ed il risultato del Breusch-Pagan test ci fa rifiutare l’ipotesi di omoschedasticità. Il Durbin-Watson test ci conferma l’incorrelazione e questo è positivo. Si nota nel grafico “Residual vs Leverage” un punto che supera la distanza di Cook (il punto 1551). Si è dunque approfondita la presenza di punti di leverage e/o outliers individuandone rispettivamente 135 e 3, i quali potrebbero essere la causa, o parte di essa, dei risultati negativi ottenuti durante l’analisi dei residui. In ogni caso, con una quantità grande di dati, lo Shapiro test non è abbastanza per rifiutare il modello e graficamente (grafico Residuals vs Fitted) si può notare che i residui sono distribuiti intorno allo 0 (positivo) e non si notano pattern inoltre (grafico Q-Q Residuals) seguono la diagonale (positivo). Il grafico Scale-Location (anche se il Breusch-Pagan test è fallito) non mostra trend e i residui sono distribuiti in una nuvola (casuali) il che è positivo; si notano però (anche nel grafico Residuals vs Fitted) dei punti iniziali fuori dalla nuvola il che è dovuto ai vari valori di leverage e/o outliers. Si procede con la visualizzazione di questi valori di leverage e outliers in modo da capire se sono dati credibili o se contengono errori.

index_lev <- which(lev > soglia)
dati[index_lev,]
##      Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio
## 15           33            3         0         34 2400       470    298
## 34           27            0         0         39 3150       480    382
## 42           28            1         0         41 2720       500    310
## 61           34            0         0         39 3620       545    334
## 67           29            0         0         33 2400       450    320
## 96           39            3         0         37 3640       510    376
## 101          31            0         0         34 1370       390    287
## 106          29            4         0         30 1340       400    273
## 117          34            1         0         34 2160       435    303
## 131          30            0         0         34 2290       450    285
## 151          20            0         0         41 2280       450    280
## 155          30            0         0         36 3610       410    330
## 190          26            2         0         39 4050       525    390
## 205          45            2         0         38 3850       505    384
## 206          39            1         0         31 1500       405    295
## 220          23            1         0         40 3520       445    363
## 249          36            1         0         34 2500       440    338
## 295          18            0         0         40 1850       460    305
## 304          36            0         0         37 2060       420    326
## 305          41            2         0         33 2300       450    323
## 310          40            3         0         28 1560       420    379
## 312          26            1         0         32 1280       360    276
## 315          33            2         0         35 2910       450    355
## 348          32            0         0         38 3560       460    360
## 378          27            0         0         28 1285       400    274
## 383          22            1         0         39 3600       550    346
## 445          27            0         0         32 1550       410    289
## 471          29            0         0         40 3680       560    346
## 486          22            0         0         33 2250       445    310
## 492          34            2         0         33 1410       380    295
## 565          24            1         0         40 4250       520    386
## 587          16            1         0         31 1900       440    300
## 592          30            1         0         32 2260       440    322
## 615          27            1         0         35 2100       440    345
## 629          23            0         0         34 2450       475    329
## 638          25            0         0         33 1720       420    300
## 656          38            3         0         41 2320       450    330
## 666          32            1         0         40 4240       555    345
## 684          30            1         0         39 3000       475    390
## 697          30            0         0         39 2820       510    300
## 702          25            0         0         33 2220       450    320
## 726          30            0         0         35 2350       446    344
## 748          35            0         0         33 1390       390    277
## 750          24            0         0         35 1450       405    280
## 765          26            1         0         33 1970       445    300
## 805          30            2         0         29 1190       360    272
## 821          22            0         0         41 3050       495    310
## 895          30            1         0         34 2580       470    347
## 928          25            0         0         28  830       310    254
## 947          34            3         0         32 1615       390    297
## 956          25            0         0         41 2210       430    310
## 964          26            0         0         40 4010       550    335
## 968          23            1         0         39 2900       470    366
## 991          35            2         0         40 4050       550    385
## 1014         17            0         0         37 2050       390    295
## 1067         26            3         0         31 1960       420    300
## 1091         30            1         0         33 1770       410    275
## 1096         37            0         0         34 1750       420    306
## 1130         33           11         0         43 3400       475    360
## 1157         26            0         0         40 4060       505    380
## 1166         36            3         0         39 2950       505    307
## 1181         30            1         0         36 4070       500    373
## 1188         21            0         0         40 4140       550    320
## 1200         21            0         0         40 3200       525    310
## 1238         19            0         0         33 2270       440    315
## 1248         26            1         0         30 1170       370    266
## 1273         32            1         0         33 2040       480    307
## 1283         29            0         0         40 4250       550    376
## 1293         30            3         0         38 4600       485    380
## 1294         24            1         0         40 3250       460    360
## 1356         32            1         0         40 4090       525    390
## 1357         22            0         0         32 2340       445    304
## 1361         25            0         0         39 3570       520    315
## 1385         33            0         0         29 1620       410    292
## 1395         30            2         0         39 3790       505    304
## 1400         22            0         0         34 2590       485    314
## 1402         35            1         0         39 2660       460    364
## 1420         32            1         0         38 3770       530    380
## 1428         30            1         0         36 1280       385    292
## 1429         24            4         0         29 1280       390    355
## 1551         35            1         0         38 4370       315    374
## 1553         30            4         0         35 4520       520    360
## 1556         37            0         0         41 2420       490    300
## 1560         17            0         0         41 2800       455    328
## 1593         41            3         0         35 1500       420    304
## 1606         28            0         0         41 3050       460    352
## 1610         37            3         0         33 2000       470    293
## 1619         31            0         0         31  990       340    278
## 1628         31            0         0         35 2120       410    312
## 1634         32            1         0         38 2500       430    328
## 1686         27            0         0         31 1800       430    308
## 1692         15            0         0         35 2700       470    300
## 1693         25            0         0         41 3100       500    305
## 1701         22            0         0         32 1430       380    301
## 1712         28            0         0         39 3800       520    300
## 1735         15            0         0         37 2750       440    345
## 1780         25            2         0         25  900       325    253
## 1802         27            2         0         39 3600       540    330
## 1806         42            2         0         37 3290       455    355
## 1809         35            0         0         32 1780       420    277
## 1827         32            1         0         33 2100       420    310
## 1858         32            1         0         37 3860       520    371
## 1868         29            0         0         40 3470       525    390
## 1893         22            1         0         34 3030       470    312
## 1911         25            1         0         39 3480       520    312
## 1920         26            0         1         39 4930       550    350
## 1977         39            4         0         34 2970       480    350
## 2037         42            3         0         37 4020       525    368
## 2040         27            1         0         38 3240       410    359
## 2066         30            2         0         41 3540       470    355
## 2089         32            1         1         33 1780       400    305
## 2114         36            0         0         31 1180       355    270
## 2115         35            1         0         32 1890       500    309
## 2120         32            0         0         27 1140       370    267
## 2140         30            2         0         33 1600       410    290
## 2149         39            3         0         30 1300       380    276
## 2175         37            8         0         28  930       355    235
## 2200         33            0         0         30 1750       410    294
## 2215         29            1         0         40 2440       465    298
## 2216         22            0         0         32 2580       470    330
## 2220         23            3         1         41 2620       475    313
## 2224         41            1         0         33 2000       425    312
## 2225         27            0         0         35 3140       465    290
## 2257         40            0         0         34 1580       400    300
## 2307         26            1         0         30 1170       370    273
## 2318         17            0         0         41 3100       500    307
## 2337         31            3         1         37 3440       460    362
## 2359         25            6         0         33 2230       430    313
## 2391         36            1         0         41 4400       565    366
## 2408         37            2         0         31 1690       405    290
## 2437         28            1         0         27  980       320    265
## 2452         28            0         0         26  930       345    245
## 2458         31            0         0         31 1730       430    300
## 2476         19            0         0         40 2910       520    315
## 2478         32            1         0         33 2740       475    324
##      Tipo.parto Ospedale Sesso
## 15          Ces     osp3     M
## 34          Nat     osp1     F
## 42          Ces     osp2     M
## 61          Nat     osp1     F
## 67          Nat     osp2     M
## 96          Ces     osp2     M
## 101         Nat     osp2     F
## 106         Ces     osp1     M
## 117         Ces     osp3     M
## 131         Nat     osp2     M
## 151         Ces     osp3     M
## 155         Nat     osp1     M
## 190         Nat     osp1     M
## 205         Nat     osp3     M
## 206         Nat     osp3     M
## 220         Nat     osp1     F
## 249         Nat     osp3     F
## 295         Nat     osp3     F
## 304         Nat     osp2     F
## 305         Nat     osp1     M
## 310         Nat     osp3     F
## 312         Nat     osp2     M
## 315         Nat     osp3     F
## 348         Nat     osp3     M
## 378         Nat     osp1     F
## 383         Nat     osp2     F
## 445         Nat     osp1     F
## 471         Nat     osp2     M
## 486         Nat     osp3     F
## 492         Nat     osp2     F
## 565         Nat     osp2     F
## 587         Nat     osp2     F
## 592         Ces     osp3     F
## 615         Ces     osp2     F
## 629         Nat     osp1     F
## 638         Nat     osp1     M
## 656         Nat     osp2     F
## 666         Nat     osp2     F
## 684         Ces     osp2     F
## 697         Ces     osp3     F
## 702         Nat     osp1     F
## 726         Nat     osp1     F
## 748         Nat     osp1     F
## 750         Nat     osp1     F
## 765         Nat     osp3     M
## 805         Nat     osp2     F
## 821         Nat     osp1     F
## 895         Nat     osp2     M
## 928         Nat     osp1     F
## 947         Nat     osp3     F
## 956         Nat     osp3     F
## 964         Nat     osp2     F
## 968         Nat     osp1     F
## 991         Nat     osp1     M
## 1014        Nat     osp2     F
## 1067        Nat     osp2     F
## 1091        Nat     osp3     M
## 1096        Ces     osp3     F
## 1130        Nat     osp1     M
## 1157        Ces     osp1     F
## 1166        Nat     osp1     F
## 1181        Nat     osp2     M
## 1188        Ces     osp1     M
## 1200        Nat     osp1     F
## 1238        Nat     osp1     M
## 1248        Nat     osp2     M
## 1273        Ces     osp1     F
## 1283        Ces     osp3     F
## 1293        Nat     osp1     M
## 1294        Nat     osp2     F
## 1356        Ces     osp3     F
## 1357        Nat     osp1     F
## 1361        Nat     osp1     F
## 1385        Nat     osp3     F
## 1395        Ces     osp3     M
## 1400        Nat     osp2     M
## 1402        Ces     osp1     F
## 1420        Nat     osp3     F
## 1428        Nat     osp2     F
## 1429        Nat     osp1     F
## 1551        Nat     osp3     F
## 1553        Nat     osp2     F
## 1556        Ces     osp1     M
## 1560        Nat     osp3     M
## 1593        Nat     osp1     M
## 1606        Nat     osp3     F
## 1610        Ces     osp1     F
## 1619        Ces     osp2     F
## 1628        Nat     osp1     F
## 1634        Nat     osp1     M
## 1686        Ces     osp3     M
## 1692        Nat     osp1     F
## 1693        Nat     osp2     F
## 1701        Nat     osp1     M
## 1712        Nat     osp3     F
## 1735        Nat     osp2     M
## 1780        Nat     osp3     F
## 1802        Nat     osp1     M
## 1806        Nat     osp1     M
## 1809        Ces     osp1     F
## 1827        Nat     osp1     M
## 1858        Nat     osp1     M
## 1868        Nat     osp1     M
## 1893        Nat     osp2     F
## 1911        Nat     osp1     M
## 1920        Ces     osp2     F
## 1977        Ces     osp2     F
## 2037        Ces     osp1     M
## 2040        Ces     osp1     F
## 2066        Nat     osp1     M
## 2089        Ces     osp1     F
## 2114        Nat     osp3     F
## 2115        Nat     osp2     F
## 2120        Nat     osp3     F
## 2140        Ces     osp1     F
## 2149        Nat     osp1     M
## 2175        Nat     osp1     F
## 2200        Nat     osp2     M
## 2215        Nat     osp2     F
## 2216        Nat     osp1     F
## 2220        Nat     osp3     M
## 2224        Ces     osp3     M
## 2225        Nat     osp2     F
## 2257        Nat     osp2     F
## 2307        Nat     osp3     M
## 2318        Ces     osp1     M
## 2337        Ces     osp1     M
## 2359        Nat     osp3     F
## 2391        Nat     osp1     F
## 2408        Nat     osp2     M
## 2437        Nat     osp1     M
## 2452        Ces     osp3     F
## 2458        Nat     osp3     F
## 2476        Nat     osp1     F
## 2478        Ces     osp2     F
dati[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
dati[155,]
##     Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio
## 155         30            0         0         36 3610       410    330
##     Tipo.parto Ospedale Sesso
## 155        Nat     osp1     M
dati[1306,]
##      Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio
## 1306         23            0         0         41 4900       510    352
##      Tipo.parto Ospedale Sesso
## 1306        Nat     osp2     F

In seguito alla visualizzazione delle righe dei valori di leverage e outliers non sono stati trovati dati dei quali si potesse affermare con certezza l’erroneità dei valori presenti perciò il modello finale sarà il modello 4 con i limiti risultati dell’analisi dei residui e dalla presenza di parecchi valori tra leverage e outliers di cui uno sulla soglia d’allarme della distanza di Cook. Sicuramente questi valori contribuiscono anche all’RMSE che porta ad un errore di 8.4% rispetto al peso medio e all’R2 di 72.6% che non è male ma neanche ottimo. In linea di massima il modello si potrà utilizzare se l’errore sul peso predetto è accettabile, nel caso serva più precisione si può utilizzare il modello per avere una stima ma va approfondito a parte.

Di seguito alcune previsioni (si utilizzano le 4 variabili con cui è costruito il modello perciò essendo il numero di gravidanze non significativo per il modello non fa parte delle variabili significative da dare in pasto al modello predittivo; inoltre la sola gestazione non è sufficiente).

predict(mod4, newdata = data.frame(Lunghezza=496, Gestazione=39, Cranio=350, Sesso="F"))
##        1 
## 3365.072
predict(mod4, newdata = data.frame(Lunghezza=496, Gestazione=39, Cranio=350, Sesso="M"))
##        1 
## 3444.177
predict(mod4, newdata = data.frame(Lunghezza=496, Gestazione=39, Cranio=380, Sesso="F"))
##        1 
## 3685.183

Si conclude con alcune visualizzazioni grafiche di come varia la nostra variabile target (Peso) in funzione delle variabili ritenute significative per il modello:

ggplot(data=dati)+
  geom_point(aes(x=Lunghezza,
                 y=Peso,
                 col=Sesso))+
  geom_smooth(aes(x=Lunghezza,
                 y=Peso,
                 col=Sesso), se=F, method="lm")
## `geom_smooth()` using formula = 'y ~ x'

ggplot(data=dati)+
  geom_point(aes(x=Cranio,
                 y=Peso,
                 col=Sesso))+
  geom_smooth(aes(x=Cranio,
                 y=Peso,
                 col=Sesso), se=F, method="lm")
## `geom_smooth()` using formula = 'y ~ x'

Sia nella rappresentazione grafica del peso rispetto alla lughezza che rispetto al diametro del cranio si nota come le rette (sesso maschile e sesso femminile) ottenute siano molto vicine, ulteriore conferma del fatto che la variabile “Sesso” potrebbe essere rimossa al fine di semplificare il modello (è stato scelto infatti di tenerla come variabile di controllo).

ggplot(data=dati)+
  geom_point(aes(x=Gestazione,
                 y=Peso,
                 col=Sesso))+
  geom_smooth(aes(x=Gestazione,
                 y=Peso,
                 col=Sesso), se=F, method="lm")
## `geom_smooth()` using formula = 'y ~ x'

X_num <- dati[, c("Lunghezza", "Cranio", "Gestazione")]
cor(X_num, use = "complete.obs")
##            Lunghezza    Cranio Gestazione
## Lunghezza  1.0000000 0.6033410  0.6189204
## Cranio     0.6033410 1.0000000  0.4608289
## Gestazione 0.6189204 0.4608289  1.0000000

Nel grafico del peso rispetto alle settimane di gestazione si nota anche qui la poca influenza del sesso del bambino viste le rette molto vicine; c’è da sottolineare però che, nel caso del diametro del cranio e delle settimane di gestazione, le rette sono si vicine ma parallele con la retta del sesso maschile sopra in entrambi i casi a quella del sesso femminile, dunque è una maggiore conferma della scelta di tenere la variabile “Sesso” come variabile di controllo.

Un ulteriore ricontrollo è stato fatto, tramite la matrice di correlazione, sulla possibile dipendenza tra le variabili (dal momento che logicamente lunghezza, diametro del cranio e settimane di gestazione sicuramente hanno una dipendenza anche se piccola): il risultato, come ci si aspettava, è un fattore di correlazione basso tra diametro del cranio e settimane di gestazione ma un fattore di correlazione del 60% tra lunghezza-diametro del cranio e lunghezza-settimane di gestazione. Si mantiene comunque il modello 4 come modello finale considerando “Lunghezza” e “Cranio” vere e proprio variabili del modello mentre “Sesso” e “Gestazione” variabili di controllo del modello.