dati<-read.csv("C:/Users/angel/Desktop/Data Science/R statistica inferenziale/neonati.csv")
summary(dati)
## Anni.madre N.gravidanze Fumatrici Gestazione
## Min. : 0.00 Min. : 0.0000 Min. :0.0000 Min. :25.00
## 1st Qu.:25.00 1st Qu.: 0.0000 1st Qu.:0.0000 1st Qu.:38.00
## Median :28.00 Median : 1.0000 Median :0.0000 Median :39.00
## Mean :28.16 Mean : 0.9812 Mean :0.0416 Mean :38.98
## 3rd Qu.:32.00 3rd Qu.: 1.0000 3rd Qu.:0.0000 3rd Qu.:40.00
## Max. :46.00 Max. :12.0000 Max. :1.0000 Max. :43.00
## Peso Lunghezza Cranio Tipo.parto
## Min. : 830 Min. :310.0 Min. :235 Length:2500
## 1st Qu.:2990 1st Qu.:480.0 1st Qu.:330 Class :character
## Median :3300 Median :500.0 Median :340 Mode :character
## Mean :3284 Mean :494.7 Mean :340
## 3rd Qu.:3620 3rd Qu.:510.0 3rd Qu.:350
## Max. :4930 Max. :565.0 Max. :390
## Ospedale Sesso
## Length:2500 Length:2500
## Class :character Class :character
## Mode :character Mode :character
##
##
##
#Analisi Preliminare
Nella prima fase, esploreremo le variabili attraverso un’analisi descrittiva per comprenderne la distribuzione e identificare eventuali outlier o anomalie. Inoltre si saggeranno le seguenti ipotesi con i test adatti: in alcuni ospedali si fanno più parti cesarei La media del peso e della lunghezza di questo campione di neonati sono significativamente uguali a quelle della popolazione Le misure antropometriche sono significativamente diverse tra i due sessi
library(psych)
## Warning: il pacchetto 'psych' è stato creato con R versione 4.1.3
describe(dati)
## vars n mean sd median trimmed mad min max range
## Anni.madre 1 2500 28.16 5.27 28 28.10 4.45 0 46 46
## N.gravidanze 2 2500 0.98 1.28 1 0.74 1.48 0 12 12
## Fumatrici 3 2500 0.04 0.20 0 0.00 0.00 0 1 1
## Gestazione 4 2500 38.98 1.87 39 39.19 1.48 25 43 18
## Peso 5 2500 3284.08 525.04 3300 3302.90 459.61 830 4930 4100
## Lunghezza 6 2500 494.69 26.32 500 496.45 22.24 310 565 255
## Cranio 7 2500 340.03 16.43 340 340.68 14.83 235 390 155
## Tipo.parto* 8 2500 1.71 0.45 2 1.76 0.00 1 2 1
## Ospedale* 9 2500 2.01 0.81 2 2.01 1.48 1 3 2
## Sesso* 10 2500 1.50 0.50 1 1.50 0.00 1 2 1
## skew kurtosis se
## Anni.madre 0.04 0.38 0.11
## N.gravidanze 2.51 10.98 0.03
## Fumatrici 4.59 19.06 0.00
## Gestazione -2.06 8.25 0.04
## Peso -0.65 2.03 10.50
## Lunghezza -1.51 6.48 0.53
## Cranio -0.78 2.94 0.33
## Tipo.parto* -0.92 -1.16 0.01
## Ospedale* -0.01 -1.49 0.02
## Sesso* 0.01 -2.00 0.01
Statistiche per tutte le variabili è mostrata la media, la deviazione standard, la mediana, minimo e massimo, il numero di elementi, range, curtosi e asimmetria, errore standard e le altre descrittive per le variabili in esame. notiamo il massimo della gestazione di 43 settimane è un valore limite secondo la letteratura ma ancora accettabile sicuramente non vale per il valore minimo di età 0 della madre
Individua eventuiali valori mancanti
colSums(is.na(dati))
## Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza
## 0 0 0 0 0 0
## Cranio Tipo.parto Ospedale Sesso
## 0 0 0 0
Analisi grafica delle distribuzioni Istogrammi e grafici di tutte le variabili ad eccezione di Tipo parto, fumatrici e Ospedale che verranno visualizzate in tabella a doppia entrata
par(mfrow = c(3, 2))
hist(dati$Peso, main = "Distribuzione Peso Neonatale", xlab = "Peso (grammi)", col = "lightblue")
boxplot(dati$Peso, main = "Boxplot Peso Neonatale", col = "lightblue", horizontal = TRUE)
hist(dati$Gestazione, main = "Distribuzione Settimane di Gestazione", xlab = "Settimane", col = "lightgreen")
boxplot(dati$Gestazione, main = "Boxplot Settimane di Gestazione", col = "lightgreen", horizontal = TRUE)
hist(dati$Lunghezza, main = "Distribuzione Lunghezza Neonati", xlab = "Lunghezza (mm)", col = "lightpink")
boxplot(dati$Lunghezza, main = "Boxplot Lunghezza Neonati", col = "lightpink", horizontal = TRUE)
Gli istogrammi presentano una forma simil gaussiana. Andremo a verificare che la media non sia diversa da quella della popolazione. I box plot espricitano la mediana e come si distribuiscono i valori andando ad evidenziare outlier. Per settimane e lunghezza notiamo molti outlier nei valori inferiori e quasi nessuno per valori superiori. Per il peso invece ci sono anche outlier verso l’estremo superiore anche se si notano anche qui molti più elementi con valori più bassi.
par(mfrow = c(2, 2))
hist(dati$Anni.madre, main = "Distribuzione Anni madre", xlab = "Anni", col = "lightblue")
boxplot(dati$Anni.madre, main = "Boxplot Anni madre", col = "lightblue", horizontal = TRUE)
hist(dati$Cranio, main = "Distribuzione Cranio Neonati", xlab = "Circonferenza (mm)", col = "lightpink")
boxplot(dati$Cranio, main = "Boxplot Cranio Neonati", col = "lightpink", horizontal = TRUE)
Anche qui si nota una forma simil gaussiana oltre a degli outlier anomali per l’età della madre essendo molto bassi 2 valori
Tabella che divide fumatrici (1) da non fumatrici (0)
table(dati$Fumatrici)
##
## 0 1
## 2396 104
Identificazione di outlier per Peso, gestazione, Lunghezza, Cranio e Anni Madre
par(mfrow = c(1, 1))
peso_outlier <- boxplot.stats(dati$Peso)$out
peso_outlier # valori anomali del peso
## [1] 1370 1340 4680 1500 1850 1560 1280 1750 4600 1285 1550 1410 1900 1720 1980
## [16] 1390 1450 1970 1190 2000 830 1615 1960 1770 1750 1170 2040 1980 4600 4900
## [31] 1840 1620 1280 1280 4810 2040 4620 1500 2000 990 4760 1800 1430 1950 1970
## [46] 900 1780 4580 4930 4700 4650 4720 1780 1180 1890 1140 1600 1300 930 1750
## [61] 2000 4690 1580 1170 4720 1690 980 930 1730
gestazione_outlier <- boxplot.stats(dati$Gestazione)$out
gestazione_outlier
## [1] 34 33 34 30 34 34 31 34 33 28 32 28 34 34 32 33 33 31 32 34 33 33 33 33 29
## [26] 34 28 32 31 33 34 34 33 30 33 34 32 29 34 29 33 31 31 32 25 32 33 34 34 33
## [51] 31 32 27 33 30 28 30 32 33 34 30 33 31 27 26 31 33
Lunghezza_outlier <- boxplot.stats(dati$Lunghezza)$out
Lunghezza_outlier
## [1] 390 400 410 405 420 420 360 430 400 410 560 380 420 390 405 360 430 310 390
## [20] 430 390 420 410 420 370 430 430 410 385 390 560 315 420 340 410 430 430 380
## [39] 325 420 420 410 400 430 355 370 410 380 355 410 425 400 370 430 565 405 320
## [58] 345 430
Cranio_outlier <- boxplot.stats(dati$Cranio)$out
Cranio_outlier
## [1] 298 382 287 273 285 280 390 384 295 276 382 274 289 295 386 390 277 280 272
## [20] 254 297 385 295 275 266 383 390 292 292 293 278 253 277 390 381 270 267 290
## [39] 276 235 294 299 298 290 273 290 265 245
AnniM_outlier <- boxplot.stats(dati$Anni.madre)$out
AnniM_outlier
## [1] 13 45 43 44 44 43 14 46 1 0 14 44 44
Sostituisco il valore anomalo di 0 e 1 anni con la media delle età (calcolata escludendo il valore zero e 1)
media_anni_madre <- mean(dati$Anni.madre[!(dati$Anni.madre %in% c(0, 1))], na.rm = TRUE)
dati$Anni.madre[dati$Anni.madre %in% c(0, 1)] <- media_anni_madre
Controllo il dataset dopo la sostituzione
summary(dati)
## Anni.madre N.gravidanze Fumatrici Gestazione
## Min. :13.00 Min. : 0.0000 Min. :0.0000 Min. :25.00
## 1st Qu.:25.00 1st Qu.: 0.0000 1st Qu.:0.0000 1st Qu.:38.00
## Median :28.00 Median : 1.0000 Median :0.0000 Median :39.00
## Mean :28.19 Mean : 0.9812 Mean :0.0416 Mean :38.98
## 3rd Qu.:32.00 3rd Qu.: 1.0000 3rd Qu.:0.0000 3rd Qu.:40.00
## Max. :46.00 Max. :12.0000 Max. :1.0000 Max. :43.00
## Peso Lunghezza Cranio Tipo.parto
## Min. : 830 Min. :310.0 Min. :235 Length:2500
## 1st Qu.:2990 1st Qu.:480.0 1st Qu.:330 Class :character
## Median :3300 Median :500.0 Median :340 Mode :character
## Mean :3284 Mean :494.7 Mean :340
## 3rd Qu.:3620 3rd Qu.:510.0 3rd Qu.:350
## Max. :4930 Max. :565.0 Max. :390
## Ospedale Sesso
## Length:2500 Length:2500
## Class :character Class :character
## Mode :character Mode :character
##
##
##
Distribuzione per Sesso
library(ggplot2)
## Warning: il pacchetto 'ggplot2' è stato creato con R versione 4.1.2
##
## Caricamento pacchetto: 'ggplot2'
## I seguenti oggetti sono mascherati da 'package:psych':
##
## %+%, alpha
ggplot(dati, aes(x = Sesso, fill = Sesso)) +
geom_bar() +
labs(title = "Distribuzione per Sesso", x = "Sesso", y = "Frequenza") +
scale_fill_manual(values = c("lightblue", "pink")) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
axis.title = element_text(size = 12),
axis.text = element_text(size = 10)) +
geom_text(stat = 'count', aes(label = ..count..), vjust = -0.1, size = 5)
Il grafico mostra una quasi equa distribuzione nei due generi. Questo da valore alle conclusioni riguardo le differenze di genere
Distribuzione per Tipo di Parto indipendentemente dagli ospedali
ggplot(dati, aes(x = Tipo.parto, fill = Tipo.parto)) +
geom_bar() +
labs(title = "Distribuzione per Tipo di Parto", x = "Tipo di Parto", y = "Frequenza") +
scale_fill_brewer(palette = "Set2") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
axis.title = element_text(size = 12),
axis.text = element_text(size = 10)) +
geom_text(stat = 'count', aes(label = ..count..), vjust = -0.1, size = 5)
si notano 728 osservazioni per i parti cesarei e 1772 per i parti naturali come mostra il grafico.
Distribuzione per Ospedale
ggplot(dati, aes(x = Ospedale, fill = Ospedale)) +
geom_bar() +
labs(title = "Distribuzione per Ospedale", x = "Ospedale", y = "Frequenza") +
scale_fill_viridis_d() +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
axis.title = element_text(size = 12),
axis.text = element_text(size = 10)) +
geom_text(stat = 'count', aes(label = ..count..), vjust = -0.15, size = 5)
Si nota una quasi pari distribuzione di osservazioni tra i tre ospedali
Distribuzione per Fumatrici
ggplot(dati, aes(x = Fumatrici, fill = Fumatrici)) +
geom_bar() +
labs(title = "Distribuzione per Fumo Materno", x = "Fumatrici", y = "Frequenza") +
scale_fill_manual(values = c("lightgreen", "lightcoral")) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
axis.title = element_text(size = 12),
axis.text = element_text(size = 10)) +
geom_text(stat = 'count', aes(label = ..count..), vjust = -0.1, size = 5)
Come mostrato dai grafici, il campione dispone di pochi dati riguardo le madri fumatrici
Relazione tra Peso e Settimane di Gestazione
plot(dati$Gestazione, dati$Peso, main = "Peso vs Settimane di Gestazione",
xlab = "Settimane di Gestazione", ylab = "Peso (grammi)", col = "darkblue", pch = 20)
Si può notare un andamento crescente tra settimane di gestazione e peso.
Peso Neonatale rispetto al Fumo Materno o meno
boxplot(dati$Peso ~ dati$Fumatrici, main = "Peso Neonatale e Fumo Materno",
xlab = "Fumo Materno (0 = No, 1 = Si)", ylab = "Peso (grammi)", col = c("lightblue", "lightcoral"))
Nonostante le mediane appaiano molto simili, le madri che non fumano risultano avere bambini con pesi che si disperdono maggiormente oltre i limiti del boxplot (per cui si notano molti outlier). Per cui si nota una maggiore variabilità in questo sottogruppo piuttosto che nelle non fumatrici (anche perchè sono di numerosità molto inferiore).
tabella_parti <- table(dati$Ospedale, dati$Tipo.parto)
df_parti <- as.data.frame(tabella_parti)
colnames(df_parti) <- c("Ospedale", "TipoParto", "Frequenza")
# Creazione del grafico a barre
library(ggplot2)
ggplot(df_parti, aes(x = TipoParto, y = Frequenza, fill = Ospedale)) +
geom_bar(stat = "identity", position = position_dodge()) + # Barre affiancate
geom_text(
aes(label = Frequenza),
position = position_dodge(width = 0.9),
vjust = -0.5,
size = 3
) + # Etichette sopra le barre
scale_fill_brewer(palette = "Set2") + # Tavolozza di colori personalizzata
labs(
title = "Distribuzione dei Tipi di Parto per Ospedale",
x = "Tipo di Parto",
y = "Frequenza",
fill = "Ospedale"
)
La distribuzione appare abbastanza bilanciata tra gli ospedali nel tipo di parto, ma eventuali differenze vanno verificate con un test statistico
valutazioni sul campione in esame rispetto alla popolazione
chisq_test <- chisq.test(tabella_parti)
chisq_test
##
## Pearson's Chi-squared test
##
## data: tabella_parti
## X-squared = 1.0972, df = 2, p-value = 0.5778
NON Si può rifiutare l’ipotesi nulla di ugualianza. il tipo di parto non è legato all’ospedale
t_test_peso <- t.test(dati$Peso, mu = 3300, alternative = "two.sided")
t_test_peso
##
## One Sample t-test
##
## data: dati$Peso
## t = -1.516, df = 2499, p-value = 0.1296
## alternative hypothesis: true mean is not equal to 3300
## 95 percent confidence interval:
## 3263.490 3304.672
## sample estimates:
## mean of x
## 3284.081
la media del campione non è significativamente diversa da quella della popolazione
t_test_lunghezza <- t.test(dati$Lunghezza, mu = 500, alternative = "two.sided")
t_test_lunghezza
##
## One Sample t-test
##
## data: dati$Lunghezza
## t = -10.084, df = 2499, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 500
## 95 percent confidence interval:
## 493.6598 495.7242
## sample estimates:
## mean of x
## 494.692
la media del campione è significativamente diversa da quella della popolazione per la lunghezza anche se quasi sempre entro circa 7mm poichè l’estremo inferiore è 493.6
#test condizionati dal Sesso
t_test_peso_sesso <- t.test(Peso ~ Sesso, data = dati)
t_test_peso_sesso
##
## Welch Two Sample t-test
##
## data: Peso by Sesso
## t = -12.106, df = 2490.7, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
## -287.1051 -207.0615
## sample estimates:
## mean in group F mean in group M
## 3161.132 3408.215
t_test_lunghezza_sesso <- t.test(Lunghezza ~ Sesso, data = dati)
t_test_lunghezza_sesso
##
## Welch Two Sample t-test
##
## data: Lunghezza by Sesso
## t = -9.582, df = 2459.3, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
## -11.929470 -7.876273
## sample estimates:
## mean in group F mean in group M
## 489.7643 499.6672
t_test_cranio_sesso <- t.test(Cranio ~ Sesso, data = dati)
t_test_cranio_sesso
##
## Welch Two Sample t-test
##
## data: Cranio by Sesso
## t = -7.4102, df = 2491.4, p-value = 1.718e-13
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
## -6.089912 -3.541270
## sample estimates:
## mean in group F mean in group M
## 337.6330 342.4486
Sono tutti significativi in quanto p < 0.01 indicando differenze tra i due generi per peso lunghezza e cranio, come previsto dalla letteratura a vantaggio del genere maschile come mostrato dagli output
shapiro.test(dati$Peso)
##
## Shapiro-Wilk normality test
##
## data: dati$Peso
## W = 0.97066, p-value < 2.2e-16
Poichè il p-value è inferiore a 0.05, rifiutiamo l’ipotesi nulla di normalità i dati relativi al Peso non seguono una distribuzione normale
Conversione in fattori
dati$Ospedale <- as.factor(dati$Ospedale)
dati$Tipo.parto <- as.factor(dati$Tipo.parto)
dati$Sesso <- as.factor(dati$Sesso)
str(dati)
## 'data.frame': 2500 obs. of 10 variables:
## $ Anni.madre : num 26 21 34 28 20 32 26 25 22 23 ...
## $ N.gravidanze: int 0 2 3 1 0 0 1 0 1 0 ...
## $ Fumatrici : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Gestazione : int 42 39 38 41 38 40 39 40 40 41 ...
## $ Peso : int 3380 3150 3640 3690 3700 3200 3100 3580 3670 3700 ...
## $ Lunghezza : int 490 490 500 515 480 495 480 510 500 510 ...
## $ Cranio : int 325 345 375 365 335 340 345 349 335 362 ...
## $ Tipo.parto : Factor w/ 2 levels "Ces","Nat": 2 2 2 2 2 2 2 2 1 1 ...
## $ Ospedale : Factor w/ 3 levels "osp1","osp2",..: 3 1 2 2 3 2 3 1 2 2 ...
## $ Sesso : Factor w/ 2 levels "F","M": 2 1 2 2 1 1 1 2 1 1 ...
Creazione del Modello di Regressione
Correlazioni
panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor, ...)
{
usr <- par("usr"); on.exit(par(usr))
par(usr = c(0, 1, 0, 1))
r <- (cor(x, y))
txt <- format(c(r, 1), digits = digits)[1]
txt <- paste0(prefix, txt)
if(missing(cex.cor)) cex.cor <- 0.8/strwidth(txt)
text(0.5, 0.5, txt, cex = 1.5)
}
pairs(dati,lower.panel=panel.cor, upper.panel=panel.smooth)
Tenendo presente lo scopo reale del modello di previsione farei delle considerazioni preliminari: sembra che con il peso incidano le variabili GESTAZIONE LUNGHEZZA, CRANIO, SESSO poichè i coefficienti corr sono rispettivamente r= 0.59 ; 0.8 ; 0.7 e 0.24.
Studi in letteratura indicano che il fumo può incidere negativamente sul peso, lunghezza e parto prematura a causa del minore apporto di ossigeno (fonte: salute.gov) inoltre è¨ noto in letteratura come una madre fumatrice possa innescare o favorire altre patologie al bambino. Per queste considerazioni anche se in questo specifico campione non risulta incisivo l’apporto del fumo si dovrebbero fare considerazioni sul modello. Ad esempio se inserire la variabile può dare maggiore generalizzabilità al modello
Oltre il campione specifico, altra motivazione della non incidenza del fumo potrebbe essere la modalità in cui questa variabile è stata raccolta ovvero che la variabile è stata caratterizzata solo in due livelli. Valutare i mesi o anni di fumo precedenti oppure la quanitità di sigarette medie potrebbe essere maggiormente utile per future ricerche per maggiore prevedibilità del peso Visto che lo scopo è utilizzare al meglio le TIV (terapie intensive) e le risorse umane terrei gli anni della madre in considerazione anche se non sembra esserci correlazione in questo campione
Inoltre, visivamente la relazione PESO - LUNGHEZZA E PESO-CRANIO sembrano lineari, la relazione PESO-GESTAZIONE appare curvilinea per questo si potrebbe provare a valutare tale relazione per una maggiore prevedibilità  (in letteratura è noto che nascere con molte settimane di anticipo compromette in modo maggiore rispetto a differenze più vicine al completamento della gestazione per cui suggerisce una relazione non lineare)
t.test(dati$Peso~dati$Sesso)
##
## Welch Two Sample t-test
##
## data: dati$Peso by dati$Sesso
## t = -12.106, df = 2490.7, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
## -287.1051 -207.0615
## sample estimates:
## mean in group F mean in group M
## 3161.132 3408.215
t.test(dati$Peso~dati$Tipo.parto)
##
## Welch Two Sample t-test
##
## data: dati$Peso by dati$Tipo.parto
## t = -0.12968, df = 1493, p-value = 0.8968
## alternative hypothesis: true difference in means between group Ces and group Nat is not equal to 0
## 95 percent confidence interval:
## -46.27992 40.54037
## sample estimates:
## mean in group Ces mean in group Nat
## 3282.047 3284.916
il genere come prevedibile incide sul peso di circa 150g mentre il tipo di parto no è significativo per cui può essere escluso dal successivo modello
Anova per valutare eventuali differenze tra tipo di parto e gli Ospedali
anova_result <- aov(Peso ~ Ospedale, data = dati)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## Ospedale 2 936237 468118 1.699 0.183
## Residuals 2497 687952305 275512
boxplot(Peso ~ Ospedale, data = dati, pch=20,
main = "Peso per Ospedale",
xlab = "Ospedale", ylab = "Peso",
col = "lightblue")
come si evince dal p value dell’anova 0.18 maggiore di 0.05 e dai boxplot non ci sono associazioni significative tra Peso e Ospedale
Modello di regressione lineare multipla inserendo solo inizialmente tutte le variabili
modello_peso <- lm(Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio +
Tipo.parto + Ospedale + Sesso, data = dati)
summary(modello_peso)
##
## Call:
## lm(formula = Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione +
## Lunghezza + Cranio + Tipo.parto + Ospedale + Sesso, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1123.3 -181.2 -14.6 160.7 2612.6
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6735.1400 141.3974 -47.633 < 2e-16 ***
## Anni.madre 0.7975 1.1463 0.696 0.4867
## N.gravidanze 11.4130 4.6665 2.446 0.0145 *
## Fumatrici -30.1567 27.5396 -1.095 0.2736
## Gestazione 32.5262 3.8179 8.519 < 2e-16 ***
## Lunghezza 10.2951 0.3007 34.237 < 2e-16 ***
## Cranio 10.4725 0.4261 24.580 < 2e-16 ***
## Tipo.partoNat 29.5025 12.0848 2.441 0.0147 *
## Ospedaleosp2 -11.2217 13.4388 -0.835 0.4038
## Ospedaleosp3 28.0985 13.4972 2.082 0.0375 *
## SessoM 77.5473 11.1779 6.938 5.07e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 273.9 on 2489 degrees of freedom
## Multiple R-squared: 0.7289, Adjusted R-squared: 0.7278
## F-statistic: 669.1 on 10 and 2489 DF, p-value: < 2.2e-16
appare come tutte le variabili tranne anni madre ed essere fumatrici o meno, sono significative
Selezione del modello
library(MASS)
## Warning: il pacchetto 'MASS' è stato creato con R versione 4.1.3
modello_aic <- stepAIC(modello_peso, direction = "both")
## Start: AIC=28075.39
## Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza +
## Cranio + Tipo.parto + Ospedale + Sesso
##
## Df Sum of Sq RSS AIC
## - Anni.madre 1 36321 186809099 28074
## - Fumatrici 1 89979 186862757 28075
## <none> 186772779 28075
## - Tipo.parto 1 447229 187220007 28079
## - N.gravidanze 1 448861 187221640 28079
## - Ospedale 2 686401 187459180 28081
## - Sesso 1 3611594 190384372 28121
## - Gestazione 1 5446472 192219251 28145
## - Cranio 1 45338176 232110954 28617
## - Lunghezza 1 87959836 274732615 29038
##
## Step: AIC=28073.88
## Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio +
## Tipo.parto + Ospedale + Sesso
##
## Df Sum of Sq RSS AIC
## - Fumatrici 1 90897 186899996 28073
## <none> 186809099 28074
## + Anni.madre 1 36321 186772779 28075
## - Tipo.parto 1 448222 187257321 28078
## - Ospedale 2 692738 187501837 28079
## - N.gravidanze 1 633756 187442855 28080
## - Sesso 1 3618736 190427835 28120
## - Gestazione 1 5412879 192221978 28143
## - Cranio 1 45588236 232397335 28618
## - Lunghezza 1 87950050 274759149 29036
##
## Step: AIC=28073.1
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Tipo.parto +
## Ospedale + Sesso
##
## Df Sum of Sq RSS AIC
## <none> 186899996 28073
## + Fumatrici 1 90897 186809099 28074
## + Anni.madre 1 37239 186862757 28075
## - Tipo.parto 1 440684 187340680 28077
## - Ospedale 2 701680 187601677 28079
## - N.gravidanze 1 610840 187510837 28079
## - Sesso 1 3602797 190502794 28119
## - Gestazione 1 5346781 192246777 28142
## - Cranio 1 45632149 232532146 28617
## - Lunghezza 1 88355030 275255027 29039
Calcolo in automatico il modello migliore partendo da quello completo
summary(modello_aic)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Tipo.parto + Ospedale + Sesso, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1113.18 -181.16 -16.58 161.01 2620.19
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6707.4293 135.9438 -49.340 < 2e-16 ***
## N.gravidanze 12.3619 4.3325 2.853 0.00436 **
## Gestazione 31.9909 3.7896 8.442 < 2e-16 ***
## Lunghezza 10.3086 0.3004 34.316 < 2e-16 ***
## Cranio 10.4922 0.4254 24.661 < 2e-16 ***
## Tipo.partoNat 29.2803 12.0817 2.424 0.01544 *
## Ospedaleosp2 -11.0227 13.4363 -0.820 0.41209
## Ospedaleosp3 28.6408 13.4886 2.123 0.03382 *
## SessoM 77.4412 11.1756 6.930 5.36e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 273.9 on 2491 degrees of freedom
## Multiple R-squared: 0.7287, Adjusted R-squared: 0.7278
## F-statistic: 836.3 on 8 and 2491 DF, p-value: < 2.2e-16
con il metodo AIC si ottiene il modello composto N.gravidanze Gestazione Lunghezza Cranio Tipo.partoNat Ospedale Sesso come variabili esplicative del peso R quadro aggiustato risualta 0.7265 Gli anni madre e fumatrici sono state elimiante dal modello migliore come ci aspettavamo dalle considerazioni sui p value
n <- nrow(dati)
modello_bic <- stepAIC(modello_peso, direction = "both", k = log(n))
## Start: AIC=28139.46
## Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza +
## Cranio + Tipo.parto + Ospedale + Sesso
##
## Df Sum of Sq RSS AIC
## - Anni.madre 1 36321 186809099 28132
## - Fumatrici 1 89979 186862757 28133
## - Ospedale 2 686401 187459180 28133
## - Tipo.parto 1 447229 187220007 28138
## - N.gravidanze 1 448861 187221640 28138
## <none> 186772779 28140
## - Sesso 1 3611594 190384372 28180
## - Gestazione 1 5446472 192219251 28204
## - Cranio 1 45338176 232110954 28675
## - Lunghezza 1 87959836 274732615 29096
##
## Step: AIC=28132.12
## Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio +
## Tipo.parto + Ospedale + Sesso
##
## Df Sum of Sq RSS AIC
## - Fumatrici 1 90897 186899996 28126
## - Ospedale 2 692738 187501837 28126
## - Tipo.parto 1 448222 187257321 28130
## <none> 186809099 28132
## - N.gravidanze 1 633756 187442855 28133
## + Anni.madre 1 36321 186772779 28140
## - Sesso 1 3618736 190427835 28172
## - Gestazione 1 5412879 192221978 28196
## - Cranio 1 45588236 232397335 28670
## - Lunghezza 1 87950050 274759149 29089
##
## Step: AIC=28125.51
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Tipo.parto +
## Ospedale + Sesso
##
## Df Sum of Sq RSS AIC
## - Ospedale 2 701680 187601677 28119
## - Tipo.parto 1 440684 187340680 28124
## <none> 186899996 28126
## - N.gravidanze 1 610840 187510837 28126
## + Fumatrici 1 90897 186809099 28132
## + Anni.madre 1 37239 186862757 28133
## - Sesso 1 3602797 190502794 28165
## - Gestazione 1 5346781 192246777 28188
## - Cranio 1 45632149 232532146 28664
## - Lunghezza 1 88355030 275255027 29086
##
## Step: AIC=28119.23
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Tipo.parto +
## Sesso
##
## Df Sum of Sq RSS AIC
## - Tipo.parto 1 463870 188065546 28118
## <none> 187601677 28119
## - N.gravidanze 1 651066 188252743 28120
## + Ospedale 2 701680 186899996 28126
## + Fumatrici 1 99840 187501837 28126
## + Anni.madre 1 43769 187557908 28127
## - Sesso 1 3649259 191250936 28160
## - Gestazione 1 5444109 193045786 28183
## - Cranio 1 45758101 233359778 28657
## - Lunghezza 1 88054432 275656108 29074
##
## Step: AIC=28117.58
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso
##
## Df Sum of Sq RSS AIC
## <none> 188065546 28118
## - N.gravidanze 1 623141 188688687 28118
## + Tipo.parto 1 463870 187601677 28119
## + Ospedale 2 724866 187340680 28124
## + Fumatrici 1 91892 187973654 28124
## + Anni.madre 1 44972 188020574 28125
## - Sesso 1 3655292 191720838 28158
## - Gestazione 1 5464853 193530399 28181
## - Cranio 1 46108583 234174130 28658
## - Lunghezza 1 87632762 275698308 29066
summary(modello_bic)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1149.44 -180.81 -15.58 163.64 2639.72
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6681.1445 135.7229 -49.226 < 2e-16 ***
## N.gravidanze 12.4750 4.3396 2.875 0.00408 **
## Gestazione 32.3321 3.7980 8.513 < 2e-16 ***
## Lunghezza 10.2486 0.3006 34.090 < 2e-16 ***
## Cranio 10.5402 0.4262 24.728 < 2e-16 ***
## SessoM 77.9927 11.2021 6.962 4.26e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.6 on 2494 degrees of freedom
## Multiple R-squared: 0.727, Adjusted R-squared: 0.7265
## F-statistic: 1328 on 5 and 2494 DF, p-value: < 2.2e-16
con il metodo BIC si ottiene il modello composto N.gravidanze Gestazione Lunghezza Cranio Sesso come variabili esplicative del peso R quadro aggiustato risualta 0.7265 (spiega il 72.65% della varianza) identico al metodo AIC anche come p value, dalle considerazioni fatte precedentemente questo metodo sembra dare il risultato più simile a ciò che ci si aspetta dalla letteratura , tranne per il fumo che è stato nuovamente eliminato. Forse come spiegato sopra per il campione o per il metodo dicotomico di valutarlo
Rispetto al modello preferito dal metodo AIC è stato eliminato anche l’ospedale. In effetti logicamente questa variabile non dovrebbe contribuire al peso. la significatività statistca trovata per l’ospedale 3 (p =0.034) può essere una seppur anomala, fluttiazione statistica. Nel contesto reale potrebbe accadere che alcuni ospedali siano preferiti ad altri nei casi in cui si rischia un parto anticipato e ciò può indirizzare la scelta senza significare che abbiano una incidenza sul peso
Riprendo tale modello indagando possibili interazioni
modello_interazioni <- lm(Peso ~ (Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio)^2, data = dati)
summary(modello_interazioni)
##
## Call:
## lm(formula = Peso ~ (Anni.madre + N.gravidanze + Fumatrici +
## Gestazione + Lunghezza + Cranio)^2, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1021.04 -177.20 -16.37 164.88 2317.73
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3034.43888 1417.96167 2.140 0.032452 *
## Anni.madre -56.29135 26.75357 -2.104 0.035473 *
## N.gravidanze -126.28224 95.68228 -1.320 0.187021
## Fumatrici 102.22367 916.32621 0.112 0.911183
## Gestazione -282.09085 66.66166 -4.232 2.40e-05 ***
## Lunghezza 19.03932 5.44024 3.500 0.000474 ***
## Cranio -20.69010 8.21599 -2.518 0.011856 *
## Anni.madre:N.gravidanze -0.17443 0.85893 -0.203 0.839092
## Anni.madre:Fumatrici 2.16084 5.75098 0.376 0.707147
## Anni.madre:Gestazione 2.75425 0.75999 3.624 0.000296 ***
## Anni.madre:Lunghezza -0.24395 0.06026 -4.048 5.32e-05 ***
## Anni.madre:Cranio 0.20844 0.08524 2.445 0.014543 *
## N.gravidanze:Fumatrici -9.63511 24.17947 -0.398 0.690309
## N.gravidanze:Gestazione -4.92195 2.99569 -1.643 0.100508
## N.gravidanze:Lunghezza 0.39762 0.24595 1.617 0.106075
## N.gravidanze:Cranio 0.41698 0.37188 1.121 0.262284
## Fumatrici:Gestazione -53.44547 22.36459 -2.390 0.016935 *
## Fumatrici:Lunghezza 5.72437 1.71406 3.340 0.000851 ***
## Fumatrici:Cranio -2.64128 2.41281 -1.095 0.273758
## Gestazione:Lunghezza 0.00801 0.11039 0.073 0.942158
## Gestazione:Cranio 0.73650 0.21549 3.418 0.000642 ***
## Lunghezza:Cranio -0.00661 0.01405 -0.471 0.637968
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 273.3 on 2478 degrees of freedom
## Multiple R-squared: 0.7314, Adjusted R-squared: 0.7291
## F-statistic: 321.3 on 21 and 2478 DF, p-value: < 2.2e-16
in combinazione con la letteratura, delle interazioni significative potremmo considerare Anni.madre:Gestazione (2.7) Anni.madre:Lunghezza (-0.24) Fumatrici:Gestazione (-53.45) Fumatrici:Lunghezza (5.7) Gestazione:Cranio (+0.74) però è possibile notare che seppur significativi i contributi sono di ordine del grammo o decimo di grammo tranne per Fumatrici:gestazione per cui trascurabili l’essere fumatrice modifica significativamente l’effetto della gestazione sul peso del bambino con -53.45 g p <0.05 quindi questa è forse l’unica interazione da considerare
Modello con trasformazioni non lineari per la gestazione come suggerito dal grafico precedente
modello_nonlineare <- lm(Peso ~ poly(Gestazione, 2) + Lunghezza + Anni.madre + Fumatrici, data = dati)
summary(modello_nonlineare)
##
## Call:
## lm(formula = Peso ~ poly(Gestazione, 2) + Lunghezza + Anni.madre +
## Fumatrici, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1177.9 -204.2 -19.3 194.5 3598.3
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3710.7084 155.3852 -23.881 < 2e-16 ***
## poly(Gestazione, 2)1 4388.5893 401.6457 10.927 < 2e-16 ***
## poly(Gestazione, 2)2 152.0372 317.2673 0.479 0.631832
## Lunghezza 13.8878 0.3072 45.204 < 2e-16 ***
## Anni.madre 4.4601 1.2022 3.710 0.000212 ***
## Fumatrici -26.4350 31.1363 -0.849 0.395958
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 310.2 on 2494 degrees of freedom
## Multiple R-squared: 0.6516, Adjusted R-squared: 0.6509
## F-statistic: 933 on 5 and 2494 DF, p-value: < 2.2e-16
Il termine quadratico dela Gestazione non è significativo e potrebbe essere rimosso per semplificare il modello.
Confronto tra modelli - modello_peso, modello_peso_ridotto, modello_peso_int
modello_peso_ridotto <- lm(Peso ~ N.gravidanze + Gestazione +Lunghezza + Cranio + Sesso, data = dati)
summary(modello_peso_ridotto)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1149.44 -180.81 -15.58 163.64 2639.72
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6681.1445 135.7229 -49.226 < 2e-16 ***
## N.gravidanze 12.4750 4.3396 2.875 0.00408 **
## Gestazione 32.3321 3.7980 8.513 < 2e-16 ***
## Lunghezza 10.2486 0.3006 34.090 < 2e-16 ***
## Cranio 10.5402 0.4262 24.728 < 2e-16 ***
## SessoM 77.9927 11.2021 6.962 4.26e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.6 on 2494 degrees of freedom
## Multiple R-squared: 0.727, Adjusted R-squared: 0.7265
## F-statistic: 1328 on 5 and 2494 DF, p-value: < 2.2e-16
modello_peso_int <- lm(Peso ~ N.gravidanze + Gestazione +Lunghezza + Cranio + Sesso + Fumatrici:Gestazione, data = dati)
summary(modello_peso_int)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso + Fumatrici:Gestazione, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1150.33 -181.33 -15.97 162.95 2636.22
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6682.3544 135.7187 -49.237 < 2e-16 ***
## N.gravidanze 12.7287 4.3450 2.929 0.00343 **
## Gestazione 32.6216 3.8062 8.571 < 2e-16 ***
## Lunghezza 10.2334 0.3009 34.008 < 2e-16 ***
## Cranio 10.5355 0.4262 24.717 < 2e-16 ***
## SessoM 78.1998 11.2029 6.980 3.76e-12 ***
## Gestazione:Fumatrici -0.8028 0.7024 -1.143 0.25316
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.6 on 2493 degrees of freedom
## Multiple R-squared: 0.7271, Adjusted R-squared: 0.7265
## F-statistic: 1107 on 6 and 2493 DF, p-value: < 2.2e-16
inserito nel modello ridotto Gestazione:Fumatrici risulta non significativo per cui eliminabile
AIC(modello_peso, modello_peso_ridotto, modello_peso_int)
## df AIC
## modello_peso 12 35172.09
## modello_peso_ridotto 7 35179.33
## modello_peso_int 8 35180.02
BIC(modello_peso, modello_peso_ridotto, modello_peso_int)
## df BIC
## modello_peso 12 35241.97
## modello_peso_ridotto 7 35220.10
## modello_peso_int 8 35226.61
il metodo BIC che predilige modelli piu semplici conferma che che il modello migliore è modello_peso_ridotto ci sarebbe da decidere se includere nel modello di previsione il fumo (e/o sue interazioni) o meno per dare maggiore generalizzabilità  anche se questi dati non suggeriscono che vada inserita tale variabile. Questa considerazione dovrebbe essere fatta con un confronto adeguato con esperti del settore per valutazioni cliniche. Per quanto mostrato nei dati non dovrebbe essere inserito
per cui il miglior modello appare quello che associa al Peso: N.gravidanze, Gestazione,Lunghezza ,Cranio,Sesso
scelto il modello valutiamo le altre info sui residui
analisi residui
par(mfrow=c(2,2))
plot(modello_peso_ridotto)
I grafici mostrano un buon adattamento tranne verso i valori più estremi. Viene visualizzata la distanza di cook e sembra indicare che il valore 1551 peggiori il modello lo stesso valore come è evidente dai residui e dalla distribuzione dei quartili appare anomalo
verifichiamo con i test
lmtest::bptest(modello_peso_ridotto)
##
## studentized Breusch-Pagan test
##
## data: modello_peso_ridotto
## BP = 90.253, df = 5, p-value < 2.2e-16
Poichè il p-value è < 0.01, rifiutiamo l’ipotesi nulla di omoschedasticitÃ
lmtest::dwtest(modello_peso_ridotto)
##
## Durbin-Watson test
##
## data: modello_peso_ridotto
## DW = 1.9535, p-value = 0.1224
## alternative hypothesis: true autocorrelation is greater than 0
I residui non presentano una correlazione significativa tra di loro e soddisfano l’assunzione di indipendenza. Non possiamo rifiutare l’ipotesi nulla di autocorrelazione dei residui
shapiro.test(modello_peso_ridotto$residuals)
##
## Shapiro-Wilk normality test
##
## data: modello_peso_ridotto$residuals
## W = 0.97408, p-value < 2.2e-16
rifiutiamo l’ipotesi nulla di normalità dei residui. I residui non seguono una distribuzione normale, il che potrebbe indicare che il modello lineare non è perfettamente appropriato (ed esempio effetti non lineari) o che nei dati vi siano outlier. plot(density(residuals(modello_peso_ridotto))) Ci aspettiamo che l’osservazione 1551 sia oltre la soglia dello 0.5 dell’indice di Cook
Verifica dell’indice di Cook, Leverage e Outlier
Leverage: quanto un’osservazione è distante dallo spazio medio delle variabili indipendenti. Un’osservazione con alta leverage può influenzare notevolmente i coefficienti del modello.
lev <- hatvalues(modello_peso_ridotto)
plot(lev)
p <- sum(lev)
n <- length(lev)
soglia <- 2 * p / n
abline(h = soglia, col = 2)
lev[lev > soglia]
## 13 15 34 67 89 96
## 0.005630918 0.007050422 0.006744143 0.005891590 0.012816470 0.005351586
## 101 106 131 134 151 155
## 0.007526751 0.014479871 0.007229339 0.007552819 0.010883937 0.007207682
## 161 189 190 204 205 206
## 0.020335483 0.004893297 0.005366557 0.014490604 0.005351634 0.009476652
## 220 294 305 310 312 315
## 0.007393997 0.005912765 0.005442061 0.028812123 0.013169272 0.005385800
## 378 440 442 445 486 492
## 0.015934061 0.005404736 0.007723662 0.007509382 0.005164446 0.008274018
## 497 516 582 587 592 614
## 0.005166306 0.013079851 0.011665555 0.008412325 0.006384116 0.005299262
## 638 656 657 684 697 702
## 0.006688287 0.005927777 0.005322685 0.008818987 0.005863826 0.005202259
## 729 748 750 757 765 805
## 0.005023115 0.008565543 0.006942097 0.008145491 0.006070298 0.014356657
## 828 893 895 913 928 946
## 0.007179817 0.005075205 0.005295896 0.005571144 0.022742332 0.006909044
## 947 956 985 1008 1014 1049
## 0.008409465 0.007784123 0.007039416 0.005343037 0.008470133 0.004956169
## 1067 1091 1106 1130 1166 1181
## 0.008465430 0.008933360 0.005967317 0.031728597 0.005513559 0.005677676
## 1188 1200 1219 1238 1248 1273
## 0.006477203 0.005492370 0.030694311 0.005908078 0.014622914 0.007085831
## 1291 1293 1311 1321 1325 1356
## 0.006117497 0.006073639 0.009625908 0.009293111 0.004857169 0.005303442
## 1357 1385 1395 1400 1402 1411
## 0.006965051 0.012636943 0.005126697 0.005925069 0.004811441 0.008048184
## 1420 1428 1429 1450 1505 1551
## 0.005155654 0.008192811 0.021757172 0.015104831 0.013330439 0.048769569
## 1553 1556 1573 1593 1606 1610
## 0.008504889 0.005919673 0.005047204 0.005623758 0.005001812 0.008722184
## 1617 1619 1628 1686 1693 1701
## 0.004866796 0.015067498 0.005069731 0.009349313 0.005077858 0.010842957
## 1712 1718 1727 1735 1780 1781
## 0.006992084 0.006958857 0.013300523 0.004884846 0.025538678 0.016832361
## 1809 1827 1868 1892 1962 1967
## 0.008707504 0.006065698 0.005205637 0.005332812 0.005540442 0.005337356
## 1977 2037 2040 2046 2086 2089
## 0.006927281 0.004889127 0.011494872 0.005471670 0.013193090 0.006293550
## 2098 2114 2115 2120 2140 2146
## 0.005094455 0.013316875 0.011772090 0.018659995 0.006244232 0.005802168
## 2148 2149 2157 2175 2200 2215
## 0.007926839 0.013583436 0.005907225 0.032527273 0.011670024 0.004892265
## 2216 2220 2221 2224 2225 2244
## 0.008117864 0.005414040 0.021628717 0.005838076 0.005591261 0.006929217
## 2257 2307 2317 2318 2337 2359
## 0.006170254 0.013965608 0.007673614 0.004831118 0.005230450 0.010067364
## 2408 2422 2436 2437 2452 2458
## 0.009696691 0.021532808 0.004986522 0.023943328 0.023838489 0.008506087
## 2471 2478
## 0.020903740 0.005775173
La soglia individua molti dati oltre; tuttavia, leverage alto non implica necessariamente che l’osservazione sia problematica.
Analisi degli outlier nei residui standardizzati
Gli outlier nei residui standardizzati mostrano osservazioni che deviano significativamente dal modello.
plot(rstudent(modello_peso_ridotto))
abline(h = c(-2, 2))
car::outlierTest(modello_peso_ridotto)
## rstudent unadjusted p-value Bonferroni p
## 1551 10.051908 2.4906e-23 6.2265e-20
## 155 5.027798 5.3138e-07 1.3285e-03
## 1306 4.827238 1.4681e-06 3.6702e-03
Valutazione della distanza di Cook Combina gli effetti di leverage e outlier per valutare se il dato è anomalo rispetto al modello.
cook <- cooks.distance(modello_peso_ridotto)
plot(cook, ylim = c(0, 1))
abline(h = 0.5, col = "red") # Solo un'osservazione è oltre 0.5.
osservazioni_influenti <- which(cook > 0.5)
print(osservazioni_influenti) # Mostra gli indici delle osservazioni influenti.
## 1551
## 1551
Rimozione dell’osservazione influente 1551 Verifica che il database abbia il numero corretto di dati dopo la modifica.
dati_modificati <- dati[-osservazioni_influenti, ]
nrow(dati) - nrow(dati_modificati)
## [1] 1
Creazione del nuovo modello con dati modificati (eliminando l’osservazione 1551) Valutazione delle prestazioni del modello aggiornato.
modello_peso_ridotto_mod <- lm(Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso, data = dati_modificati)
summary(modello_peso_ridotto_mod)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio +
## Sesso, data = dati_modificati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1165.74 -179.59 -12.74 162.89 1410.88
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6683.4142 133.0802 -50.221 < 2e-16 ***
## N.gravidanze 13.1652 4.2557 3.094 0.002 **
## Gestazione 29.5891 3.7340 7.924 3.43e-15 ***
## Lunghezza 10.8927 0.3017 36.109 < 2e-16 ***
## Cranio 9.9187 0.4225 23.476 < 2e-16 ***
## SessoM 78.1348 10.9840 7.114 1.47e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 269.3 on 2493 degrees of freedom
## Multiple R-squared: 0.7372, Adjusted R-squared: 0.7367
## F-statistic: 1399 on 5 and 2493 DF, p-value: < 2.2e-16
AIC(modello_peso_ridotto, modello_peso_ridotto_mod)
## Warning in AIC.default(modello_peso_ridotto, modello_peso_ridotto_mod): models
## are not all fitted to the same number of observations
## df AIC
## modello_peso_ridotto 7 35179.33
## modello_peso_ridotto_mod 7 35066.98
BIC(modello_peso_ridotto, modello_peso_ridotto_mod)
## Warning in BIC.default(modello_peso_ridotto, modello_peso_ridotto_mod): models
## are not all fitted to the same number of observations
## df BIC
## modello_peso_ridotto 7 35220.10
## modello_peso_ridotto_mod 7 35107.74
Ripetizione dei test diagnostici sul nuovo modello Verifica di omoschedasticità , autocorrelazione e normalità dei residui.
par(mfrow = c(2, 2))
plot(modello_peso_ridotto_mod)
lmtest::bptest(modello_peso_ridotto_mod)
##
## studentized Breusch-Pagan test
##
## data: modello_peso_ridotto_mod
## BP = 11.393, df = 5, p-value = 0.04411
lmtest::dwtest(modello_peso_ridotto_mod)
##
## Durbin-Watson test
##
## data: modello_peso_ridotto_mod
## DW = 1.954, p-value = 0.1251
## alternative hypothesis: true autocorrelation is greater than 0
shapiro.test(modello_peso_ridotto_mod$residuals)
##
## Shapiro-Wilk normality test
##
## data: modello_peso_ridotto_mod$residuals
## W = 0.98886, p-value = 4.764e-13
Breusch-Pagan Test: p-value=0.04411. Il p-value inferiore a 0.05 suggerisce eteroschedasticità , cioè una variabilità non costante dei residui. Questo viola l’assunzione di omoschedasticità del modello di regressione Anche se dopo l’eliminazione del valore outlier non possiamo rifiutare l’ipotesi nulla al 0.01, migliorando le carattetistiche del modello Durbin-Watson Test: Il p-value maggiore di 0.05 indica che non c’è evidenza significativa di autocorrelazione positiva tra i residui del modello. Shapiro-Wilk Test: Il p-value molto basso indica che i residui non seguono una distribuzione normale, un’altra violazione delle assunzioni classiche del modello.
Calcolo di R^2 e RMSE per il nuovo modello
pred <- predict(modello_peso_ridotto_mod, newdata = dati_modificati)
actual <- dati_modificati$Peso
R2 <- round(cor(pred, actual)^2, 3)
RMSE <- round(sqrt(mean((pred - actual)^2)), 2)
R2
## [1] 0.737
RMSE
## [1] 268.93
Il modello spiega il 73.7% della varianza dei dati. 1% in più rispetto al modello precedente (72.65%)
Previsione del peso per un nuovo neonato Peso previsto sulla base delle caratteristiche specificate.
nuovo_neonato <- data.frame(
N.gravidanze = 3,
Gestazione = 39,
Lunghezza = 500,
Cranio = 340,
Sesso = "F"
)
peso_previsto <- predict(modello_peso_ridotto_mod, newdata = nuovo_neonato)
Analisi dei coefficienti del modello Interpretazione dei coefficienti utili al modello di predizione.
coeff <- summary(modello_peso_ridotto_mod)$coefficients
round(coeff["N.gravidanze", ], 2)
## Estimate Std. Error t value Pr(>|t|)
## 13.17 4.26 3.09 0.00
round(coeff["Gestazione", ], 2)
## Estimate Std. Error t value Pr(>|t|)
## 29.59 3.73 7.92 0.00
round(coeff["Lunghezza", ], 2)
## Estimate Std. Error t value Pr(>|t|)
## 10.89 0.30 36.11 0.00
round(coeff["Cranio", ], 2)
## Estimate Std. Error t value Pr(>|t|)
## 9.92 0.42 23.48 0.00
round(coeff["SessoM", ], 2)
## Estimate Std. Error t value Pr(>|t|)
## 78.13 10.98 7.11 0.00
L’aumento unitario del numero di gravidanze tende ad aumentare di 13.17 grammi il peso del neonato L’aumento unitario delle settimane di gestazione tende ad aumentare di 29.59 grammi il peso del neonato L’aumento unitario della lunghezza del bambino tende ad aumentare di 10.89 grammi il peso del neonato L’aumento unitario della circonferenza del cranio del bambino tende ad aumentare di 9.92 grammi il peso del neonato Il sesso maschile del bambino tende ad aumentare di 78.13 grammi il peso del neonato
Visualizzazione: scatterplot con linea di regressione Relazione tra settimane di gestazione e peso neonatale.
ggplot(dati, aes(x = Gestazione, y = Peso, color = factor(Sesso))) +
geom_point(position = position_jitter(width = 0.2, height = 0)) +
geom_smooth(method = "lm", color = "blue") +
labs(
title = "Relazione tra Settimane di Gestazione e Peso Neonatale",
x = "Settimane di Gestazione",
y = "Peso Neonatale (g)",
color = "Sesso"
) +
theme_minimal()
## `geom_smooth()` using formula 'y ~ x'
Visualizzazione: grafico a violino per gli ospedali Distribuzione del peso neonatale nei tre ospedali.
ggplot(dati, aes(x = Ospedale, y = Peso, fill = Ospedale)) +
geom_violin(alpha = 0.7) +
labs(
title = "Distribuzione del Peso Neonatale nei Tre Ospedali",
x = "Ospedale",
y = "Peso Neonatale (g)"
) +
theme_minimal()
Si possono notare le similarità tra le frequenze e le distribuzioni del Peso dei bambini nei tre Ospedali
Visualizzazione: scatterplot per cranio e peso Relazione tra circonferenza cranio e peso.
ggplot(data = dati) +
geom_point(aes(x = Cranio, y = Peso, col = Sesso), position = "jitter") +
geom_smooth(aes(x = Cranio, y = Peso, col = Sesso), se = FALSE, method = "lm") +
labs(
title = "Relazione tra Circonferenza Cranio e Peso (g)",
x = "Circonferenza Cranio",
y = "Peso",
fill = "Peso (g)"
)
## `geom_smooth()` using formula 'y ~ x'
La circonferenza dei maschi appare mediamente sempre maggiore rispetto a quella delle femmine come indicato dalle rette.
Visualizzazione: scatterplot per lunghezza e peso Relazione tra lunghezza e peso.
ggplot(data = dati) +
geom_point(aes(x = Lunghezza, y = Peso, col = Sesso), position = "jitter") +
geom_smooth(aes(x = Lunghezza, y = Peso, col = Sesso), se = FALSE, method = "lm") +
labs(
title = "Relazione tra Lunghezza (cm) e Peso (g)",
x = "Lunghezza (cm)",
y = "Peso",
fill = "Peso (g)"
)
## `geom_smooth()` using formula 'y ~ x'
Notiamo che le due rette hanno un punto di intersezione e il genere femminile man mano che si avvicina il momento del parto tendono ad avere una lunghezza inferiore ai maschi.
Per concludere possiamo dire che il modello (modello_peso_ridotto) trovato con i predittori N.gravidanze, Gestazione Lunghezza, Cranio, Sesso possa considerarsi sufficientemente buono per predire il peso del neonato (R aggiustato = 0.736).