Statistica inferenziale · R

Modello statistico per prevedere il peso dei neonati

Versione integrata nel sito senza iframe. Il notebook ricostruito resta disponibile come file .ipynb.

Modello statistico per prevedere il peso dei neonati

Gabriele Iocco

2024-06-03

In particolare, si vuole studiare una relazione tra il peso del neonato e le variabili della madre (ad esempio fumatrice o meno, età, numero di gravidanze già sostenute) per capire se queste hanno o meno un effetto significativo.

Setto la cartella di lavoro, leggo il file csv e calcolo le dimensioni del dataframe assegnandolo all’oggetto N

Codice
setwd("D:/R/Neonati")

dati_neonati <- read.csv("neonati.csv",sep = ",",encoding = "latin1")

attach(dati_neonati)

Creo il file global_environment_neonati.Rdata e lo passo alla funzione save.image in modo da salvare tutto l’ambiente virtuale in un unico passaggio

Codice
save.image(file = "global_environment_neonati.RData")

Con la funzione load posso caricare l’ambiente virtuale salvato in precedenza in un unico passaggio

Codice
load("D:/R/Neonati/global_environment_neonati.RData")

Descrizione del dataset e sua composizione

L’obiettivo principale di questo studio è quello di creare un modello statistico che riesca a prevedere il peso dei bambini alla nascita. Lo studio mira a cercare una relazione tra lunghezza e diametro del cranio (le quali si possono stimare già dalle ecografie) durante i mesi di gestazione e le variabili materne (è fumatrice?, ha già sostenuto gravidanze?, quante? Che tipo di parto ha affrontato, Naturale o Cesareo?, che età ha?, quante sono state le settimane di gestazione?). Vengono analizzati per questo studio i dati raccolti da tre ospedali e riguardano 2500 neonati, per ogni neonato oltre ai dati citati in precedenza è stato misurato il peso alla nascita e ovviamente si conosce il sesso. Il dataset è composto da dieci variabili.

Codice
N<-dim(dati_neonati)[1]
N
## [1] 2500
Codice
sapply(dati_neonati, class)
##   Anni.madre N.gravidanze    Fumatrici   Gestazione         Peso    Lunghezza 
##    "integer"    "integer"    "integer"    "integer"    "integer"    "integer" 
##       Cranio   Tipo.parto     Ospedale        Sesso 
##    "integer"  "character"  "character"  "character"
## Il dataframe ha una rumorosità campionaria di 2500 unità e 10 variabili

Statistica descrittiva: analisi esplorativa dei dati

Variabile Anni.madre - quantitativa discreta

Codice
summary(Anni.madre)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00   25.00   28.00   28.16   32.00   46.00
## La variabile presenta il valore min pari a 0. Questo indica la presenza di uno o più valori errati.

Creo un boxplot per individuare i valori errati

Codice
library(ggplot2)

ggplot(data=dati_neonati)+
  geom_boxplot(aes(x=Anni.madre), fill = "red", alpha = 0.55)+
  labs(title = "Anni.madre",
       x = "Età"
       )+
  theme_minimal() +
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.text.x = element_text(size=12),
    
    axis.title.y = element_blank(),  
    axis.text.y = element_blank(),
  ) +
  scale_x_continuous(breaks = seq(0, 46, 1))

## La variabile Anni.madre presenta due outliers molto anomali corrispondenti all'età delle madri (0,1). Questo indica un errore oppure le età sono state nascoste per motivi di privacy.

Procedo all’imputazione dei valori errati sostituendoli con la media della variabile Anni.madre

Codice
dati_neonati$Anni.madre[dati_neonati$Anni.madre %in% c(0, 1)] <- NA


media_anni_madre <- mean(dati_neonati$Anni.madre, na.rm = TRUE)


dati_neonati$Anni.madre[is.na(dati_neonati$Anni.madre)] <- media_anni_madre


dati_neonati$Anni.madre <- round(dati_neonati$Anni.madre)

Uso detach per ripulire l’ambiente virtuale dai dati (in quanto devo cambiare di valore i dati errati)

Uso attach per rendere visibili i componenti di una lista come se fossero variabili definite indipendentemente

Codice
detach(dati_neonati)
attach(dati_neonati)
Codice
summary(Anni.madre)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   13.00   25.00   28.00   28.19   32.00   46.00
Quantili
Codice
quantile(Anni.madre,seq(0,1,0.1))
##   0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
##   13   22   24   25   27   28   29   31   32   35   46
Range interquartile
Codice
IQR(Anni.madre)
## [1] 7
Calcolo la varianza sigma2 e la deviazione standard sigma
Codice
sigma2_Anni_madre=sum((Anni.madre-media_anni_madre)^2)/N
sigma_Anni_madre=sqrt(sigma2_Anni_madre)

sigma2_Anni_madre
## [1] 27.1866
Codice
sigma_Anni_madre
## [1] 5.214077
Indice di asimmetria di Fischer e Curtosi
Codice
library(moments)

skewness(Anni.madre)
## [1] 0.1512083
Codice
kurtosis(Anni.madre)-3
## [1] -0.1032773

Creo il plot di densità

Codice
ggplot(dati_neonati, aes(x = Anni.madre)) +
  geom_density(fill = "orange", alpha = 0.7) +
  labs(title = "Anni.madre",
       x = "Anni.madre",
       y = "Densità") +
  theme_minimal()+
  theme(
    plot.title = element_text(size = 20, hjust = 0.5)
  )+
  scale_x_continuous(breaks = seq(13, 46, 1))

## L'asimmetria è leggermente positiva, ha una distribuzione che si avvicina alla normale
## Il valore della curtosi indica una distribuzione platicurtica

Variabile N.gravidanze - quantitativa discreta

Codice
summary(N.gravidanze)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0000  0.0000  1.0000  0.9812  1.0000 12.0000
Quantili
Codice
quantile(N.gravidanze,seq(0,1,0.1))
##   0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
##    0    0    0    0    0    1    1    1    2    2   12
Range interquartile
Codice
IQR(N.gravidanze)
## [1] 1
Calcolo la varianza sigma2 e la deviazione standard sigma
Codice
sigma2_N_gravidanze=sum((N.gravidanze-mean(N.gravidanze))^2)/N
sigma_N_gravidanze=sqrt(sigma2_N_gravidanze)

sigma2_N_gravidanze
## [1] 1.639247
Codice
sigma_N_gravidanze
## [1] 1.280331
Indice di asimmetria di Fischer e Curtosi
Codice
skewness(N.gravidanze)
## [1] 2.514254
Codice
kurtosis(N.gravidanze)-3
## [1] 10.98941

Creo il plot di densità

Codice
ggplot(dati_neonati, aes(x = N.gravidanze)) +
  geom_density(fill = "orange", alpha = 0.7) +
  labs(title = "N.gravidanze",
       x = "N.gravidanze",
       y = "Densità") +
  theme_minimal()+
  theme(
    plot.title = element_text(size = 20, hjust = 0.5)
  )+
  scale_x_continuous(breaks = seq(0, 12, 1))

## La distribuzione è multimodale perchè il plot di densità presenta più di un picco o madalità. I dati hanno diversi clusters, ciascuno con il proprio picco.
## Il valore di asimmetria è molto alto ed è positivo indicando una distribuzione in cui i valori sono raggruppati nella parte dei valori bassi con una lunga coda verso i valori maggiori
## Il valore della curtosi è altissimo, ciò indica una maggiore concentrazione dei dati intorno alla media. La distribuzione è leptocurtica.

Creo un boxplot per mostrare l’asimmetria dei dati

Codice
ggplot(data=dati_neonati)+
  geom_boxplot(aes(x=N.gravidanze), fill = "red", alpha = 0.55)+
  labs(title = "N.gravidanze",
       x = "Numero di gravidanze"
       )+
  theme_minimal() +
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.text.x = element_text(size=12),
    
    axis.title.y = element_blank(),  
    axis.text.y = element_blank(),
  )+
  scale_x_continuous(breaks = seq(0, 12, 1))

## Anche il boxplot conferma la forte asimmetria della distribuzione con una mediana centrata sul valore 1. Inoltre possiamo notare la presenza di parecchi outliers.

Creo un istogramma per visualizzare la forma complessiva dei dati

Codice
ggplot(data = dati_neonati)+
  geom_bar(aes(y=N.gravidanze),
           stat = "count",
           fill = "green4", alpha= 0.65)+
  labs(title = "N.gravidanze",
       x="Numero di madri coinvolte nello studio")+
       scale_y_continuous(breaks = seq(0,12,1))+
       scale_x_continuous(breaks = seq(0, 1200, 100))+
  theme_minimal() +
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.title.y = element_text(size = 17),
    axis.text.x = element_text(size=12),
    axis.text.y = element_text(size=12)
  )

## Dall'istogramma notiamo a colpo d'occhio che la maggior parte delle madri del nostro campione di studio o non ha mai partorito oppure ha una sola gravidanza alle spalle.

Variabile Fumatrici - qualitativa dicotomica

Codice
freq_ass_fumatrici<-table(Fumatrici)
freq_ass_fumatrici
## Fumatrici
##    0    1 
## 2396  104

Creo l’istogramma

Codice
ggplot(data = dati_neonati)+
  geom_bar(aes(y=Fumatrici),
           stat = "count",
           fill = "green4", alpha= 0.65)+
  labs(title = "Fumatrici",
       x="Numero di madri coinvolte nello studio",
       y="No(0) / Sì(1)")+
       scale_y_continuous(breaks = seq(0,1,1))+
       scale_x_continuous(breaks = seq(0, 2500, 400))+
  theme_minimal() +
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.title.y = element_text(size = 17),
    axis.text.x = element_text(size=12),
    axis.text.y = element_text(size=12)
  )

## La quasi totalità delle madri del nostro campione di studio non fuma

Variabile Gestazione - quantitativa discreta

Codice
summary(Gestazione)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   25.00   38.00   39.00   38.98   40.00   43.00
Quantili
Codice
quantile(Gestazione,seq(0,1,0.1))
##   0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
##   25   37   38   38   39   39   40   40   40   41   43
Range interquartile
Codice
IQR(Gestazione)
## [1] 2
Calcolo la varianza sigma2 e la deviazione standard sigma
Codice
sigma2_Gestazione=sum((Gestazione-mean(Gestazione))^2)/N
sigma_Gestazione=sqrt(sigma2_Gestazione)

sigma2_Gestazione
## [1] 3.490416
Codice
sigma_Gestazione
## [1] 1.868265
Indice di asimmetria di Fischer e Curtosi
Codice
skewness(Gestazione)
## [1] -2.065313
Codice
kurtosis(Gestazione)-3
## [1] 8.25815

Creo il plot di densità

Codice
ggplot(dati_neonati, aes(x = Gestazione)) +
  geom_density(fill = "orange", alpha = 0.7) +
  labs(title = "Gestazione",
       x = "Settimane di gestazione",
       y = "Densità") +
  theme_minimal()+
  theme(
    plot.title = element_text(size = 20, hjust = 0.5)
  )+
  scale_x_continuous(breaks = seq(25, 43, 1))

## La distribuzione è multimodale perchè il plot di densità presenta più di un picco o madalità. I dati hanno diversi clusters, ciascuno con il proprio picco.
## Il valore di asimmetria è molto alto ed è negativo indicando una distribuzione in cui i valori sono raggruppati nella parte dei valori alti con una lunga coda verso i valori minori.
## Il valore della curtosi è altissimo, ciò indica una maggiore concentrazione dei dati intorno alla media. La distribuzione è leptocurtica.

Creo un boxplot per mostrare l’asimmetria dei dati

Codice
ggplot(data=dati_neonati)+
  geom_boxplot(aes(x=Gestazione), fill = "red", alpha = 0.55)+
  labs(title = "Gestazione",
       x = "Settimane di gestazione"
       )+
  theme_minimal() +
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.text.x = element_text(size=12),
    
    axis.title.y = element_blank(),  
    axis.text.y = element_blank(),
  )+
  scale_x_continuous(breaks = seq(25, 43, 1))

## Il boxplot ci mostra la presenza di parecchi outliers.

Creo un istogramma per visualizzare la forma complessiva dei dati

Codice
ggplot(data = dati_neonati)+
  geom_bar(aes(y=Gestazione),
           stat = "count",
           fill = "green4", alpha= 0.65)+
  labs(title = "Gestazione",
       x="Numero di madri coinvolte nello studio",
       y="Settimane di gestazione")+
       scale_y_continuous(breaks = seq(25,43,1))+
       scale_x_continuous(breaks = seq(0, 800, 100))+
  theme_minimal() +
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.title.y = element_text(size = 17),
    axis.text.x = element_text(size=12),
    axis.text.y = element_text(size=12)
  )

## Dall'istogramma notiamo che la metà delle madri del nostro campione di studio ha partorito nella 39° e 40° settimana di gestazione e che la maggior parte ha comunque partorito entro i termini. Alcune madri però hanno avuto un parto prematuro.

Variabile Peso - quantitativa continua

Codice
summary(Peso)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     830    2990    3300    3284    3620    4930
Quantili
Codice
quantile(Peso,seq(0,1,0.1))
##   0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
##  830 2700 2910 3060 3186 3300 3400 3550 3700 3901 4930
Range interquartile
Codice
IQR(Peso)
## [1] 630
Calcolo la varianza sigma2 e la deviazione standard sigma
Codice
sigma2_Peso=sum((Peso-mean(Peso))^2)/N
sigma_Peso=sqrt(sigma2_Peso)

sigma2_Peso
## [1] 275555.4
Codice
sigma_Peso
## [1] 524.9337
Indice di asimmetria di Fischer e Curtosi
Codice
skewness(Peso)
## [1] -0.6470308
Codice
kurtosis(Peso)-3
## [1] 2.031532

Creo il plot di densità

Codice
ggplot(dati_neonati, aes(x = Peso)) +
  geom_density(fill = "orange", alpha = 0.7) +
  labs(title = "Peso",
       x = "Peso del neonato",
       y = "Densità") +
  theme_minimal()+
  theme(
    plot.title = element_text(size = 20, hjust = 0.5)
  )+
  scale_x_continuous(breaks = seq(800, 5000, 500))

## La distribuzione è unimodale perchè il plot di densità presenta un picco solo.
## Il valore di asimmetria non si discosta tanto dalla normale ed è negativo indicando una distribuzione in cui i valori sono raggruppati nella parte dei valori alti con una coda verso i valori minori.
## Il valore della curtosi è abbastanza alto indicando una maggiore concentrazione dei dati intorno alla media. La distribuzione è leptocurtica.

Creo un boxplot per mostrare l’asimmetria dei dati

Codice
ggplot(data=dati_neonati)+
  geom_boxplot(aes(x=Peso), fill = "red", alpha = 0.55)+
  labs(title = "Peso",
       x = "Peso del neonato"
       )+
  theme_minimal() +
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.text.x = element_text(size=12),
    
    axis.title.y = element_blank(),  
    axis.text.y = element_blank(),
  )+
  scale_x_continuous(breaks = seq(800, 5000, 400))

## Il boxplot ci mostra la presenza di parecchi outliers.

Variabile Lunghezza - quantitativa continua

Codice
summary(Lunghezza)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   310.0   480.0   500.0   494.7   510.0   565.0
Quantili
Codice
quantile(Lunghezza,seq(0,1,0.1))
##   0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
##  310  465  480  485  490  500  500  510  515  520  565
Range interquartile
Codice
IQR(Lunghezza)
## [1] 30
Calcolo la varianza sigma2 e la deviazione standard sigma
Codice
sigma2_Lunghezza=sum((Lunghezza-mean(Lunghezza))^2)/N
sigma_Lunghezza=sqrt(sigma2_Lunghezza)

sigma2_Lunghezza
## [1] 692.3939
Codice
sigma_Lunghezza
## [1] 26.31338
Indice di asimmetria di Fischer e Curtosi
Codice
skewness(Lunghezza)
## [1] -1.514699
Codice
kurtosis(Lunghezza)-3
## [1] 6.487174

Creo il plot di densità

Codice
ggplot(dati_neonati, aes(x = Lunghezza)) +
  geom_density(fill = "orange", alpha = 0.7) +
  labs(title = "Lunghezza",
       x = "Lunghezza del neonato",
       y = "Densità") +
  theme_minimal()+
  theme(
    plot.title = element_text(size = 20, hjust = 0.5)
  )+
  scale_x_continuous(breaks = seq(300, 600, 50))

## La distribuzione è unimodale.
## Il valore di asimmetria si discosta abbastanza dalla normale ed è negativo indicando una distribuzione in cui i valori sono raggruppati nella parte dei valori alti con una coda verso i valori minori.
## Il valore della curtosi è abbastanza alto indicando una maggiore concentrazione dei dati intorno alla media. La distribuzione è leptocurtica.

Creo un boxplot per mostrare l’asimmetria dei dati

Codice
ggplot(data=dati_neonati)+
  geom_boxplot(aes(x=Lunghezza), fill = "red", alpha = 0.55)+
  labs(title = "Lunghezza",
       x = "Lunghezza del neonato"
       )+
  theme_minimal() +
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.text.x = element_text(size=12),
    
    axis.title.y = element_blank(),  
    axis.text.y = element_blank(),
  )+
  scale_x_continuous(breaks = seq(300, 600, 50))

## Il boxplot conferma l'asimmetria, la linea di mediana non è al centro del riquadro e ci mostra la presenza di parecchi outliers che ricadono al di sotto del baffo inferiore.

Variabile Cranio - quantitativa continua

Codice
summary(Cranio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     235     330     340     340     350     390
Quantili
Codice
quantile(Cranio,seq(0,1,0.1))
##   0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
##  235  320  329  334  337  340  345  349  353  360  390
Range interquartile
Codice
IQR(Cranio)
## [1] 20
Calcolo la varianza sigma2 e la deviazione standard sigma
Codice
sigma2_Cranio=sum((Cranio-mean(Cranio))^2)/N
sigma_Cranio=sqrt(sigma2_Cranio)

sigma2_Cranio
## [1] 269.6835
Codice
sigma_Cranio
## [1] 16.42204
Indice di asimmetria di Fischer e Curtosi
Codice
skewness(Cranio)
## [1] -0.7850527
Codice
kurtosis(Cranio)-3
## [1] 2.946206

Creo il plot di densità

Codice
ggplot(dati_neonati, aes(x = Cranio)) +
  geom_density(fill = "orange", alpha = 0.7) +
  labs(title = "Cranio",
       x = "Diametro del cranio del neonato",
       y = "Densità") +
  theme_minimal()+
  theme(
    plot.title = element_text(size = 20, hjust = 0.5)
  )+
  scale_x_continuous(breaks = seq(225, 400, 25))

## La distribuzione è unimodale.
## Il valore di asimmetria si discosta un pò dalla normale ed è negativo indicando una distribuzione in cui i valori sono raggruppati nella parte dei valori più alti con una coda verso i valori minori.
## Il valore della curtosi è alto indicando una maggiore concentrazione dei dati intorno alla media. La distribuzione è leptocurtica.

Creo un boxplot per mostrare l’asimmetria dei dati

Codice
ggplot(data=dati_neonati)+
  geom_boxplot(aes(x=Cranio), fill = "red", alpha = 0.55)+
  labs(title = "Cranio",
       x = "Diametro del cranio del neonato"
       )+
  theme_minimal() +
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.text.x = element_text(size=12),
    
    axis.title.y = element_blank(),  
    axis.text.y = element_blank(),
  )+
  scale_x_continuous(breaks = seq(225, 400, 25))

## Il boxplot conferma l'asimmetria, la linea di mediana è al centro del riquadro e coincide con il valore medio. Sono presenti diversi outliers che ricadono al di sotto del baffo inferiore e alcuni al di sopra del baffo superiore.

Variabile Tipo.parto - qualitativa dicotomica

Codice
freq_ass_parto<-table(Tipo.parto)
freq_ass_parto
## Tipo.parto
##  Ces  Nat 
##  728 1772

Creo l’istogramma

Codice
ggplot(data = dati_neonati)+
  geom_bar(aes(y=Tipo.parto),
           stat = "count",
           fill = "green4", alpha= 0.65)+
  labs(title = "Tipo.parto",
       x="Numero di madri coinvolte nello studio",
       y="Cesareo / Naturale")+
       scale_x_continuous(breaks = seq(0, 1800, 200))+
  theme_minimal() +
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.title.y = element_text(size = 17),
    axis.text.x = element_text(size=12),
    axis.text.y = element_text(size=12)
  )

## Dall'istogramma notiamo che più del 25% delle madri coinvolte nello studio ha subito un parto cesareo.

Variabile Ospedale - qualitativa nominale

Codice
freq_ass_ospedale<-table(Ospedale)
freq_ass_ospedale
## Ospedale
## osp1 osp2 osp3 
##  816  849  835

Creo l’istogramma

Codice
ggplot(data = dati_neonati)+
  geom_bar(aes(y=Ospedale),
           stat = "count",
           fill = "green4", alpha= 0.65)+
  labs(title = "Ospedale",
       x="Numero di bambini coinvolti nello studio",
       y="Ospedali")+
       scale_x_continuous(breaks = seq(0, 1800, 200))+
  theme_minimal() +
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.title.y = element_text(size = 17),
    axis.text.x = element_text(size=12),
    axis.text.y = element_text(size=12)
  )

## I dati sono stati raccolti in modo quasi equamente distribuito tra tre ospedali.

Variabile Sesso - qualitativa dicotomica

Codice
freq_ass_sesso<-table(Sesso)
freq_ass_sesso
## Sesso
##    F    M 
## 1256 1244

Creo l’istogramma

Codice
ggplot(data = dati_neonati)+
  geom_bar(aes(y=Sesso),
           stat = "count",
           fill = "green4", alpha= 0.65)+
  labs(title = "Sesso",
       x="Numero di bambini coinvolti nello studio",
       y="")+
       scale_x_continuous(breaks = seq(0, 2500, 400))+
  theme_minimal() +
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.title.y = element_text(size = 17),
    axis.text.x = element_text(size=12),
    axis.text.y = element_text(size=12)
  )

## I bambini coinvolti nello studio sono divisi quasi equamente tra femmine e maschi.

Saggio l’ipotesi che la media del peso di questo campione di neonati sia significativamente uguale a quella della media nazionale con il t test.

H_0 (ipotesi nulla) = la media del peso dei neonati nel campione è uguale a 3300 grammi, cioè la media a livello nazionale

H_a (ipotesi alternativa) la media del peso dei neonati nel campione è diversa dalla media nazionale

Codice
t_test_result_peso <- t.test(Peso, mu=3300, conf.level=0.95, alternative="two.sided")

broom::tidy(t_test_result_peso)
## # A tibble: 1 × 8
##   estimate statistic p.value parameter conf.low conf.high method     alternative
##      <dbl>     <dbl>   <dbl>     <dbl>    <dbl>     <dbl> <chr>      <chr>      
## 1    3284.     -1.52   0.130      2499    3263.     3305. One Sampl… two.sided
## Non rigettiamo l'ipotesi nulla. In base ai risultati del test, non si sono trovate prove statisticamente significative per affermare che la media del peso dei bambini nel campione sia diversa da 3300 grammi.

Saggio l’ipotesi che la media della lunghezza di questo campione di neonati sia significativamente uguale a quella della media nazionale con il t test.

H_0 (ipotesi nulla) = la media della lunghezza dei neonati nel campione è uguale a 500 mm, cioè la media a livello nazionale

H_a (ipotesi alternativa) la media della lunghezza dei neonati nel campione è diversa dalla media nazionale

Codice
t_test_result_lunghezza <- t.test(Lunghezza, mu=500, conf.level=0.95, alternative="two.sided")

broom::tidy(t_test_result_lunghezza)
## # A tibble: 1 × 8
##   estimate statistic  p.value parameter conf.low conf.high method    alternative
##      <dbl>     <dbl>    <dbl>     <dbl>    <dbl>     <dbl> <chr>     <chr>      
## 1     495.     -10.1 1.81e-23      2499     494.      496. One Samp… two.sided
## Il p value molto basso, al di sotto del livello di significatività dello 0,05 fornisce un'indicazione che c'è una significativa differena tra la lunghezza media dei neonati nel campione e la media nazionale, quindi si rigetta l'ipotesi nulla a favore dell'ipotesi alternativa.

Verifico differenze significative tra i due sessi

H_0 (ipotesi nulla) = la media dei pesi dei neonati M e F del campione è uguale

H_a (ipotesi alternativa) la media dei pesi dei neonati M e F del campione non è uguale

Codice
t_test_diff_peso_sesso <- t.test(Peso ~ Sesso)

broom::tidy(t_test_diff_peso_sesso)
## # A tibble: 1 × 10
##   estimate estimate1 estimate2 statistic  p.value parameter conf.low conf.high
##      <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>    <dbl>     <dbl>
## 1    -247.     3161.     3408.     -12.1 8.03e-33     2491.    -287.     -207.
## # ℹ 2 more variables: method <chr>, alternative <chr>
## Il p-value è estremamente basso, al di sotto del livello di significatività e questo vuol dire che c'è una differenza statisticamente significativa nelle medie dei pesi tra M e F. Quindi si rifiuta l'ipotesi  nulla.

H_0 (ipotesi nulla) = la media delle lunghezze dei neonati M e F del campione è uguale

H_a (ipotesi alternativa) la media delle lunghezze dei neonati M e F del campione non è uguale

Codice
t_test_diff_lunghezza <- t.test(Lunghezza ~ Sesso)

broom::tidy(t_test_diff_lunghezza)
## # A tibble: 1 × 10
##   estimate estimate1 estimate2 statistic  p.value parameter conf.low conf.high
##      <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>    <dbl>     <dbl>
## 1    -9.90      490.      500.     -9.58 2.24e-21     2459.    -11.9     -7.88
## # ℹ 2 more variables: method <chr>, alternative <chr>
## Il p-value è estremamente basso, al di sotto del livello di significatività e questo vuol dire che c'è una differenza statisticamente significativa nelle medie delle lunghezze tra M e F. Quindi si rifiuta l'ipotesi  nulla.

H_0 (ipotesi nulla) = la media del diametro del cranio dei neonati M e F del campione è uguale

H_a (ipotesi alternativa) la media del diametro del cranio dei neonati M e F del campione non è uguale

Codice
t_test_diff_cranio_sesso <- t.test(Cranio ~ Sesso)

broom::tidy(t_test_diff_cranio_sesso)
## # A tibble: 1 × 10
##   estimate estimate1 estimate2 statistic  p.value parameter conf.low conf.high
##      <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>    <dbl>     <dbl>
## 1    -4.82      338.      342.     -7.41 1.72e-13     2491.    -6.09     -3.54
## # ℹ 2 more variables: method <chr>, alternative <chr>
## Il p-value è estremamente basso, al di sotto del livello di significatività e questo vuol dire che c'è una differenza statisticamente significativa nel diametro del cranio tra M e F. Quindi si rifiuta l'ipotesi  nulla.

H_0 (ipotesi nulla) = non ci sono differenze significative nel peso dei neonati

H_a (ipotesi alternativa) ci sono differenze significative nel peso dei neonati

Codice
t_test_diff_fumatrici_peso <- t.test(Peso ~ Fumatrici)

broom::tidy(t_test_diff_fumatrici_peso)
## # A tibble: 1 × 10
##   estimate estimate1 estimate2 statistic p.value parameter conf.low conf.high
##      <dbl>     <dbl>     <dbl>     <dbl>   <dbl>     <dbl>    <dbl>     <dbl>
## 1     49.8     3286.     3236.      1.03   0.303      114.    -45.6      145.
## # ℹ 2 more variables: method <chr>, alternative <chr>
## Essendo il p value superiore al livello di significatività non possiamo rifiutare l'ipotesi nulla.

Creo un boxplot per analizzare i dati visivamente

Codice
dati_neonati$Fumatrici <- factor(Fumatrici, labels = c("Non Fumatrici", "Fumatrici"))

ggplot(dati_neonati, aes(x = Fumatrici, y = Peso, fill = Sesso)) +
  geom_boxplot() +
  scale_fill_manual(values = c("pink", "skyblue")) +
  
  scale_y_continuous(breaks = seq(800, 5000, 100))+ 
  
  labs(title = "Distribuzione del Peso dei Neonati in base allo Status di Fumatrici delle Madri",
       x = "Madri",
       y = "Peso dei Neonati (grammi)",
       fill = "Sesso") +
  theme_minimal()+
   theme(plot.title = element_text(hjust = 0.5))

## Dal boxplot notiamo che c'è una sensibile differenza di peso tra i neonati tra i due gruppi di madri (fumatrici e non).

Verifico l’ipotesi che in alcuni ospedali si facciano più parti cesarei

Test del Chi-quadro di Pearson

H_0 (ipotesi nulla) = non c’è un’associazione significativa tra il tipo di parto e l’ospedale

H_a (ipotesi alternativa) = c’è associazione

Codice
tab_contingenza <- table(Ospedale, Tipo.parto)
tab_contingenza
##         Tipo.parto
## Ospedale Ces Nat
##     osp1 242 574
##     osp2 254 595
##     osp3 232 603
Codice
test_chi2 <- chisq.test(tab_contingenza)
test_chi2
## 
##  Pearson's Chi-squared test
## 
## data:  tab_contingenza
## X-squared = 1.0972, df = 2, p-value = 0.5778
## Con un p-value di 0.5778 possiamo affermare che non vi è un'associazione significativa tra l'ospedale in cui viene eseguito il parto e il tipo di parto, poiché il p-value è superiore al livello di significatività comune del 5%

Analisi multidimensionale

Indago le variabili Sesso, Lunghezza e Cranio con la variabile risposta Peso calcolando la correlazione di Spearman tramite la funzione cor

Codice
cor(Peso, Lunghezza, method = "spearman")
## [1] 0.7496205
## Questo risultato mostra una correlazione positiva relativamente forte tra il peso e la lunghezza dei neonati. Al crescere dell'uno cresce anche l'altro.

Creo uno scatterplot per visualizzare le differenze

Codice
ggplot(dati_neonati) +
  geom_point(aes(x = Lunghezza, y = Peso, color = Sesso)) +
  scale_x_continuous(breaks = seq(300, 600, 25)) +
  scale_y_continuous(breaks = seq(800, 5000, 100)) +
  geom_smooth(aes(x = Lunghezza, y = Peso, color = Sesso), se = FALSE, method = "lm") +
  geom_smooth(aes(x = Lunghezza, y = Peso), color = "black", se = FALSE, method = "lm") +
  labs(title = "Relazione tra Lunghezza e Peso dei Neonati",
       x = "Lunghezza (mm)",
       y = "Peso (grammi)",
       color = "Sesso") +
  theme_minimal()+
   theme(plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'

## Nel grafico si osserva una tendenza generale ascendente, indicando che, all'aumentare della lunghezza dei neonati, tende ad aumentare anche il loro peso. 
## Le linee di regressione lineare, tracciate per sesso (rosso e verde) e nero per l'intero dataset, mostrano che indipendentemente dal sesso esiste una relazione positiva tra lunghezza e peso. Ci sono però differenze minime nelle inclinazioni che suggeriscono piccole variazioni del tasso di crescita del peso tra i due sessi.
Codice
cor(Peso, Cranio, method = "spearman")
## [1] 0.6322726
## Questo risultato mostra una correlazione positiva moderatamente forte tra il peso e il diametro del cranio dei neonati. Al crescere dell'uno cresce anche l'altro.

Creo uno scatterplot per visualizzare le differenze

Codice
ggplot(dati_neonati) +
  geom_point(aes(x = Cranio, y = Peso, color = Sesso)) +
  scale_x_continuous(breaks = seq(200, 400, 25)) +
  geom_smooth(aes(x = Cranio, y = Peso, color = Sesso), se = FALSE, method = "lm") +
  geom_smooth(aes(x = Cranio, y = Peso), color = "black", se = FALSE, method = "lm") +
  labs(title = "Relazione tra la circonferenza cranica e il peso dei neonati",
       x = "Circonferenza cranica (mm)",
       y = "Peso (grammi)",
       color = "Sesso") +
  theme_minimal()+
   theme(plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'

## Nel grafico si osserva una tendenza generale ascendente, indicando che, all'aumentare del peso dei neonati, tende ad aumentare anche il diametro del loro cranio. 
## Le linee di regressione lineare, tracciate per sesso (rosso e verde) e nero per l'intero datatset,mostrano che a parità di circonferenza cranica i maschi hanno un peso maggiore.
Codice
cor(Peso, Anni.madre, method = "spearman")
## [1] -0.006576456
## Il valore -0.006576456 è molto vicino a 0. Il peso dei neonati all'aumentare dell'età delle madri tende a diminuire lievemente, ma questa tendenza è estremamente debole e probabilmente non significativa indicando che non c'è praticamente alcuna correlazione tra il peso dei neonati e l'età delle madri.
Codice
cor(Peso, N.gravidanze, method = "spearman")
## [1] 0.01670611
## Il valore 0.01670611 è molto vicino a 0 indicando che non c'è praticamente alcuna correlazione tra il peso dei neonati e il numero di gravidanze delle madri, anche se all'aumentare del numero di gravidanze il peso dei neonati tende ad aumentare lievemente.
Codice
cor(Peso, Gestazione, method = "spearman")
## [1] 0.4317869
## Questo risultato mostra una correlazione positiva mediamente forte tra il peso e il numero di settimane di gestazione.

Creo uno scatterplot per visualizzare le differenze

Codice
ggplot(dati_neonati)+
  geom_point(aes(x=Gestazione, y=Peso, col=Sesso))+
  scale_x_continuous(breaks = seq(25,43,1))+
    scale_y_continuous(breaks = seq(800,5000,100))+
  
  geom_smooth(aes(x=Gestazione, y=Peso, col=Sesso), se=F, method = "lm")+
  geom_smooth(aes(x=Gestazione, y=Peso), col="black", se=F, method = "lm")+
  
  labs(title = "Relazione tra il numero di settimane di gestazione e il peso dei neonati",
       x = "Gestazione (settimane)",
       y = "Peso (grammi)",
       color = "Sesso") +
  theme_minimal()+
   theme(plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'

Creo un modello di regressione lineare multipla con tutte le variabili

H_0 = il campione proviene da una popolazione che segue una distribuzione normale

H_a = il campione non proviene da una popolazione che segue una distribuzione normale

Codice
shapiro.test(Peso)
## 
##  Shapiro-Wilk normality test
## 
## data:  Peso
## W = 0.97066, p-value < 2.2e-16
## Il p-value estremamente piccolo, minore del livello di significatività dello 0,05%,  suggerisce che il peso dei neonati non segue una distribuzione normale. Si rifiuta l'ipotesi nulla.

Trasformo la variabile Fumatrici qualitativa dicotomica in numerica

Codice
dati_neonati$Fumatrici <- ifelse(dati_neonati$Fumatrici == "Fumatrici", 1, 0)
dati_neonati$Sesso <- ifelse(dati_neonati$Sesso == "M", 1, 0)

Verifico il dataframe

Codice
str(dati_neonati)
## 'data.frame':    2500 obs. of  10 variables:
##  $ Anni.madre  : num  26 21 34 28 20 32 26 25 22 23 ...
##  $ N.gravidanze: int  0 2 3 1 0 0 1 0 1 0 ...
##  $ Fumatrici   : num  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       : num  1 0 1 1 0 0 0 1 0 0 ...

Seleziono le colonne numeriche

Codice
dati_neonati_numerici <- dati_neonati[sapply(dati_neonati, is.numeric)]

Indago le relazioni fra più variabili e creo la matrice di correlazione

Codice
round(cor(dati_neonati_numerici),2)
##              Anni.madre N.gravidanze Fumatrici Gestazione  Peso Lunghezza
## Anni.madre         1.00         0.38      0.01      -0.13 -0.02     -0.06
## N.gravidanze       0.38         1.00      0.05      -0.10  0.00     -0.06
## Fumatrici          0.01         0.05      1.00       0.03 -0.02     -0.02
## Gestazione        -0.13        -0.10      0.03       1.00  0.59      0.62
## Peso              -0.02         0.00     -0.02       0.59  1.00      0.80
## Lunghezza         -0.06        -0.06     -0.02       0.62  0.80      1.00
## Cranio             0.02         0.04     -0.01       0.46  0.70      0.60
## Sesso              0.01         0.02      0.01       0.13  0.24      0.19
##              Cranio Sesso
## Anni.madre     0.02  0.01
## N.gravidanze   0.04  0.02
## Fumatrici     -0.01  0.01
## Gestazione     0.46  0.13
## Peso           0.70  0.24
## Lunghezza      0.60  0.19
## Cranio         1.00  0.15
## Sesso          0.15  1.00
## Ci sono correlazioni notevoli tra Il peso e la lunghezza e tra il peso e il diametro del cranio. Buona correlazione tra lunghezza e diametro del cranio, tra la gestazione e il peso, gestazione e lunghezza e tra la gestazione e il diametro del cranio.
## Ci sono correlazioni basse tra il sesso e il peso ma che comunque suggerisce che il sesso del neonato può avere influenza sul suo peso.
## Ci sono correlazioni estramamente basse tra le variabili dei neonati (peso, lunghezza e diametro cranio) e gli anni delle madri, il numero di gravidanze e il loro stato di fumatrici o non.

Creo i grafici

Codice
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(dati_neonati_numerici, upper.panel = panel.smooth, lower.panel = panel.cor)

Creo il primo modello

Codice
mod1 <- lm(Peso ~ Anni.madre+N.gravidanze+Fumatrici+Gestazione+Lunghezza+Cranio+Sesso, data = dati_neonati_numerici)

summary(mod1)
## 
## Call:
## lm(formula = Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + 
##     Lunghezza + Cranio + Sesso, data = dati_neonati_numerici)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1160.62  -181.17   -15.91   163.47  2631.35 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -6711.5440   141.2543 -47.514  < 2e-16 ***
## Anni.madre       0.8772     1.1487   0.764   0.4452    
## N.gravidanze    11.4029     4.6745   2.439   0.0148 *  
## Fumatrici      -30.2865    27.5981  -1.097   0.2726    
## Gestazione      32.8936     3.8259   8.598  < 2e-16 ***
## Lunghezza       10.2348     0.3009  34.010  < 2e-16 ***
## Cranio          10.5192     0.4268  24.644  < 2e-16 ***
## Sesso           78.0898    11.2042   6.970 4.05e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 274.6 on 2492 degrees of freedom
## Multiple R-squared:  0.7272, Adjusted R-squared:  0.7264 
## F-statistic:   949 on 7 and 2492 DF,  p-value: < 2.2e-16
## Nella tabella dei coefficienti abbiamo le stime dei coefficienti beta per tutte le variabili e rappresentano gli effetti marginali di ogni singola variabile sulla variabile risposta.
## Gli anni della madre  non hanno un effetto significativo sul peso del neonato, poiché il p-value è maggiore di 0.05.
## C'è un effetto positivo del numero di gravidanze precedenti sul peso del neonato e ovviamente anche la durata della gestazione ha un effetto positivo e significativo sul peso.
## Hanno un effetto positivo la lunghezza, il diametro del cranio e anche il sesso del neonato sulla variabile risposta.
## A quanto pare essere una madre fumatrice non ha un effetto significativo sulla variabile risposta peso.
## L'R quadro è di 0.73, l'R quadro aggiustato è simile ed indicano un modello buono

Procedura stepwise, tolgo le variabili una alla volta

Codice
mod2 <- update(mod1, ~. -Anni.madre)
summary(mod2)
## 
## Call:
## lm(formula = Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza + 
##     Cranio + Sesso, data = dati_neonati_numerici)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1150.3  -181.3   -15.7   163.0  2636.3 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -6681.6714   135.7178 -49.232  < 2e-16 ***
## N.gravidanze    12.7185     4.3450   2.927  0.00345 ** 
## Fumatrici      -30.4634    27.5948  -1.104  0.26972    
## Gestazione      32.5914     3.8051   8.565  < 2e-16 ***
## Lunghezza       10.2341     0.3009  34.011  < 2e-16 ***
## Cranio          10.5359     0.4262  24.718  < 2e-16 ***
## Sesso           78.1713    11.2028   6.978 3.83e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 274.6 on 2493 degrees of freedom
## Multiple R-squared:  0.7271, Adjusted R-squared:  0.7265 
## F-statistic:  1107 on 6 and 2493 DF,  p-value: < 2.2e-16

Applico il metodo ANOVA per l’analisi della varianza

Codice
anova(mod1, mod2)
## Analysis of Variance Table
## 
## Model 1: Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza + 
##     Cranio + Sesso
## Model 2: Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio + 
##     Sesso
##   Res.Df       RSS Df Sum of Sq      F Pr(>F)
## 1   2492 187929681                           
## 2   2493 187973654 -1    -43973 0.5831 0.4452
## Il valore di p value più alto del livello di significatività indica che non vi è evidenza sufficiente per rigettare l'ipotesi nulla, la variabile Anni.madre non ha un impatto significativo.
## Altri modelli (escludendo altre variabili) non li prendo in considerazione in quanto le variabili usate nel mod2 sono necessarie per predire il peso dei neonati. 
## Anche se di poco la variabile Fumatrici, ad esempio, incide un pò sul peso del nascituro come visto dal t test.

Applico i criteri di informazione AIC e BIC

Codice
AIC(mod1, mod2 )
##      df      AIC
## mod1  9 35181.52
## mod2  8 35180.11
Codice
BIC (mod1, mod2)
##      df      BIC
## mod1  9 35233.94
## mod2  8 35226.70
## Secondo AIC e BIC il modello migliore è il mod2

Calcolo i VIF per valutare la collinearità tra le variabili predittive

Codice
library(car)
## Caricamento del pacchetto richiesto: carData
Codice
vif(mod2)
## N.gravidanze    Fumatrici   Gestazione    Lunghezza       Cranio        Sesso 
##     1.026120     1.006607     1.675575     2.078644     1.624603     1.040271
## I vif delle variabili sono bassi, al di sotto di 5. Non ci sono problemi di multicollinearità.

Diagnostica sui residui del modello

Codice
par(mfrow=c(2,2))
plot(mod2)

## Nel primo grafico, Residual vs Fitted, la maggior parte dei dati si colloca intorno alla media di 0. Alcuni dati sono sparsi indicando a quanto pare che non sono stati filtrati bene dei regressori e si sono riversati sui residui.
## 
## Nel secondo grafico, Normal Q-Q, vengono messi in relazione i residui con i quantili di una di una distribuzione normale. La maggior parte dei dati si trova sulla retta e questo è positivo però le due code, inferiore e superiore, presentano dati che si discostano un pò.
## 
## Nel terzo grafico, Scale-Location, la maggior parte dei dati si posizionano intorno al valore y di 0.8 ma si concentrano intorno al valore x di 3200 e non si posizionano lungo la retta.
## 
## Nel quarto grafico, Residuals vs Leverange, i residui mostrano una distanza di Cook nella norma. Non ci sono valori influenti tranne che per uno, il 1551.

Indago i valori di leva e i valori outliers numericamente

Codice
lev <- hatvalues(mod2)
plot(lev)

p = sum(lev)

soglia = 2*p/N
abline(h=soglia, col=2)

Codice
lev[lev>soglia]
##          13          15          34          67          89          99 
## 0.005701303 0.007063521 0.006754498 0.005892580 0.012910981 0.010439294 
##         101         105         106         120         128         131 
## 0.007547922 0.010619066 0.014502002 0.010038865 0.011383848 0.007234866 
##         134         140         151         155         161         182 
## 0.007594012 0.011383097 0.010954678 0.007236095 0.020448546 0.011314658 
##         194         204         206         220         234         242 
## 0.010838364 0.014576811 0.009483391 0.007440530 0.010852299 0.010235987 
##         251         279         294         296         306         310 
## 0.010893497 0.010509023 0.005974827 0.010171095 0.010856933 0.028812882 
##         312         321         335         378         391         413 
## 0.013203779 0.010712320 0.010921679 0.015934740 0.010945631 0.010550439 
##         424         442         445         473         492         516 
## 0.010778599 0.016100607 0.007513013 0.011311052 0.008306692 0.013188913 
##         538         557         567         572         582         587 
## 0.012114256 0.010675402 0.010349049 0.010612745 0.011720774 0.008412394 
##         592         593         638         656         658         668 
## 0.006384761 0.010423807 0.006695658 0.006018345 0.011305325 0.011515183 
##         684         697         699         703         748         750 
## 0.008836176 0.005872566 0.011104503 0.010765338 0.008580665 0.006965520 
##         757         758         765         805         828         913 
## 0.008193218 0.011588686 0.006075696 0.014369467 0.007252180 0.005643794 
##         928         932         946         947         956         984 
## 0.022756502 0.010471866 0.006929519 0.008436064 0.007853821 0.010404872 
##         985        1014        1017        1026        1037        1051 
## 0.007132127 0.008519880 0.011236061 0.011627171 0.010357179 0.010765729 
##        1067        1091        1106        1110        1118        1130 
## 0.008473411 0.008952316 0.006006209 0.010413324 0.010363532 0.032004825 
##        1170        1175        1181        1188        1219        1227 
## 0.010797117 0.010504719 0.005679157 0.006482056 0.030876924 0.011904008 
##        1238        1248        1262        1271        1273        1282 
## 0.005910463 0.014637569 0.012913716 0.010119368 0.007085833 0.010434740 
##        1285        1291        1293        1311        1321        1326 
## 0.012201635 0.006160032 0.006100177 0.009678501 0.009353884 0.011062394 
##        1333        1357        1368        1379        1385        1397 
## 0.011373022 0.006965052 0.011081209 0.010729161 0.012637438 0.011242355 
##        1398        1400        1410        1411        1415        1425 
## 0.010898342 0.005925138 0.012145967 0.008128147 0.010394855 0.010298475 
##        1426        1428        1429        1443        1449        1450 
## 0.013000422 0.008245853 0.021763751 0.011273205 0.011022883 0.015264031 
##        1458        1473        1480        1505        1512        1525 
## 0.010509023 0.010704585 0.011506315 0.013426687 0.011239772 0.010429984 
##        1537        1551        1553        1556        1576        1583 
## 0.011945191 0.048894280 0.008506884 0.005958271 0.010627832 0.012627876 
##        1593        1610        1619        1626        1652        1660 
## 0.005669713 0.008727229 0.015088232 0.011104701 0.011301902 0.011289554 
##        1672        1686        1691        1701        1712        1718 
## 0.010903644 0.009349482 0.010807413 0.010857075 0.006998227 0.007038575 
##        1720        1727        1761        1763        1780        1781 
## 0.010997269 0.013376581 0.011311923 0.010748635 0.025543096 0.016923009 
##        1789        1809        1827        1902        1906        1920 
## 0.010797999 0.008710061 0.006077091 0.010576575 0.010376577 0.014344029 
##        1929        1933        1971        1977        2003        2016 
## 0.012560840 0.010996875 0.012328192 0.006934103 0.011147851 0.013531116 
##        2040        2046        2049        2086        2089        2101 
## 0.011541669 0.014286949 0.010439294 0.013303759 0.015640622 0.011513947 
##        2110        2114        2115        2120        2140        2145 
## 0.010608705 0.013332484 0.011775621 0.018660016 0.006263186 0.010268351 
##        2146        2148        2149        2157        2175        2200 
## 0.005833949 0.007983119 0.013606612 0.005967649 0.032596366 0.011670531 
##        2202        2216        2220        2221        2224        2237 
## 0.010368796 0.008120263 0.013757017 0.021754315 0.005847734 0.010698549 
##        2238        2244        2245        2256        2257        2270 
## 0.010965046 0.006995300 0.013619106 0.010582603 0.006185756 0.011002949 
##        2282        2285        2307        2317        2337        2353 
## 0.010998766 0.010708229 0.013979507 0.007749993 0.014207152 0.012972794 
##        2359        2361        2408        2412        2422        2437 
## 0.010106830 0.010626804 0.009708738 0.010412911 0.021698506 0.023956769 
##        2450        2452        2458        2459        2465        2471 
## 0.010627186 0.023838748 0.008506091 0.010213071 0.011317924 0.021047568 
##        2478 
## 0.005775174
## Le osservazioni con valori di leverage oltre il valore di soglia in questo modello sono diversi però i loro valori sono molto bassi.

Indago gli outliers e applico la correzione di Bonferroni

Codice
plot(rstudent(mod2))
abline(h=c(-2,2),col=2)

Codice
outlierTest(mod2)
##       rstudent unadjusted p-value Bonferroni p
## 1551 10.039719         2.8060e-23   7.0149e-20
## 155   5.022108         5.4723e-07   1.3681e-03
## 1306  4.823102         1.4986e-06   3.7465e-03
## Abbiamo tre valori outliers nel mod2.

Calcolo la distanza di Cook

Codice
cook<-cooks.distance(mod2)
plot(cook)

Codice
max(cook)
## [1] 0.7117513
## Abbiamo un valore che supera la soglia di allarme di 0.5. Questo valore sarà influente sulle stime di regressione.

Effettuo i test sui residui

H_0 = omoschedasticità H_a = eteroschedasticità

Codice
library(lmtest)
## Caricamento del pacchetto richiesto: zoo
## 
## Caricamento pacchetto: 'zoo'
## I seguenti oggetti sono mascherati da 'package:base':
## 
##     as.Date, as.Date.numeric
Codice
bptest(mod2)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod2
## BP = 89.798, df = 6, p-value < 2.2e-16
## Con un p value così basso si rifiuta l'ipotesi nulla di omoschedasticità (varianze costanti), quindi siamo in presenza di eteroschedasticità nel modello, gli errori non hanno una varianza costante. I residui non appaiono distribuiti casualmente attorno alla linea orizzontale zero.

H_0 = non c’è autocorrelazione tra i residui H_a = c’è autocorrelazione nei residui

Codice
dwtest(mod2)
## 
##  Durbin-Watson test
## 
## data:  mod2
## DW = 1.9542, p-value = 0.126
## alternative hypothesis: true autocorrelation is greater than 0
## Il valore DW di quasi 2 suggerisce che non c'è una forte evidenza di autocorrelazione positiva. Il p value di 0.126 indica che non possiamo rifiutare l'ipotesi nulla, non abbiamo evidenza sufficiente per concludere che esista autocorrelazione positiva nei residui del modello.

H_0 = normalità dei residui H_a = non normalità dei residui

Codice
shapiro.test(residuals(mod2))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mod2)
## W = 0.9741, p-value < 2.2e-16
## Il valore W si allontana da 1, suggerendo che i residui potrebbero non essere distribuiti normalmente. Il p value molto basso rifiuta l'ipotesi nulla di normalità, quindi i residui non sono distribuiti normalmente.

Creo il density plot

Codice
plot(density(residuals(mod2)))

## Sia nella coda sinistra che nella coda destra abbiamo delle leggere protuberanze ma il resto della distribuzione assomiglia a una normale. 
## Quindi il modello mi sembra abbastanza buono per fare previsioni.

Previsione per il peso di una neonata

Codice
dato_previsione <- data.frame(
  Gestazione = 39,
  N.gravidanze = 3,     
  Sesso = 0,
  Lunghezza = mean(Lunghezza),
  Cranio = mean(Cranio),
  Fumatrici = 0
)

previsione_peso <- predict(mod2, newdata = dato_previsione)
## Previsione del peso per la neonata: 3273 grammi

Creo il grafico per rappresentare il modello

Codice
dati_neonati_numerici$Sesso <- factor(dati_neonati_numerici$Sesso, levels = c(0, 1), labels = c("Femmina", "Maschio"))

dati_neonati_numerici$Fumatrici <- factor(dati_neonati_numerici$Fumatrici, levels = c(0, 1), labels = c("Non Fumatrici", "Fumatrici"))

ggplot(data = dati_neonati_numerici, aes(x = Gestazione, y = Peso, color = Sesso)) +
  geom_point(size = 3) +  
  facet_wrap(~ Fumatrici) +  
  labs(x = "Gestazione", y = "Peso", color = "Sesso") + 
  
  theme_minimal()