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] 2500Codice
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 variabiliStatistica 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.00Quantili
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 46Range interquartile
Codice
IQR(Anni.madre)## [1] 7Calcolo 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.1866Codice
sigma_Anni_madre## [1] 5.214077Indice di asimmetria di Fischer e Curtosi
Codice
library(moments)
skewness(Anni.madre)## [1] 0.1512083Codice
kurtosis(Anni.madre)-3## [1] -0.1032773Creo 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 platicurticaVariabile 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.0000Quantili
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 12Range interquartile
Codice
IQR(N.gravidanze)## [1] 1Calcolo 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.639247Codice
sigma_N_gravidanze## [1] 1.280331Indice di asimmetria di Fischer e Curtosi
Codice
skewness(N.gravidanze)## [1] 2.514254Codice
kurtosis(N.gravidanze)-3## [1] 10.98941Creo 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 104Creo 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 fumaVariabile 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.00Quantili
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 43Range interquartile
Codice
IQR(Gestazione)## [1] 2Calcolo 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.490416Codice
sigma_Gestazione## [1] 1.868265Indice di asimmetria di Fischer e Curtosi
Codice
skewness(Gestazione)## [1] -2.065313Codice
kurtosis(Gestazione)-3## [1] 8.25815Creo 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 4930Quantili
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 4930Range interquartile
Codice
IQR(Peso)## [1] 630Calcolo 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.4Codice
sigma_Peso## [1] 524.9337Indice di asimmetria di Fischer e Curtosi
Codice
skewness(Peso)## [1] -0.6470308Codice
kurtosis(Peso)-3## [1] 2.031532Creo 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.0Quantili
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 565Range interquartile
Codice
IQR(Lunghezza)## [1] 30Calcolo 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.3939Codice
sigma_Lunghezza## [1] 26.31338Indice di asimmetria di Fischer e Curtosi
Codice
skewness(Lunghezza)## [1] -1.514699Codice
kurtosis(Lunghezza)-3## [1] 6.487174Creo 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 390Quantili
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 390Range interquartile
Codice
IQR(Cranio)## [1] 20Calcolo 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.6835Codice
sigma_Cranio## [1] 16.42204Indice di asimmetria di Fischer e Curtosi
Codice
skewness(Cranio)## [1] -0.7850527Codice
kurtosis(Cranio)-3## [1] 2.946206Creo 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 1772Creo 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 835Creo 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 1244Creo 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 603Codice
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 buonoProcedura 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-16Applico 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.11Codice
BIC (mod1, mod2)## df BIC
## mod1 9 35233.94
## mod2 8 35226.70## Secondo AIC e BIC il modello migliore è il mod2Calcolo i VIF per valutare la collinearità tra le variabili predittive
Codice
library(car)## Caricamento del pacchetto richiesto: carDataCodice
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.numericCodice
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 grammiCreo 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()