En aquest tutorial revisarem els principals mètodes d’anàlisi de dades amb R. Per il·lustrar els procediments utilitzarem el conjunt de dades, “nadons.xlsx”, que podeu trobar aquí: https://malucalle.github.io/statistical-pills/nadons.xlsx
Abans de començar una anàlisi de dades cal plantejar-se si les dades estan ben estructurades:
Quins són els “individus” o “casos” de l’estudi?
Quina informació recollim de cada individu? variables
Una fila no pot contenir informació de més d’un individu
Les dades han de tenir una estructura quadrada:
Files = individus = casos
Columnes = variables
Especificar la carpeta de treball directament des de RStudio:
Session -> Set working directory -> choose directory
Importar les dades a R directament des de RStudio
File -> Import Dataset
-> From Excel... -> Browse (carregueu el fitxer "nadons.xlsx")
Comprovar que les variables numèriques s'importen com a numèriques o double
També es pot fer amb codi d’R amb la llibreria d’R readxl:
Instal·lar la llibreria. Només cal fer-ho una vegada. El nom ha d’anar entre cometes:
install.packages("readxl")
Activar la llibreria sempre que es comença una nova sessió d’R. El nom no cal que estigui entre cometes:
library(readxl)
Utilitzem la funció read_excel per carregar les dades:
nadons <- read_excel("nadons.xlsx")
Mirar la taula de dades que hem carregat:
Clicar sobre el nom de la taula a la finestra “Environment” i comprovar que les dades s’han carregat bé. També es pot fer amb codi d’R:
View(nadons)
Canviarem el nom de la taula a “data”:
data<-nadons
I ara eliminem (rm=remove) la taula “nadons”:
rm(nadons)
Mirar l’estructura de les dades i el tipus de cada variable:
str(data)
## tibble [200 x 11] (S3: tbl_df/tbl/data.frame)
## $ id : chr [1:200] "001" "002" "003" "004" ...
## $ nado_sexe : chr [1:200] "nen" "nena" "nen" "nena" ...
## $ nado_pes : num [1:200] 3.83 3.62 4.15 2.67 3.76 3.77 3.11 3.49 2.37 3.13 ...
## $ nado_baix_pes : num [1:200] 0 0 0 0 0 0 0 0 1 0 ...
## $ setmanes_gestacio: num [1:200] 40 38 41 39 39 40 40 37 40 39 ...
## $ prematur : chr [1:200] "no" "no" "no" "no" ...
## $ edat_mare : num [1:200] 1 2 2 2 2 1 2 1 2 2 ...
## $ nombre_visites : num [1:200] 2 4 2 2 3 3 3 4 10 1 ...
## $ mare_fumadora : chr [1:200] "no" "no" "no" "si" ...
## $ mare_pes_ini : num [1:200] 62 56 66 63 76 62 63 70 70 63 ...
## $ mare_pes_fi : num [1:200] 74 73 80 76 95 79 81 78 81 76 ...
Veiem que totes les variables s’han importat com a numèriques (num) o caràcter (chr)
summary(data)
## id nado_sexe nado_pes nado_baix_pes
## Length:200 Length:200 Min. :1.510 Min. :0.000
## Class :character Class :character 1st Qu.:2.748 1st Qu.:0.000
## Mode :character Mode :character Median :3.230 Median :0.000
## Mean :3.201 Mean :0.185
## 3rd Qu.:3.612 3rd Qu.:0.000
## Max. :5.250 Max. :1.000
## setmanes_gestacio prematur edat_mare nombre_visites
## Min. :22.00 Length:200 Min. :1.000 Min. : 0.00
## 1st Qu.:36.00 Class :character 1st Qu.:1.000 1st Qu.: 2.00
## Median :38.00 Mode :character Median :2.000 Median : 3.00
## Mean :37.37 Mean :1.825 Mean : 3.72
## 3rd Qu.:40.00 3rd Qu.:2.000 3rd Qu.: 4.00
## Max. :44.00 Max. :3.000 Max. :20.00
## mare_fumadora mare_pes_ini mare_pes_fi
## Length:200 Min. :50 Min. :63.00
## Class :character 1st Qu.:62 1st Qu.:75.00
## Mode :character Median :65 Median :79.00
## Mean :65 Mean :78.64
## 3rd Qu.:69 3rd Qu.:82.00
## Max. :77 Max. :95.00
Com es pot veure el resum de les dades categòriques no es adequat i cal preparar-les per l’anàlisi
Amb la funció factor()
preparem les dades categòriques per l’anàlisi:
Variables caràcter (chr):
data$prematur<-factor(data$prematur)
data$nado_sexe<-factor(data$nado_sexe)
data$mare_fumadora<-factor(data$mare_fumadora)
Variables numèriques (num) que en realitat són categòriques:
Cal especificar què representa cada valor:
data$edat_mare<-factor(data$edat_mare, levels = c(1,2,3), labels = c("<=30", "30-40", ">40"))
data$nado_baix_pes<-factor(data$nado_baix_pes, levels = c(0,1), labels = c("no", "si"))
Tornem a fer un resum numèric conjunt de totes les variables:
summary(data)
## id nado_sexe nado_pes nado_baix_pes setmanes_gestacio
## Length:200 nen : 94 Min. :1.510 no:163 Min. :22.00
## Class :character nena:106 1st Qu.:2.748 si: 37 1st Qu.:36.00
## Mode :character Median :3.230 Median :38.00
## Mean :3.201 Mean :37.37
## 3rd Qu.:3.612 3rd Qu.:40.00
## Max. :5.250 Max. :44.00
## prematur edat_mare nombre_visites mare_fumadora mare_pes_ini
## no:141 <=30 : 65 Min. : 0.00 no:160 Min. :50
## si: 59 30-40:105 1st Qu.: 2.00 si: 40 1st Qu.:62
## >40 : 30 Median : 3.00 Median :65
## Mean : 3.72 Mean :65
## 3rd Qu.: 4.00 3rd Qu.:69
## Max. :20.00 Max. :77
## mare_pes_fi
## Min. :63.00
## 1st Qu.:75.00
## Median :79.00
## Mean :78.64
## 3rd Qu.:82.00
## Max. :95.00
Utilitzarem la llibreria ggpubr que permet fer gràfics més interessants que els que es poden fer amb les funcions bàsiques d’R.
Podeu veure exemples dels gràfics més importants en aquest tutorial: https://malucalle.github.io/statistical-pills/nice-plots-with-r.html
#install.packages("ggpubr")
library(ggpubr) # activar la llibreria. S'ha de fer cada cop que s'engega R
Exemple: Setmanes de gestació:
gghistogram(data, x="setmanes_gestacio",
bins = 20,
color="aquamarine2", fill="aquamarine2")
Podeu representar totes les variables numèriques de cop:
p<-gghistogram(data,
x=c("setmanes_gestacio","nombre_visites","nado_pes","mare_pes_ini","mare_pes_fi"), bins = 20,
color = "coral1", fill = "coral1")
p
## $setmanes_gestacio
##
## $nombre_visites
##
## $nado_pes
##
## $mare_pes_ini
##
## $mare_pes_fi
Exemple: Setmanes de gestació:
p<-ggboxplot(data, y="setmanes_gestacio", color = "blue")
p
Exemple: Edat de la mare:
Per poder representar les variables categòriques primer hem de fer la taula de freqüències:
table(data$edat_mare)
##
## <=30 30-40 >40
## 65 105 30
i la taula de freqüències relatives:
prop.table(table(data$edat_mare))
##
## <=30 30-40 >40
## 0.325 0.525 0.150
Gràfic de barres de la taula de freqüències:
barplot(table(data$edat_mare))
Gràfic de barres de les freqüències relatives
barplot(prop.table(table(data$edat_mare)),
col=c("aquamarine2", "coral1","darkturquoise"))
Mirar si alguna de les variables són comptatges (recomptes) perquè requeriran una atenció especial.
Les variables comptatges es poden analitzar com si fossin numèriques o com categòriques i mirar quin dels dos anàlisis ens aporta més informació sobre la variable:
La variable “nombre_visites” és un recompte. La podem analitzar segons una variable numèrica:
summary(data$nombre_visites)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 2.00 3.00 3.72 4.00 20.00
gghistogram(data, x="nombre_visites",
bins = 20,
color = "coral1", fill = "coral1")
o com si fos categòrica:
table(data$nombre_visites)
##
## 0 1 2 3 4 5 8 9 10 11 15 16 17 20
## 4 14 36 52 70 10 1 2 4 2 1 2 1 1
prop.table(table(data$nombre_visites))
##
## 0 1 2 3 4 5 8 9 10 11 15 16 17
## 0.020 0.070 0.180 0.260 0.350 0.050 0.005 0.010 0.020 0.010 0.005 0.010 0.005
## 20
## 0.005
barplot(table(data$nombre_visites))
i també la agrupar en noves categories:
Podem subdividir el nombre de visites en 2 categories: “<= 4” i “superiors a 4”
data$visites_cat2<-cut(data$nombre_visites, c(0,4,20))
table(data$visites_cat2)
##
## (0,4] (4,20]
## 172 24
prop.table(table(data$visites_cat2))
##
## (0,4] (4,20]
## 0.877551 0.122449
barplot(table(data$visites_cat2),
col=c("aquamarine2", "coral1"))
També podem subdividir el nombre de visites en 3 categories: “<=2”, “>2 i <=4” i “>4”:
data$visites_cat3<-cut(data$nombre_visites, c(0,2,4,20))
table(data$visites_cat3)
##
## (0,2] (2,4] (4,20]
## 50 122 24
prop.table(table(data$visites_cat3))
##
## (0,2] (2,4] (4,20]
## 0.255102 0.622449 0.122449
barplot(table(data$visites_cat3),
col=c("aquamarine2", "coral1","darkturquoise"))
Resum dels resultats obtinguts fins al moment:
És molt important tenir una bona descripció inicial de les dades que analitzarem. És recomanable fer un informe d’aquesta descripció inicial, tot i que aquesta part segurament no caldrà incloure-la a l’informe final (es pot afegir com a annex).
En aquesta fase es poden detectar possibles valors anòmals i decidir què fer amb ells. En general, eliminar valors no és una opció acceptable, llevat que es tracti de valors extremadament diferents de la majoria i que distorsionen molt els resultats. Si es decideix eliminar algun valor cal fer-ho de manera transparent i, en tot cas, informar d’aquest fet.
Concretar i prioritzar els objectius:
Definir l’objectiu principal de l’estudi
Identificar la variable principal de l’estudi (outcome)
Definir objectius que involucrin dues variables i mirar de quin tipus són:
Quin és l’efecte de l’edat de la mare sobre el pes del nadó?
"edat_mare" (categòrica) i "nado_pes" (numèrica)
"edat_mare" (categòrica) i "nado_baix_pes" (categòrica)
Hi ha relació entre el fet que la mare fumi i el pes del nadó?
"mare_fumadora" (categòrica) i "nado_pes" (numèrica)
"mare_fumadora" (categòrica) i "nado_baix_pes" (categòrica)
Quin és l’efecte del nombre de setmanes de gestació sobre el pes del nadó?
"setmanes_gestacio" (numèrica) i "nado_pes" (numèrica)
"setmanes_gestacio" (numèrica) i "nado_baix_pes" (categòrica)
Definir objectius que involucrin més de dues variables.
Quin és l’efecte de l’edat de la mare sobre el pes del nadó en funció de si fuma o no fuma?
"edat_mare" (categòrica), "mare_fumadora" (categòrica) i "nado_pes" (numèrica)
"edat_mare" (categòrica), "mare_fumadora" (categòrica) i "nado_baix_pes" (categòrica)
Exemple: Analitzar la possible relació entre el nombre de setmanes de gestació i el pes dels nadons
“setmanes_gestacio” (numèrica) i “nado_pes” (numèrica)
Fem un diagrama de punts (scatter plot):
ggscatter(data, x = "setmanes_gestacio", y = "nado_pes",
add = "reg.line", # regression line
conf.int = TRUE, # confidence interval
add.params = list(color = "coral1", fill = "bisque") # color
)+
stat_cor(method = "pearson") # correlation coefficient
Exemple: Analitzar la possible relació entre el nombre de setmanes de gestació i que el nadó tingui baix pes o no
“setmanes_gestacio” (numèrica) i “nado_baix_pes” (categòrica)
Fem l’histograma posant la variable numèrica a la “x” i la categòrica a “color”:
gghistogram(data,
x="setmanes_gestacio",
color="nado_baix_pes",
add = "mean",
bins = 20)
Exemple: Analitzar la possible relació entre el nombre de setmanes de gestació i que el nadó tingui baix pes o no
“setmanes_gestacio” (numèrica) i “nado_baix_pes” (categòrica)
Fem el gràfic de caixes múltiple posant la variable numèrica a la “y” i la categòrica a la “x”:
boxp<-ggboxplot(data,
y="setmanes_gestacio",
x="nado_baix_pes",
color = "nado_baix_pes",
)
boxp
Exemple: Analitzar la possible relació entre el nombre de setmanes de gestació i que el nadó tingui baix pes o no
“setmanes_gestacio” (numèrica) i “nado_baix_pes” (categòrica)
El resum numèric es pot fer de dues maneres, amb la funció tapply()
:
tapply(data$setmanes_gestacio, data$nado_baix_pes, summary)
## $no
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 22.0 37.0 39.0 38.3 40.0 44.0
##
## $si
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 30.00 31.00 33.00 33.24 34.00 40.00
o amb la funció desc_statby()
de la llibreria ggpubr:
desc_statby(data,"setmanes_gestacio", "nado_baix_pes") # amb la funció desc_statby de ggpubr
## nado_baix_pes length min max median mean iqr mad sd se
## 1 no 163 22 44 39 38.30061 3 1.4826 3.233954 0.2533028
## 2 si 37 30 40 33 33.24324 3 2.9652 2.361796 0.3882768
## ci range cv var
## 1 0.5002010 22 0.08443608 10.458456
## 2 0.7874618 10 0.07104588 5.578078
Si les dades en cada categoria són normals (p-valor shapiro test >= alpha) apliquem:
t.test (2 categories)
anova (> 2 categories)
Si les dades en cada categoria no són normals (p-valor shapiro test < alpha) apliquem:
wilcoxon test (2 categories)
Kruskal-wallis (> 2 categories)
Exemple1: Analitzar la possible relació entre el nombre de setmanes de gestació i que el nadó tingui baix pes o no
“setmanes_gestacio” (numèrica) i “nado_baix_pes” (categòrica)
Apliquem el test de normalitat:
tapply(data$setmanes_gestacio, data$nado_baix_pes, function(x) shapiro.test(x))
## $no
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.8354, p-value = 2.893e-12
##
##
## $si
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.92247, p-value = 0.01319
Com que les dades no segueixen una distribució normal apliquem el test de Wilcoxon d’igualtat de dues mitjanes:
wilcox.test(data$setmanes_gestacio~data$nado_baix_pes)
##
## Wilcoxon rank sum test with continuity correction
##
## data: data$setmanes_gestacio by data$nado_baix_pes
## W = 5457.5, p-value = 1.066e-14
## alternative hypothesis: true location shift is not equal to 0
Exemple2: Analitzar la possible relació entre el pes inicial de la mare i que el nadó tingui baix pes o no
“mare_pes_ini” (numèrica) i “nado_baix_pes” (categòrica):
Apliquem el test de normalitat:
tapply(data$mare_pes_ini, data$nado_baix_pes, function(x) shapiro.test(x))
## $no
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.98949, p-value = 0.2677
##
##
## $si
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.97341, p-value = 0.5082
Com que les dades són normals, podrem aplicar el t-test per comparar les mitjanes. Però prèviament necessitem verificar si les variàncies són iguals o no:
var.test(data$mare_pes_ini~data$nado_baix_pes)
##
## F test to compare two variances
##
## data: data$mare_pes_ini by data$nado_baix_pes
## F = 1.6908, num df = 162, denom df = 36, p-value = 0.06545
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 0.9658489 2.7172032
## sample estimates:
## ratio of variances
## 1.690776
Apliquem el t-test amb variàncies iguals:
t.test(data$mare_pes_ini~data$nado_baix_pes, var.equal=T)
##
## Two Sample t-test
##
## data: data$mare_pes_ini by data$nado_baix_pes
## t = -1.5509, df = 198, p-value = 0.1225
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -3.1777358 0.3798582
## sample estimates:
## mean in group no mean in group si
## 64.73620 66.13514
Exemple 3: Analitzar la possible relació entre l’edat de la mare i el pes del nadó
“edat_mare” (categòrica) i “nado_pes” (numèrica)
Comprovem si les dades són normals:
tapply(data$nado_pes, data$edat_mare, function(x) shapiro.test(x))
## $`<=30`
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.96744, p-value = 0.08446
##
##
## $`30-40`
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.9862, p-value = 0.3518
##
##
## $`>40`
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.95714, p-value = 0.2614
Abans d’aplicar l’ANOVA cal comprovar si les variàncies dels diferents grups es poden considerar iguals:
#install.packages("lmtest")
library(lmtest)
bptest(lm(data$nado_pes ~data$edat_mare),studentize = FALSE)
##
## Breusch-Pagan test
##
## data: lm(data$nado_pes ~ data$edat_mare)
## BP = 0.90261, df = 2, p-value = 0.6368
Podem aplicar l’ANOVA per comparar les mitjanes de pes dels 3 grups d’edat:
summary(aov(data$nado_pes~data$edat_mare))
## Df Sum Sq Mean Sq F value Pr(>F)
## data$edat_mare 2 0.17 0.0848 0.188 0.828
## Residuals 197 88.67 0.4501
La conclusió és que no hi ha diferències. Si n’hi haguéssin aplicaríem un test per determinar quins grups tenen mitjanes diferents:
TukeyHSD(aov(data$nado_pes~data$edat_mare))
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = data$nado_pes ~ data$edat_mare)
##
## $`data$edat_mare`
## diff lwr upr p adj
## 30-40-<=30 0.006241758 -0.2438059 0.2562894 0.9980859
## >40-<=30 0.085051282 -0.2646475 0.4347501 0.8339475
## >40-30-40 0.078809524 -0.2491809 0.4068000 0.8375801
Exemple 4: Analitzar la possible relació entre l’edat de la mare i el nombre de setmanes de gestació
“edat_mare” (categòrica) i “setmanes_gestacio” (numèrica)
Comprovem si les dades són normals:
tapply(data$setmanes_gestacio, data$edat_mare, function(x) shapiro.test(x))
## $`<=30`
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.89778, p-value = 5.835e-05
##
##
## $`30-40`
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.92059, p-value = 9.623e-06
##
##
## $`>40`
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.90979, p-value = 0.0147
Com que no es verifica la condició de normalitat apliquem el test de Kruskal-Wallis per comparar les mitjanes dels 3 grups:
kruskal.test(data$setmanes_gestacio~data$edat_mare)
##
## Kruskal-Wallis rank sum test
##
## data: data$setmanes_gestacio by data$edat_mare
## Kruskal-Wallis chi-squared = 0.97933, df = 2, p-value = 0.6128
Exemple: Analitzar la possible relació entre el fet que la mare fumi i que el nadó tingui baix pes o no
“mare_fumadora” (categòrica) i “nado_baix_pes” (categòrica)
Comencem fent la taula de freqüències i la taula de freqüències relatives per files:
freq<-table(data$mare_fumadora, data$nado_baix_pes)
freqbyrow<-prop.table(table(data$mare_fumadora, data$nado_baix_pes),1)
Convertim la taula de freqüències per files en un data frame i posem bé el nom de les variables:
freqbyrow<-as.data.frame(freqbyrow) # transform the table into a data frame
freqbyrow
## Var1 Var2 Freq
## 1 no no 0.89375
## 2 si no 0.50000
## 3 no si 0.10625
## 4 si si 0.50000
colnames(freqbyrow)<-c("mare_fumadora","nado_baix_pes","Freq")
freqbyrow
## mare_fumadora nado_baix_pes Freq
## 1 no no 0.89375
## 2 si no 0.50000
## 3 no si 0.10625
## 4 si si 0.50000
Fem el gràfic de barres de la taula de freqüències per files:
ggbarplot(freqbyrow, x="mare_fumadora", y="Freq", # x = variable files de la taula
color = "nado_baix_pes",
label = TRUE,
lab.nb.digits = 2) # nombre de dígits de les proporcions
Apliquem la prova xi-quadrat d’independència entre dos factors:
chisq.test(freq)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: freq
## X-squared = 30.345, df = 1, p-value = 3.616e-08
Quan la taula de freqüències és 2x2 podem aplicar el test de Fisher:
fisher.test(freq)
##
## Fisher's Exact Test for Count Data
##
## data: freq
## p-value = 1.864e-07
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 3.49944 20.11074
## sample estimates:
## odds ratio
## 8.280577
De vegades pot ser interessant mesurar el grau d’associació entre dos variables categòriques. Una possible mesura d’associació és la V de Cramer:
library(rcompanion)
cramerV(data$mare_fumadora, data$nado_baix_pes, bias.correct = T)
## Cramer V
## 0.4004
Els models de regressió són útils per estudiar la relació d’una o més variables sobre una variable d’interès (variable resposta).
El model de regressió lineal s’utilitza quan la variable resposta és numèrica (contínua):
Exemple: Quin és l’efecte de l’edat i el pes inicial de la mare sobre el pes del nadó en funció de si fuma o no fuma?
y = “nado_pes” (numèrica)
x1 = “edat_mare” (categòrica), x2 = “mare_fumadora” (categòrica), x3 = “mare_pes_ini”
model1<-lm(nado_pes~mare_fumadora+edat_mare+mare_pes_ini, data = data)
summary(model1)
##
## Call:
## lm(formula = nado_pes ~ mare_fumadora + edat_mare + mare_pes_ini,
## data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.75729 -0.41119 -0.03987 0.42235 1.91645
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.783093 0.587203 6.443 8.98e-10 ***
## mare_fumadorasi -0.587786 0.111838 -5.256 3.85e-07 ***
## edat_mare30-40 -0.007793 0.100558 -0.078 0.938
## edat_mare>40 0.118196 0.139082 0.850 0.396
## mare_pes_ini -0.007362 0.009093 -0.810 0.419
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6294 on 195 degrees of freedom
## Multiple R-squared: 0.1304, Adjusted R-squared: 0.1126
## F-statistic: 7.313 on 4 and 195 DF, p-value: 1.655e-05
Cal comprovar que es compleixen els requisits de la regressió lineal:
shapiro.test(residuals(model1))
##
## Shapiro-Wilk normality test
##
## data: residuals(model1)
## W = 0.99039, p-value = 0.2037
plot(residuals(model1))
abline(a=0, b=0)
El model de regressió logística s’utilitza quan la variable resposta és binària (categòrica, amb dues categories):
Exemple: Quin és l’efecte de l’edat de la mare en el risc que el nen tingui baix pes en funció de si la mare fuma o no fuma?
y = “nado_baix_pes” (binària)
x1=“edat_mare” (categòrica), x2=“mare_fumadora” (categòrica)
model2<-glm(nado_baix_pes~mare_fumadora+edat_mare, data = data, family = "binomial")
summary(model2)
##
## Call:
## glm(formula = nado_baix_pes ~ mare_fumadora + edat_mare, family = "binomial",
## data = data)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.2062 -0.4861 -0.4614 -0.4540 2.1558
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.18641 0.39274 -5.567 2.59e-08 ***
## mare_fumadorasi 2.14358 0.41060 5.221 1.78e-07 ***
## edat_mare30-40 0.11039 0.44787 0.246 0.805
## edat_mare>40 -0.03424 0.61464 -0.056 0.956
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 191.56 on 199 degrees of freedom
## Residual deviance: 163.71 on 196 degrees of freedom
## AIC: 171.71
##
## Number of Fisher Scoring iterations: 4
La selecció de variables s’utilitza per identificar quines variables estan més relacionades amb la variable d’interès.
Exemple: Quines variables estan relacionades amb el pes del nadó?
L’objectiu és identificar quines variables estan realment relacionades amb el pes del nadó i quines es poden eliminar del model. Afegirem en l’anàlisi l’augment de pes de la mare durant l’embaràç:
data$augment_pes<-data$mare_pes_fi-data$mare_pes_ini
model3<-lm(nado_pes~., data = data[, c(2,3,7,8,9,14)])
summary(model3)
##
## Call:
## lm(formula = nado_pes ~ ., data = data[, c(2, 3, 7, 8, 9, 14)])
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.68535 -0.39363 -0.04404 0.37876 2.00964
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.437544 0.202720 12.024 < 2e-16 ***
## nado_sexenena -0.174646 0.084276 -2.072 0.0396 *
## edat_mare30-40 0.049287 0.093836 0.525 0.6000
## edat_mare>40 0.106804 0.129932 0.822 0.4121
## nombre_visites 0.007366 0.015220 0.484 0.6289
## mare_fumadorasi -0.508147 0.105874 -4.800 3.18e-06 ***
## augment_pes 0.065103 0.012075 5.391 2.03e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.5877 on 193 degrees of freedom
## Multiple R-squared: 0.2497, Adjusted R-squared: 0.2264
## F-statistic: 10.71 on 6 and 193 DF, p-value: 2.889e-10
Apliquem el mètode de selecció de variables (step-wise regression):
step(model3)
## Start: AIC=-205.77
## nado_pes ~ nado_sexe + edat_mare + nombre_visites + mare_fumadora +
## augment_pes
##
## Df Sum of Sq RSS AIC
## - edat_mare 2 0.2457 66.896 -209.03
## - nombre_visites 1 0.0809 66.731 -207.53
## <none> 66.651 -205.77
## - nado_sexe 1 1.4830 68.134 -203.37
## - mare_fumadora 1 7.9551 74.606 -185.22
## - augment_pes 1 10.0384 76.689 -179.71
##
## Step: AIC=-209.03
## nado_pes ~ nado_sexe + nombre_visites + mare_fumadora + augment_pes
##
## Df Sum of Sq RSS AIC
## - nombre_visites 1 0.0866 66.983 -210.78
## <none> 66.896 -209.03
## - nado_sexe 1 1.5094 68.406 -206.57
## - mare_fumadora 1 7.9952 74.891 -188.46
## - augment_pes 1 10.1911 77.087 -182.68
##
## Step: AIC=-210.78
## nado_pes ~ nado_sexe + mare_fumadora + augment_pes
##
## Df Sum of Sq RSS AIC
## <none> 66.983 -210.78
## - nado_sexe 1 1.4496 68.432 -208.49
## - mare_fumadora 1 7.9650 74.948 -190.31
## - augment_pes 1 10.1165 77.099 -184.65
##
## Call:
## lm(formula = nado_pes ~ nado_sexe + mare_fumadora + augment_pes,
## data = data[, c(2, 3, 7, 8, 9, 14)])
##
## Coefficients:
## (Intercept) nado_sexenena mare_fumadorasi augment_pes
## 2.51355 -0.17157 -0.50559 0.06445
Veiem que el procediment de selecció de variables ha seleccionat el sexe del nadó, si la mare fuma i l’augment de pes de la mare com a variables rellevants en relació al pes del nadó. Fem un resum d’aquest model:
summary(step(model3))
## Start: AIC=-205.77
## nado_pes ~ nado_sexe + edat_mare + nombre_visites + mare_fumadora +
## augment_pes
##
## Df Sum of Sq RSS AIC
## - edat_mare 2 0.2457 66.896 -209.03
## - nombre_visites 1 0.0809 66.731 -207.53
## <none> 66.651 -205.77
## - nado_sexe 1 1.4830 68.134 -203.37
## - mare_fumadora 1 7.9551 74.606 -185.22
## - augment_pes 1 10.0384 76.689 -179.71
##
## Step: AIC=-209.03
## nado_pes ~ nado_sexe + nombre_visites + mare_fumadora + augment_pes
##
## Df Sum of Sq RSS AIC
## - nombre_visites 1 0.0866 66.983 -210.78
## <none> 66.896 -209.03
## - nado_sexe 1 1.5094 68.406 -206.57
## - mare_fumadora 1 7.9952 74.891 -188.46
## - augment_pes 1 10.1911 77.087 -182.68
##
## Step: AIC=-210.78
## nado_pes ~ nado_sexe + mare_fumadora + augment_pes
##
## Df Sum of Sq RSS AIC
## <none> 66.983 -210.78
## - nado_sexe 1 1.4496 68.432 -208.49
## - mare_fumadora 1 7.9650 74.948 -190.31
## - augment_pes 1 10.1165 77.099 -184.65
##
## Call:
## lm(formula = nado_pes ~ nado_sexe + mare_fumadora + augment_pes,
## data = data[, c(2, 3, 7, 8, 9, 14)])
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.66988 -0.39415 -0.06879 0.39318 2.05793
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.51355 0.17321 14.511 < 2e-16 ***
## nado_sexenena -0.17157 0.08330 -2.060 0.0408 *
## mare_fumadorasi -0.50559 0.10473 -4.828 2.78e-06 ***
## augment_pes 0.06445 0.01185 5.441 1.57e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.5846 on 196 degrees of freedom
## Multiple R-squared: 0.246, Adjusted R-squared: 0.2345
## F-statistic: 21.32 on 3 and 196 DF, p-value: 5.417e-12