dati <- read.csv("~/Desktop/texas/neonati.csv", stringsAsFactors = T)
head(dati)
## 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
attach(dati)
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 Ospedale Sesso
## Min. : 830 Min. :310.0 Min. :235 Ces: 728 osp1:816 F:1256
## 1st Qu.:2990 1st Qu.:480.0 1st Qu.:330 Nat:1772 osp2:849 M:1244
## Median :3300 Median :500.0 Median :340 osp3:835
## Mean :3284 Mean :494.7 Mean :340
## 3rd Qu.:3620 3rd Qu.:510.0 3rd Qu.:350
## Max. :4930 Max. :565.0 Max. :390
Alcuni dati sembrano errati: in Anni.madre il valore minimo è 0, il che non ha senso, probabilmente si tratta di un errore di registrazione. In N.gravidanze ci sono casi con 12 gravidanze, insolito ma non impossibile. Per correggere i dati, sostituisco i casi in cui Anni.madre = 0 con la mediana.
dati$Anni.madre[dati$Anni.madre == 0] <- median(dati$Anni.madre[dati$Anni.madre > 0])
summary(dati)
## Anni.madre N.gravidanze Fumatrici Gestazione
## Min. : 1.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.18 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 Ospedale Sesso
## Min. : 830 Min. :310.0 Min. :235 Ces: 728 osp1:816 F:1256
## 1st Qu.:2990 1st Qu.:480.0 1st Qu.:330 Nat:1772 osp2:849 M:1244
## Median :3300 Median :500.0 Median :340 osp3:835
## Mean :3284 Mean :494.7 Mean :340
## 3rd Qu.:3620 3rd Qu.:510.0 3rd Qu.:350
## Max. :4930 Max. :565.0 Max. :390
Il valore minimo di Anni.madre ora è 1. Applico nuovamente la correzione.
dati$Anni.madre[dati$Anni.madre == 1] <- median(dati$Anni.madre[dati$Anni.madre > 1])
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 Ospedale Sesso
## Min. : 830 Min. :310.0 Min. :235 Ces: 728 osp1:816 F:1256
## 1st Qu.:2990 1st Qu.:480.0 1st Qu.:330 Nat:1772 osp2:849 M:1244
## Median :3300 Median :500.0 Median :340 osp3:835
## Mean :3284 Mean :494.7 Mean :340
## 3rd Qu.:3620 3rd Qu.:510.0 3rd Qu.:350
## Max. :4930 Max. :565.0 Max. :390
Ora i dati sembrano corretti.
Calcoliamo asimmetria e curtosi per vedere la distribuzione della variabile Peso.
skew <- moments::skewness(Peso)
kurt <- moments::kurtosis(Peso)-3
cat("L'asimmetria è di", round(skew, 3),".\n")
## L'asimmetria è di -0.647 .
cat("La curtosi è di", round(kurt, 3))
## La curtosi è di 2.032
plot(density(Peso))
Il valore di -0.647 suggerisce che la distribuzione del peso dei neonati è moderatamente asimmetrica a sinistra. Mentre il valore di 2.032 indica che la distribuzione è leptocurtica, ovvero ha una coda più lunga e appuntita rispetto a una distribuzione normale.
Analisi Preliminare
#controlliamo che la variabile risposta(Peso) sia normale
n <- nrow(dati)
shapiro.test(Peso)
##
## Shapiro-Wilk normality test
##
## data: Peso
## W = 0.97066, p-value < 2.2e-16
Si rifiuta l’ipotesi di normalità(p-value < 0.05)
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.2)
}
#correlazioni
pairs(dati,lower.panel=panel.cor, upper.panel=panel.smooth)
Le variabili più correlate con la variabile risposta sono Lunghezza, Cranio e Gestazione. Si nota, inoltre, una correlazione positiva tra Gestazione e Lunghezza e Cranio e Lunghezza.
par(mfrow=c(1,2))
boxplot(Peso~Fumatrici)
boxplot(Peso~Gestazione)
Si può notare che i valori medi di Peso tendono ad essere più bassi se la madre è fumatrice. Invece con l’aumentare delle settimane di Gestazione il Peso aumenta.
# 1. In alcuni ospedali si fanno più parti cesarei
table_parto <- table(Ospedale, Tipo.parto)
table_parto
## Tipo.parto
## Ospedale Ces Nat
## osp1 242 574
## osp2 254 595
## osp3 232 603
chisq.test(table_parto)
##
## Pearson's Chi-squared test
##
## data: table_parto
## X-squared = 1.0972, df = 2, p-value = 0.5778
Non si rifiuta l’ipotesi nulla(p-value > 0.05): il risultato non è statisticamente significativo, indicando che il tipo di parto non è associato all’ospedale.
# 2. La media del peso e della lunghezza di questo campione di neonati sono significativamente uguali a quelle della popolazione
# Peso e lunghezza media di un neonato
media_popolazione_peso <- 3300
media_popolazione_lunghezza <- 500
t.test(Peso, mu=media_popolazione_peso)
##
## One Sample t-test
##
## data: 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
t.test(Lunghezza, mu=media_popolazione_lunghezza)
##
## One Sample t-test
##
## data: 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
Il test t ha mostrato che la media del peso dei neonati nel campione non differisce significativamente dalla media della popolazione (p-value > 0.05), suggerendo che la media campionaria può essere considerata rappresentativa della popolazione. Invece, la media della lunghezza risulta significativamente inferiore rispetto a quella attesa nella popolazione (p-value < 0.05), quindi c’è una differenza statisticamente significativa tra la media campionaria e quella della popolazione.
# 3. Le misure antropometriche sono significativamente diverse tra i due sessi
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)
##
## 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)
##
## 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
In tutti e tre i test, il p-value è estremamente basso, ben al di sotto del valore di soglia di 0.05. Questo significa che la differenza tra i due sessi è statisticamente significativa, come si può osservare anche nel grafico sottostante.
boxplot(Peso~Sesso)
Creazione del Modello di Regressione
# modello con tutte le variabili
mod1 <- lm(Peso ~ ., data = dati)
summary(mod1)
##
## Call:
## lm(formula = Peso ~ ., 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.1677 141.3977 -47.633 < 2e-16 ***
## Anni.madre 0.7983 1.1463 0.696 0.4862
## N.gravidanze 11.4118 4.6665 2.445 0.0145 *
## Fumatrici -30.1567 27.5396 -1.095 0.2736
## Gestazione 32.5265 3.8179 8.520 < 2e-16 ***
## Lunghezza 10.2951 0.3007 34.237 < 2e-16 ***
## Cranio 10.4725 0.4261 24.580 < 2e-16 ***
## Tipo.partoNat 29.5027 12.0848 2.441 0.0147 *
## Ospedaleosp2 -11.2216 13.4388 -0.835 0.4038
## Ospedaleosp3 28.0984 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
Analisi dei coefficienti calcolati: L’età della madre non ha un effetto significativo sul peso (p-value > 0.05), quindi questa variabile non contribuisce significativamente al modello. Il numero di gravidanze ha un effetto positivo e significativo sul peso. Ogni gravidanza in più aumenta il peso di circa 11.41 grammi. Il fatto che la madre sia fumatrice non sembra avere un effetto significativo sul peso, poiché il p-value è maggiore di 0.05, tuttavia sarebbe opportuno considerare lo stesso questa variabile nel modello, dato che fumare durante la gravidanza può influenzare la salute del neonato. La durata della gestazione ha un effetto positivo e molto significativo sul peso. Ogni settimana aggiuntiva di gestazione comporta un aumento del peso di circa 32.53 grammi. La lunghezza ha un effetto altamente significativo sul peso. Ogni unità aggiuntiva di lunghezza comporta un aumento di circa 10.30 grammi. La dimensione del cranio ha anch’essa un effetto significativo sul peso, con un aumento di 10.47 grammi per ogni unità aggiuntiva di cranio. Il tipo di parto naturale ha un effetto positivo e significativo sul peso, con un aumento medio di 29.50 grammi rispetto al parto cesareo. Il tipo di ospedale non influenza significativamente il peso del neonato. Il sesso maschile ha un effetto significativo e positivo sul peso. I neonati maschi tendono ad avere un peso medio superiore di 77.55 grammi rispetto alle femmine. Questo effetto è altamente significativo, con un p-value estremamente basso.
L’R-quadro aggiustato pari a 0.7278 indica che il modello spiega abbastanza bene i dati, anche se ci sono alcune variabili non significative.
#Proviamo a togliere alcune variabili non significative
mod2 <- update(mod1, ~.-Anni.madre)
summary(mod2)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza +
## Cranio + Tipo.parto + Ospedale + Sesso, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1113.93 -180.11 -16.36 160.58 2616.96
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6708.1065 135.9394 -49.346 < 2e-16 ***
## N.gravidanze 12.6085 4.3381 2.906 0.00369 **
## Fumatrici -30.3092 27.5359 -1.101 0.27113
## Gestazione 32.2501 3.7968 8.494 < 2e-16 ***
## Lunghezza 10.2944 0.3007 34.239 < 2e-16 ***
## Cranio 10.4876 0.4255 24.651 < 2e-16 ***
## Tipo.partoNat 29.5351 12.0834 2.444 0.01458 *
## Ospedaleosp2 -11.0816 13.4359 -0.825 0.40957
## Ospedaleosp3 28.3660 13.4903 2.103 0.03559 *
## SessoM 77.6205 11.1763 6.945 4.81e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 273.9 on 2490 degrees of freedom
## Multiple R-squared: 0.7288, Adjusted R-squared: 0.7278
## F-statistic: 743.6 on 9 and 2490 DF, p-value: < 2.2e-16
La rimozione della variabile “Anni.madre” non ha influito significativamente sulla qualità del modello, poiché l’R-quadro e le statistiche globali sono rimasti pressoché invariati, e come si può osservare dai risultati dei seguenti test(Anova e BIC).
anova(mod2,mod1)
## Analysis of Variance Table
##
## Model 1: Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza + Cranio +
## Tipo.parto + Ospedale + Sesso
## Model 2: Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza +
## Cranio + Tipo.parto + Ospedale + Sesso
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2490 186809099
## 2 2489 186772707 1 36392 0.485 0.4862
Il p-value è maggiore di 0.05, il che indica che la rimozione della variabile “Anni.madre” non ha un impatto significativo sulla qualità del modello e non causa una perdita significativa di informazione per la previsione del peso.
BIC(mod2,mod1)
## df BIC
## mod2 11 35234.64
## mod1 12 35241.97
Il modello mod2 ha un BIC più basso rispetto al modello mod1. Un valore di BIC più basso indica che mod2 è preferibile in termini di equilibrio tra la bontà di adattamento e la complessità del modello.
car::vif(mod2)
## GVIF Df GVIF^(1/(2*Df))
## N.gravidanze 1.027985 1 1.013896
## Fumatrici 1.007346 1 1.003666
## Gestazione 1.676688 1 1.294870
## Lunghezza 2.085755 1 1.444214
## Cranio 1.626661 1 1.275406
## Tipo.parto 1.004240 1 1.002118
## Ospedale 1.003421 2 1.000854
## Sesso 1.040558 1 1.020077
Tutte le variabili hanno un valore minore di 5, questo indica che non c’è pericolo di multicollinearità.
# Procediamo con la rimozione di variabili non significative
mod3 <- update(mod2, ~.-Ospedale)
summary(mod3)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza +
## Cranio + Tipo.parto + Sesso, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1130.04 -181.29 -16.31 160.59 2635.32
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6708.074 135.984 -49.330 < 2e-16 ***
## N.gravidanze 13.012 4.342 2.997 0.00276 **
## Fumatrici -31.759 27.570 -1.152 0.24946
## Gestazione 32.541 3.801 8.561 < 2e-16 ***
## Lunghezza 10.272 0.301 34.129 < 2e-16 ***
## Cranio 10.501 0.426 24.648 < 2e-16 ***
## Tipo.partoNat 30.296 12.098 2.504 0.01234 *
## SessoM 78.114 11.191 6.980 3.77e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.3 on 2492 degrees of freedom
## Multiple R-squared: 0.7278, Adjusted R-squared: 0.7271
## F-statistic: 952 on 7 and 2492 DF, p-value: < 2.2e-16
mod4 <- update(mod3, ~.-Tipo.parto)
summary(mod4)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza +
## Cranio + Sesso, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1150.3 -181.3 -15.7 163.0 2636.3
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6681.6714 135.7178 -49.232 < 2e-16 ***
## N.gravidanze 12.7185 4.3450 2.927 0.00345 **
## Fumatrici -30.4634 27.5948 -1.104 0.26972
## Gestazione 32.5914 3.8051 8.565 < 2e-16 ***
## Lunghezza 10.2341 0.3009 34.011 < 2e-16 ***
## Cranio 10.5359 0.4262 24.718 < 2e-16 ***
## SessoM 78.1713 11.2028 6.978 3.83e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.6 on 2493 degrees of freedom
## Multiple R-squared: 0.7271, Adjusted R-squared: 0.7265
## F-statistic: 1107 on 6 and 2493 DF, p-value: < 2.2e-16
La rimozione delle variabili Ospedale e Tipo.Parto non causa una perdita significativa di informazione per la previsione del peso dei neonati.
mod5 <- update(mod4, ~.-Fumatrici)
summary(mod5)
##
## 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
Selezione del Modello Ottimale
BIC(mod5,mod4,mod3,mod2,mod1)
## df BIC
## mod5 7 35220.10
## mod4 8 35226.70
## mod3 9 35228.24
## mod2 11 35234.64
## mod1 12 35241.97
Sebbene il BIC è piu basso nel mod5, terrei in considerazione la variabile Fumatrici nel modello perchè, anche se non risulta significativa in questo campione di dati, potrebbe portare a dei risultati considerevoli.
Nei seguenti passaggi, proviamo a inserire l’effetto quadratico della variabile Gestazione, osservato anche dalla curvatura nel grafico delle correlazioni visto in precedenza.
plot(Gestazione, Peso)
mod_q <- lm(Peso ~ N.gravidanze + Fumatrici + Gestazione + I(Gestazione^2) +
Lunghezza + Cranio + Sesso, data = dati)
summary(mod_q)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Fumatrici + Gestazione + I(Gestazione^2) +
## Lunghezza + Cranio + Sesso, data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1145.00 -180.96 -13.12 165.00 2659.10
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4669.1027 898.3246 -5.198 2.18e-07 ***
## N.gravidanze 12.7990 4.3416 2.948 0.00323 **
## Fumatrici -29.2442 27.5772 -1.060 0.28904
## Gestazione -79.7741 49.7260 -1.604 0.10878
## I(Gestazione^2) 1.4999 0.6618 2.266 0.02352 *
## Lunghezza 10.3386 0.3042 33.989 < 2e-16 ***
## Cranio 10.6312 0.4280 24.841 < 2e-16 ***
## SessoM 75.9814 11.2351 6.763 1.68e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.4 on 2492 degrees of freedom
## Multiple R-squared: 0.7277, Adjusted R-squared: 0.7269
## F-statistic: 951.4 on 7 and 2492 DF, p-value: < 2.2e-16
L’effetto lineare della variabile Gestazione è diventato non significativo, mentre l’effetto quadratico risulta poco significativo. Non consideriamo queste variabili nel modello.
Proviamo ad inserire alcuni effetti di interazione tra le variabili.
mod_interazioni <- lm(Peso ~ N.gravidanze + Fumatrici + Gestazione +
Lunghezza + Cranio + Sesso + Gestazione * Fumatrici + Lunghezza * Sesso, data=dati)
summary(mod_interazioni)
##
## Call:
## lm(formula = Peso ~ N.gravidanze + Fumatrici + Gestazione + Lunghezza +
## Cranio + Sesso + Gestazione * Fumatrici + Lunghezza * Sesso,
## data = dati)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1162.40 -179.33 -16.22 163.06 2571.11
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6513.1362 163.9000 -39.738 < 2e-16 ***
## N.gravidanze 13.0268 4.3442 2.999 0.00274 **
## Fumatrici 742.3677 757.2148 0.980 0.32699
## Gestazione 33.4021 3.8385 8.702 < 2e-16 ***
## Lunghezza 9.8486 0.3532 27.885 < 2e-16 ***
## Cranio 10.5011 0.4262 24.637 < 2e-16 ***
## SessoM -358.1206 213.2511 -1.679 0.09321 .
## Fumatrici:Gestazione -19.7174 19.2745 -1.023 0.30642
## Lunghezza:SessoM 0.8818 0.4298 2.051 0.04032 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.4 on 2491 degrees of freedom
## Multiple R-squared: 0.7277, Adjusted R-squared: 0.7269
## F-statistic: 832.2 on 8 and 2491 DF, p-value: < 2.2e-16
Gli effetti tra variabili non sono significativi, anzi annullano anche un predittore importante per il peso, ossia la variabile Sesso.
Proseguiamo con la selezione automatica del modello tramite la procedura stepwise basata sul criterio di informazione di Akaike(AIC).
stepwise.mod <- MASS::stepAIC(mod1,
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 36392 186809099 28132
## - Fumatrici 1 89979 186862686 28133
## - Ospedale 2 686397 187459103 28133
## - Tipo.parto 1 447233 187219939 28138
## - N.gravidanze 1 448762 187221469 28138
## <none> 186772707 28140
## - Sesso 1 3611588 190384294 28180
## - Gestazione 1 5446558 192219264 28204
## - Cranio 1 45338051 232110758 28675
## - Lunghezza 1 87959790 274732497 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 36392 186772707 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 37311 186862686 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 43845 187557831 28126
## - Sesso 1 3649259 191250936 28160
## - Gestazione 1 5444109 193045786 28183
## - Cranio 1 45758101 233359778 28657
## - Lunghezza 1 88054432 275656108 29074
##
## Step: AIC=28117.58
## Peso ~ N.gravidanze + Gestazione + Lunghezza + Cranio + Sesso
##
## Df Sum of Sq RSS AIC
## <none> 188065546 28118
## - N.gravidanze 1 623141 188688687 28118
## + Tipo.parto 1 463870 187601677 28119
## + Ospedale 2 724866 187340680 28124
## + Fumatrici 1 91892 187973654 28124
## + Anni.madre 1 45044 188020502 28125
## - Sesso 1 3655292 191720838 28158
## - Gestazione 1 5464853 193530399 28181
## - Cranio 1 46108583 234174130 28658
## - Lunghezza 1 87632762 275698308 29066
summary(stepwise.mod)
##
## 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
Anche se dalla procedura stepwise il modello ottimale risulta essere il mod5, ritengo più opportuno scegliere il mod4 con la variabile Fumatrici, con un R^2=0.73 circa.
Analisi della Qualità del Modello
par(mfrow=c(2,2))
plot(mod4)
Nel grafico dei residui si può osservare un pattern leggermente ricurvo e le osservazioni sono concentrate nella parte destra del grafico, tranne l’osservazione 1551 che risulta più spostata. Nel secondo grafico i punti sono disposti correttamente sopra la retta, indicando una distribuzione normale dei residui, a parte per qualche osservazione nella coda superiore. Nel terzo grafico si nota, come nel primo, una leggera curvatura. Nel quarto grafico si visualizzano i potenziali valori influenti sulle stime di regressione: l’osservazione 1551 supera la soglia di avvertimento ed è molto vicina alla soglia di allarme.
#leverage
lev <- hatvalues(mod4)
plot(lev)
p = sum(lev)
soglia = 2*p/n
abline(h=soglia,col=2)
Si osservano parecchi punti con un valore di leverage maggiore della soglia: sono osservazioni che potrebbero avere un’influenza eccessiva sul modello ed essere degli outliers in termini di variabili indipendenti, anche se non necessariamente in termini di variabile dipendente.
#outliers
library(car)
plot(rstudent(mod4))
abline(h=c(-2,2),col=2)
outlierTest(mod4)
## rstudent unadjusted p-value Bonferroni p
## 1551 10.039719 2.8060e-23 7.0149e-20
## 155 5.022108 5.4723e-07 1.3681e-03
## 1306 4.823102 1.4986e-06 3.7465e-03
Sono presenti diverse osservazioni outliers sia sopra che sotto le soglie: ne spiccano 3 in particolare dopo aver fatto il test di Bonferroni applicato ai residui studentizzati(outlierTest).
#distanza di Cook
cook <- cooks.distance(mod4)
plot(cook)
Si può concludere che l’osservazione 1551 sembra particolaremente influente sulle stime di regressione.
dati[1551, ]
## Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio
## 1551 35 1 0 38 4370 315 374
## Tipo.parto Ospedale Sesso
## 1551 Nat osp3 F
library(lmtest)
bptest(mod4)
##
## studentized Breusch-Pagan test
##
## data: mod4
## BP = 89.798, df = 6, p-value < 2.2e-16
dwtest(mod4)
##
## Durbin-Watson test
##
## data: mod4
## DW = 1.9542, p-value = 0.126
## alternative hypothesis: true autocorrelation is greater than 0
shapiro.test(residuals(mod4))
##
## Shapiro-Wilk normality test
##
## data: residuals(mod4)
## W = 0.9741, p-value < 2.2e-16
plot(density(residuals(mod4)))
BP test: p-value < 0.05, rifiuto l’ipotesi nulla(varianza non costante). DW test:p-value > 0.05, i residui non sono autocorrelati. Shapiro test: p-value < 0.05: rifiuto l’ipotesi nulla, i residui non sono normali.
Peso di una neonata considerando una madre alla terza gravidanza che partorirà alla 39esima settimana.
media_lunghezzaF <- mean(Lunghezza[Sesso=="F"])
media_CranioF <- mean(Cranio[Sesso=="F"])
#madre non fumatrice
peso_predNF <- predict(mod4, data.frame(N.gravidanze=3, Gestazione=39,
Sesso="F",Lunghezza=media_lunghezzaF,
Cranio=media_CranioF, Fumatrici=0))
cat("Il peso previsto è di", round(peso_predNF, 3), "grammi.")
## Il peso previsto è di 3197.088 grammi.
# madre fumatrice
peso_predF <- predict(mod4, data.frame(N.gravidanze=3, Gestazione=39,
Sesso="F",Lunghezza=media_lunghezzaF,
Cranio=media_CranioF, Fumatrici=1))
cat("Il peso previsto è di", round(peso_predF, 3), "grammi.")
## Il peso previsto è di 3166.625 grammi.
Il peso della neonata risulta minore se la madre è fumatrice.
library(ggplot2)
ggplot(data=dati)+
geom_point(aes(x=Gestazione,
y=Peso,
col=Sesso),position = "jitter")+
geom_smooth(aes(x=Gestazione,
y=Peso,
col=Sesso),se=F,method = "lm")
Come si è osservato dallo studio del modello ottimale, e come si può osservare dal grafico sopra, il peso dei neonati maschi è più elevato rispetto a quello delle neonate. Entrambe le rette, però, hanno la stessa pendenza e il valore del peso aumenta all’aumentare delle settimane di gestazione. Le osservazioni si concentrano tra la 37esima e la 42esima settimana.
ggplot(data=dati) +
geom_point(aes(x=Gestazione,
y=Peso,
col=factor(Fumatrici)),position = "jitter")+
geom_smooth(aes(x=Gestazione,
y=Peso,
col=factor(Fumatrici)),se=F,method = "lm")+
labs(x = "Settimane di Gestazione",
y = "Peso",
color = "Fumatrici")
Il peso dei neonati tende a diminuire se le madri sono fumatrici: infatti la retta che le rappresenta tende a inclinarsi di pù rispetto a quella delle non-fumatrici.