Hasta ahora hemos desarrollado modelos multinivel para variables predichas continuas. Sin embargo, muchas variables de interés en ciencias sociales son categóricas nominales (aprobar vs reprobar un curso, votar por un candidato de derecha o izquierda) u ordinales (grado de acuerdo con una pregunta). Ahora Veremos el caso de variables de salida nominales binarias o dicotómicas donde sólo hay dos alternativas de respuesta que no tienen un orden inherente. La variable predictora puede ser continua o categórica. Para comenzar, veremos el caso de la regresión logística para ilustrar los principios que luego extenderemos al caso del análisis multinivel.
Para esta parte del curso analizaremos los resultados de una encuesta nacional transeccional (BDHS2004). La variable dependiente es un indicador de atención prenatal (antemed) al menos una vez antes del nacimiento del hijo más reciente (dentro de los últimos 5 años). La variables analizadas y sus respectivos códigos se encuentran en la Tabla 1.
Tabla 1. Bangladesh Demographic and Health Survey (BDHS2004)
| varnames | vardescr |
|---|---|
| comm | Community identifier |
| womid | Woman identifier |
| antemed | Received antenatal care at least once from a medically-trained provider, e.g. doctor, nurse or midwife (1 = yes, 0 = no) |
| bord | Birth order of child (ranges from 1 to 13) |
| mage | Mother’s age at the child’s birth (in years) |
| urban | Type of region of residence at survey (1 = urban, 0 = rural) |
| meduc | Mother’s level of education at survey (1 = none, 2 = primary, 3 = secondary or higher) |
| islam | Mother’s religion (1 = Islam, 0 = other) |
| wealth | Household wealth index in quintiles (1 = poorest to 5 = richest) |
mydata <- read.table("6.1.txt", sep = ",", header = TRUE)
En total respondieron 5366 personas, de las cuales 2753 (51%) recibieron atención prenatal.
cbind(Freq = table(mydata$antemed), Perc = prop.table(table(mydata$antemed)),
Cum = cumsum(prop.table(table(mydata$antemed))))
## Freq Perc Cum
## 0 2613 0.4869549 0.4869549
## 1 2753 0.5130451 1.0000000
El parámetro poblacional a estimar es \(\pi\) y lo estimaremos mediante la media de la variable dicotómica \(y\) que contiene sólo 1s y 0s.
\[\hat\pi=\overline{y}=Pr(y=1)=\frac{r}{N}\] donde r corresponde al número de individuos en la muestra que seleccionaron la opción “1”.1 La media y la desviación estándar se podrían obtener mediante summary(mydata$antemed)
La varianza muestral de y se puede obtener mediante la fórmula tradicional para obtener la varianza, que en el caso de variables dicotómicas (1 y 0) se puede simplificar a:
\[s^2=\hat\pi(1-\hat\pi)\]
Por lo tanto, la varianza de antemed se podría obtener como \(s^2=0.513(1-0.513)=0.248\) y la desviación estándar \(s=\sqrt{0.248}=0.4998\)
Se le llama distribución de Bernoulli a una distribución que tiene media \(\pi\) y varianza \(\pi(1-\pi)\).
En la ausencia de información adicional, el valor esperado para un individuo i es igual a la probabilidad de respuesta de la poblacióm, esto es \(\pi_i=\pi\). Si el 51% de la muestra dijo 1, entonces para cualquier individuo i la probabilidad de responder 1 es .51 más un error, esto es:
\[y_i=\pi+e_i\] Pero este es el caso si no hay ningún predictor. Si incluimos las variables \(X_1...X_p\) entonces \(\pi_i=\beta_0 + \beta_1X_1\), por lo que el valor esperado de \(y_i\) sería:
\[y_i=\pi+e_i=\beta_0 + \beta_1X_1+e_i\]
plot(mydata$mage, mydata$antemed, xlab = "Edad de la madre al nacer", ylab =
"Atencion prenatal")
Una mejor manera de visualizar la relación entre ambas variables es agrupar la vd según la edad de la madres, de modo que cada punto represente la proporción de madres de x edad que recibieron atención prenatal.
propantemed <- tapply(mydata$antemed, mydata$mage, mean)
plot(names(propantemed), propantemed, xlim = c(10, 50), xlab = "Edad de la madre al nacer")
Evidentemente la probabilidad de recibir atención prenatal disminuye con la edad de la madre, pero esta relación no es lineal.
Consideremos si el lugar de residencia (urban) y el nivel de educación de la madre (meduc) como posibles predictores.
#Urban = 1; Rural = 0
table(mydata$antemed, mydata$urban)
##
## 0 1
## 0 2138 475
## 1 1544 1209
table(mydata$antemed, mydata$urban) / (rbind(colSums(table(mydata$antemed,
mydata$urban)), colSums(table(mydata$antemed, mydata$urban))))
##
## 0 1
## 0 0.5806627 0.2820665
## 1 0.4193373 0.7179335
#Educación de la madre (1 = none, 2 = primary, 3 = secondary or higher)
table(mydata$antemed, mydata$meduc)
##
## 1 2 3
## 0 1272 856 485
## 1 594 793 1366
table(mydata$antemed, mydata$meduc) / rbind(colSums(table(mydata$antemed,
mydata$meduc)), colSums(table(mydata$antemed, mydata$meduc)))
##
## 1 2 3
## 0 0.6816720 0.5191025 0.2620205
## 1 0.3183280 0.4808975 0.7379795
La proporción de madres que reciben atención prenatal viven preponderantemente en zonas urbanas (urban = 1) y tienen educación secundaria o superior (meduc = 3)
Hay varias dificultades asociadas al uso de la regresión lineal para modelar datos binarios, especialmente cuando los valores de \(\pi\) se aproximan a 1 o 0. Para ilustrar este punto, amalizaremos los datos anteriores usando la edad de la madre y su lugar de residencia. Previamente haremos algunas transformaciones (i.e., centrar la edad de la madre, agregar una variable para representar el efecto cuadrático de la edad centrada de la madres, y agregar dos variables dummy para representar el nivel de educación de la madre usando como categoría de referencia la falta de educación).
\[antemed_i=\pi_i+e_i\]
\[\pi_i=\beta_0+\beta_1magec_i+\beta_2magecsq_i+\beta_3urban_i+\beta_4meduc2_i+\beta_5meduc3_i\]
donde magec = edad de la madre centrada en la gran media, magecsq = cuadrado de magec, meduc2 = primaria, meduc3 = secundaria.
mydata$meduc2 <- mydata$meduc == 2
mydata$meduc3 <- mydata$meduc == 3
summary(mydata$mage)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 13.00 19.00 23.00 23.63 28.00 49.00
mydata$magec <- mydata$mage - mean(mydata$mage)
mydata$magecsq <- mydata$magec * mydata$magec
Y usamos el siguiente código para modelar2 o “fitear” como dice SCH la probabilidad de antemed
fit <- lm(antemed ~ magec + magecsq + urban + meduc2 + meduc3, data = mydata)
summary(fit)
##
## Call:
## lm(formula = antemed ~ magec + magecsq + urban + meduc2 + meduc3,
## data = mydata)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.90669 -0.40463 0.09385 0.36842 0.94449
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.2718852 0.0122798 22.141 < 2e-16 ***
## magec 0.0017864 0.0011937 1.497 0.13457
## magecsq -0.0004067 0.0001240 -3.281 0.00104 **
## urban 0.2501874 0.0134693 18.575 < 2e-16 ***
## meduc2TRUE 0.1516849 0.0156085 9.718 < 2e-16 ***
## meduc3TRUE 0.3826707 0.0156717 24.418 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.453 on 5360 degrees of freedom
## Multiple R-squared: 0.1795, Adjusted R-squared: 0.1787
## F-statistic: 234.4 on 5 and 5360 DF, p-value: < 2.2e-16
A cotinuación haremos un modelo para evaluar la relación entre magec y antemed pero teniendo la precaución de fijar los valores de los predictores del modelo en torno a su media. De esta manera, el coeficiente para magec se puede interpretar como la proporción de madres (de edad promedio) que recibieron atención prenatal que viven en una misma ubicación y que tienen el mismo nivel de educación.
mydata2 <- mydata
mean(mydata$urban)
## [1] 0.3138278
mydata2$urban <- mean(mydata$urban)
mean(mydata$meduc2)
## [1] 0.3073053
mydata2$meduc2 <- mean(mydata$meduc2)
mean(mydata$meduc3)
## [1] 0.3449497
mydata2$meduc3 <- mean(mydata$meduc3)
head(mydata2,20)
## comm womid antemed bord mage urban meduc islam wealth meduc2
## 1 1 1 0 4 33 0.3138278 2 1 3 0.3073053
## 2 1 2 1 2 21 0.3138278 3 1 4 0.3073053
## 3 1 3 1 3 26 0.3138278 2 1 2 0.3073053
## 4 1 4 0 6 28 0.3138278 1 1 2 0.3073053
## 5 1 5 0 6 37 0.3138278 2 1 4 0.3073053
## 6 1 6 1 4 29 0.3138278 2 1 4 0.3073053
## 7 1 7 0 2 20 0.3138278 3 1 2 0.3073053
## 8 1 8 0 3 29 0.3138278 3 1 3 0.3073053
## 9 1 9 0 1 19 0.3138278 3 1 3 0.3073053
## 10 1 10 1 1 19 0.3138278 3 1 4 0.3073053
## 11 1 11 1 1 23 0.3138278 3 1 3 0.3073053
## 12 1 12 1 1 15 0.3138278 3 1 3 0.3073053
## 13 1 13 0 7 27 0.3138278 1 1 1 0.3073053
## 14 1 14 1 2 24 0.3138278 2 1 2 0.3073053
## 15 2 15 1 1 19 0.3138278 3 1 4 0.3073053
## 16 2 16 0 3 20 0.3138278 3 1 3 0.3073053
## 17 2 17 0 4 35 0.3138278 2 1 4 0.3073053
## 18 2 18 0 5 24 0.3138278 1 1 3 0.3073053
## 19 2 19 0 7 39 0.3138278 2 1 4 0.3073053
## 20 2 20 1 1 16 0.3138278 3 1 4 0.3073053
## meduc3 magec magecsq
## 1 0.3449497 9.3656355 87.7151280
## 2 0.3449497 -2.6343645 6.9398764
## 3 0.3449497 2.3656355 5.5962312
## 4 0.3449497 4.3656355 19.0587732
## 5 0.3449497 13.3656355 178.6402119
## 6 0.3449497 5.3656355 28.7900441
## 7 0.3449497 -3.6343645 13.2086054
## 8 0.3449497 5.3656355 28.7900441
## 9 0.3449497 -4.6343645 21.4773345
## 10 0.3449497 -4.6343645 21.4773345
## 11 0.3449497 -0.6343645 0.4024183
## 12 0.3449497 -8.6343645 74.5522506
## 13 0.3449497 3.3656355 11.3275022
## 14 0.3449497 0.3656355 0.1336893
## 15 0.3449497 -4.6343645 21.4773345
## 16 0.3449497 -3.6343645 13.2086054
## 17 0.3449497 11.3656355 129.1776699
## 18 0.3449497 0.3656355 0.1336893
## 19 0.3449497 15.3656355 236.1027538
## 20 0.3449497 -7.6343645 58.2835216
mydata$meduc2 <- as.numeric(mydata$meduc2)
mydata$meduc3 <- as.numeric(mydata$meduc3)
fit <- lm(antemed ~ magec + magecsq + urban + meduc2 + meduc3, data = mydata)
summary(fit)
##
## Call:
## lm(formula = antemed ~ magec + magecsq + urban + meduc2 + meduc3,
## data = mydata)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.90669 -0.40463 0.09385 0.36842 0.94449
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.2718852 0.0122798 22.141 < 2e-16 ***
## magec 0.0017864 0.0011937 1.497 0.13457
## magecsq -0.0004067 0.0001240 -3.281 0.00104 **
## urban 0.2501874 0.0134693 18.575 < 2e-16 ***
## meduc2 0.1516849 0.0156085 9.718 < 2e-16 ***
## meduc3 0.3826707 0.0156717 24.418 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.453 on 5360 degrees of freedom
## Multiple R-squared: 0.1795, Adjusted R-squared: 0.1787
## F-statistic: 234.4 on 5 and 5360 DF, p-value: < 2.2e-16
mydata2$predantemed <- predict(fit, mydata2)
head(mydata2,20)
## comm womid antemed bord mage urban meduc islam wealth meduc2
## 1 1 1 0 4 33 0.3138278 2 1 3 0.3073053
## 2 1 2 1 2 21 0.3138278 3 1 4 0.3073053
## 3 1 3 1 3 26 0.3138278 2 1 2 0.3073053
## 4 1 4 0 6 28 0.3138278 1 1 2 0.3073053
## 5 1 5 0 6 37 0.3138278 2 1 4 0.3073053
## 6 1 6 1 4 29 0.3138278 2 1 4 0.3073053
## 7 1 7 0 2 20 0.3138278 3 1 2 0.3073053
## 8 1 8 0 3 29 0.3138278 3 1 3 0.3073053
## 9 1 9 0 1 19 0.3138278 3 1 3 0.3073053
## 10 1 10 1 1 19 0.3138278 3 1 4 0.3073053
## 11 1 11 1 1 23 0.3138278 3 1 3 0.3073053
## 12 1 12 1 1 15 0.3138278 3 1 3 0.3073053
## 13 1 13 0 7 27 0.3138278 1 1 1 0.3073053
## 14 1 14 1 2 24 0.3138278 2 1 2 0.3073053
## 15 2 15 1 1 19 0.3138278 3 1 4 0.3073053
## 16 2 16 0 3 20 0.3138278 3 1 3 0.3073053
## 17 2 17 0 4 35 0.3138278 2 1 4 0.3073053
## 18 2 18 0 5 24 0.3138278 1 1 3 0.3073053
## 19 2 19 0 7 39 0.3138278 2 1 4 0.3073053
## 20 2 20 1 1 16 0.3138278 3 1 4 0.3073053
## meduc3 magec magecsq predantemed
## 1 0.3449497 9.3656355 87.7151280 0.5100719
## 2 0.3449497 -2.6343645 6.9398764 0.5214880
## 3 0.3449497 2.3656355 5.5962312 0.5309666
## 4 0.3449497 4.3656355 19.0587732 0.5290640
## 5 0.3449497 13.3656355 178.6402119 0.4802361
## 6 0.3449497 5.3656355 28.7900441 0.5268924
## 7 0.3449497 -3.6343645 13.2086054 0.5171519
## 8 0.3449497 5.3656355 28.7900441 0.5268924
## 9 0.3449497 -4.6343645 21.4773345 0.5120024
## 10 0.3449497 -4.6343645 21.4773345 0.5120024
## 11 0.3449497 -0.6343645 0.4024183 0.5277198
## 12 0.3449497 -8.6343645 74.5522506 0.4832697
## 13 0.3449497 3.3656355 11.3275022 0.5304220
## 14 0.3449497 0.3656355 0.1336893 0.5296155
## 15 0.3449497 -4.6343645 21.4773345 0.5120024
## 16 0.3449497 -3.6343645 13.2086054 0.5171519
## 17 0.3449497 11.3656355 129.1776699 0.4967809
## 18 0.3449497 0.3656355 0.1336893 0.5296155
## 19 0.3449497 15.3656355 236.1027538 0.4604376
## 20 0.3449497 -7.6343645 58.2835216 0.4916731
mydata2 <- mydata2[order(mydata2$mage), ]
plot(mydata2$mage, mydata2$predantemed, xlim = c(10, 50), xlab = "Edad de la madre al nacimiento", ylab = "Pr(antemed)", type = "l")
predprob <- predict(fit)
estd <- rstandard(fit)
plot(predprob, estd, xlab = "Predicción lineal, factores fijos", ylab =
"residuos estandarizados")
Como se puede observar hay sólo dos valores posibles para cada error de predicción. Por ejemplo, para todas las madres cuya probabilidad de ser atendida es de .14 (que corresponde a los puntos más a la izquierda) el error de estimación es o -.31 o 1.91. Esto es así porque el valor observado para cada caso es o 1 o 0. El resultado es que el error de predicción no está normalmente distribuido.
Un segundo problema es que la varianza de \(\pi\) depende del valor de x. Particularmente, en los extremos de x la varianza de \(\pi\) va a ser menor.
Relacionado con lo anterior, la forma de la relación entre una variable continua y una variable binaria va a tener una forma de S. Sólo para los valores intermedios de \(\pi\) la relación con x va a ser lineal. Por ejemplo, la mayor intensidad del estudio (x) va a afectar la probabilidad de pasar el examen más para los alumnos que están en el centro de la distribución que los que están en los extremos.
Por último, un modelo de regresión lineal produce predicciones que están fuera del rango e \(\pi\), esto es, menores que 0 o mayores que 1, lo que claramente es inadecuado.
Por todas estas razones, es obligatorio hacer una transformación de los valores predichos de una regresión multiple que genere valores contenidos entre 0 y 1. Esta transformación se conoce como transformación logística.
Una manera de representar la probabilidad de ocurrencia de un evento es mediante el cociente entre la probabilidad de que ocurra el evento \(\pi\) y la probabilidad de que no ocurra \(1-\pi\) que en inglés se llama odds.
\[odds=\frac{\pi}{1-\pi}\]
Este cociente tiene una distribución asimétrica positiva pero se puede transformar tomando su logaritmo natural3 Ants de continuar mira este video de Josh Starmer de Statquest
#Generar una distribución normal con media 0 y desviación estándar 1
bdist<-data.frame(rnorm(200, mean=0,sd=1))
#Etiquetar a primera columna como "z"
names(bdist)[1]<-"z"
#Transformar los valores z en odds
bdist$log<-exp(bdist$z)/(1+exp(bdist$z))
#Graficar los resultados
plot(bdist$z,bdist$log)
En esencia, vamos a interpretar los valores predichos de la regresión múltiple como un log(odds).
\[log\bigg{(}\frac{\pi}{1-\pi}\bigg{)}=\beta_0+\beta_1X_1\] ##Regresión logística con predictores continuos
Usando la edad de la madre (mage) como único predictor y como variable dependiente el recibir (o no) atención prenatal, podemos estimar un modelo de regresión logística usando la función glm y especificando que la distribución es binomial logística usando:
fit<-glm(antemed~mage, family = binomial(logit), data=mydata)
summary(fit)
##
## Call:
## glm(formula = antemed ~ mage, family = binomial(logit), data = mydata)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.343 -1.208 1.045 1.134 1.501
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.785578 0.107847 7.284 3.24e-13 ***
## mage -0.031029 0.004415 -7.028 2.10e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 7435.2 on 5365 degrees of freedom
## Residual deviance: 7385.1 on 5364 degrees of freedom
## AIC: 7389.1
##
## Number of Fisher Scoring iterations: 4
El intercepto en el modelo anterior es 0.785578 y la pendiente -0.031029. Por lo tanto, el log odds de recibir atención prenatal para una madre de edad promedio (23.63) sería:
\[log\bigg{(}\frac{\pi}{1-\pi}\bigg{)}=\beta_0+\beta_1X_1=0.785578-0.031029\times23.63=0.0523\]
Para transformar el log odds resultante en la probabilidad de recibir atención prenatal hay que obtener el inverso de la función logit (o antilogit). La función logit del paquete VGAM convierte el logit en una probabilidad especificando inverse=TRUE
require(VGAM)
## Loading required package: VGAM
## Loading required package: stats4
## Loading required package: splines
logit(0.785578-0.031029*23.63436, inverse=TRUE)
## [1] 0.5130539
En consecuencia la probabilidad de que una madre de edad promedio reciba atención prenatal es de 51.31%. Podemos graficar los valores predicho para todos los niveles de mage.
#La opción `type = "response"` es importante para que la predicción
#ocurra en la escala de la VD
mydata$predprob <- predict(fit, type = "response")
plot(mydata$mage,mydata$predprob)
En el gráfico se observa que una madre de 45 años tiene una probabilidad mucho menor (aprox. 35%) de recibir atención prenatal que una de, por ejemplo, 15 años (58%).
Lo mismo pero usando la edad de la madre centrada
fit<-glm(antemed~magec, family = binomial(logit), data=mydata)
summary(fit)
##
## Call:
## glm(formula = antemed ~ magec, family = binomial(logit), data = mydata)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.343 -1.208 1.045 1.134 1.501
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.052223 0.027440 1.903 0.057 .
## magec -0.031029 0.004415 -7.028 2.1e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 7435.2 on 5365 degrees of freedom
## Residual deviance: 7385.1 on 5364 degrees of freedom
## AIC: 7389.1
##
## Number of Fisher Scoring iterations: 4
Ahora el valor de \(X_1\) es 0, que es el promedio de magec. Sin embargo, la probabilidad resultante es exactamente la misma que en el modelo anterior salvo por el error de redondeo a partir del sexto decimal.
require(VGAM)
logit(0.052223-0.031029*0, inverse=TRUE)
## [1] 0.5130528
#La opción `type = "response"` es importante para que la predicción
#ocurra en la escala de la VD
mydata$predprob <- predict(fit, type = "response")
plot(mydata$mage,mydata$predprob)
Y una vez más pero incluyen magecsq
fit<-glm(antemed~magec+magecsq, family = binomial(logit), data=mydata)
summary(fit)
##
## Call:
## glm(formula = antemed ~ magec + magecsq, family = binomial(logit),
## data = mydata)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.258 -1.238 1.099 1.115 1.973
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.1348006 0.0352034 3.829 0.000129 ***
## magec -0.0214217 0.0051078 -4.194 2.74e-05 ***
## magecsq -0.0021501 0.0005782 -3.718 0.000201 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 7435.2 on 5365 degrees of freedom
## Residual deviance: 7370.9 on 5363 degrees of freedom
## AIC: 7376.9
##
## Number of Fisher Scoring iterations: 4
require(VGAM)
logit(0.1348006-0.0214217*0-0.0021501*0, inverse=TRUE)
## [1] 0.5336492
Se observa en el gráfico que dada la curvatura del modelo, la probabilidad para una madre de edad promedio (53.36%) mejora levemente en comparación con el modelo lineal (51.31%)
#La opción `type = "response"` es importante para que la predicción
#ocurra en la escala de la VD
mydata$predprob <- predict(fit, type = "response")
plot(mydata$mage,mydata$predprob)
Tomando ahora el nivel de educación de la madre como variable predictora, podemos estimar el siguiente modelo:
table(mydata$antemed, mydata$meduc)
##
## 1 2 3
## 0 1272 856 485
## 1 594 793 1366
table(mydata$antemed, mydata$meduc)/rbind(colSums(table(mydata$antemed,
mydata$meduc)), colSums(table(mydata$antemed, mydata$meduc)))
##
## 1 2 3
## 0 0.6816720 0.5191025 0.2620205
## 1 0.3183280 0.4808975 0.7379795
rowSums(table(mydata$antemed, mydata$meduc)) /
sum(rowSums(table(mydata$antemed, mydata$meduc)))
## 0 1
## 0.4869549 0.5130451
La probabilidad de recibir atención prenatal en general es de 0.513, pero esta probabilidad varía según el nivel de educación de la madre. Las madres sin educación, con educación primaria y con educación secundaria o superior tienen una probabilidad de 0.318, 0.481, y 0.738 de recibir atención prenatal, respectivamente.
Por último, podemos comparar los odds de recibir atencion prenatal para los distintos niveles de educación. Por ejemplo, la razón de los odds (odds ratio) para las madres con educación primaria versus las madres sin educación sería:
(793/856)/(594/1272)
## [1] 1.98381
El 1.98 quiere decir que las madres con educación primaria tienen casi el doble de odds de recibir atención prenatal en comparación con las madres sin educación.
En resumen, tenemos que:
| Educación | Probabilidad | Odds | Odds ratio |
|---|---|---|---|
| Sin educación | 0.318 | 0.467 | - |
| Primaria | 0.481 | 0.926 | 1.984 |
| Secundaria o superior | 0.738 | 2.816 | 6.031 |
El modelo a estimar en este caso es: \[log\bigg{(}\frac{\pi}{1-\pi}\bigg{)}=\beta_0+\beta_1meduc1_i+\beta_2meduc3_i\] De nuevo, la sintaxis usa la función glm y se especifica a continuación:
fit <- glm(antemed ~ meduc2 + meduc3, data = mydata, family = binomial(logit))
summary(fit)
##
## Call:
## glm(formula = antemed ~ meduc2 + meduc3, family = binomial(logit),
## data = mydata)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.6367 -0.8754 0.7795 1.2100 1.5131
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.76147 0.04970 -15.323 <2e-16 ***
## meduc2 0.68502 0.06999 9.787 <2e-16 ***
## meduc3 1.79696 0.07255 24.768 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 7435.2 on 5365 degrees of freedom
## Residual deviance: 6747.6 on 5363 degrees of freedom
## AIC: 6753.6
##
## Number of Fisher Scoring iterations: 4
Para obtener el efecto de educación podemos nuevamente usar la función logit del paquete VGAM. Como las variables meduc2 y meduc3 son variables dummy, hay que simplemente reemplazar por 1 y 0 para obtener los efectos que queremos determinar.
require(VGAM)
#Para madres sin educación (sólo intercepto)
logit(-0.76147+0.68502*0+1.79696*0, inverse=TRUE)
## [1] 0.3183272
#Para madres con educación primaria
logit(-0.76147+0.68502*1+1.79696*0, inverse=TRUE)
## [1] 0.4808968
#Para madres con educación secundaria o superior
logit(-0.76147+0.68502*0+1.79696*1, inverse=TRUE)
## [1] 0.7379789
Nótese que las probabilidades obtenidas calzan con las probabilidades de la tabla de resumen4 BAM!
#La opción `type = "response"` es importante para que la predicción
#ocurra en la escala de la VD
mydata$predprob <- predict(fit, type = "response")
plot(mydata$meduc,mydata$predprob)
La significancia estadística de los coeficientes está incluida por defecto en el output de la función glm. Sin embargo, para obtener los intervalos de confianza para los coeficientes hay que usar la función confint() que también es parte del paquete VGAM.
confint(fit)
## Waiting for profiling to be done...
## 2.5 % 97.5 %
## (Intercept) -0.8594640 -0.6646200
## meduc2 0.5480822 0.8224776
## meduc3 1.6554694 1.9398952
Se pueden obtener las probabilidades asociadas a los coeficientes transformandolos nuevamente con la función logit.
logit(confint(fit), inverse = TRUE)
## Waiting for profiling to be done...
## 2.5 % 97.5 %
## (Intercept) 0.2974513 0.3397026
## meduc2 0.6336905 0.6947620
## meduc3 0.8396289 0.8743406
En este caso, la hipótesis nula es que \(\beta=0\) que es lo mismo que decir que hay una probabilidad de un 50% de recibir atención prenatal. E ambos casos (meduc2 y meduc3) la probabilidad excede el 50%. Lo mismom se puede hacer (y de hecho me parece que es más común) usando los odds.
exp(fit$coefficients)
## (Intercept) meduc2 meduc3
## 0.4669811 1.9838101 6.0312819
exp(confint(fit))
## Waiting for profiling to be done...
## 2.5 % 97.5 %
## (Intercept) 0.423389 0.514469
## meduc2 1.729932 2.276132
## meduc3 5.235537 6.958022
#Podemos juntar los resultados anteriores en una sola tabla
#con el comando cbind (column bind)
cbind(exp(fit$coefficients),exp(confint(fit)))
## Waiting for profiling to be done...
## 2.5 % 97.5 %
## (Intercept) 0.4669811 0.423389 0.514469
## meduc2 1.9838101 1.729932 2.276132
## meduc3 6.0312819 5.235537 6.958022
De nuevo, los valores reproducen lo que obtuvimos en la tabla de resumen pero ahora usando los odds en vez de las probabilidades. La interpretación es distinta. Un odd de 1 quiere decir que la chance de recibir el tratamiento es la misma que la de no recibirlo. En ambos caso, el intervalo de confianza de los odds exceden el valor de 1.
Por último, si el interés es evaluar el efecto de un set de predictores o la diferencia entre los coeficientes de dos predictores, podemos usar el test de Wald disponible en el paquete car5 ¡Precaución! La función logittambién es parte del paquete car. Para desambiguar su uso, de aquí en adelante hay que especificar si queremos usar la función logit del paquete VGAM VGAM::logit o car car::logit
require(car)
## Loading required package: car
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:VGAM':
##
## logit
#Evaluar un set de predictores
linearHypothesis(fit,c("meduc2","meduc3"),c(0,0))
## Linear hypothesis test
##
## Hypothesis:
## meduc2 = 0
## meduc3 = 0
##
## Model 1: restricted model
## Model 2: antemed ~ meduc2 + meduc3
##
## Res.Df Df Chisq Pr(>Chisq)
## 1 5365
## 2 5363 2 620.16 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#Comparar dos coeficientes
linearHypothesis(fit,c("meduc2"="meduc3"))
## Linear hypothesis test
##
## Hypothesis:
## meduc3 = 0
##
## Model 1: restricted model
## Model 2: antemed ~ meduc2 + meduc3
##
## Res.Df Df Chisq Pr(>Chisq)
## 1 5364
## 2 5363 1 613.47 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
El resultado del segundo test es interesante porque muestra que las madres con educación primaria y secundaria o superior difieren en cuanto a sus log odds de recibir atención prenatal.