Ejercicios de Regresión Logística Binaria

César Córdova

18/5/2021

Introducción

En esta lección utilizaremos los datos de la encuesta del Projecto de Opinión Pública de América Latina (LAPOP) del años 2018/19 que evalúa sobre creencias, actitudes, prácticas políticas, entre otros.

La base de datos y el libo de códigos se pueden descargase desde el siguiente enlace. (1) Copie el vínculo, (2) abra una ventana nueva y (3) péguelo en la barra de direcciones:

https://www.dropbox.com/sh/5tvi4uiww52by59/AABnFrvhs8N1fYICALPmRJYUa?dl=0

A continuación, se presenta la lista de variables de la base:

Cargar paquetes


library(foreign)
library(stargazer)
library(DescTools)

Carga de data


load("protesta.Rdata")

names(protesta)
## [1] "sexo"        "ciudad"      "prot"        "int.pol"     "aut.id.etn" 
## [6] "coi.emp.pub" "coi.pol"     "vic.del"

Ejercicio 1


modelo1 <- glm(prot~coi.pol, binomial, protesta)

summary(modelo1)
## 
## Call:
## glm(formula = prot ~ coi.pol, family = binomial, data = protesta)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -0.7081  -0.4871  -0.4871  -0.4871   2.0931  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -2.07201    0.09132 -22.689  < 2e-16 ***
## coi.polSí    0.81655    0.18051   4.524 6.08e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1117.5  on 1445  degrees of freedom
## Residual deviance: 1098.7  on 1444  degrees of freedom
## AIC: 1102.7
## 
## Number of Fisher Scoring iterations: 4

anova(modelo1, test = "Chisq")
## Analysis of Deviance Table
## 
## Model: binomial, link: logit
## 
## Response: prot
## 
## Terms added sequentially (first to last)
## 
## 
##         Df Deviance Resid. Df Resid. Dev  Pr(>Chi)    
## NULL                     1445     1117.5              
## coi.pol  1   18.815      1444     1098.7 1.441e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
PseudoR2(modelo1, c("CoxSnell", "Nagel"))
##   CoxSnell Nagelkerke 
## 0.01292724 0.02401523

Predicciones

new.data <- data.frame(coi.pol = c("Sí"))

predict(modelo1, new.data, type = "response")
##         1 
## 0.2217573
new.data2 <- data.frame(coi.pol = c("No"))

predict(modelo1, new.data2, type = "response")
##         1 
## 0.1118476

Ejercicio 2

Calcule los coeficientes del modelo visto en el ejercicio 1, pero a partir de una tabla simple cruzada de las variables protesta “prot” y petición de coima de polícía “coi.pol”. Luego responda:

Primero calculamos una tabla simple cruzada con la función “table”.

prop.table(table(protesta$prot,protesta$coi.pol),2)
##     
##             No        Sí
##   No 0.8881524 0.7782427
##   Sí 0.1118476 0.2217573

Luego calculamos el logaritmo natural del odds de la participación en protesta pública en el caso de las personas que no han sufrido extorsión por parte de la polícía


log(0.1118476/0.8881524)
## [1] -2.072006
log(0.2217573/0.7782427)
## [1] -1.255455


##

log(0.2217573/0.7782427) + 2.072007
## [1] 0.8165521

Ejercicio 3


(exp(-2.07201 + 0.81655*1 ))/(exp(-2.07201 + 0.81655*1 )+1)
## [1] 0.2217564

Ejercicio 4


prop.table(table(protesta$prot,protesta$vic.del),2)
##     
##             No        Sí
##   No 0.8813886 0.8410758
##   Sí 0.1186114 0.1589242

modelo2 <- glm(prot~vic.del, binomial, protesta)

summary(modelo2)
## 
## Call:
## glm(formula = prot ~ vic.del, family = binomial, data = protesta)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -0.5883  -0.5025  -0.5025  -0.5025   2.0649  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -2.00565    0.09604 -20.883   <2e-16 ***
## vic.delSí    0.33939    0.16588   2.046   0.0408 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1117.5  on 1445  degrees of freedom
## Residual deviance: 1113.4  on 1444  degrees of freedom
## AIC: 1117.4
## 
## Number of Fisher Scoring iterations: 4

Ejercicio 5

Finalmente, calcule un modelo de regresión logística quie tenga como variable dependiente a la protesta públicas (prot) y como independientes al interés en política (int.pol), ciudad (tamano) y extrosión con pedido de coima de polícía (coi.pol):


modelo2 <- glm(prot ~ coi.pol + int.pol + ciudad, binomial, protesta)

summary(modelo2)
## 
## Call:
## glm(formula = prot ~ coi.pol + int.pol + ciudad, family = binomial, 
##     data = protesta)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.2533  -0.5615  -0.4182  -0.3090   2.4763  
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -0.014224   0.303629  -0.047  0.96264    
## coi.polSí      0.807395   0.186655   4.326 1.52e-05 ***
## int.pol       -0.625422   0.090748  -6.892 5.51e-12 ***
## ciudadgrande  -0.502327   0.186630  -2.692  0.00711 ** 
## ciudadmediana  0.008936   0.243292   0.037  0.97070    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1117.5  on 1445  degrees of freedom
## Residual deviance: 1045.4  on 1441  degrees of freedom
## AIC: 1055.4
## 
## Number of Fisher Scoring iterations: 5

anova(modelo2, test = "Chisq")
## Analysis of Deviance Table
## 
## Model: binomial, link: logit
## 
## Response: prot
## 
## Terms added sequentially (first to last)
## 
## 
##         Df Deviance Resid. Df Resid. Dev  Pr(>Chi)    
## NULL                     1445     1117.5              
## coi.pol  1   18.815      1444     1098.7 1.441e-05 ***
## int.pol  1   43.783      1443     1054.9 3.669e-11 ***
## ciudad   2    9.526      1441     1045.4  0.008538 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

PseudoR2(modelo2, c("CoxSnell", "Nagel"))
##   CoxSnell Nagelkerke 
## 0.04865475 0.09038702

Identificación de variable más importante del modelo

exp(coefficients(modelo2))
##   (Intercept)     coi.polSí       int.pol  ciudadgrande ciudadmediana 
##     0.9858769     2.2420595     0.5350355     0.6051209     1.0089760

Predicciones

Calcule la probabilidad para los siguientes casos:


new.data <- data.frame(coi.pol = c("Sí"), int.pol = c(4), ciudad = "grande")
predict(modelo2, new.data, type = "response")


new.data <- data.frame(int.pol = 1, ciudad = "pequeña", coi.pol = "Sí")
predict(modelo2, new.data, type = "response")