Random Coefficients Modeling

Introducción modelos logit

Gonzalo J. Muñoz

2019-07-10

Introducción

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.

Regresión logística

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

Media y varianza de variables binarias

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\]

Visualizando la relación entre variables cuando una de ellas es binaria

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)

Regresión lineal para modelar atención prenatal

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.

El modelo logit/logístico

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)

Regresión logística con predictores categóricos

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)

Significancia estadística e intervalos de confianza

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.