Lโobiettivo dello studio รจ la creazione di un modello statistico in grado di prevedere con precisione il peso dei neonati alla nascita, basandosi su variabili cliniche raccolte da tre ospedali. Il progetto mira a migliorare la gestione delle gravidanze ad alto rischio, ottimizzare le risorse ospedaliere e garantire migliori risultati e garantire migliori risultati per la salute neonatale.
Andiamo ad importare il dataset con i dati oggetto del nostro studio
neonati <- read.csv("neonati.csv",
stringsAsFactors = T,
sep = ",")
Allโinterno della funzione read.csv ho specificato il separatore di colonne del foglio elettronico (virgola) e ho utilizzato questo argomento stringAsFactor = True perchรฉ allโinterno del dataset ci sono delle variabili qualitative che vanno lette come fattori e non come semplici string
Andiamo a verificare la presenza di dati mancanti (Na e NaN)
colSums(is.na(neonati))
## Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza
## 0 0 0 0 0 0
## Cranio Tipo.parto Ospedale Sesso
## 0 0 0 0
Visto che per ogni colonna abbiamo un valore di 0 sappiamo che non ci sono dati mancanti
Verifichiamo quanti set di dati abbiamo
nrow(neonati)
## [1] 2500
Visualizziamo le prime 5 righe del nostro dataset
head(neonati)
## Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio Tipo.parto
## 1 26 0 0 42 3380 490 325 Nat
## 2 21 2 0 39 3150 490 345 Nat
## 3 34 3 0 38 3640 500 375 Nat
## 4 28 1 0 41 3690 515 365 Nat
## 5 20 0 0 38 3700 480 335 Nat
## 6 32 0 0 40 3200 495 340 Nat
## Ospedale Sesso
## 1 osp3 M
## 2 osp1 F
## 3 osp2 M
## 4 osp2 M
## 5 osp3 F
## 6 osp2 F
Dunque abbiamo un dataset costituito da 2500 osservazioni di 10 variabili.
Ecco le variabili presenti:
โข Etร della madre: Misura dellโetร in anni. (variabile quantitativa continua)
โข Numero di gravidanze: Quante gravidanze ha avuto la madre. (variabile quantitativa discreta)
โข Fumo materno: Un indicatore binario (0=non fumatrice, 1=fumatrice). (variabile qualitativa dummy)
โข Durata della gravidanza: Numero di settimane di gestazione. (variabile quantitativa continua)
โข Peso del neonato: Peso alla nascita in grammi. (variabile quantitativa continua)
โข Lunghezza e diametro del cranio: Lunghezza del neonato e diametro craniale, misurabili anche durante la gravidanza tramite ecografie. (variabile quantitativa continua) I valori riportati nel dataset sono verosimilmente relativi alla circonferenza del cranio e non al diametro.
โข Tipo di parto: Naturale o cesareo. (variabile qualitativa su base nominale)
โข Ospedale di nascita: Ospedale 1, 2 o 3. (variabile qualitativa su base nominale)
โข Sesso del neonato: Maschio (M) o femmina (F). (variabile qualitativa su base nominale)
Anche la colonna con la variabile dummy Fumatrici (che attualmente รจ una variabile int) deve essere trasformata in fattori
neonati$Fumatrici <- as.factor(neonati$Fumatrici)
A questo punto facciamo un summary del nostro dataset per svolgere unโanalisi preliminare
summary(neonati)
## Anni.madre N.gravidanze Fumatrici Gestazione Peso
## Min. : 0.00 Min. : 0.0000 0:2396 Min. :25.00 Min. : 830
## 1st Qu.:25.00 1st Qu.: 0.0000 1: 104 1st Qu.:38.00 1st Qu.:2990
## Median :28.00 Median : 1.0000 Median :39.00 Median :3300
## Mean :28.16 Mean : 0.9812 Mean :38.98 Mean :3284
## 3rd Qu.:32.00 3rd Qu.: 1.0000 3rd Qu.:40.00 3rd Qu.:3620
## Max. :46.00 Max. :12.0000 Max. :43.00 Max. :4930
## Lunghezza Cranio Tipo.parto Ospedale Sesso
## Min. :310.0 Min. :235 Ces: 728 osp1:816 F:1256
## 1st Qu.:480.0 1st Qu.:330 Nat:1772 osp2:849 M:1244
## Median :500.0 Median :340 osp3:835
## Mean :494.7 Mean :340
## 3rd Qu.:510.0 3rd Qu.:350
## Max. :565.0 Max. :390
Da questo summary possiamo vedere che cโรจ certamente un problema con la variabile Anni.madre in quanto ha un valore minimo di 0, cosa ovviamente non possibile. Diamo unโocchiata al suo grafico
plot(neonati$Anni.madre, pch=20, col="royalblue3")
Abbiamo due osservazioni molto basse, una pari a 0 e una certamente minore di 5, che vanno eliminate perchรจ sono frutto di errore in quanto non รจ fisiologicamente possibile avere figli a quellโetร
neonati <- subset(neonati, Anni.madre > 5)
Andiamo ad osservare il summary aggiornato
summary(neonati)
## Anni.madre N.gravidanze Fumatrici Gestazione Peso
## Min. :13.00 Min. : 0.0000 0:2394 Min. :25.00 Min. : 830
## 1st Qu.:25.00 1st Qu.: 0.0000 1: 104 1st Qu.:38.00 1st Qu.:2990
## Median :28.00 Median : 1.0000 Median :39.00 Median :3300
## Mean :28.19 Mean : 0.9816 Mean :38.98 Mean :3284
## 3rd Qu.:32.00 3rd Qu.: 1.0000 3rd Qu.:40.00 3rd Qu.:3620
## Max. :46.00 Max. :12.0000 Max. :43.00 Max. :4930
## Lunghezza Cranio Tipo.parto Ospedale Sesso
## Min. :310.0 Min. :235 Ces: 728 osp1:816 F:1255
## 1st Qu.:480.0 1st Qu.:330 Nat:1770 osp2:848 M:1243
## Median :500.0 Median :340 osp3:834
## Mean :494.7 Mean :340
## 3rd Qu.:510.0 3rd Qu.:350
## Max. :565.0 Max. :390
Dal summary possiamo osservare che le madri:
hanno tra i 13 e i 46 anni con una mediana di 28 e una media di 28.19
hanno avuto tra 0 e 12 gravidanze precedenti con una mediana di 1 e una media di 0.98
non fumatrici sono 2394 e fumatrici sono 104.
Le settimane di gestazione a cui sono nati i neonati variano tra 25 e 43 con una mediana di 39 e una media di 38.98
I neonati hanno: - un peso che varia tra 830 e 4930 grammi con una mediana di 3300 e una media di 3284
una lunghezza che varia tra 310 e 565 millimetri con una mediana di 500 e una media di 494.7
un diametro del cranio che varia tra 235 e 390 millimetri con una mediana e una media di 340
728 neonati sono nati per parto cesareo e 1770 per parto naturale
Ci sono 816 neonati nati nellโospedale 1, 848 nellโospedale 2 e 834 nellโospedale 3
Sesso: 1255 sono neonati femmine e 1243 sono maschi
Salviamo il numero di righe del nostro dataset nella variabile n
n <- nrow(neonati)
Le righe del dataset adesso sono 2498
Estraiamo le colonne dal dataframe neonati in modo da non dover richiamare tutte le volte il dataset di riferimento e usare il simbolo dollaro
attach(neonati)
Saggiamo lโipotesi che i valori della media di peso e lunghezza del nostro dataset siano significativamente uguali a quelli della popolazione
Prendiamo come valori di riferimento quelli presenti in questa pagina internet: https://www.ospedalebambinogesu.it/da-0-a-30-giorni-come-si-presenta-e-come-cresce-80012/ ovvero Peso alla nascita 3300g e lunghezza 500 mm
#H0: peso medio = 3300
#H1: peso medio != 3300
t.test(Peso,
mu = 3300,
conf.level = 0.95,
alternative = "two.sided")
##
## One Sample t-test
##
## data: Peso
## t = -1.505, df = 2497, p-value = 0.1324
## alternative hypothesis: true mean is not equal to 3300
## 95 percent confidence interval:
## 3263.577 3304.791
## sample estimates:
## mean of x
## 3284.184
Non si rifiuta lโipotesi nulla, dunque il valore della media del peso di questo campione รจ significativamente uguale alla media del peso della popolazione.
Procediamo allo stesso modo per la lunghezza.
#H0: lunghezza media = 500
#H1: lunghezza media != 500
t.test(Lunghezza,
mu = 500,
conf.level = 0.95,
alternative = "two.sided")
##
## One Sample t-test
##
## data: Lunghezza
## t = -10.069, df = 2497, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 500
## 95 percent confidence interval:
## 493.6628 495.7287
## sample estimates:
## mean of x
## 494.6958
Si rifiuta lโipotesi nulla, dunque secondo il t-test il valore della media della lunghezza di questo campione non รจ significativamente uguale alla media della lunghezza della popolazione. La differenza tra le due medie รจ perรฒ di soli 6 mm quindi la questione va approfondita al di lร del risultato del test.
Proviamo a fare lo scatterplot delle diverse variabili quantitative per capire se ci sono altri outliers o anomalie
plot(Peso, pch=20, col="royalblue3")
plot(Anni.madre, pch=20, col="royalblue3")
plot(N.gravidanze, pch=20, col="royalblue3")
plot(Gestazione, pch=20, col="royalblue3")
plot(Lunghezza, pch=20, col="royalblue3")
plot(Cranio, pch=20, col="royalblue3")
Guardando gli scatterplot delle singole variabili non sembra esserci nessuna anomalia specifica come accadeva anche leggendo i dati del summary.
Analizziamo invece i grafici di 2 variabili numeriche alla volta per visualizzare le loro relazioni.
plot(Anni.madre, Peso, pch=20, col="royalblue3")
nessuna anomalia rilevabile
plot(N.gravidanze, Peso, pch=20, col="royalblue3")
nessuna anomalia rilevabile
plot(Gestazione, Peso, pch=20, col="royalblue3")
Qui abbiamo un primo valore un poโ fuori dalla nuvola ovvero peso intorno ai 4500g per settimana di gestazione pari a 35
Troviamo il numero di questa osservazione
which(Gestazione==35 & Peso > 4000)
## [1] 1551
รจ la numero 1551
plot(Gestazione, Lunghezza, pch=20, col="royalblue3")
qui invece abbiamo un valore un poโ fuori dalla nuvola ovvero gestazione pari a 38 e lunghezza tra 300 e 350 mm Troviamo il numero di questa osservazione
which(Gestazione==38 & Lunghezza < 350)
## [1] 1549
รจ la numero 1549
plot(Lunghezza, Peso, pch=20, col="royalblue3")
Qui troviamo un valore โfuoriโ dalla nuvola formata dagli altri valori: peso molto alto (tra i 4000 e i 4500g) rispetto alla lunghezza che รจ vicina a 300mm
Troviamo il numero dellโosservazione:
which(Lunghezza<350 & Peso > 4000)
## [1] 1549
รจ sempre la numero 1549, lโosservazione che aveva un valore di lunghezza piccolo per la settimana di gestazione
plot(Cranio, Peso, pch=20, col="royalblue3")
qui abbiamo un paio di osservazioni con valori di peso piccolo rispetto alla circonferenza del cranio.
Troviamoli:
which(Cranio>350 & Peso <2000)
## [1] 310 1427
Sono le osservazioni 310 e 1427
proviamo a guardare il grafico del peso
ggplot()+
geom_histogram(aes(x=Peso),
stat="density",
col="royalblue3",
fill="royalblue3")+
labs(title = "Distribuzione della variabile peso",
x = "Peso (g)",
y = "Densitร ")+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face="bold"))
Dal grafico vediamo che la coda di sinistra รจ piรน lunga della coda di destra
Realizziamo i grafici dei regressori
ggplot()+
geom_histogram(aes(x=Anni.madre),
col="royalblue4",
fill="royalblue3",
bins = 34)+
labs(title = "Distribuzione della variabile anni madre",
x = "Anni madre",
y = "Frequenze assolute")+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face="bold"))
la distribuzione ha la coda di destra piรน lunga
ggplot()+
geom_histogram(aes(x=N.gravidanze),
col="royalblue4",
fill="royalblue3",
bins = 13)+
labs(title = "Distribuzione della variabile numero gravidanze",
x = "Numero gravidanze precedenti",
y = "Frequenze assolute")+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face="bold"))
Il numero di unitร statistiche relative a donne che hanno avuto piรน di 3 gravidanze precedenti รจ molto basso.
ggplot()+
geom_histogram(aes(x=Gestazione),
col="royalblue4",
fill="royalblue3",
bins = 19)+
labs(title = "Distribuzione della variabile gestazione",
x = "Gestazione (settimane)",
y = "Frequenze assolute")+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face="bold"))
la coda di sinistra รจ molto piรน lunga di quella di destra
ggplot()+
geom_histogram(aes(x=Lunghezza),
stat="density",
col="royalblue3",
fill="royalblue3")+
labs(title = "Distribuzione della variabile lunghezza",
x = "Lunghezza (mm)",
y = "Densitร ")+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face="bold"))
La coda di sinistra รจ molto piรน lunga di quella di destra.
ggplot()+
geom_histogram(aes(x=Cranio),
stat="density",
col="royalblue3",
fill="royalblue3")+
labs(title = "Distribuzione della variabile cranio",
x = "Circonferenza cranio (mm)",
y = "Densitร ")+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face="bold"))
Anche qui la coda di sinistra รจ molto piรน lunga di quella di destra.
ggplot(neonati)+
geom_bar(aes(x=Fumatrici),
fill="royalblue3",
position = "dodge",
stat = "count",
col = "royalblue4")+
geom_text(aes(x = Fumatrici,
label = after_stat(count)),
stat = "count",
vjust = -0.5,
size = 4,
color = "royalblue4") +
labs(title = "Distribuzione della variabile fumatrici",
x = "Fumatrici",
y = "Frequenze assolute")+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face="bold"))+
guides(fill=guide_legend(title=""))+
scale_x_discrete(labels = c("0" = "No", "1" = "Sรฌ"))
Le mamme sono prevalentemente non fumatrici. Solo il 4.16% sono fumatrici.
ggplot(neonati)+
geom_bar(aes(x=Tipo.parto),
fill="royalblue3",
position = "dodge",
stat = "count",
col = "royalblue4")+
geom_text(aes(x = Tipo.parto,
label = ..count..),
stat = "count",
vjust = -0.5,
size = 4,
color = "royalblue4") +
labs(title = "Distribuzione della variabile tipo parto",
x = "Tipo parto",
y = "Frequenze assolute")+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face="bold"))+
guides(fill=guide_legend(title=""))+
scale_x_discrete(labels = c("Ces" = "Cesareo", "Nat" = "Naturale"))
Quasi un terzo (29.14%) dei parti รจ cesareo.
ggplot(neonati)+
geom_bar(aes(x=Ospedale),
fill="royalblue3",
position = "dodge",
stat = "count",
col = "royalblue4")+
labs(title = "Distribuzione della variabile ospedale",
x = "",
y = "Frequenze assolute")+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face="bold"))+
guides(fill=guide_legend(title=""))+
scale_x_discrete(labels = c("osp1" = "Ospedale 1", "osp2" = "Ospedale 2", "osp3" = "Ospedale 3"))
Possiamo dire che circa un terzo viene dallโospedale 1, un terzo dallโospedale 2 e un terzo dallโospedale 3
ggplot(neonati)+
geom_bar(aes(x=Sesso),
fill="royalblue3",
position = "dodge",
stat = "count",
col = "royalblue4")+
labs(title = "Distribuzione della variabile sesso",
x = "Sesso",
y = "Frequenze assolute")+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face="bold"))+
guides(fill=guide_legend(title=""))+
scale_x_discrete(labels = c("F" = "Femmina", "M" = "Maschio"))
Circa metร del campione รจ di sesso femminile e metร di sesso maschile.
ggplot(data = neonati)+
geom_half_boxplot(aes(x=Tipo.parto,y=Peso),
side="l",fill="violet")+
geom_half_violin(aes(x=Tipo.parto,y=Peso),
side="r",fill="pink")+
labs(x="Tipo parto",
y="Peso (g)",
title = "Distribuzione del peso \nin relazione al tipo di parto")+
scale_y_continuous(breaks = seq(750,5000,by=250))+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face="bold"))+
scale_x_discrete(labels = c("Ces" = "Cesareo", "Nat" = "Naturale"))
Non si notano differenze sostanziali nel peso in base al tipo di parto
ggplot(data = neonati)+
geom_half_boxplot(aes(x=Tipo.parto,y=Peso,fill=Ospedale),
side="l", alpha=0.5)+
geom_half_violin(aes(x=Tipo.parto,y=Peso,fill=Ospedale),
side="r", alpha=0.5)+
labs(x="Tipo parto",
y="Peso (g)",
title = "Distribuzione del peso in relazione \nal tipo di parto e all'ospedale")+
scale_y_continuous(breaks = seq(750,5000,by=250))+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face="bold"))+
scale_fill_discrete(labels = c("osp1" = "Ospedale 1", "osp2" = "Ospedale 2", "osp3" = "Ospedale 3"))+
guides(fill=guide_legend(title="Ospedale"))+
scale_x_discrete(labels = c("Ces" = "Cesareo", "Nat" = "Naturale"))
Ci sono lievissime differenze nel peso in base al tipo di parto e allโospedale in cui si รจ partorito
Proviamo a fare una tabella di contingenza tra le variabili tipo parto e ospedale per vedere se ci sono ospedali che fanno piรน cesarei di altri
Visto che nel nostro campione le unitร statistiche prese dallโospedale 1 sono in numero diverso rispetto a quelle dellโospedale 2 e 3 andiamo a valutare la proporzione del tipo di parto e non il numero in sรจ.
table_proporzioni_ospedale_tipo.parto <-round(prop.table(table(Ospedale, Tipo.parto), margin=1)*100)
table_proporzioni_ospedale_tipo.parto
## Tipo.parto
## Ospedale Ces Nat
## osp1 30 70
## osp2 30 70
## osp3 28 72
Cโรจ una lieve differenza percentuale nellโospedale 3
Andiamo ad effettuare il test del chi quadro per capire se il numero di parti cesarei รจ condizionato dallโospedale in cui avviene il parto
#H0: Il numero di parti cesarei non รจ condizionato dall'ospedale in cui avviene il parto (ipotesi di indipendenza)
#H1: Il numero di parti cesarei รจ condizionato dall'ospedale in cui avviene il parto (ipotesi di dipendenza)
chisq.test(table_proporzioni_ospedale_tipo.parto)
##
## Pearson's Chi-squared test
##
## data: table_proporzioni_ospedale_tipo.parto
## X-squared = 0.12864, df = 2, p-value = 0.9377
Non si rifiuta lโipotesi di indipendenza, quindi non si puรฒ dire che il tipo parto dipenda dallโospedale in cui avviene.
ggplot(data = neonati)+
geom_half_boxplot(aes(fill=Ospedale,y=Peso),
side="l", alpha=0.5)+
geom_half_violin(aes(fill=Ospedale,y=Peso),
side="r", alpha=0.5)+
labs(x="",
y="Peso (g)",
title = "Distribuzione del peso \nin relazione all'ospedale")+
scale_y_continuous(breaks = seq(750,5000,by=250))+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face = "bold"),
axis.text.x = element_blank(),
axis.ticks.x = element_blank()) +
scale_fill_discrete(
labels = c("osp1" = "Ospedale 1", "osp2" = "Ospedale 2", "osp3" = "Ospedale 3"),
name = "Ospedale")
Come ci si poteva aspettare non ci sono differenze evidenti tra la distribuzione del peso in relazione ai tre ospedali
Analizziamo il grafico relativo alla distribuzione del peso in relazione allโessere fumatrice della madre
ggplot(data = neonati)+
geom_half_boxplot(aes(fill=Fumatrici,y=Peso),
side="l")+
geom_half_violin(aes(fill=Fumatrici,y=Peso),
side="r")+
labs(x="",
y="Peso (g)",
title = "Distribuzione del peso \nin relazione all'essere fumatrice della madre")+
scale_y_continuous(breaks = seq(750,5000,by=250))+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face = "bold"),
axis.text.x = element_blank(),
axis.ticks.x = element_blank()) +
scale_fill_manual(
values = c("0" = "royalblue3", "1" = "gray"),
labels = c("0" = "No", "1" = "Sรฌ"),
name = "Fumatrici")
Dal grafico sembra esserci una differenza tra le due distribuzioni e sembra che lโessere fumatrice porti a un peso neonatale minore.
Leggiamo i valori di peso medio per le due categorie di madri.
neonati_no_fumatrici <- neonati %>%
filter(Fumatrici==0)
neonati_fumatrici <- neonati %>%
filter(Fumatrici==1)
mean(neonati_no_fumatrici$Peso)
## [1] 3286.262
mean(neonati_fumatrici$Peso)
## [1] 3236.346
La media per madri non fumatrici รจ 3286.26 e per madri fumatrici 3236.35
mean(neonati_no_fumatrici$Peso) - mean(neonati_fumatrici$Peso)
## [1] 49.91617
La differenza รจ di quasi 50g
Proviamo a saggiare lโipotesi che questa differenza sia significativa
#H0: peso medio fumatrici = peso medio non fumatrici
#H1: peso medio fumatrici != peso medio non fumatrici
t.test(neonati_fumatrici$Peso,
mu = mean(neonati_no_fumatrici$Peso),
conf.level = 0.95,
alternative = "two.sided")
##
## One Sample t-test
##
## data: neonati_fumatrici$Peso
## t = -1.0632, df = 103, p-value = 0.2902
## alternative hypothesis: true mean is not equal to 3286.262
## 95 percent confidence interval:
## 3143.232 3329.460
## sample estimates:
## mean of x
## 3236.346
Non si rifiuta lโipotesi nulla, dunque il valore della media del peso di neonati nati da madri fumatrici รจ significativamente uguale alla media del peso di neonati nati da madri non fumatrici.
Proviamo perรฒ ad approfondire un attimo la questione.
Vi รจ una classificazione utilizzata per stabilire il grado di prematuritร e quindi il rischio alla nascita di un neonato ed รจ la seguente. Nati: - Estremamente pretermine, prima della 28^ settimana di gestazione. - Molto pretermine, tra le 28 e 31+6 settimane. - Moderatamente pretermine, tra le 32 e 33+6 settimane. - Lievemente pretermine, tra le 34 e le 36+6 settimane.
Proviamo ad analizzare il peso in relazione alla settimana di gestazione e allโessere fumatrice della madre. Dividiamo in 5 classi Gestazione
neonati$Gestazione_CL <- cut(Gestazione,
breaks = c(25,28,32,34,37,43),
include.lowest = TRUE,
right = FALSE,
labels = c("Estremamente pret.","Molto pret.","Moderatamente pret.","Lievemente pret.","A termine"))
Visualizziamo le frequenze delle madri fumatrici per ogni classe
table(neonati$Gestazione_CL,Fumatrici)
## Fumatrici
## 0 1
## Estremamente pret. 4 0
## Molto pret. 20 0
## Moderatamente pret. 26 1
## Lievemente pret. 110 1
## A termine 2234 102
ggplot(data = neonati, aes(y=Peso, x=Gestazione_CL, fill=Fumatrici))+
geom_boxplot()+
theme_classic()+
scale_y_continuous(breaks = seq(750,5000,by=250))+
scale_fill_manual(
values = c("0" = "royalblue3", "1" = "gray"),
labels = c("0" = "No", "1" = "Sรฌ"),
name = "Fumatrici")+
labs(x="Grado di prematuritร ",
y="Peso (g)",
title = "Distribuzione del peso nei nati a termine\nin relazione all'essere fumatrice della madre")
Per le classi relative ai parti pretermine cโรจ una scarsissima
(praticamente nulla) rappresentanza di madri fumatrici. Ciรฒ potrebbe
essere dovuto ad esempio alle dimensioni ridotte del campione. Visto ciรฒ
andiamo a rifare lโanalisi precedente valutando esclusivamente i dati
relativi a Gestazione maggiore o uguale a 37 ovvero per i nati a
termine.
Analizziamo il grafico relativo alla distribuzione del peso in relazione allโessere fumatrice della madre
ggplot(data = filter(neonati, Gestazione_CL=="A termine"))+
geom_half_boxplot(aes(fill=Fumatrici,y=Peso),
side="l")+
geom_half_violin(aes(fill=Fumatrici,y=Peso),
side="r")+
labs(x="",
y="Peso (g)",
title = "Distribuzione del peso nei nati a termine\nin relazione all'essere fumatrice della madre")+
scale_y_continuous(breaks = seq(750,5000,by=250))+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face = "bold"),
axis.text.x = element_blank(),
axis.ticks.x = element_blank()) +
scale_fill_manual(
values = c("0" = "royalblue3", "1" = "gray"),
labels = c("0" = "No", "1" = "Sรฌ"),
name = "Fumatrici")
Dal grafico sembra esserci una differenza tra le due distribuzioni e sembra che lโessere fumatrice porti a un peso neonatale mediamente minore.
Leggiamo i valori di peso medio per le due categorie di madri.
neonati_no_fumatrici_a_termine <- neonati %>%
filter(Gestazione_CL=="A termine", Fumatrici==0)
neonati_fumatrici_a_termine <- neonati %>%
filter(Gestazione_CL=="A termine", Fumatrici==1)
mean(neonati_no_fumatrici_a_termine$Peso)
## [1] 3353.81
mean(neonati_fumatrici_a_termine$Peso)
## [1] 3256.373
La media per madri non fumatrici รจ 3353.81 e per madri fumatrici 3256.37
mean(neonati_no_fumatrici_a_termine$Peso) - mean(neonati_fumatrici_a_termine$Peso)
## [1] 97.43766
La differenza รจ di 97.4g
Proviamo a saggiare lโipotesi che questa differenza sia significativa
#H0: peso medio fumatrici = peso medio non fumatrici
#H1: peso medio fumatrici != peso medio non fumatrici
t.test(neonati_fumatrici_a_termine$Peso,
mu = mean(neonati_no_fumatrici_a_termine$Peso),
conf.level = 0.95,
alternative = "two.sided")
##
## One Sample t-test
##
## data: neonati_fumatrici_a_termine$Peso
## t = -2.1527, df = 101, p-value = 0.03373
## alternative hypothesis: true mean is not equal to 3353.81
## 95 percent confidence interval:
## 3166.582 3346.164
## sample estimates:
## mean of x
## 3256.373
Si rifiuta lโipotesi nulla, dunque secondo il t-test il valore della media del peso di neonati nati da madri fumatrici non รจ significativamente uguale alla media del peso di neonati nati da madri non fumatrici, la media del peso dei nati da madri non fumatrici si trova fuori dallโintervallo di confidenza.
Dโora in avanti come richiesto si considererร di nuovo il dataset per intero e non un subset dei nati a termine, ritenevo perรฒ importante evidenziare questo aspetto.
Ora andiamo ad analizzare la distribuzione delle variabili Peso, Lunghezza e Cranio condizionatamente alla variabile Sesso.
ggplot(data = neonati)+
geom_half_boxplot(aes(y=Peso,fill=Sesso),
side="l",alpha=0.5)+
geom_half_violin(aes(y=Peso,fill=Sesso),
side="r",alpha=0.5)+
labs(x="",
y="Peso (g)",
title = "Distribuzione del peso \nin relazione al sesso del neonato")+
scale_y_continuous(breaks = seq(750,5000,by=250))+
scale_x_continuous(breaks=seq(5,20,by=5))+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face="bold"))+
scale_fill_discrete(
labels = c("F" = "Femmina", "M" = "Maschio"),
name = "Sesso")
Il peso dei neonati rispetto a quello delle neonate risulta essere maggiore
ggplot(data = neonati)+
geom_half_boxplot(aes(y=Lunghezza,fill=Sesso),
side="l", alpha=0.5)+
geom_half_violin(aes(y=Lunghezza,fill=Sesso),
side="r", alpha=0.5)+
labs(x="",
y="Lunghezza (mm)",
title = "Distribuzione della lunghezza \nin relazione al sesso del neonato")+
scale_y_continuous(breaks = seq(310,570,by=10))+
scale_x_continuous(breaks=seq(5,20,by=5))+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face="bold"))+
scale_fill_discrete(
labels = c("F" = "Femmina", "M" = "Maschio"),
name = "Sesso")
La lunghezza dei neonati rispetto a quello delle neonate risulta essere maggiore
ggplot(data = neonati)+
geom_half_boxplot(aes(y=Cranio,fill=Sesso),
side="l", alpha=0.5)+
geom_half_violin(aes(y=Cranio,fill=Sesso),
side="r", alpha=0.5)+
labs(x="",
y="Cranio (mm)",
title = "Distribuzione della circonferenza del cranio \nin relazione al sesso del neonato")+
scale_y_continuous(breaks = seq(230,390,by=10))+
scale_x_continuous(breaks=seq(5,20,by=5))+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face="bold"))+
scale_fill_discrete(
labels = c("F" = "Femmina", "M" = "Maschio"),
name = "Sesso")
La circonferenza del cranio dei neonati rispetto a quello delle neonate risulta essere maggiore
Prima di procedere alla realizzazione della matrice di correlazione e realizzare il primo modello รจ necessario fare una valutazione. Potremmo pensare di escludere la variabile Ospedale dal modello perchรฉ il primo pensiero che viene รจ โcome potrebbe un ospedale diverso cambiare il peso del neonato?โ e anche i grafici sopra suggeriscono la stessa cosa. Ritengo perรฒ che non avendo informazioni sulla tipologia di ospedali presi in esame, il livello di assistenza fornito, il tipo di terapia intensiva neonatale presente e cosรฌ via, sia importante prendere in considerazione anche la variabile ospedale. Inoltre al variare delle caratteristiche elencate sopra un certo ospedale potrebbe essere preferito in caso di gravidanza a rischio che porta a un parto prematuro. Quindi potrebbe variare la distribuzione delle settimane di gestazione al variare dellโospedale. Proviamo a vederne il grafico:
ggplot(data = neonati)+
geom_half_boxplot(aes(y=Gestazione, fill = Ospedale),
side="l",alpha=0.5)+
geom_half_violin(aes(y=Gestazione, fill = Ospedale),
side="r",,alpha=0.5, adjust=2)+
labs(x="",
y="Gestazione (settimane)",
title = "Distribuzione delle settimane di gestazione \nin relazione all'ospedale")+
scale_y_continuous(breaks = seq(26,44,by=2))+
scale_x_continuous(breaks=seq(5,20,by=5))+
scale_fill_discrete(labels = c("osp1" = "Ospedale 1", "osp2" = "Ospedale 2", "osp3" = "Ospedale 3"))+
theme_classic()+
theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
theme(legend.title = element_text(face="bold"))
Graficamente la mediana รจ identica e anche lโandamento simile quindi sembra non esserci correlazione tra la variabile Gestazione e la variabile Ospedale, variano un poโ gli estremi per i quali in realtร cโรจ poca statistica come possiamo vedere qui:
table(Gestazione)
## Gestazione
## 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
## 1 1 2 4 3 5 8 9 18 16 33 62 192 437 580 741 328 56 2
Possiamo fare table perchรฉ nonostante Gestazione sia una variabile quantitativa continua nel nostro dataset assume solo un numero finito di valori interi.
Da quanto visto sinora non sembra essere utile mantenere la variabile Ospedale ma lo decideremo direttamente con i test successivi.
Procediamo alla realizzazione della matrice di correlazione sul dataset privo della colonna Gestazione_CL.
panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor=0.8, ...)
{
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(r>=0.1) cex.cor <- 1.4
text(0.5, 0.5, txt, cex = cex.cor)
}
#correlazioni
pairs(x=neonati[,1:10],lower.panel=panel.cor, upper.panel=panel.smooth)
Dalla matrice di correlazione possiamo vedere che i regressori che hanno una correlazione importante con la variabile Peso sono: Lunghezza, Cranio, Gestazione e in piccola parte Sesso. Si rileva anche una possibile correlazione tra le variabili Lunghezza e Cranio, Lunghezza e Gestazione, Cranio e Gestazione. Non si rileva correlazione tra Ospedale e Gestazione. Negli scatterplot si rileva una non linearitร nella relazione tra Peso e Gestazione, Lunghezza e Cranio. Partiamo da un modello con tutte le variabili ma senza termini quadratici.
summary(lm(Peso~Anni.madre+N.gravidanze+Fumatrici+Gestazione+Lunghezza+Cranio+Tipo.parto+Ospedale+Sesso, data=neonati))
##
## Call:
## lm(formula = Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione +
## Lunghezza + Cranio + Tipo.parto + Ospedale + Sesso, data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1123.26 -181.53 -14.45 161.05 2611.89
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6735.7960 141.4790 -47.610 < 2e-16 ***
## Anni.madre 0.8018 1.1467 0.699 0.4845
## N.gravidanze 11.3812 4.6686 2.438 0.0148 *
## Fumatrici1 -30.2741 27.5492 -1.099 0.2719
## Gestazione 32.5773 3.8208 8.526 < 2e-16 ***
## Lunghezza 10.2922 0.3009 34.207 < 2e-16 ***
## Cranio 10.4722 0.4263 24.567 < 2e-16 ***
## Tipo.partoNat 29.6335 12.0905 2.451 0.0143 *
## Ospedaleosp2 -11.0912 13.4471 -0.825 0.4096
## Ospedaleosp3 28.2495 13.5054 2.092 0.0366 *
## SessoM 77.5723 11.1865 6.934 5.18e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274 on 2487 degrees of freedom
## Multiple R-squared: 0.7289, Adjusted R-squared: 0.7278
## F-statistic: 668.7 on 10 and 2487 DF, p-value: < 2.2e-16
Analizziamo la tabella ottenuta con questo summary Nella tabella dei coefficienti vengono mostrate le stime dei coefficienti beta di tutte le variabili che rappresentano gli effetti marginali di ogni singola variabile sulla variabile risposta Per ogni stima bisogna guardare segno, valore e significativitร
Anni.madre: coefficiente positivo quindi effetto positivo anche se abbastanza basso ma poco significativo perchรจ p-value di 0.48 N.gravidanze: il numero di gravidanze precedenti della madre ha effetto positivo e elevato, con p-value sotto la soglia del 5% quindi effetto significativo. Dunque allโaumentare delle gravidanze aumenta il peso del neonato Fumatrici: lโessere fumatrici (valore della variabile = 1) ha un effetto negativo sul peso con significativitร al di sopra del 5% classico quindi tale influenza รจ poco significativa Gestazione: coefficiente alto e positivo con p-value prossimo allo zero quindi significativitร altissima dunque per ogni settimana di gestazione si ha un aumento di peso di 32.6g Lunghezza: coefficiente alto e positivo con p-value prossimo allo zero quindi significativitร altissima dunque per ogni centimetro si ha un aumento di peso di circa 10.3g Cranio: coefficiente alto e positivo con p-value prossimo allo zero quindi significativitร altissima dunque per ogni centimetro di circonferenza del cranio del neonato si ha un aumento di peso di 10.5g Tipo.parto: il tipo di parto naturale avviene per neonati con peso maggiore (coefficiente positivo alto e p-value sotto la soglia del 5% quindi differenza significativa) Ospedale: lโospedale 2 ha un coefficiente negativo e alto in valore assoluto ma significativitร bassa. Invece lโospedale 3 ha un coefficiente positivo alto e p-value sotto la soglia del 5% quindi effetto significativo. Quindi la variabile nel suo complesso potrebbe aggiungere informazioni. Sesso: il valore Maschio della variabile sesso ha un coefficiente altissimo e p-value prossimo allo zero quindi effetto molto significativo
Si ha un R2 pari a 0.7289 quindi buono ma ancora piรน importante รจ il valore dellโR2 aggiustato che รจ anchโesso pari a 0.7278
Visto che il tipo parto รจ qualcosa che avviene alla fine e non รจ quindi utile in questo tipo di studio in tutti i modelli che realizzeremo questa variabile non sarร presente.
Creiamo il mod1 che avrร tutte le variabili tranne tipo parto e vediamo che differenze ci sono rispetto a quello completo.
mod1 <- lm(Peso~Anni.madre+N.gravidanze+Fumatrici+Gestazione+Lunghezza+Cranio+Ospedale+Sesso, data=neonati)
summary(mod1)
##
## Call:
## lm(formula = Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione +
## Lunghezza + Cranio + Ospedale + Sesso, data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1142.99 -181.56 -14.41 164.29 2612.53
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6710.3696 141.2400 -47.510 < 2e-16 ***
## Anni.madre 0.8124 1.1479 0.708 0.4792
## N.gravidanze 11.0736 4.6716 2.370 0.0178 *
## Fumatrici1 -28.9707 27.5717 -1.051 0.2935
## Gestazione 32.6215 3.8246 8.530 < 2e-16 ***
## Lunghezza 10.2560 0.3008 34.094 < 2e-16 ***
## Cranio 10.5060 0.4265 24.635 < 2e-16 ***
## Ospedaleosp2 -11.1525 13.4606 -0.829 0.4074
## Ospedaleosp3 28.8129 13.5171 2.132 0.0331 *
## SessoM 77.6195 11.1978 6.932 5.28e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.3 on 2488 degrees of freedom
## Multiple R-squared: 0.7282, Adjusted R-squared: 0.7273
## F-statistic: 740.8 on 9 and 2488 DF, p-value: < 2.2e-16
Ci sono modifiche solamente marginali rispetto al modello precedente. Proviamo a semplificare il modello togliendo le variabili non significative.
mod2<-update(mod1,~.-Anni.madre-Fumatrici)
summary(mod2)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Ospedale + Sesso, data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1132.57 -183.77 -16.22 163.78 2620.13
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6682.3557 135.7530 -49.224 < 2e-16 ***
## N.gravidanze 12.0569 4.3372 2.780 0.00548 **
## Gestazione 32.0899 3.7962 8.453 < 2e-16 ***
## Lunghezza 10.2693 0.3005 34.174 < 2e-16 ***
## Cranio 10.5256 0.4259 24.716 < 2e-16 ***
## Ospedaleosp2 -10.9554 13.4579 -0.814 0.41570
## Ospedaleosp3 29.3428 13.5084 2.172 0.02993 *
## SessoM 77.5211 11.1952 6.924 5.55e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.3 on 2490 degrees of freedom
## Multiple R-squared: 0.7281, Adjusted R-squared: 0.7273
## F-statistic: 952.4 on 7 and 2490 DF, p-value: < 2.2e-16
Le stime sono cambiate soltanto lievemente e la significativitร รจ rimasta pressapoco la stessa. Anche r2 aggiustato รจ rimasto fisso al 72.73% quindi possiamo dire che le variabili Anni.madre e Fumatrici erano inutili alla spiegazione della variabile risposta
Facciamo una versione del mod2 senza la variabile ospedale
mod2_1<-update(mod2,~.-Ospedale)
summary(mod2_1)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso, data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1149.37 -180.98 -15.57 163.69 2639.09
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6681.7251 135.8036 -49.201 < 2e-16 ***
## N.gravidanze 12.4554 4.3416 2.869 0.00415 **
## Gestazione 32.3827 3.8008 8.520 < 2e-16 ***
## Lunghezza 10.2455 0.3008 34.059 < 2e-16 ***
## Cranio 10.5410 0.4265 24.717 < 2e-16 ***
## SessoM 77.9807 11.2111 6.956 4.47e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.7 on 2492 degrees of freedom
## Multiple R-squared: 0.727, Adjusted R-squared: 0.7265
## F-statistic: 1327 on 5 and 2492 DF, p-value: < 2.2e-16
LโR2 adj รจ praticamente identico quindi teniamo questa versione come buona
Sulla base di quanto visto nello scatterplot della matrice di correlazione proviamo ad aggiungere il termine quadratico di Gestazione
summary(update(mod2_1,~.+I(Gestazione^2)))
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso + I(Gestazione^2), data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1144.0 -181.5 -12.9 165.8 2661.9
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4646.7158 898.6322 -5.171 2.52e-07 ***
## N.gravidanze 12.5489 4.3381 2.893 0.00385 **
## Gestazione -81.2309 49.7402 -1.633 0.10257
## Lunghezza 10.3502 0.3040 34.045 < 2e-16 ***
## Cranio 10.6376 0.4282 24.843 < 2e-16 ***
## SessoM 75.7563 11.2435 6.738 1.99e-11 ***
## I(Gestazione^2) 1.5168 0.6621 2.291 0.02206 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.5 on 2491 degrees of freedom
## Multiple R-squared: 0.7276, Adjusted R-squared: 0.7269
## F-statistic: 1109 on 6 and 2491 DF, p-value: < 2.2e-16
Lโaggiunta di I(Gestazione^2) ha โrottoโ la variabile Gestazione che adesso non รจ piรน significativa e R2 adj non ha avuto un aumento significativo. I(Gestazione^2) non va quindi aggiunto al modello
Anche lโutilizzo delle variabili Gestazione * Lunghezza o Lunghezza * Cranio porta agli stessi risultati
summary(update(mod2_1,~.+Gestazione*Lunghezza))
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso + Gestazione:Lunghezza, data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1133.41 -179.98 -11.52 168.93 2652.65
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.991e+03 9.206e+02 -2.163 0.030631 *
## N.gravidanze 1.303e+01 4.321e+00 3.015 0.002594 **
## Gestazione -9.391e+01 2.481e+01 -3.785 0.000157 ***
## Lunghezza -8.476e-02 2.028e+00 -0.042 0.966661
## Cranio 1.076e+01 4.264e-01 25.234 < 2e-16 ***
## SessoM 7.225e+01 1.121e+01 6.445 1.38e-10 ***
## Gestazione:Lunghezza 2.729e-01 5.298e-02 5.151 2.79e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 273.3 on 2491 degrees of freedom
## Multiple R-squared: 0.7299, Adjusted R-squared: 0.7292
## F-statistic: 1122 on 6 and 2491 DF, p-value: < 2.2e-16
Qui a โrompersiโ รจ la variabile Lunghezza. R2 adj non ha avuto un aumento significativo.
summary(update(mod2_1,~.+Lunghezza*Cranio))
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso + Lunghezza:Cranio, data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1150.65 -180.93 -13.48 165.99 2865.46
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.803e+03 1.018e+03 -1.771 0.0767 .
## N.gravidanze 1.293e+01 4.323e+00 2.991 0.0028 **
## Gestazione 3.815e+01 3.967e+00 9.616 < 2e-16 ***
## Lunghezza -3.060e-01 2.203e+00 -0.139 0.8895
## Cranio -4.755e+00 3.192e+00 -1.490 0.1365
## SessoM 7.324e+01 1.120e+01 6.537 7.59e-11 ***
## Lunghezza:Cranio 3.157e-02 6.531e-03 4.835 1.41e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 273.5 on 2491 degrees of freedom
## Multiple R-squared: 0.7296, Adjusted R-squared: 0.7289
## F-statistic: 1120 on 6 and 2491 DF, p-value: < 2.2e-16
Qui a โrompersiโ sono le variabili Lunghezza e Cranio. R2 adj non ha avuto un aumento significativo.
mod3 <- update(mod2_1,~.+I(Lunghezza^2))
summary(mod3)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso + I(Lunghezza^2), data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1169.62 -181.77 -12.79 163.77 1786.03
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 212.288548 723.852095 0.293 0.769336
## N.gravidanze 14.085464 4.266175 3.302 0.000975 ***
## Gestazione 42.551398 3.876629 10.976 < 2e-16 ***
## Lunghezza -20.267001 3.162718 -6.408 1.76e-10 ***
## Cranio 10.651783 0.418894 25.428 < 2e-16 ***
## SessoM 69.968733 11.038797 6.338 2.75e-10 ***
## I(Lunghezza^2) 0.031655 0.003267 9.690 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 269.7 on 2491 degrees of freedom
## Multiple R-squared: 0.7369, Adjusted R-squared: 0.7363
## F-statistic: 1163 on 6 and 2491 DF, p-value: < 2.2e-16
Lโaggiunta del termine quadratico di Lunghezza non aumenta in maniera significativa lโR2 adj. Quindi per il rasoio di Occam preferiamo la soluzione piรน semplice
summary(update(mod2_1,~.+I(Cranio^2)))
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso + I(Cranio^2), data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1138.6 -179.4 -14.8 163.4 2622.6
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 84.10118 1151.77280 0.073 0.94180
## N.gravidanze 12.76356 4.31259 2.960 0.00311 **
## Gestazione 38.90540 3.93291 9.892 < 2e-16 ***
## Lunghezza 10.48745 0.30157 34.776 < 2e-16 ***
## Cranio -31.79371 7.16973 -4.434 9.63e-06 ***
## SessoM 73.10236 11.16590 6.547 7.11e-11 ***
## I(Cranio^2) 0.06262 0.01059 5.915 3.77e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 272.8 on 2491 degrees of freedom
## Multiple R-squared: 0.7308, Adjusted R-squared: 0.7301
## F-statistic: 1127 on 6 and 2491 DF, p-value: < 2.2e-16
Lโaggiunta del termine quadratico di Cranio non aumenta in maniera significativa lโR2 adj. Quindi per il rasoio di Occam preferiamo la soluzione piรน semplice
Sinora il modello migliore รจ il mod2_1
Proviamo a semplificare ulteriormente il modello 2_1:
mod4<-lm(Peso~Gestazione+Lunghezza+Cranio)
summary(mod4)
##
## Call:
## lm(formula = Peso ~ Gestazione + Lunghezza + Cranio)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1105.68 -183.52 -12.69 166.41 2622.95
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6778.1583 135.7089 -49.946 <2e-16 ***
## Gestazione 31.7554 3.8247 8.303 <2e-16 ***
## Lunghezza 10.4210 0.3022 34.486 <2e-16 ***
## Cranio 10.7911 0.4285 25.186 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 277.8 on 2494 degrees of freedom
## Multiple R-squared: 0.7207, Adjusted R-squared: 0.7203
## F-statistic: 2145 on 3 and 2494 DF, p-value: < 2.2e-16
mod4 rispetto a mod2 ha un r2 aggiustato quasi identico e unโaltissima significativitร dei regressori quindi per il rasoio di Occam sinora รจ preferibile il mod4
Riaggiungere singolarmente fumatrici, sesso, anni madre o n gravidanze migliora di pochi millesimi il r2 adj quindi sempre per il rasoio di occam non li riaggiungiamo e scegliamo il modello piรน semplice ovvero il mod 4
Fumatrici
summary(update(mod4,~.+Fumatrici))
##
## Call:
## lm(formula = Peso ~ Gestazione + Lunghezza + Cranio + Fumatrici)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1106.12 -184.29 -13.02 167.10 2620.16
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6778.3648 135.7173 -49.945 <2e-16 ***
## Gestazione 31.9396 3.8313 8.337 <2e-16 ***
## Lunghezza 10.4097 0.3025 34.412 <2e-16 ***
## Cranio 10.7900 0.4285 25.181 <2e-16 ***
## Fumatrici1 -23.3289 27.8768 -0.837 0.403
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 277.8 on 2493 degrees of freedom
## Multiple R-squared: 0.7207, Adjusted R-squared: 0.7203
## F-statistic: 1608 on 4 and 2493 DF, p-value: < 2.2e-16
R2 adj identica e non significativitร della variabile Fumatrici
Sesso
summary(update(mod4,~.+Sesso))
##
## Call:
## lm(formula = Peso ~ Gestazione + Lunghezza + Cranio + Sesso)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1138.1 -184.4 -17.4 163.3 2626.7
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6651.6732 135.5952 -49.055 < 2e-16 ***
## Gestazione 31.3262 3.7884 8.269 < 2e-16 ***
## Lunghezza 10.2024 0.3009 33.909 < 2e-16 ***
## Cranio 10.6706 0.4247 25.126 < 2e-16 ***
## SessoM 79.1027 11.2205 7.050 2.31e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 275.1 on 2493 degrees of freedom
## Multiple R-squared: 0.7261, Adjusted R-squared: 0.7257
## F-statistic: 1652 on 4 and 2493 DF, p-value: < 2.2e-16
R2 adj aumentata solo di mezzo punto
Anni madre
summary(update(mod4,~.+Anni.madre))
##
## Call:
## lm(formula = Peso ~ Gestazione + Lunghezza + Cranio + Anni.madre)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1132.88 -185.78 -14.93 167.11 2614.28
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6855.0490 141.4871 -48.450 <2e-16 ***
## Gestazione 32.7288 3.8565 8.487 <2e-16 ***
## Lunghezza 10.4319 0.3021 34.534 <2e-16 ***
## Cranio 10.7189 0.4299 24.934 <2e-16 ***
## Anni.madre 2.0609 1.0792 1.910 0.0563 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 277.6 on 2493 degrees of freedom
## Multiple R-squared: 0.7211, Adjusted R-squared: 0.7206
## F-statistic: 1611 on 4 and 2493 DF, p-value: < 2.2e-16
R2 adj quasi identica e Anni.madre al limite della significativitร
Numero gravidanze
summary(update(mod4,~.+N.gravidanze))
##
## Call:
## lm(formula = Peso ~ Gestazione + Lunghezza + Cranio + N.gravidanze)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1118.36 -181.20 -12.15 167.93 2636.44
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6808.8062 135.8418 -50.123 < 2e-16 ***
## Gestazione 32.8947 3.8360 8.575 < 2e-16 ***
## Lunghezza 10.4643 0.3020 34.651 < 2e-16 ***
## Cranio 10.6486 0.4302 24.752 < 2e-16 ***
## N.gravidanze 13.5089 4.3800 3.084 0.00206 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 277.3 on 2493 degrees of freedom
## Multiple R-squared: 0.7217, Adjusted R-squared: 0.7213
## F-statistic: 1616 on 4 and 2493 DF, p-value: < 2.2e-16
R2 adj quasi identica
Come vediamo sotto, anche aggiungere dei termini che tengono conto delle interazioni al modello piรน semplice non aiuta
summary(lm(Peso~Gestazione*Lunghezza+Cranio))
##
## Call:
## lm(formula = Peso ~ Gestazione * Lunghezza + Cranio)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1137.31 -180.01 -7.48 164.76 2637.67
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.559e+03 9.269e+02 -1.682 0.0928 .
## Gestazione -1.086e+02 2.494e+01 -4.352 1.4e-05 ***
## Lunghezza -1.069e+00 2.041e+00 -0.524 0.6006
## Cranio 1.103e+01 4.279e-01 25.783 < 2e-16 ***
## Gestazione:Lunghezza 3.030e-01 5.323e-02 5.692 1.4e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 276 on 2493 degrees of freedom
## Multiple R-squared: 0.7242, Adjusted R-squared: 0.7238
## F-statistic: 1637 on 4 and 2493 DF, p-value: < 2.2e-16
Qui si rompe la variabile Lunghezza e lโR2 adj รจ quasi identica
summary(lm(Peso~Gestazione+Lunghezza*Cranio))
##
## Call:
## lm(formula = Peso ~ Gestazione + Lunghezza * Cranio)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1108.76 -181.95 -7.75 165.45 2872.86
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.377e+03 1.026e+03 -1.342 0.180
## Gestazione 3.806e+01 3.985e+00 9.550 < 2e-16 ***
## Lunghezza -1.257e+00 2.219e+00 -0.566 0.571
## Cranio -6.116e+00 3.212e+00 -1.904 0.057 .
## Lunghezza:Cranio 3.490e-02 6.571e-03 5.311 1.19e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 276.3 on 2493 degrees of freedom
## Multiple R-squared: 0.7238, Adjusted R-squared: 0.7233
## F-statistic: 1633 on 4 and 2493 DF, p-value: < 2.2e-16
Qui si rompe la variabile Lunghezza e Cranio e lโR2 adj รจ quasi identica
summary(lm(Peso~Gestazione*Lunghezza*Cranio))
##
## Call:
## lm(formula = Peso ~ Gestazione * Lunghezza * Cranio)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1109.52 -180.55 -10.26 164.14 2583.63
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.596e+04 8.389e+03 4.287 1.88e-05 ***
## Gestazione -1.179e+03 2.380e+02 -4.953 7.81e-07 ***
## Lunghezza -7.186e+01 1.975e+01 -3.638 0.00028 ***
## Cranio -1.216e+02 2.764e+01 -4.400 1.13e-05 ***
## Gestazione:Lunghezza 2.330e+00 5.322e-01 4.377 1.25e-05 ***
## Gestazione:Cranio 3.720e+00 7.606e-01 4.891 1.07e-06 ***
## Lunghezza:Cranio 2.537e-01 6.253e-02 4.058 5.11e-05 ***
## Gestazione:Lunghezza:Cranio -7.129e-03 1.656e-03 -4.304 1.74e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.7 on 2490 degrees of freedom
## Multiple R-squared: 0.7273, Adjusted R-squared: 0.7265
## F-statistic: 948.5 on 7 and 2490 DF, p-value: < 2.2e-16
R2 adj quasi identica
Proviamo ad aggiungere il termine quadratico di Lunghezza
mod3_1 <- update(mod4,~.+I(Lunghezza^2))
summary(mod3_1)
##
## Call:
## lm(formula = Peso ~ Gestazione + Lunghezza + Cranio + I(Lunghezza^2))
##
## Residuals:
## Min 1Q Median 3Q Max
## -1128.48 -178.32 -8.38 164.12 1738.23
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 378.389165 730.115696 0.518 0.604
## Gestazione 42.098677 3.892279 10.816 < 2e-16 ***
## Lunghezza -21.206080 3.186356 -6.655 3.46e-11 ***
## Cranio 10.911086 0.420425 25.952 < 2e-16 ***
## I(Lunghezza^2) 0.032782 0.003288 9.969 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 272.4 on 2493 degrees of freedom
## Multiple R-squared: 0.7314, Adjusted R-squared: 0.7309
## F-statistic: 1697 on 4 and 2493 DF, p-value: < 2.2e-16
R2 adj aumentata di un punto.
Sinora in base ai dati dellโR2 adj e il rasoio di Occam il miglior modello รจ il mod4.
Visto perรฒ che lโazienda richiede di fare delle stime per, ad esempio, il peso di una neonata considerando una madre alla terza gravidanza, non fumatrice, che partorirร alla 39esima settimana creiamo anche un modello che includa esattamente queste variabili oltre a quelle fortemente significative (Lunghezza e Cranio):
mod_var_richieste <- lm(Peso~N.gravidanze+Fumatrici+Gestazione+Lunghezza+Cranio+Sesso)
summary(mod_var_richieste)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza +
## Cranio + Sesso)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1150.24 -181.32 -15.73 162.95 2635.69
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6682.2637 135.7983 -49.207 < 2e-16 ***
## N.gravidanze 12.6996 4.3470 2.921 0.00352 **
## Fumatrici1 -30.5728 27.6048 -1.108 0.26818
## Gestazione 32.6437 3.8079 8.573 < 2e-16 ***
## Lunghezza 10.2309 0.3011 33.979 < 2e-16 ***
## Cranio 10.5366 0.4265 24.707 < 2e-16 ***
## SessoM 78.1596 11.2117 6.971 4.01e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.7 on 2491 degrees of freedom
## Multiple R-squared: 0.7271, Adjusted R-squared: 0.7265
## F-statistic: 1106 on 6 and 2491 DF, p-value: < 2.2e-16
Se non includessimo Lunghezza e Cranio lโR2 adj crollerebbe a meno di 0.38!
summary(lm(Peso~N.gravidanze+Fumatrici+Gestazione+Sesso))
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Fumatrici + Gestazione + Sesso)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1498.59 -274.99 -14.02 265.74 1887.17
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3152.312 175.346 -17.978 < 2e-16 ***
## N.gravidanze 24.214 6.511 3.719 0.000204 ***
## Fumatrici1 -111.697 41.521 -2.690 0.007189 **
## Gestazione 162.523 4.499 36.127 < 2e-16 ***
## SessoM 165.433 16.720 9.894 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 413.8 on 2493 degrees of freedom
## Multiple R-squared: 0.3804, Adjusted R-squared: 0.3794
## F-statistic: 382.6 on 4 and 2493 DF, p-value: < 2.2e-16
Proviamo a vedere quale modello ci suggerisce R con la libreria MASS
stepwise.mod <- stepAIC(mod1,
direction = "both",
k=log(n)) #criterio BIC
## Start: AIC=28116.81
## Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza +
## Cranio + Ospedale + Sesso
##
## Df Sum of Sq RSS AIC
## - Anni.madre 1 37687 187231953 28110
## - Fumatrici 1 83067 187277334 28110
## - Ospedale 2 710947 187905214 28111
## - N.gravidanze 1 422758 187617025 28115
## <none> 187194266 28117
## - Sesso 1 3615113 190809379 28157
## - Gestazione 1 5473810 192668077 28181
## - Cranio 1 45659609 232853876 28654
## - Lunghezza 1 87455591 274649858 29067
##
## Step: AIC=28109.49
## Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio +
## Ospedale + Sesso
##
## Df Sum of Sq RSS AIC
## - Fumatrici 1 83954 187315907 28103
## - Ospedale 2 717552 187949505 28103
## <none> 187231953 28110
## - N.gravidanze 1 602588 187834541 28110
## + Anni.madre 1 37687 187194266 28117
## - Sesso 1 3622317 190854270 28150
## - Gestazione 1 5438554 192670508 28173
## - Cranio 1 45914823 233146777 28650
## - Lunghezza 1 87445208 274677161 29059
##
## Step: AIC=28102.79
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Ospedale +
## Sesso
##
## Df Sum of Sq RSS AIC
## - Ospedale 2 726146 188042054 28097
## - N.gravidanze 1 581341 187897249 28103
## <none> 187315907 28103
## + Fumatrici 1 83954 187231953 28110
## + Anni.madre 1 38573 187277334 28110
## - Sesso 1 3607033 190922941 28143
## - Gestazione 1 5375559 192691466 28166
## - Cranio 1 45954185 233270092 28643
## - Lunghezza 1 87854020 275169927 29056
##
## Step: AIC=28096.81
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso
##
## Df Sum of Sq RSS AIC
## <none> 188042054 28097
## - N.gravidanze 1 621053 188663107 28097
## + Ospedale 2 726146 187315907 28103
## + Fumatrici 1 92548 187949505 28103
## + Anni.madre 1 45366 187996688 28104
## - Sesso 1 3650790 191692844 28137
## - Gestazione 1 5477493 193519547 28161
## - Cranio 1 46098547 234140601 28637
## - Lunghezza 1 87532691 275574744 29044
summary(stepwise.mod)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso, data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1149.37 -180.98 -15.57 163.69 2639.09
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6681.7251 135.8036 -49.201 < 2e-16 ***
## N.gravidanze 12.4554 4.3416 2.869 0.00415 **
## Gestazione 32.3827 3.8008 8.520 < 2e-16 ***
## Lunghezza 10.2455 0.3008 34.059 < 2e-16 ***
## Cranio 10.5410 0.4265 24.717 < 2e-16 ***
## SessoM 77.9807 11.2111 6.956 4.47e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.7 on 2492 degrees of freedom
## Multiple R-squared: 0.727, Adjusted R-squared: 0.7265
## F-statistic: 1327 on 5 and 2492 DF, p-value: < 2.2e-16
Il modello che si ottiene dal metodo stepwise รจ identico al mod2_1, ha 5 variabili ma ha un R2 adj di poco piรน di mezzo punto percentuale maggiore del nostro mod4 quindi scegliamo il mod4
Altro modo per valutare se aggiungere o meno un regressore รจ utilizzare anova() ovvero lโanalisi della varianza
anova(mod4,stepwise.mod,mod2,mod1)
## Analysis of Variance Table
##
## Model 1: Peso ~ Gestazione + Lunghezza + Cranio
## Model 2: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso
## Model 3: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Ospedale +
## Sesso
## Model 4: Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza +
## Cranio + Ospedale + Sesso
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2494 192424285
## 2 2492 188042054 2 4382231 29.1221 3.149e-13 ***
## 3 2490 187315907 2 726146 4.8256 0.008097 **
## 4 2488 187194266 2 121641 0.8084 0.445703
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Secondo il test anova() tra questi modelli รจ preferibile il mod2
Confrontiamo ora altri modelli
anova(mod3_1,mod3)
## Analysis of Variance Table
##
## Model 1: Peso ~ Gestazione + Lunghezza + Cranio + I(Lunghezza^2)
## Model 2: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso +
## I(Lunghezza^2)
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2493 185047535
## 2 2491 181211596 2 3835940 26.365 4.67e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
il mod3 รจ migliore del mod3_1
anova(stepwise.mod, mod_var_richieste)
## Analysis of Variance Table
##
## Model 1: Peso ~ N.gravidanze + 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 188042054
## 2 2491 187949505 1 92548 1.2266 0.2682
lo stepwise.mod รจ migliore del mod_var_richieste
anova(stepwise.mod,mod3)
## Analysis of Variance Table
##
## Model 1: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso
## Model 2: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso +
## I(Lunghezza^2)
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2492 188042054
## 2 2491 181211596 1 6830458 93.894 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
il mod3 รจ migliore dello stepwise.mod
Quindi secondo il test anova i migliore modelli sono il mod3 e il mod2. Non possiamo confrontare questi due modelli in quanto contengono variabili differenti.
Possiamo creare perรฒ un modello ad hoc come il mod2 con aggiunta del termine quadratico Lunghezza per confrontare entrambi con esso e vedere se si stabilisce in maniera indiretta un ordine.
mod2_plus <- update(mod2,~.+I(Lunghezza^2))
anova(mod2,mod2_plus)
## Analysis of Variance Table
##
## Model 1: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Ospedale +
## Sesso
## Model 2: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Ospedale +
## Sesso + I(Lunghezza^2)
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2490 187315907
## 2 2489 180500632 1 6815275 93.979 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod3,mod2_plus)
## Analysis of Variance Table
##
## Model 1: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso +
## I(Lunghezza^2)
## Model 2: Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Ospedale +
## Sesso + I(Lunghezza^2)
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2491 181211596
## 2 2489 180500632 2 710964 4.9019 0.007504 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Neanche questo confronto รจ risolutivo, il test anova ci dice che il modello migliore in assoluto รจ proprio questโultimo mod2_plus
A questo punto facciamo anche un summary per questo modello
summary(mod2_plus)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Ospedale + Sesso + I(Lunghezza^2), data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1153.52 -179.76 -12.29 164.18 1767.87
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 203.769407 722.726866 0.282 0.77801
## N.gravidanze 13.695246 4.261771 3.214 0.00133 **
## Gestazione 42.251614 3.871801 10.913 < 2e-16 ***
## Lunghezza -20.211869 3.158064 -6.400 1.85e-10 ***
## Cranio 10.636865 0.418287 25.430 < 2e-16 ***
## Ospedaleosp2 -9.543044 13.214305 -0.722 0.47025
## Ospedaleosp3 29.979854 13.263177 2.260 0.02388 *
## SessoM 69.531232 11.022732 6.308 3.33e-10 ***
## I(Lunghezza^2) 0.031622 0.003262 9.694 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 269.3 on 2489 degrees of freedom
## Multiple R-squared: 0.738, Adjusted R-squared: 0.7371
## F-statistic: 876.2 on 8 and 2489 DF, p-value: < 2.2e-16
Il modello preferito dal test anova ha un R2 adj circa uguale a quello del mod3, di 1.5 punti maggiore dellโR2 adj del mod4. Parliamo perรฒ di 6 regressori e un termine quadratico contro 3 regressori, una bella differenza in termini di complessitร a fronte di un aumento relativamente piccolo di R2 adj.
Proviamo ad utilizzare altri criteri di valutazione, AIC e BIC. Il modello con i criteri di informazione piรน bassi รจ di solito il modello migliore
AIC(mod1,mod2_plus,mod2,mod3,mod3_1,mod4,mod_var_richieste,stepwise.mod) #mod2_plus
## df AIC
## mod1 11 35149.60
## mod2_plus 10 35056.64
## mod2 9 35147.22
## mod3 8 35062.46
## mod3_1 6 35110.79
## mod4 5 35206.43
## mod_var_richieste 8 35153.66
## stepwise.mod 7 35152.89
BIC(mod1,mod2_plus,mod2,mod3,mod3_1,mod4,mod_var_richieste,stepwise.mod) #mod3
## df BIC
## mod1 11 35213.65
## mod2_plus 10 35114.87
## mod2 9 35199.63
## mod3 8 35109.04
## mod3_1 6 35145.72
## mod4 5 35235.55
## mod_var_richieste 8 35200.24
## stepwise.mod 7 35193.65
Per AIC il modello migliore รจ il mod2_plus Per BIC invece รจ il mod3.
A questo punto, considerando che AIC tende a preferire modelli sovraparametrizzati prendiamo in considerazione il risultato di BIC.
Controlliamo la multicollinearitร
car::vif(mod1)
## GVIF Df GVIF^(1/(2*Df))
## Anni.madre 1.190224 1 1.090974
## N.gravidanze 1.188419 1 1.090146
## Fumatrici 1.007051 1 1.003519
## Gestazione 1.695637 1 1.302166
## Lunghezza 2.081857 1 1.442864
## Cranio 1.629339 1 1.276456
## Ospedale 1.003827 2 1.000955
## Sesso 1.040740 1 1.020167
car::vif(mod2_plus)
## GVIF Df GVIF^(1/(2*Df))
## N.gravidanze 1.026144 1 1.012988
## Gestazione 1.802961 1 1.342744
## Lunghezza 238.051106 1 15.428905
## Cranio 1.626150 1 1.275206
## Ospedale 1.002774 2 1.000693
## Sesso 1.046278 1 1.022877
## I(Lunghezza^2) 230.061562 1 15.167780
car::vif(mod2)
## GVIF Df GVIF^(1/(2*Df))
## N.gravidanze 1.024531 1 1.012191
## Gestazione 1.670812 1 1.292599
## Lunghezza 2.077805 1 1.441459
## Cranio 1.624925 1 1.274726
## Ospedale 1.002651 2 1.000662
## Sesso 1.040428 1 1.020014
car::vif(mod2_1)
## N.gravidanze Gestazione Lunghezza Cranio Sesso
## 1.023462 1.669779 2.075747 1.624568 1.040184
car::vif(mod3)
## N.gravidanze Gestazione Lunghezza Cranio Sesso
## 1.025055 1.801815 238.007682 1.625780 1.046053
## I(Lunghezza^2)
## 230.033474
car::vif(mod3_1)
## Gestazione Lunghezza Cranio I(Lunghezza^2)
## 1.780167 236.760730 1.605028 228.434188
car::vif(mod4)
## Gestazione Lunghezza Cranio
## 1.653674 2.048591 1.603713
car::vif(mod_var_richieste)
## N.gravidanze Fumatrici Gestazione Lunghezza Cranio Sesso
## 1.026101 1.006621 1.676199 2.079728 1.624705 1.040400
car::vif(stepwise.mod)
## N.gravidanze Gestazione Lunghezza Cranio Sesso
## 1.023462 1.669779 2.075747 1.624568 1.040184
Non ci sono problemi di multicollinearitร (a parte quella prevedibile tra Lunghezza e il suo termine quadratico I(Lunghezza^2))
Tra il mod3 (6 regressori e un termine quadratico) e il mod4 (3 regressori) abbiamo sempre un R2 adj che differisce di circa 1.5 punti e non vale la pena aggiungere 3 regressori e un termine quadratico per avere solo un punto percentuale di varianza in piรน spiegata, nonostante alcuni test sopra riportati valutino come migliore il mod3 o il mod2_plus (7 regressori e un termine quadratico)
Tenendo in considerazione il mod4 che risulta essere il migliore in termini di semplicitร e rasoio di Occam per i valori di R2 adj, il mod3 segnalato come migliore dal test BIC e il mod_var_richieste andiamo a valutare lโMSE, lโRMSE e il MAE
MSE รจ la media dei quadrati degli errori tra i valori osservati e quelli predetti da un modello. RMSE รจ la radice quadrata della media dei quadrati degli errori tra i valori osservati e quelli predetti da un modello quindi รจ nella stessa unitร di misura della variabile peso. Sono entrambi sensibili agli outlier MAE รจ la media degli errori assoluti tra i valori osservati e quelli predetti. Indica, in media, di quanto il modello si discosta dai valori osservati, nella stessa unitร della variabile dipendente. Il MAE รจ meno sensibile agli outlier
MSE_mod4 <- mean(mod4$residuals^2)
RMSE_mod4 <- sqrt(mean(mod4$residuals^2))
MAE_mod4 <- mean(abs(mod4$residuals))
MSE_mod3 <- mean(mod3$residuals^2)
RMSE_mod3 <- sqrt(mean(mod3$residuals^2))
MAE_mod3 <- mean(abs(mod3$residuals))
MSE_mod_var_richieste <- mean(mod_var_richieste$residuals^2)
RMSE_mod_var_richieste <- sqrt(mean(mod_var_richieste$residuals^2))
MAE_mod_var_richieste <- mean(abs(mod_var_richieste$residuals))
tabella_risultati <- data.frame(
Modello = c("mod4", "mod3", "mod_var_richieste"),
MSE = c(MSE_mod4, MSE_mod3, MSE_mod_var_richieste),
RMSE = c(RMSE_mod4, RMSE_mod3, RMSE_mod_var_richieste),
MAE = c(MAE_mod4, MAE_mod3, MAE_mod_var_richieste)
)
kable(tabella_risultati, caption = "Metriche di Valutazione dei Modelli")
| Modello | MSE | RMSE | MAE |
|---|---|---|---|
| mod4 | 77031.34 | 277.5452 | 214.1401 |
| mod3 | 72542.67 | 269.3375 | 208.8608 |
| mod_var_richieste | 75239.99 | 274.2991 | 210.9321 |
I valori di MSE e RMSE del mod4 risultano essere maggiori e questo significa un errore maggiore
par(mfrow=c(2,2))
plot(mod4, pch=20, col="royalblue3")
Residuals vs Fitted
I punti devono presentarsi sparsi casualmente attorno alla media di zero.
La media di zero sembra essere rispettata per valori piรน alti mentre i valori piรน bassi tendono ad essere maggiori di 0. Le osservazioni 1549, 155 e 1305 sono fuori dalla nuvola
Q-Q Residuals
Vengono messi in relazione i residui con i quantili di una distribuzione normale.
Se i punti giacciono pressappoco sulla bisettrice del grafico allora i residui seguono la distribuzione normale.
In questo caso sembra che i punti siano correttamente disposti sopra la bisettrice, a parte qualche problemino nella coda inferiore e soprattutto quella superiore. Ci sono di nuovo le osservazioni 1549, 155 e 1305 che sono piรน lontane dalle altre, principalmente la 1549.
Scale-Location
Non si devono visualizzare dei patterns ma soltanto una nuvola casuale grossomodo orizzontale attorno a un valore di y che indicherร appunto una varianza costante.
Anche qui si nota una curvatura per i valori piรน piccoli.
Residuals vs Leverage
Si visualizzano i potenziali valori influenti, ovvero quei valori molto leverage, molto outliers o una combinazione di entrambe le cose.
In generale quando alcuni residui mostrano una distanza di Cook che supera queste linee tratteggiate, vengono considerati residui di osservazioni potenzialmente influenti sulle stime di regressione.
La soglia a 0,5 รจ quella di avvertimento mentre la soglia fissata a 1 รจ quella di allarme.
In questo caso lโosservazione 1549 รจ addirittura oltre la soglia di allarme.
Lโosservazione 1549 si era distinta giร nellโanalisi descrittiva
Calcoliamo ora i valori di leva per il mod4, identifichiamo il valore soglia che classificherร i valori come valori di leva o meno e andiamo infine a visualizzare la soglia anche nel grafico con una linea orizzontale azzurra
lev_mod4<-hatvalues(mod4)
plot(lev_mod4, pch=20, col="royalblue3")
p_mod4 = sum(lev_mod4)
soglia_mod4 = 2*p_mod4/n
abline(h=soglia_mod4,col="turquoise3",lwd=1.5)
Ci sono molti valori leverage ovvero oltre il valore soglia definito.
Possiamo identificare questi valori, ma essendo cosรฌ tanti guardiamone solo il numero.
length(lev_mod4[lev_mod4>soglia_mod4])
## [1] 173
Per capire meglio lโimpatto di questi leverage andiamo avanti con lโanalisi dei residui
plot(rstudent(mod4), pch=20, col="royalblue3")
abline(h=c(-2,2),col="turquoise3",lwd=1.5)
Ci sono molti punti che superano i valori soglia di meno 2 e 2
Andiamo ad effettuare anche il test statistico per gli outlier
car::outlierTest(mod4)
## rstudent unadjusted p-value Bonferroni p
## 1549 9.866111 1.5024e-22 3.7531e-19
## 155 5.120997 3.2715e-07 8.1722e-04
## 1305 4.567113 5.1853e-06 1.2953e-02
Le tre osservazioni che vedevamo dai grafici mostrano avere qualche problema anche da questo test.
Andiamo anche a visualizzare la distanza di Cook
cook_mod4<-cooks.distance(mod4)
plot(cook_mod4,ylim = c(0,1.2), pch=20, col="royalblue3")
Come avevamo visto il valore massimo della distanza di Cook รจ maggiore di 1, circa 1.2. Le altre osservazioni sono tutte sotto la soglia di attenzione di 0.5
Andiamo a verificare esattamente a quanto ammonta il massimo della distanza di Cook
max(cook_mod4)
## [1] 1.195621
Il valore massimo raggiunto delle distanze di cook รจ di circa 1.2 quindi cโรจ un valore particolarmente influente sulle stime di regressione.
par(mfrow=c(1,2))
plot(residuals(mod4), pch=20, col="royalblue3")
abline(h=mean(residuals(mod4)), col="turquoise3",lwd=1.5)
plot(density(residuals(mod4)), col="royalblue3")
Possiamo vedere che la distribuzione dei residui assomiglia abbastanza alla normale ma ha una coda a sinistra piรน schiacciata e una piccola doppia โpuntaโ centrale
Andiamo a fare un test di Shapiro Wilk, un test di normalitร in cui lโipotesi nulla รจ proprio la distribuzione normale della variabile di riferimento
shapiro.test(mod4$residuals)
##
## Shapiro-Wilk normality test
##
## data: mod4$residuals
## W = 0.97559, p-value < 2.2e-16
p value molto piccolo quindi si rifiuta lโipotesi di normalitร
Andiamo a saggiare queste altre due ipotesi
RESIDUI A VARIANZA COSTANTE (omoschedasticitร ) โ> TEST DI BREUSCH PAGAN
RESIDUI NON CORRELATI TRA DI LORO โ> TEST DI DURBIN WATSON
bptest(mod4)
##
## studentized Breusch-Pagan test
##
## data: mod4
## BP = 91.818, df = 3, p-value < 2.2e-16
il p value รจ molto piccolo quindi si rifiuta lโipotesi di omoschedasticitร (residui a varianza non costante)
dwtest(mod4)
##
## Durbin-Watson test
##
## data: mod4
## DW = 1.9617, p-value = 0.1687
## alternative hypothesis: true autocorrelation is greater than 0
il p value รจ di 0.1687 (valore piรน grande della soglia dello 0.05) quindi non si rifiuta lโipotesi di indipendenza
Visualizziamo questa osservazione 1549 che รจ quella con la distanza di Cook maggiore di 1
oss_1549 <- neonati[1549, ]
oss_1549
## Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio
## 1551 35 1 0 38 4370 315 374
## Tipo.parto Ospedale Sesso Gestazione_CL
## 1551 Nat osp3 F A termine
Escludendo lโosservazione 1549 verifichiamo alcuni valori tenendo presente che la nostra osservazione riporta: Gestazione: 38 Peso: 4370 Lunghezza: 315 Cranio:374
Minima lunghezza del neonato per una gestazione maggiore o uguale a 38
neonati[-1549,] %>%
filter(Gestazione>=38)%>%
summarize(min(Lunghezza))
## min(Lunghezza)
## 1 410
Massima settimana di gestazione per una lunghezza del neonato compresa tra 310 e 320 mm
neonati[-1549, ] %>%
filter(Lunghezza>=310&Lunghezza<=320)%>%
summarize(max(Gestazione))
## max(Gestazione)
## 1 28
Massimo peso per una lunghezza del neonato compresa tra 310 e 320 mm
neonati[-1549, ] %>%
filter(Lunghezza>=310&Lunghezza<=320)%>%
summarize(max(Peso))
## max(Peso)
## 1 980
Massima dimensione del cranio del neonato per una lunghezza compresa tra 310 e 320 mm
neonati[-1549,] %>%
filter(Lunghezza>=310&Lunghezza<=320)%>%
summarize(max(Cranio))
## max(Cranio)
## 1 265
Lunghezza media per un peso tra i 4300g e i 4400g
neonati[-1549,] %>%
filter(Peso >= 4300 & Peso <= 4400) %>%
summarise(mean(Lunghezza))
## mean(Lunghezza)
## 1 534
Da questi 4 valori possiamo vedere quanto si discosti questa osservazione dalle altre del dataset.
Proviamo a creare un dataset in cui escludiamo lโosservazione 1549 per vedere come varia il modello, potrebbe anche essere un errore di battitura.
neonati_no_1549 <- neonati[-1549,]
Proviamo a creare un modello identico a mod4 applicandolo a questo nuovo dataset
mod4_no_1549 <- lm(Peso~Gestazione+Lunghezza+Cranio, data = neonati_no_1549)
summary(mod4_no_1549)
##
## Call:
## lm(formula = Peso ~ Gestazione + Lunghezza + Cranio, data = neonati_no_1549)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1121.19 -181.67 -12.06 166.83 1452.03
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6778.9476 133.1613 -50.908 <2e-16 ***
## Gestazione 28.9674 3.7635 7.697 2e-14 ***
## Lunghezza 11.0595 0.3035 36.441 <2e-16 ***
## Cranio 10.1808 0.4249 23.958 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 272.6 on 2493 degrees of freedom
## Multiple R-squared: 0.7307, Adjusted R-squared: 0.7304
## F-statistic: 2255 on 3 and 2493 DF, p-value: < 2.2e-16
summary(mod4)
##
## Call:
## lm(formula = Peso ~ Gestazione + Lunghezza + Cranio)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1105.68 -183.52 -12.69 166.41 2622.95
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6778.1583 135.7089 -49.946 <2e-16 ***
## Gestazione 31.7554 3.8247 8.303 <2e-16 ***
## Lunghezza 10.4210 0.3022 34.486 <2e-16 ***
## Cranio 10.7911 0.4285 25.186 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 277.8 on 2494 degrees of freedom
## Multiple R-squared: 0.7207, Adjusted R-squared: 0.7203
## F-statistic: 2145 on 3 and 2494 DF, p-value: < 2.2e-16
Il summary del nuovo modello mostra valori buoni, rispetto al mod4 cโรจ un miglioramento nei residui e nel r2 adj (1%). I coefficienti tra i due modelli variano ma non di tantissimo.
par(mfrow=c(2,2))
plot(mod4_no_1549, pch=20, col="royalblue3")
La situazione รจ rimasta analoga alla precedente senza ovviamente lโosservazione 1549 Restano in evidenza principalmente le osservazioni 1305 e 155. Compare anche lโosservazione 1399.
Calcoliamo ora i valori di leva per il mod4_no_1549, identifichiamo il valore soglia che classificherร i valori come valori di leva o meno e andiamo infine a visualizzare la soglia anche nel grafico con una linea orizzontale azzurra
lev_mod4_no_1549<-hatvalues(mod4_no_1549)
plot(lev_mod4_no_1549, pch=20, col="royalblue3")
p_mod4_no_1549 = sum(lev_mod4_no_1549)
n_mod4_no_1549 <- nrow(neonati_no_1549)
soglia_mod4_no_1549 = 2*p_mod4_no_1549/n_mod4_no_1549
abline(h=soglia_mod4_no_1549,col="turquoise3",lwd=1.5)
Ci sono molti valori leverage ovvero oltre il valore soglia definito.
Possiamo identificare questi valori, ma essendo cosรฌ tanti guardiamone solo il numero.
length(lev_mod4_no_1549[lev_mod4_no_1549>soglia_mod4_no_1549])
## [1] 176
Per capire meglio lโimpatto di questi leverage andiamo avanti con lโanalisi dei residui
plot(rstudent(mod4_no_1549), pch=20, col="royalblue3")
abline(h=c(-2,2),col="turquoise3",lwd=1.5)
Ci sono molti punti che superano i valori soglia di meno 2 e 2
Andiamo ad effettuare anche il test statistico per gli outlier
car::outlierTest(mod4_no_1549)
## rstudent unadjusted p-value Bonferroni p
## 155 5.373143 8.4549e-08 0.00021112
## 1306 4.671130 3.1546e-06 0.00787710
Le due osservazioni che vedevamo dai grafici mostrano avere qualche problema anche da questo test.
Andiamo anche a visualizzare la distanza di Cook
cook_mod4_no_1549<-cooks.distance(mod4_no_1549)
plot(cook_mod4_no_1549,ylim = c(0,1), pch=20, col="royalblue3")
Come avevamo visto dai grafici non abbiamo valori al di sopra della soglia di attenzione della distanza di Cook pari a 0.5.
Andiamo a verificare esattamente a quanto ammonta il massimo della distanza di Cook
max(cook_mod4_no_1549)
## [1] 0.09804879
il valore massimo raggiunto delle distanze di cook รจ di circa 0.1 quindi non ci sono valori particolarmente influenti sulle stime di regressione.
par(mfrow=c(1,2))
plot(residuals(mod4_no_1549), pch=20, col="royalblue3")
abline(h=mean(residuals(mod4_no_1549)), col="turquoise3",lwd=1.5)
plot(density(residuals(mod4_no_1549)), col="royalblue3")
Possiamo vedere che la distribuzione dei residui assomiglia abbastanza alla normale ma ha una coda a sinistra piรน schiacciata e piรน corta rispetto a quella di destra e una piccola doppia โpuntaโ centrale
Andiamo a fare un test di Shapiro Wilk, un test di normalitร in cui lโipotesi nulla รจ proprio la distribuzione normale della variabile di riferimento
shapiro.test(mod4_no_1549$residuals)
##
## Shapiro-Wilk normality test
##
## data: mod4_no_1549$residuals
## W = 0.98955, p-value = 1.559e-12
p value molto piccolo quindi si rifiuta lโipotesi di normalitร
Andiamo a saggiare queste altre due ipotesi
RESIDUI A VARIANZA COSTANTE (omoschedasticitร ) โ> TEST DI BREUSCH PAGAN
RESIDUI NON CORRELATI TRA DI LORO โ> TEST DI DURBIN WATSON
bptest(mod4_no_1549)
##
## studentized Breusch-Pagan test
##
## data: mod4_no_1549
## BP = 10.634, df = 3, p-value = 0.01388
il p value รจ minore della soglia di 0.05 quindi si rifiuta lโipotesi di omoschedasticitร (residui a varianza non costante)
dwtest(mod4_no_1549)
##
## Durbin-Watson test
##
## data: mod4_no_1549
## DW = 1.9623, p-value = 0.173
## alternative hypothesis: true autocorrelation is greater than 0
il p value รจ di 0.173 (valore piรน grande della soglia dello 0.05) quindi non si rifiuta lโipotesi di indipendenza
par(mfrow=c(2,2))
plot(mod3, pch=20, col="royalblue3")
Residuals vs Fitted
La media di zero sembra essere rispettata per valori piรน alti mentre i valori piรน bassi tendono ad essere maggiori di 0. Le osservazioni 1551, 155 e 1306 sono fuori dalla nuvola
Q-Q Residuals
In questo caso sembra che i punti siano correttamente disposti sopra la bisettrice, a parte qualche problemino nella coda inferiore e soprattutto quella superiore. Ci sono di nuovo le osservazioni 1551, 155 e 1306 che sono piรน lontane dalle altre, principalmente la 1551.
Scale-Location
Anche qui si nota una curvatura per i valori piรน piccoli e le solite 3 osservazioni piรน lontane.
Residuals vs Leverage
Qui notiamo lโosservazione 1551 oltre la soglia di avvertimento: รจ unโosservazione che si era giร distinta durante lโanalisi preliminare dei dati, per un valore di peso alto rispetto alla settimana di gestazione
Calcoliamo ora i valori di leva per lo mod3, identifichiamo il valore soglia che classificherร i valori come valori di leva o meno e andiamo infine a visualizzare la soglia anche nel grafico con una linea orizzontale azzurra
lev_mod3<-hatvalues(mod3)
plot(lev_mod3, pch=20, col="royalblue3")
p_mod3 = sum(lev_mod3)
soglia_mod3 = 2*p_mod3/n
abline(h=soglia_mod3,col="turquoise3",lwd=1.5)
Ci sono molti valori leverage ovvero oltre il valore soglia definito.
Possiamo identificare questi valori, ma essendo cosรฌ tanti guardiamone solo il numero.
length(lev_mod3[lev_mod3>soglia_mod3])
## [1] 142
Per capire meglio lโimpatto di questi leverage andiamo avanti con lโanalisi dei residui
plot(rstudent(mod3), pch=20, col="royalblue3")
abline(h=c(-2,2),col="turquoise3",lwd=1.5)
Ci sono molti punti che superano i valori soglia di meno 2 e 2
Andiamo ad effettuare anche il test statistico per gli outlier
car::outlierTest(mod3)
## rstudent unadjusted p-value Bonferroni p
## 1551 7.279956 4.4561e-13 1.1131e-09
## 1306 4.831997 1.4338e-06 3.5817e-03
## 155 4.746031 2.1919e-06 5.4754e-03
## 1399 -4.357506 1.3689e-05 3.4194e-02
## 1694 4.315725 1.6529e-05 4.1290e-02
Le tre osservazioni che vedevamo dai grafici mostrano avere qualche problema anche da questo test. Se ne presentano perรฒ anche altre 2.
Andiamo anche a visualizzare la distanza di Cook
cook_mod3<-cooks.distance(mod3)
plot(cook_mod3,ylim = c(0,1.4), pch=20, col="royalblue3")
Come avevamo visto il valore massimo della distanza di Cook รจ maggiore di 1, quasi 1.4. Le altre osservazioni sono tutte sotto la soglia di attenzione di 0.5
Andiamo a verificare esattamente a quanto ammonta il massimo della distanza di Cook
max(cook_mod3)
## [1] 1.36394
il valore massimo raggiunto delle distanze di cook รจ di circa 1.36 quindi cโรจ un valore oltre la soglia di attenzione.
par(mfrow=c(1,2))
plot(residuals(mod3), pch=20, col="royalblue3")
abline(h=mean(residuals(mod3)), col="turquoise3",lwd=1.5)
plot(density(residuals(mod3)), col="royalblue3")
Possiamo vedere che la distribuzione dei residui assomiglia abbastanza alla normale ma ha una coda a destra meno schiacciata e piรน lunga
Andiamo a fare un test di Shapiro Wilk, un test di normalitร in cui lโipotesi nulla รจ proprio la distribuzione normale della variabile di riferimento
shapiro.test(mod3$residuals)
##
## Shapiro-Wilk normality test
##
## data: mod3$residuals
## W = 0.98572, p-value = 3.811e-15
p value molto piccolo quindi si rifiuta lโipotesi di normalitร
Andiamo a saggiare queste altre due ipotesi
RESIDUI A VARIANZA COSTANTE (omoschedasticitร ) โ> TEST DI BREUSCH PAGAN
RESIDUI NON CORRELATI TRA DI LORO โ> TEST DI DURBIN WATSON
bptest(mod3)
##
## studentized Breusch-Pagan test
##
## data: mod3
## BP = 127.61, df = 6, p-value < 2.2e-16
il p value รจ molto piccolo quindi si rifiuta lโipotesi di omoschedasticitร (residui a varianza non costante)
dwtest(mod3)
##
## Durbin-Watson test
##
## data: mod3
## DW = 1.9478, p-value = 0.09601
## alternative hypothesis: true autocorrelation is greater than 0
il p value รจ di 0.09601 (valore piรน grande della soglia dello 0.05) quindi non si rifiuta lโipotesi di indipendenza
Visualizziamo lโosservazione 1551, ovvero quella oltre la soglia di attenzione di Cook
oss_1551 <- neonati[1551, ]
oss_1551
## Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio
## 1553 30 4 0 35 4520 520 360
## Tipo.parto Ospedale Sesso Gestazione_CL
## 1553 Nat osp2 F Lievemente pret.
Escludendo lโosservazione 1551 verifichiamo alcuni valori tenendo presente che la nostra osservazione riporta:
Gestazione: 35
Peso: 4520
Lunghezza: 520
Cranio:360
Massimo peso del neonato per una gestazione minore o uguale a 35
neonati[-1551,] %>%
filter(Gestazione<=35)%>%
summarize(max(Peso))
## max(Peso)
## 1 3140
Massima dimensione cranio per una gestazione minore o uguale a 35
neonati[-1551,] %>%
filter(Gestazione<=35)%>%
summarize(max(Cranio))
## max(Cranio)
## 1 379
Massima lunghezza del neonato per una gestazione minore o uguale a 35
neonati[-1551,] %>%
filter(Gestazione<=35)%>%
summarize(max(Lunghezza))
## max(Lunghezza)
## 1 500
Peso medio dei neonati alti tra i 515mm e i 525mm
neonati[-1551,] %>%
filter(Lunghezza >= 515 & Lunghezza <= 525) %>%
summarise(mean(Peso))
## mean(Peso)
## 1 3670.432
Il peso ha un valore totalmente distante dai valori del resto del campione. Potrebbe essere un errore di battitura.
Proviamo a creare un dataset in cui escludiamo lโosservazione 1551 per vedere come varia il modello, potrebbe anche essere un errore di battitura.
neonati_no_1551 <- neonati[-1551,]
Proviamo a creare un modello identico a mod3 applicandolo a questo nuovo dataset e leggiamone i due summary a confronto.
mod3_no_1551 <- lm(Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
Sesso + I(Lunghezza^2), data = neonati_no_1551)
summary(mod3_no_1551)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso + I(Lunghezza^2), data = neonati_no_1551)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1166.7 -180.5 -13.3 164.1 1779.6
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 221.05907 722.34369 0.306 0.75961
## N.gravidanze 13.49263 4.26086 3.167 0.00156 **
## Gestazione 43.42167 3.87707 11.200 < 2e-16 ***
## Lunghezza -20.35444 3.15621 -6.449 1.35e-10 ***
## Cranio 10.62032 0.41812 25.400 < 2e-16 ***
## SessoM 70.88786 11.01907 6.433 1.49e-10 ***
## I(Lunghezza^2) 0.03170 0.00326 9.724 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 269.2 on 2490 degrees of freedom
## Multiple R-squared: 0.7376, Adjusted R-squared: 0.7369
## F-statistic: 1166 on 6 and 2490 DF, p-value: < 2.2e-16
summary(mod3)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso + I(Lunghezza^2), data = neonati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1169.62 -181.77 -12.79 163.77 1786.03
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 212.288548 723.852095 0.293 0.769336
## N.gravidanze 14.085464 4.266175 3.302 0.000975 ***
## Gestazione 42.551398 3.876629 10.976 < 2e-16 ***
## Lunghezza -20.267001 3.162718 -6.408 1.76e-10 ***
## Cranio 10.651783 0.418894 25.428 < 2e-16 ***
## SessoM 69.968733 11.038797 6.338 2.75e-10 ***
## I(Lunghezza^2) 0.031655 0.003267 9.690 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 269.7 on 2491 degrees of freedom
## Multiple R-squared: 0.7369, Adjusted R-squared: 0.7363
## F-statistic: 1163 on 6 and 2491 DF, p-value: < 2.2e-16
Il summary del nuovo modello rispetto al mod3 mostra un R2 adj praticamente identico. I coefficienti tra i due modelli variano ma non di tantissimo.
Passiamo allโanalisi dei residui di questo nuovo modello
par(mfrow=c(2,2))
plot(mod3_no_1551, pch=20, col="royalblue3")
La situazione รจ rimasta analoga alla precedente ma si รจ aggiunta lโosservazione 1551 del nuovo dataset
Restano in evidenza principalmente le osservazioni 1305 e 155.
Calcoliamo ora i valori di leva per il mod3_no_1551, identifichiamo il valore soglia che classificherร i valori come valori di leva o meno e andiamo infine a visualizzare la soglia anche nel grafico con una linea orizzontale azzurra
lev_mod3_no_1551<-hatvalues(mod3_no_1551)
plot(lev_mod3_no_1551, pch=20, col="royalblue3")
p_mod3_no_1551 = sum(lev_mod3_no_1551)
n_mod3_no_1551 <- nrow(neonati_no_1551)
soglia_mod3_no_1551 = 2*p_mod3_no_1551/n_mod3_no_1551
abline(h=soglia_mod3_no_1551,col="turquoise3",lwd=1.5)
Ci sono molti valori leverage ovvero oltre il valore soglia definito.
Possiamo identificare questi valori, ma essendo cosรฌ tanti guardiamone solo il numero.
length(lev_mod3_no_1551[lev_mod3_no_1551>soglia_mod3_no_1551])
## [1] 141
Per capire meglio lโimpatto di questi leverage andiamo avanti con lโanalisi dei residui
plot(rstudent(mod3_no_1551), pch=20, col="royalblue3")
abline(h=c(-2,2),col="turquoise3",lwd=1.5)
Ci sono molti punti che superano i valori soglia di meno 2 e 2
Andiamo ad effettuare anche il test statistico per gli outlier
car::outlierTest(mod3_no_1551)
## rstudent unadjusted p-value Bonferroni p
## 1551 7.269113 4.8212e-13 1.2039e-09
## 1306 4.840484 1.3745e-06 3.4321e-03
## 155 4.747261 2.1788e-06 5.4404e-03
## 1399 -4.355687 1.3802e-05 3.4464e-02
## 1694 4.331325 1.5409e-05 3.8476e-02
Le tre osservazioni che vedevamo dai grafici mostrano avere qualche problema anche da questo test. Ci sono anche altre 2 osservazioni.
Andiamo anche a visualizzare la distanza di Cook
cook_mod3_no_1551<-cooks.distance(mod3_no_1551)
plot(cook_mod3_no_1551,ylim = c(0,1.4), pch=20, col="royalblue3")
Come avevamo visto dai grafici abbiamo valori al di sopra della soglia di allarme della distanza di Cook. Unโosservazione ha una distanza di Cook pari a circa 1.4 (lโosservazione 1551 del nuovo dataset)
Andiamo a verificare esattamente a quanto ammonta il massimo della distanza di Cook
max(cook_mod3_no_1551)
## [1] 1.360464
Il valore massimo raggiunto delle distanze di Cook รจ di circa 1.36 quindi ci sono valori particolarmente influenti sulle stime di regressione.
par(mfrow=c(1,2))
plot(residuals(mod3_no_1551), pch=20, col="royalblue3")
abline(h=mean(residuals(mod3_no_1551)), col="turquoise3",lwd=1.5)
plot(density(residuals(mod3_no_1551)), col="royalblue3")
Possiamo vedere che la distribuzione dei residui assomiglia abbastanza alla normale ma ha una coda a sinistra piรน schiacciata e piรน corta rispetto a quella di destra.
Andiamo a fare un test di Shapiro Wilk, un test di normalitร in cui lโipotesi nulla รจ proprio la distribuzione normale della variabile di riferimento
shapiro.test(mod3_no_1551$residuals)
##
## Shapiro-Wilk normality test
##
## data: mod3_no_1551$residuals
## W = 0.98616, p-value = 7.296e-15
p value molto piccolo quindi si rifiuta lโipotesi di normalitร
Andiamo a saggiare queste altre due ipotesi
RESIDUI A VARIANZA COSTANTE (omoschedasticitร ) โ> TEST DI BREUSCH PAGAN
RESIDUI NON CORRELATI TRA DI LORO โ> TEST DI DURBIN WATSON
bptest(mod3_no_1551)
##
## studentized Breusch-Pagan test
##
## data: mod3_no_1551
## BP = 128.99, df = 6, p-value < 2.2e-16
il p value รจ minore della soglia di 0.05 quindi si rifiuta lโipotesi di omoschedasticitร (residui a varianza non costante)
dwtest(mod3_no_1551)
##
## Durbin-Watson test
##
## data: mod3_no_1551
## DW = 1.946, p-value = 0.08843
## alternative hypothesis: true autocorrelation is greater than 0
il p value รจ di 0.08843 (valore piรน grande della soglia dello 0.05) quindi non si rifiuta lโipotesi di indipendenza
Il mod3_no_1551 ha un outlier molto influente (osservazione 1551 del subset neonati_no_1551) che andrebbe indagato maggiormente prima di utilizzare il modello.
par(mfrow=c(2,2))
plot(mod_var_richieste, pch=20, col="royalblue3")
Residuals vs Fitted
La media di zero sembra essere rispettata per valori piรน alti mentre i valori piรน bassi tendono ad essere maggiori di 0. Le osservazioni 1549, 155 e 1305 sono fuori dalla nuvola
Q-Q Residuals
In questo caso sembra che i punti siano correttamente disposti sopra la bisettrice, a parte qualche problemino nella coda inferiore e soprattutto quella superiore. Ci sono di nuovo le osservazioni 1549, 155 e 1305 che sono piรน lontane dalle altre, principalmente la 1549.
Scale-Location
Anche qui si nota una curvatura per i valori piรน piccoli e le solite tre osservazioni piรน distanti dalla nuvola.
Residuals vs Leverage
In questo caso lโosservazione 1549 risulta essere oltre la linea di attenzione.
Calcoliamo ora i valori di leva per il mod_var_richieste, identifichiamo il valore soglia che classificherร i valori come valori di leva o meno e andiamo infine a visualizzare la soglia anche nel grafico con una linea orizzontale azzurra
lev_mod_var_richieste<-hatvalues(mod_var_richieste)
plot(lev_mod_var_richieste, pch=20, col="royalblue3")
p_mod_var_richieste = sum(lev_mod_var_richieste)
soglia_mod_var_richieste = 2*p_mod_var_richieste/n
abline(h=soglia_mod_var_richieste,col="turquoise3",lwd=1.5)
Ci sono moltissimi valori leverage ovvero oltre il valore soglia definito.
Possiamo identificare questi valori.
length(lev_mod_var_richieste[lev_mod_var_richieste>soglia_mod_var_richieste])
## [1] 211
Per capire meglio lโimpatto di questi leverage andiamo avanti con lโanalisi dei residui
plot(rstudent(mod_var_richieste), pch=20, col="royalblue3")
abline(h=c(-2,2),col="turquoise3",lwd=1.5)
Ci sono molti punti che superano i valori soglia di meno 2 e 2
Andiamo ad effettuare anche il test statistico per gli outlier
car::outlierTest(mod_var_richieste)
## rstudent unadjusted p-value Bonferroni p
## 1549 10.033980 2.9696e-23 7.4182e-20
## 155 5.019634 5.5428e-07 1.3846e-03
## 1305 4.820812 1.5158e-06 3.7865e-03
Le tre osservazioni che vedevamo dai grafici mostrano avere qualche problema anche da questo test.
Andiamo anche a visualizzare la distanza di Cook
cook_mod_var_richieste<-cooks.distance(mod_var_richieste)
plot(cook_mod_var_richieste,ylim = c(0,1), pch=20, col="royalblue3")
Come avevamo visto il valore massimo della distanza di Cook รจ maggiore di 0.5, circa 0.7. Le altre osservazioni sono tutte sotto la soglia di attenzione di 0.5
Andiamo a verificare esattamente a quanto ammonta il massimo della distanza di Cook
max(cook_mod_var_richieste)
## [1] 0.7114668
il valore massimo raggiunto delle distanze di cook รจ di circa 0.71.
par(mfrow=c(1,2))
plot(residuals(mod_var_richieste), pch=20, col="royalblue3")
abline(h=mean(residuals(mod_var_richieste)), col="turquoise3",lwd=1.5)
plot(density(residuals(mod_var_richieste)), col="royalblue3")
Possiamo vedere che la distribuzione dei residui assomiglia abbastanza alla normale ma ha una coda a coda a destra meno schiacciata e piรน lunga
Andiamo a fare un test di Shapiro Wilk, un test di normalitร in cui lโipotesi nulla รจ proprio la distribuzione normale della variabile di riferimento
shapiro.test(mod_var_richieste$residuals)
##
## Shapiro-Wilk normality test
##
## data: mod_var_richieste$residuals
## W = 0.97416, p-value < 2.2e-16
p value molto piccolo quindi si rifiuta lโipotesi di normalitร
Andiamo a saggiare queste altre due ipotesi
RESIDUI A VARIANZA COSTANTE (omoschedasticitร ) โ> TEST DI BREUSCH PAGAN
RESIDUI NON CORRELATI TRA DI LORO โ> TEST DI DURBIN WATSON
bptest(mod_var_richieste)
##
## studentized Breusch-Pagan test
##
## data: mod_var_richieste
## BP = 89.841, df = 6, p-value < 2.2e-16
il p value รจ molto piccolo quindi si rifiuta lโipotesi di omoschedasticitร (residui a varianza non costante)
dwtest(mod_var_richieste)
##
## Durbin-Watson test
##
## data: mod_var_richieste
## DW = 1.9539, p-value = 0.1243
## alternative hypothesis: true autocorrelation is greater than 0
il p value รจ di 0.1243 (valore piรน grande della soglia dello 0.05) quindi non si rifiuta lโipotesi di indipendenza
A seguito di questi risultati teniamo in considerazione solo il mod_var_richieste e il mod4_no_1549. Come analisi ci fermiamo qui e consideriamo accettabile il mod4_no_1549 ma andrebbero approfondite alcune situazioni problematiche prima di scegliere realmente il modello o si dovrebbero provare dei GLM. Portiamo avanti anche il mod_var_richieste solo perchรฉ come detto sopra nella previsione ci รจ stato chiesto di prevedere il peso di un neonato di cui ci venivano fornite alcune specifiche informazioni.
Andiamo ora a stimare il peso di una neonata considerando una madre alla terza gravidanza (quindi N.gravidanze=2), non fumatrice, che partorirร alla 39esima settimana.
dati.test <- data.frame(N.gravidanze = 2,
Gestazione = 39,
Lunghezza = mean(Lunghezza), # lunghezza media del neonato
Cranio = mean(Cranio), # circonferenza cranica media
Fumatrici = factor("0", levels = levels(Fumatrici)),
Sesso = factor("F", levels = levels(Sesso)))
predict(mod_var_richieste, newdata = dati.test)
## 1
## 3260.165
Con il mod_var_richieste il peso previsto รจ 3260.165g
dati.test_no_1549 <- data.frame(N.gravidanze = 2,
Gestazione = 39,
Lunghezza = mean(neonati_no_1549$Lunghezza), # lunghezza media del neonato
Cranio = mean(neonati_no_1549$Cranio)) # circonferenza cranica media
predict(mod4_no_1549, dati.test_no_1549) # circonferenza cranica media
## 1
## 3284.329
Con il mod4_no_1549 รจ 3284.33g
Andiamo a visualizzare uno scatterplot 3D di peso in relazione a lunghezza e cranio differenziando per sesso. Il grafico puรฒ essere esplorato con il mouse.
rgl::setupKnitr(autoprint = TRUE)
car::scatter3d(Peso~Lunghezza+Cranio, point.col = Sesso, groups = Sesso, surface = TRUE, axis.col = c("black", "black", "black"))
## Caricamento dei namespace richiesti: mgcv
rgl::rglwidget()
Andiamo a visualizzare uno scatterplot 3D di peso in relazione a lunghezza e gestazione differenziando per sesso. Il grafico puรฒ essere esplorato con il mouse.
rgl::setupKnitr(autoprint = TRUE)
car::scatter3d(Peso~Lunghezza+Gestazione, point.col = Sesso, groups=Sesso, surface = TRUE, axis.col = c("black", "black", "black"))
rgl::rglwidget()
Adesso visualizziamo la relazione tra lunghezza e peso del neonato differenziata per sesso
ggplot(data=neonati)+
geom_point(aes(x=Lunghezza,
y=Peso,
col=Sesso),position = "jitter", alpha=0.5)+
geom_smooth(aes(x=Lunghezza,
y=Peso,
col=Sesso),
se=F,method = "lm",alpha=0.5)+
geom_smooth(aes(x=Lunghezza,
y=Peso,
linetype = "Totale"),
method="lm", color="royalblue3", fill="royalblue1", se=TRUE)+
labs(x="Lunghezza (mm)",
y="Peso (g)",
title = "Relazione tra Lunghezza e Peso \ncon Regressioni Lineari per Sesso e Totale",
linetype = "Tipo di Regressione")+
theme_classic()+
theme(legend.position = "right",
legend.box = "vertical",
plot.title = element_text(size=14, hjust = 0.5, face = "bold"),
legend.title = element_text(face="bold"),
text = element_text(size=10))+
scale_x_continuous(breaks = seq(300,600,20))+
scale_y_continuous(breaks = seq(500,5000,250))+
scale_linetype_manual(values = c("Totale" = "dashed"))+
scale_color_manual(
labels = c("F" = "Femmina", "M" = "Maschio"),
values = c("F" = "#F8766D", "M" = "#00BFC4"))+
guides(
linetype = guide_legend(order = 1),
col = guide_legend(title = NULL, order = 2)
)
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
Adesso visualizziamo la relazione tra gestazione e peso del neonato differenziata per sesso
ggplot(data=neonati)+
geom_point(aes(x=Gestazione,
y=Peso,
col=Sesso),position = "jitter", alpha=0.5)+
geom_smooth(aes(x=Gestazione,
y=Peso,
col=Sesso),
se=F,method = "lm",alpha=0.5)+
geom_smooth(aes(x=Gestazione,
y=Peso,
linetype = "Totale"),
method="lm", color="royalblue3", fill="royalblue1", se=TRUE)+
labs(x="Gestazione (settimane)",
y="Peso (g)",
title = "Relazione tra Gestazione e Peso \ncon Regressioni Lineari per Sesso e Totale",
linetype = "Tipo di Regressione")+
theme_classic()+
theme(legend.position = "right",
legend.box = "vertical",
plot.title = element_text(size=14, hjust = 0.5, face = "bold"),
legend.title = element_text(face="bold"),
text = element_text(size=10))+
scale_x_continuous(breaks = seq(25,43,1))+
scale_y_continuous(breaks = seq(500,5000,250))+
scale_linetype_manual(values = c("Totale" = "dashed"))+
scale_color_manual(
labels = c("F" = "Femmina", "M" = "Maschio"),
values = c("F" = "#F8766D", "M" = "#00BFC4"))+
guides(
linetype = guide_legend(order = 1),
col = guide_legend(title = NULL, order = 2)
)
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
Adesso visualizziamo la relazione tra cranio e peso del neonato differenziata per sesso
ggplot(data=neonati)+
geom_point(aes(x=Cranio,
y=Peso,
col=Sesso),position = "jitter", alpha=0.5)+
geom_smooth(aes(x=Cranio,
y=Peso,
col=Sesso),
se=F,method = "lm",alpha=0.5)+
geom_smooth(aes(x=Cranio,
y=Peso,
linetype = "Totale"),
method="lm", color="royalblue3", fill="royalblue1", se=TRUE)+
labs(x="Cranio (mm)",
y="Peso (g)",
title = "Relazione tra Cranio e Peso \ncon Regressioni Lineari per Sesso e Totale",
linetype = "Tipo di Regressione")+
theme_classic()+
theme(legend.position = "right",
legend.box = "vertical",
plot.title = element_text(size=14, hjust = 0.5, face = "bold"),
legend.title = element_text(face="bold"),
text = element_text(size=10))+
scale_x_continuous(breaks = seq(230,390,10))+
scale_y_continuous(breaks = seq(500,5000,250))+
scale_linetype_manual(values = c("Totale" = "dashed"))+
scale_color_manual(
labels = c("F" = "Femmina", "M" = "Maschio"),
values = c("F" = "#F8766D", "M" = "#00BFC4"))+
guides(
linetype = guide_legend(order = 1),
col = guide_legend(title = NULL, order = 2)
)
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
Infine visualizziamo la relazione tra gestazione e peso del neonato differenziata per sesso
ggplot(data=neonati)+
geom_smooth(aes(x=Gestazione,
y=Peso,
linetype = "Totale"),
method="lm", color="red", size=1.5,fill="plum1", se=TRUE)+
geom_point(aes(x=Gestazione,
y=Peso,
col=Fumatrici),position = "jitter",alpha=0.8)+
geom_smooth(aes(x=Gestazione,
y=Peso,
col=Fumatrici),
se=F,method = "lm",alpha=0.5)+
labs(x="Gestazione (settimane)",
y="Peso (g)",
title = "Relazione tra Gestazione e Peso \ncon Regressioni Lineari per \nMadri fumatrici vs non fumatrici e Totale",
linetype = "Tipo di Regressione")+
theme_classic()+
theme(legend.position = "right",
legend.box = "vertical",
plot.title = element_text(size=14, hjust = 0.5, face = "bold"),
legend.title = element_text(face="bold"),
text = element_text(size=10))+
scale_x_continuous(breaks = seq(25,43,1))+
scale_y_continuous(breaks = seq(500,5000,250))+
scale_linetype_manual(values = c("Totale" = "solid"))+
scale_color_manual(
labels = c("0" = "Non Fumatrici", "1" = "Fumatrici"),
values = c("0" = "royalblue3", "1" = "darkorange"))+
guides(
linetype = guide_legend(order = 1),
col = guide_legend(title = NULL, order = 2)
)
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
In questo grafico la linea della regressione delle madri non fumatrici รจ quasi completamente sovrapposta alla linea della regressione totale.