Enlace a RPubs: https://rpubs.com/ReginaPC/1197469

Introducción y contexto (1 punto)

Desde su creación en el año 2012, Cómo Vamos, Nuevo León es una iniciativa se ha consolidado como una iniciativa ciudadana elemental para el fortalecimiento de la democracia en el estado. Su misión principal se centra promover la participación ciudadana, la evaluación a los gobiernos, proporcionando espacios y datos sobre la percepción de la ciudadanía en diversos temas de relevancia para la entidad, los cuales se pueden dividir en cuatro áreas: Desarrollo social y económico, desarrollo sustentable, seguridad y justicia, y gobierno.

El concepto de Desarrollo Social, según el Banco Mundial, implica priorizar a las personas en los procesos de desarrollo, con el objetivo de eliminar la pobreza y fomentar la inclusión social. Este enfoque busca crear una sociedad más accesible y equitativa. Tanto el Estado como la ciudadanía tienen un papel fundamental en este proceso (n.a., 2019). Por otro lado, el Desarrollo Económico está estrechamente vinculado al Desarrollo Social, ya que busca mejorar a largo plazo el sistema económico, haciéndolo más sostenible y equitativo. Una medida clave para evaluarlo es el Producto Interno Bruto, que proporciona información sobre el desarrollo social en México (BBVA, 2024).

De acuerdo con el Dr. Luis Beltran, el desarrollo sostenible es una combinación de desarrollo social, económico y ambiental, lo que implica la capacidad de satisfacer todas las necesidades humanas sin poner en peligro el planeta ni comprometer a las generaciones venideras (Beltran, L., 2024). En este ámbito, se estudia como el impacto ambiental de las acciones gubernamentales, en ambos casos es difícil controlar todas las variables que forman parte de esto, pero existen índices que permiten tener una idea de la situación de los países. Por ejemplo, el coeficiente de Gini evalúa la igualdad de ingresos. México registró un 45.4 en 2022, ubicándose en el lugar 37 de 43 países analizados (Carrillo, 2022). Asimismo, los Objetivos de Desarrollo Sostenible (ODS) representan un conjunto de metas a las que los países se han comprometido para el año 2030. Según un informe de las Naciones Unidas, México alcanzó un cumplimiento del 69.7% en 2023 (UNAM, 2023).

Por otro lado, es esencial destacar el ámbito de seguridad y justicia, particularmente en Nuevo León. En este estado, la Secretaría de Seguridad asume la responsabilidad de mantener un entorno de paz a través de programas y proyectos destinados a garantizar la reinserción y prevención del delito, así como a preservar las libertades, el orden y la paz pública (nl.gob., 2024). Es importante comprender que la seguridad no se limita únicamente a la presencia policial, sino que también se relaciona con el ambiente general de convivencia. Por lo tanto, las estadísticas disponibles se refieren principalmente a la percepción de seguridad de las personas en su entorno, ya sea en el estado, municipio o en sus propios hogares. Además, la seguridad abarca otros aspectos como la lucha contra la corrupción.Por otra parte, el ámbito de la justicia recae en el poder judicial del Estado de Nuevo León. Aquí se plantean cuestiones relacionadas con la efectividad de los juicios, así como la frecuencia con la que los ciudadanos realizan denuncias en función de su confianza en las autoridades y su percepción de seguridad. También se evalúan las expectativas sobre los resultados judiciales, la accesibilidad y transparencia de la información gubernamental.

Finalmente, el gobierno también es objeto de análisis en la encuesta, explorando la relación de los ciudadanos con las autoridades, la participación ciudadana, la confianza en el gobierno actual, la percepción sobre el uso de los recursos públicos y el grado de cumplimiento de las promesas gubernamentales.

Definición de la problemática (1 punto)

De acuerdo a distintas estadísticas, la aprobación de los alcaldes es en promedio baja, sin embargo, al momento de buscar el porque es que se cae en la conclusión de que muchos aspectos no caen bajo su facultad, es decir no le competen al municipio o al alcalde. Esto es un problema pues conlleva a decisiones mal informadas y a la falta de acción publica por cosas en las que realmente se podría hacer un cambio. Por ejemplo, en un estudio hecho por Héctor Gutiérrez se encontró que, aunque a peor economía y seguridad peor era la opinión sobre el gobierno, esto no concordaba con las estadísticas reales sobre la seguridad y economía, sino que más bien se basaba en los datos reales no concordaban con la percepción y aparte sus opiniones se veían influenciadas por una expectativa moral hacia ellos (Gutiérrez, 2018). En esta investigación se busca añadir a este argumento que la mala opinión también se ve influenciada por la falta de información que tienen los ciudadanos respecto a lo que le compete al estado. El estudio se centrara en el estado de Nuevo León que está conformado por 51 municipios, cada uno con su respectivo ayuntamiento y alcalde. Para poder establecer esté análisis, se han seleccionado diversas variables que abarcan cuatro temas principales: sexo, municipio, edad y aprobación, así como problemas relacionados con el suministro de agua, percepción de seguridad, estado de la infraestructura en parques, corrupción, calidad del aire, nivel educativo, ingresos, acceso a internet y presencia de casas abandonadas.

Para lograr un mayor entendimiento en el tema abordado buscamos relacionar las variables seleccionadas y justificar el uso de cada una.

Pregunta de investigación planteada (1 punto)

¿Cómo se relaciona la percepción de los servicios públicos con la aprobación del alcalde y que dice esto sobre el conocimiento de los ciudadanos?

Selección de variables de la encuesta (1 punto)

Sexo (sexo_num): Esta variable permite explorar posibles diferencias en las respuestas y percepciones entre hombres y mujeres. El sexo como la edad han mostrado tener una influencia significativa en la percepción general, comprender estas diferencias es crucial. Los individuos sienten la necesidad de cuestionar y criticar las condiciones en las que viven, así como la capacidad de cambiarlas. 0-Masculino y 1-Femenino

Municipio (NOM_MUN_MV): La importancia de esta variable radica en la condición de control de donde proviene cada dato y poder reconocer si el omitir este dato afecta de alguna manera la regresión.

Edad (CP4_1): La edad de los encuestados puede afectar sus perspectivas a nivel social y político. Las diferentes generaciones tienden a percibir de manera diferente el desempeño del gobierno local.

Aprobación del trabajo del alcalde (P126): Esta variable es esencial para evaluar la satisfacción general de los ciudadanos con la gestión del alcalde. 0-Desaprueba y 1-Aprueba

Problemas relacionados con el agua (P49): La disponibilidad y calidad del agua potable son fundamentales para el bienestar y la salud de la comunidad. Los problemas relacionados con el suministro de agua pueden afectar la percepción de la calidad de vida. ¿Durante los últimos 12 meses ha tenido algún problema relacionado con el tema del agua? 1-Disminución de presión de agua, 2-Cortes de Agua, 3-Todos, 4-Ninguno 5-Otro

Sentimiento de seguridad (P93):. La percepción de seguridad puede verse afectada por factores como el crimen, la presencia policial y la iluminación pública, lo que refleja la efectividad de las políticas de seguridad del gobierno local. ¿Qué tan seguro se siente en su municipio? 1-Muy seguro, 2-Seguro, 3-Inseguro, 4-Muy inseguro

Infraestructura municipal (P52_5): Evaluar la infraestructura municipal proporciona información sobre la eficacia de la gestión municipal en la provisión de servicios públicos y en la creación de espacios públicos accesibles. Cuentan con infraestructura necesaria (rampas para personas con discapacidad, bancas, bebederos, luminarias funcionando). 0-No y 1-Si

Percepción de corrupción (P119): Es crucial para identificar áreas de mejora en la transparencia y rendición de cuentas del gobierno municipal, además que puede esto estár relacionado con la percepción de seguridad de los habitantes. En su opinión, en su municipio la corrupción es una práctica: 1-Muy Frecuente, 2-Frecuente, 3-Poco Frecuente 4-No ocurre

Nivel educativo (CP8_1): Comprender cómo el nivel educativo afecta la percepción del desempeño del alcalde. ¿Cuál es el nivel máximo de estudios terminado?: 0-Ninguno, 1-Preescolar ,2-Primaria, 3-Secundaria, 4-Preparatoria o bachillerato general, 5-Bachillerato tecnológico, 6-Estudios técnicos o comerciales con primaria terminada, 7-Estudios técnicos o comerciales con secundaria terminada, 8-Estudios técnicos o comerciales con preparatoria terminada, 9-Normal con primaria o secundaria terminada, 10-Normal de licenciatura, 11-Licenciatura, 12-Especialidad, 13-Maestría, 14-Doctorado

Conexión a internet en el hogar (P2): Evaluar la conexión a internet en el hogar proporciona información sobre la su capacidad para participar en la vida política y social. Su hogar cuenta con una conexión a internet: 0-No y 1-Si

Ingreso mensual del hogar (P144): El nivel socioeconómico de los ciudadanos puede influir en sus expectativas y percepciones sobre el desempeño del gobierno.¿Cuál es el ingreso mensual total del hogar?: 1-sin ingreso, 2.-($1 a $6,223), 3-($6,223 a $12,446), 4-($12,446 a $18,670), 5-($18,670 a $24,893), 6-($24,893 a $31,116), 7-($31,116 a $37,339), 8-($37,339 a $43,562), 9-($43,562 a $49,786), 10-($49,786 a $56,009), 11-($56,009 a $62,232), 12-($62,232 o más)

Problemas de viviendas abandonadas (P41): La presencia de viviendas abandonadas puede afectar la percepción de seguridad y el desarrollo urbano de la comunidad. ¿Considera que en su colonia existe un problema de viviendas abandonadas?: 0-No, 1-Si

Calidad del aire (P53): La calidad del aire proporciona información sobre los problemas ambientales locales y la eficacia de las políticas de medio ambiente.Considera que la calidad del aire en su municipio es: 1-Pésimo, 2-Malo, 3-Regular, 4-Bueno, 5-Excelente

library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
eav21 <- read.csv("eav2023.csv")

Limpieza de la base de datos (2 puntos)

Se carga la base de datos seleccionando solo las variables que previamente se investigaron y que se cree que puedan tener relevancia con la aprobación del alcalde. Se retiran los valores de NA para evitar tener errores más adelante.

attach(eav21)
variables.seleccionadas <- data.frame(sexo_num,NOM_MUN_MV,CP4_1,P126,P49,P93,P52_5,P119,CP8_1,P2,P144,P41,P53)
#Creamos el dataframe con las variables relacionadas con el tema de interés
variables.seleccionadas<-na.omit(variables.seleccionadas)
#Eliminar los datos con ningun valor

Se filtran los valores al mismo tiempo que se determina si el dato va a ser utilizado como factor o numericamente, dependiendo de el uso que le queramos dar y su naturaleza. En este caso, ya que nuesto propósito es determinar si el alcalde es aprobado o no, se utilizará una regresión logistica, y por lo tanto, la mayoría de nuestras variables son consideradas como factores, es decir, a cada valor númerico se le asigna una categoría.

#Mutamos nuestras variables a lo que buscamos, y fitramos los 8888 NO SABE (NS). 9999   NO CONTESTO (NC)
base.corregida<-variables.seleccionadas%>%
  mutate(municipio=as.factor(NOM_MUN_MV))%>% #DE TEXTO A FACTOR
  
  mutate(sexo=as.factor(ifelse(sexo_num=="0", "H",
                                  ifelse(sexo_num=="1", "M", "NA"))))%>%
  
  mutate(edad=as.numeric(CP4_1))%>% #LO CONVERTIMOS A NUMERICO
  
  mutate(nivel.aprobacion=as.factor(P126))%>%#LO CONVERTIMOS A NUMERICO
  filter(nivel.aprobacion%in%c(0,1))%>% #FILTRAMOS 
  mutate(nivel.aprobacion=as.factor(ifelse(P126=="0", "No",
                                  ifelse(P126=="1", "Si", "NA"))))%>%

  mutate(problemas.de.agua=as.factor(ifelse(P49=='1', 'presion.agua',
                                  ifelse(P49=='2', 'cortes.agua',
                                  ifelse(P49=='3', 'todos',
                                  ifelse(P49=='4', 'ninguno',
                                  ifelse(P49=='5', 'todos',
                                  ifelse(P49=='6', 'ninguno','NA'))))))))%>% #DE TEXTO A FACTOR
  filter(problemas.de.agua!='NA')%>%   #FILTRAMOS NS Y NC
  
  mutate(percep.seguridad=as.factor(ifelse(P93=='1', 'Muy Seguro',
                                  ifelse(P49=='2', 'Seguro',
                                  ifelse(P49=='3', 'Inseguro',
                                  ifelse(P49=='4', 'Muy Inseguro', "NA"))))))%>%
  filter(percep.seguridad%in%c("Muy Seguro","Seguro","Inseguro","Muy Inseguro"))%>%     #FILTRAMOS NS Y NC

  
  mutate(calidad.parques=as.factor(ifelse(P52_5=="0", "No",
                                  ifelse(P52_5=="1", "Si", "NA"))))%>%
  filter(calidad.parques%in%c("No","Si"))%>%     #FILTRAMOS NS Y NC
  
  mutate(corrupcion=as.factor(ifelse(P119=='1', 'Muy Frecuente',
                                  ifelse(P119=='2', 'Frecuente',
                                  ifelse(P119=='3', 'Poco Frecuente',
                                  ifelse(P119=='4', 'No Ocurre', "NA"))))))%>%
  filter(corrupcion%in%c("Muy Frecuente","Frecuente","Poco Frecuente","No Ocurre"))%>% 
  
  mutate(estudios=as.numeric(CP8_1))%>% #LO CONVERTIMOS A FACTOR
  filter(estudios%in%c(1,2,3,4,5,6,7,8,9,10,11,12,13,14))%>%     #FILTRAMOS NS Y NC
  
  mutate(internet=as.factor(ifelse(P2=="0", "No",
                                  ifelse(P2=="1", "Si", "NA"))))%>%
  filter(internet%in%c("No","Si"))%>%    #FILTRAMOS NS Y NC
  
  mutate(casas.abandonadas=as.factor(ifelse(P41=="0", "No",
                                  ifelse(P41=="1", "Si", "NA"))))%>%
  filter(casas.abandonadas%in%c("Si","No"))%>%    #FILTRAMOS NS Y NC
  
  mutate(percep.aire=as.factor(ifelse(P53=='1', 'Pésima',
                                  ifelse(P53=='2', 'Mala',
                                  ifelse(P53=='3', 'Regular',
                                  ifelse(P53=='4', 'Buena',
                                  ifelse(P53=='5', 'Excelente',"NA")))))))%>%
  filter(percep.aire%in%c("Pésima","Mala","Regular","Buena","Excelente"))%>%    #FILTRAMOS NS Y NC
  
  mutate(maximo.ingreso=as.numeric(ifelse(P144=='1', 0,
                        ifelse(P144=='2', 6223,
                        ifelse(P144=='3', 12446,
                        ifelse(P144=='4', 18670,
                        ifelse(P144=='5', 24893,
                        ifelse(P144=='6', 31116,
                        ifelse(P144=='7', 37339,
                        ifelse(P144=='8', 43562,
                        ifelse(P144=='9', 49786,
                        ifelse(P144=='10', 56009,
                        ifelse(P144=='11', 62232,
                        ifelse(P144=='12', 70000,'NA'))))))))))))))%>%
  filter(maximo.ingreso!='NA')%>% #LO CONVERTIMOS A NUMERICO
  select(municipio, sexo, edad, nivel.aprobacion, estudios, percep.seguridad, calidad.parques, corrupcion, internet, maximo.ingreso, casas.abandonadas, problemas.de.agua, percep.aire) %>%
  droplevels() %>%
  na.omit

Modelo logístico (3 puntos)

Hacemos nuestra primera regresión con todas las variables elegidas y usando la base de datos ya limpia.

glm.fit = glm(nivel.aprobacion~sexo + edad + maximo.ingreso + percep.seguridad + calidad.parques + corrupcion + internet + maximo.ingreso + estudios + problemas.de.agua + casas.abandonadas + percep.aire, data=base.corregida,  family=binomial) #glm y family binomial para hacer una regresión logistica
summary(glm.fit)# Resutados de la regresión
## 
## Call:
## glm(formula = nivel.aprobacion ~ sexo + edad + maximo.ingreso + 
##     percep.seguridad + calidad.parques + corrupcion + internet + 
##     maximo.ingreso + estudios + problemas.de.agua + casas.abandonadas + 
##     percep.aire, family = binomial, data = base.corregida)
## 
## Coefficients:
##                                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                   -9.739e-01  4.950e-01  -1.968 0.049126 *  
## sexoM                          9.579e-03  8.305e-02   0.115 0.908182    
## edad                           3.486e-03  2.807e-03   1.242 0.214165    
## maximo.ingreso                 4.312e-05  7.269e-06   5.932 2.99e-09 ***
## percep.seguridadMuy Inseguro  -2.294e-01  4.722e-01  -0.486 0.627159    
## percep.seguridadMuy Seguro    -4.154e-02  3.104e-01  -0.134 0.893525    
## percep.seguridadSeguro        -5.391e-01  4.471e-01  -1.206 0.227920    
## calidad.parquesSi              9.922e-01  8.791e-02  11.286  < 2e-16 ***
## corrupcionMuy Frecuente       -7.413e-01  1.190e-01  -6.229 4.71e-10 ***
## corrupcionNo Ocurre            1.276e+00  1.409e-01   9.057  < 2e-16 ***
## corrupcionPoco Frecuente       1.183e+00  9.988e-02  11.840  < 2e-16 ***
## internetSi                     4.426e-02  1.165e-01   0.380 0.703985    
## estudios                      -1.254e-02  1.714e-02  -0.732 0.464278    
## problemas.de.aguaninguno      -4.798e-02  4.723e-01  -0.102 0.919086    
## problemas.de.aguapresion.agua  5.856e-01  6.017e-01   0.973 0.330483    
## problemas.de.aguatodos        -5.893e-01  4.361e-01  -1.351 0.176619    
## casas.abandonadasSi           -1.120e-02  8.623e-02  -0.130 0.896676    
## percep.aireExcelente           3.028e-01  3.397e-01   0.891 0.372716    
## percep.aireMala               -6.284e-01  1.398e-01  -4.496 6.94e-06 ***
## percep.airePésima             -6.362e-01  1.708e-01  -3.725 0.000195 ***
## percep.aireRegular            -1.070e-01  9.567e-02  -1.119 0.263185    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 4286.5  on 3092  degrees of freedom
## Residual deviance: 3486.2  on 3072  degrees of freedom
## AIC: 3528.2
## 
## Number of Fisher Scoring iterations: 4

Con los resultados se pueden seleccionar las variables que verdaderamente son significantes para determinar la aprobación del alcalde observando los valores de p. Resulta que el máximo ingreso, la corrupción, la calidad de los parques, y la percepción del aire. Repetimos la regresión solo con los valores significantes

glm.fit1 = glm(nivel.aprobacion~maximo.ingreso + percep.seguridad + calidad.parques + corrupcion + percep.aire, data=base.corregida, family= binomial)
summary(glm.fit1)
## 
## Call:
## glm(formula = nivel.aprobacion ~ maximo.ingreso + percep.seguridad + 
##     calidad.parques + corrupcion + percep.aire, family = binomial, 
##     data = base.corregida)
## 
## Coefficients:
##                                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                  -1.370e+00  1.549e-01  -8.850  < 2e-16 ***
## maximo.ingreso                4.035e-05  6.721e-06   6.003 1.93e-09 ***
## percep.seguridadMuy Inseguro  3.021e-01  1.121e-01   2.694 0.007055 ** 
## percep.seguridadMuy Seguro    4.154e-01  1.887e-01   2.202 0.027667 *  
## percep.seguridadSeguro        4.642e-02  1.007e-01   0.461 0.644770    
## calidad.parquesSi             9.911e-01  8.653e-02  11.454  < 2e-16 ***
## corrupcionMuy Frecuente      -7.381e-01  1.187e-01  -6.221 4.95e-10 ***
## corrupcionNo Ocurre           1.279e+00  1.400e-01   9.134  < 2e-16 ***
## corrupcionPoco Frecuente      1.180e+00  9.946e-02  11.864  < 2e-16 ***
## percep.aireExcelente          3.126e-01  3.376e-01   0.926 0.354544    
## percep.aireMala              -6.340e-01  1.393e-01  -4.551 5.34e-06 ***
## percep.airePésima            -6.365e-01  1.697e-01  -3.751 0.000176 ***
## percep.aireRegular           -1.133e-01  9.497e-02  -1.193 0.233036    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 4286.5  on 3092  degrees of freedom
## Residual deviance: 3493.1  on 3080  degrees of freedom
## AIC: 3519.1
## 
## Number of Fisher Scoring iterations: 4

Se observa que el intercepto es negativo, es decir, sin considerar todas las demás variables la aprobación del alcalde es negativa. Uno de los aspectos que mayor impacto tienen es la corrupción, seguido de la calidad de parques.

glm.probs <- predict(glm.fit, type = "response") # Hacemos una predicción con la regresión 


glm.pred <- rep("0", length(glm.probs))
glm.pred[glm.probs > 0.5] <- "1" #Si la probabilidad es mayor que 0.5 se aprueba al alcalde

# Generar y mostrar la matriz de confusión
tablaConfusion <- table(glm.pred, base.corregida$nivel.aprobacion)
print(tablaConfusion)
##         
## glm.pred   No   Si
##        0  999  434
##        1  516 1144
(999+1144)/(999+434+516+1144)
## [1] 0.6928548

La matriz de confusión es útil para determinar el nivel de éxito que tiene un modelo. Sirve sobretodo en modelos de clasificación (microsoft, 2024). El modelo predijo correctamente 998 no aprobados y 1137 aprobados, en total, tiene un 69% de exactitud.

Validación cruzada (3 puntos)

Hacemos Leave One Out pero no lo recomendamos para este caso por que toma mucho tiempo. Quiere decir que se crea un conjunto de entrenamiento, todas las variables menos 1, y conjunto de validación, el modelo ajustado(conjunto de entrenamiento) se usa para predecir y estimar la tasa de error

library(boot) 
cv.err<-cv.glm(base.corregida, glm.fit) #cv.glm() Realiza la validación cruzada en el modelo ajustado
cv.err$delta #resultados de la validación cruzada
## [1] 0.1942365 0.1942361

Nuestra estimación de validación cruzada para el error de la prueba es aproximadamente 0.1935

cv.error.5<-rep(0,5)
for (i in 1:5) {

cv.error.5[i]<-cv.glm(base.corregida,glm.fit)$delta[1]
} #Función de valoración cruzada
cv.error.5
## [1] 0.1942365 0.1942365 0.1942365 0.1942365 0.1942365
plot(cv.error.5) # Gráfica

Debido a que el delta es 1. No hay una clara mejoría en el error por el uso de polinomios de orden superior. Por lo cual se queda en el primer nivel.

Bootstrap

Es usado para estimar la varianza que tiene un modelo. Observando el error podemos decir que nuestro modelo esta bien aplicado pues no hay errores de gran magnitud.

boot.fn<-function(data,index){
  coefficients(glm(nivel.aprobacion~sexo + edad + maximo.ingreso + percep.seguridad + calidad.parques + corrupcion + internet + maximo.ingreso + estudios + problemas.de.agua + casas.abandonadas + percep.aire,data =base.corregida,  subset =index,family = binomial))
} #Función bootstrap
set.seed(1)
boot(base.corregida,boot.fn,1000)
## 
## ORDINARY NONPARAMETRIC BOOTSTRAP
## 
## 
## Call:
## boot(data = base.corregida, statistic = boot.fn, R = 1000)
## 
## 
## Bootstrap Statistics :
##           original        bias     std. error
## t1*  -9.738857e-01  1.143084e-02 5.869362e-01
## t2*   9.578559e-03 -6.199030e-04 8.747599e-02
## t3*   3.486490e-03  5.828697e-05 2.879665e-03
## t4*   4.312135e-05  2.964268e-07 7.842859e-06
## t5*  -2.293846e-01 -9.001008e-03 5.232678e-01
## t6*  -4.154108e-02 -1.183335e-02 4.071164e-01
## t7*  -5.390576e-01 -2.385120e-02 5.378347e-01
## t8*   9.921564e-01  6.019154e-03 8.679310e-02
## t9*  -7.412828e-01 -1.492332e-03 1.217260e-01
## t10*  1.275977e+00  9.236765e-03 1.369703e-01
## t11*  1.182552e+00  9.996565e-03 1.041969e-01
## t12*  4.426212e-02 -5.507913e-04 1.160533e-01
## t13* -1.254038e-02  5.047896e-04 1.729388e-02
## t14* -4.797913e-02 -1.420731e-02 4.425930e-01
## t15*  5.855534e-01  6.586456e-02 8.905810e-01
## t16* -5.892783e-01 -2.949357e-02 5.276741e-01
## t17* -1.119791e-02  4.981201e-03 8.581396e-02
## t18*  3.028430e-01  2.405103e-02 3.411182e-01
## t19* -6.284155e-01 -9.102821e-03 1.445105e-01
## t20* -6.362350e-01 -6.268255e-03 1.922658e-01
## t21* -1.070479e-01 -7.036060e-04 9.484543e-02

Selección y regularización de variables (3 puntos)

Para la selección de variables no utilizamos “regsubsets” porque es especial para regresiones lineales. En cambio, Ridge y Lasso ayudan a la selección de subconjuntos y estiman una lambda que funciona como penalizador del coeficiente. La diferencia entre ridge y lasso cae en que, mientras ridge solo menciona cual es la mejor lambda para el modelo, lasso busca reducir el número de variables, ambos buscando mantener el error mínimo posible.

library(ISLR)
library(leaps)
library(glmnet)
## Cargando paquete requerido: Matrix
## Loaded glmnet 4.1-8
library(Matrix)

# Preparar los datos
x <- model.matrix(nivel.aprobacion~sexo + edad + maximo.ingreso + percep.seguridad + calidad.parques + corrupcion + internet + problemas.de.agua + casas.abandonadas + percep.aire, data=base.corregida)[, -1]
y <- base.corregida$nivel.aprobacion

#REGRESIÓN RIDGE

set.seed(1) #semilla 

#Hacemos el modelo ridge con alpha=0
ridge.mod <- cv.glmnet(x, y, alpha = 0, family = "binomial")
plot(ridge.mod) #Gráfica

#Revisamos la mejor lambda para el modelo
bestlamR <- ridge.mod$lambda.min
bestlamR
## [1] 0.01584999
#Corremos el modelo con la mejor lambda
outR <- glmnet(x,y,alpha=0,family = "binomial")
predict(outR,type="coefficients",s=bestlamR)[1:20,]
##                   (Intercept)                         sexoM 
##                 -1.3168391873                  0.0163300081 
##                          edad                maximo.ingreso 
##                  0.0034199471                  0.0000386087 
##  percep.seguridadMuy Inseguro    percep.seguridadMuy Seguro 
##                  0.0496681870                  0.1826448108 
##        percep.seguridadSeguro             calidad.parquesSi 
##                 -0.1149426888                  0.9165196536 
##       corrupcionMuy Frecuente           corrupcionNo Ocurre 
##                 -0.7276302554                  1.1404067743 
##      corrupcionPoco Frecuente                    internetSi 
##                  1.0709665887                  0.0328053836 
##      problemas.de.aguaninguno problemas.de.aguapresion.agua 
##                  0.1053830848                  0.6901372334 
##        problemas.de.aguatodos           casas.abandonadasSi 
##                 -0.1724742010                 -0.0134175265 
##          percep.aireExcelente               percep.aireMala 
##                  0.3302442602                 -0.5565406770 
##             percep.airePésima            percep.aireRegular 
##                 -0.5682685460                 -0.0779168190

En la grafica se muestra que la lambda que se ajusta mejor al modelo es 0.015 manteniendo un error de 1.15 utilizando las 19 variables, mientras que los coeficientes con mayor impacto son la calidad de parques, la corrupción, la percepción del aire y los problemas de agua.

fit.ridge =glm(nivel.aprobacion~ percep.seguridad + calidad.parques + corrupcion + problemas.de.agua + percep.aire, data=base.corregida, family=binomial)
summary(fit.ridge)
## 
## Call:
## glm(formula = nivel.aprobacion ~ percep.seguridad + calidad.parques + 
##     corrupcion + problemas.de.agua + percep.aire, family = binomial, 
##     data = base.corregida)
## 
## Coefficients:
##                               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                   -0.33623    0.44521  -0.755 0.450111    
## percep.seguridadMuy Inseguro  -0.02325    0.46788  -0.050 0.960367    
## percep.seguridadMuy Seguro     0.18574    0.30578   0.607 0.543568    
## percep.seguridadSeguro        -0.43715    0.44233  -0.988 0.323019    
## calidad.parquesSi              1.12166    0.08416  13.327  < 2e-16 ***
## corrupcionMuy Frecuente       -0.76283    0.11810  -6.459 1.05e-10 ***
## corrupcionNo Ocurre            1.33325    0.13924   9.576  < 2e-16 ***
## corrupcionPoco Frecuente       1.18524    0.09895  11.979  < 2e-16 ***
## problemas.de.aguaninguno      -0.20957    0.46715  -0.449 0.653711    
## problemas.de.aguapresion.agua  0.50940    0.59835   0.851 0.394585    
## problemas.de.aguatodos        -0.43918    0.43115  -1.019 0.308382    
## percep.aireExcelente           0.26981    0.33632   0.802 0.422405    
## percep.aireMala               -0.61164    0.13844  -4.418 9.95e-06 ***
## percep.airePésima             -0.56096    0.16770  -3.345 0.000823 ***
## percep.aireRegular            -0.10025    0.09463  -1.059 0.289401    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 4286.5  on 3092  degrees of freedom
## Residual deviance: 3527.3  on 3078  degrees of freedom
## AIC: 3557.3
## 
## Number of Fisher Scoring iterations: 4

Las unicas que resultan ser relevantes son calidad de parques, corrupción, y percepción del aire.

#LASSO
set.seed(1)

#Hacemos el modelo lasso con alpha=1
lasso.mod <- cv.glmnet(x,y,alpha=1, family = "binomial")
plot(lasso.mod)# Gráfica

#Revisamos la mejor lambda para el modelo
bestlamL<- lasso.mod$lambda.min

#Corremos el modelo con la mejor lambda
outL <- cv.glmnet(x,y,alpha=1,family = "binomial")
predict(outL,type="coefficients",s=bestlamL)[1:20,]
##                   (Intercept)                         sexoM 
##                 -1.425205e+00                  0.000000e+00 
##                          edad                maximo.ingreso 
##                  2.446002e-03                  3.865049e-05 
##  percep.seguridadMuy Inseguro    percep.seguridadMuy Seguro 
##                  0.000000e+00                  1.606801e-01 
##        percep.seguridadSeguro             calidad.parquesSi 
##                  0.000000e+00                  9.727614e-01 
##       corrupcionMuy Frecuente           corrupcionNo Ocurre 
##                 -7.075404e-01                  1.220657e+00 
##      corrupcionPoco Frecuente                    internetSi 
##                  1.141433e+00                  0.000000e+00 
##      problemas.de.aguaninguno problemas.de.aguapresion.agua 
##                  2.266771e-01                  6.952975e-01 
##        problemas.de.aguatodos           casas.abandonadasSi 
##                 -5.192494e-02                  0.000000e+00 
##          percep.aireExcelente               percep.aireMala 
##                  2.292980e-01                 -5.333109e-01 
##             percep.airePésima            percep.aireRegular 
##                 -5.260495e-01                 -4.314671e-02
fit.lasso = glm(nivel.aprobacion~ maximo.ingreso + calidad.parques + corrupcion + problemas.de.agua + percep.aire, data=base.corregida, family=binomial)
summary(fit.lasso)
## 
## Call:
## glm(formula = nivel.aprobacion ~ maximo.ingreso + calidad.parques + 
##     corrupcion + problemas.de.agua + percep.aire, family = binomial, 
##     data = base.corregida)
## 
## Coefficients:
##                                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                   -1.337e+00  1.463e-01  -9.141  < 2e-16 ***
## maximo.ingreso                 4.206e-05  6.714e-06   6.265 3.74e-10 ***
## calidad.parquesSi              9.899e-01  8.663e-02  11.426  < 2e-16 ***
## corrupcionMuy Frecuente       -7.314e-01  1.185e-01  -6.170 6.84e-10 ***
## corrupcionNo Ocurre            1.279e+00  1.403e-01   9.118  < 2e-16 ***
## corrupcionPoco Frecuente       1.186e+00  9.955e-02  11.916  < 2e-16 ***
## problemas.de.aguaninguno       2.483e-01  1.047e-01   2.371 0.017760 *  
## problemas.de.aguapresion.agua  1.064e+00  5.172e-01   2.057 0.039685 *  
## problemas.de.aguatodos        -7.250e-02  9.821e-02  -0.738 0.460403    
## percep.aireExcelente           3.103e-01  3.379e-01   0.918 0.358522    
## percep.aireMala               -6.223e-01  1.395e-01  -4.462 8.11e-06 ***
## percep.airePésima             -6.164e-01  1.695e-01  -3.637 0.000276 ***
## percep.aireRegular            -1.073e-01  9.507e-02  -1.128 0.259226    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 4286.5  on 3092  degrees of freedom
## Residual deviance: 3491.3  on 3080  degrees of freedom
## AIC: 3517.3
## 
## Number of Fisher Scoring iterations: 4

En cuanto a los resultados de lasso, el coeficiente de sexo masculino, las casas abandonadas, edad, y la percepción de inseguridad (muy insegura) pasan a 0, por lo cual estas variables se deberían de retirar del modelo en caso de decidir reducir la cantidad de variables.
Es importante también notar que los coeficientes entre ridge y lasso no coinciden, y tampoco son iguales al modelo logístico original.

Pruebas para determinar la inclusión de elementos no lineales en los predictores (3 puntos)

La función de polinomios sirve para ajustar de una manera más adecuada ciertas variables, en este caso solo se pueden ajustar edad e ingreso pues son las unicas variables numericas, para esto se aplica el argumento “poly”.

# Ajustar el modelo
fitpoly <- glm(nivel.aprobacion ~ poly(maximo.ingreso, 4) + sexo + edad + percep.seguridad + calidad.parques + corrupcion + internet + estudios + problemas.de.agua + casas.abandonadas + percep.aire, data=base.corregida, family=binomial)
summary(fitpoly)
## 
## Call:
## glm(formula = nivel.aprobacion ~ poly(maximo.ingreso, 4) + sexo + 
##     edad + percep.seguridad + calidad.parques + corrupcion + 
##     internet + estudios + problemas.de.agua + casas.abandonadas + 
##     percep.aire, family = binomial, data = base.corregida)
## 
## Coefficients:
##                                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                   -0.151733   0.495433  -0.306 0.759404    
## poly(maximo.ingreso, 4)1      16.522913   2.683119   6.158 7.36e-10 ***
## poly(maximo.ingreso, 4)2      -0.592469   2.639250  -0.224 0.822381    
## poly(maximo.ingreso, 4)3      -7.958353   2.854752  -2.788 0.005307 ** 
## poly(maximo.ingreso, 4)4       7.225103   2.571945   2.809 0.004967 ** 
## sexoM                          0.004407   0.083416   0.053 0.957867    
## edad                           0.003431   0.002812   1.220 0.222309    
## percep.seguridadMuy Inseguro  -0.317351   0.472446  -0.672 0.501762    
## percep.seguridadMuy Seguro    -0.124987   0.309696  -0.404 0.686521    
## percep.seguridadSeguro        -0.639878   0.445192  -1.437 0.150631    
## calidad.parquesSi              0.962664   0.088323  10.899  < 2e-16 ***
## corrupcionMuy Frecuente       -0.759209   0.119742  -6.340 2.29e-10 ***
## corrupcionNo Ocurre            1.280641   0.141973   9.020  < 2e-16 ***
## corrupcionPoco Frecuente       1.171925   0.100228  11.693  < 2e-16 ***
## internetSi                     0.064275   0.117852   0.545 0.585485    
## estudios                      -0.017854   0.017323  -1.031 0.302684    
## problemas.de.aguaninguno      -0.053724   0.471149  -0.114 0.909217    
## problemas.de.aguapresion.agua  0.563592   0.603091   0.935 0.350043    
## problemas.de.aguatodos        -0.697678   0.434187  -1.607 0.108085    
## casas.abandonadasSi            0.003140   0.086692   0.036 0.971108    
## percep.aireExcelente           0.303336   0.341011   0.890 0.373724    
## percep.aireMala               -0.644016   0.140450  -4.585 4.53e-06 ***
## percep.airePésima             -0.661576   0.171663  -3.854 0.000116 ***
## percep.aireRegular            -0.118675   0.096122  -1.235 0.216969    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 4286.5  on 3092  degrees of freedom
## Residual deviance: 3464.8  on 3069  degrees of freedom
## AIC: 3512.8
## 
## Number of Fisher Scoring iterations: 4

De acuerdo a los p-values las variables relevantes para predecir el nivel de aprobación son: la percepción del aire, la calidad de parques, la corrupción, y el máximo ingreso. Estas variables no coinciden con las primeramente seleccionadas pues la percepción de seguridad son resulta significativa. Para determinar a que nivel polinomico es mejor elevar el ingreso se realizan las pruebas anova. Solo se tomara en cuenta hasta el 3 nivel por terminos de facilidad explicativa.

poly.1<-glm(nivel.aprobacion~poly(maximo.ingreso, 1)  + corrupcion + percep.aire+edad, data=base.corregida, family=binomial)
poly.2<-glm(nivel.aprobacion~poly(maximo.ingreso, 2)  + corrupcion + percep.aire+edad, data=base.corregida, family=binomial)
poly.3<-glm(nivel.aprobacion~poly(maximo.ingreso, 3)+ corrupcion + percep.aire+edad, data=base.corregida, family=binomial)
poly.4<-glm(nivel.aprobacion~poly(maximo.ingreso, 4)+ corrupcion + percep.aire+edad, data=base.corregida, family=binomial)

anova(poly.1, poly.2, poly.3, poly.4, test="Chisq")
## Analysis of Deviance Table
## 
## Model 1: nivel.aprobacion ~ poly(maximo.ingreso, 1) + corrupcion + percep.aire + 
##     edad
## Model 2: nivel.aprobacion ~ poly(maximo.ingreso, 2) + corrupcion + percep.aire + 
##     edad
## Model 3: nivel.aprobacion ~ poly(maximo.ingreso, 3) + corrupcion + percep.aire + 
##     edad
## Model 4: nivel.aprobacion ~ poly(maximo.ingreso, 4) + corrupcion + percep.aire + 
##     edad
##   Resid. Df Resid. Dev Df Deviance  Pr(>Chi)    
## 1      3083     3642.8                          
## 2      3082     3642.7  1   0.1685 0.6814250    
## 3      3081     3625.8  1  16.8832 3.975e-05 ***
## 4      3080     3613.3  1  12.4348 0.0004214 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Comparar los modelos usando AIC y BIC
AIC(poly.1, poly.2, poly.3, poly.4)
##        df      AIC
## poly.1 10 3662.827
## poly.2 11 3664.659
## poly.3 12 3649.775
## poly.4 13 3639.341
BIC(poly.1, poly.2, poly.3, poly.4)
##        df      BIC
## poly.1 10 3723.196
## poly.2 11 3731.064
## poly.3 12 3722.218
## poly.4 13 3717.820

A pesar de que el mejor resultado es con el ingreso al tercer nivel no consideramos que sea necesario utilizar el modelo polinómico, pues muchas variables explicativas quedan fuera de la ecuación y si se revisan los residuales es notorio que no hay una gran diferencia en estos.

Splines

El método de splines funciona como una regresión que se ajusta más a los valores de entrenamiento que se le den. La spline por default es cubica, es decir que en cada nodo se aplica un polinomio cubico. La manera en la que se modela mediante splines hace que el error se reduzca.

library(splines)

# Ajustar el modelo con splines
fitsplines <- glm(nivel.aprobacion ~ bs(maximo.ingreso, knots=c(6223, 37339, 70000)) + sexo + edad + percep.seguridad + calidad.parques + corrupcion + internet + estudios + problemas.de.agua + casas.abandonadas + percep.aire, data=base.corregida, family=binomial)
summary(fitsplines)
## 
## Call:
## glm(formula = nivel.aprobacion ~ bs(maximo.ingreso, knots = c(6223, 
##     37339, 70000)) + sexo + edad + percep.seguridad + calidad.parques + 
##     corrupcion + internet + estudios + problemas.de.agua + casas.abandonadas + 
##     percep.aire, family = binomial, data = base.corregida)
## 
## Coefficients: (1 not defined because of singularities)
##                                                     Estimate Std. Error z value
## (Intercept)                                         0.013413   0.602068   0.022
## bs(maximo.ingreso, knots = c(6223, 37339, 70000))1 -0.085432   0.455033  -0.188
## bs(maximo.ingreso, knots = c(6223, 37339, 70000))2 -1.424391   0.506029  -2.815
## bs(maximo.ingreso, knots = c(6223, 37339, 70000))3  3.597599   0.823547   4.368
## bs(maximo.ingreso, knots = c(6223, 37339, 70000))4 -3.311114   1.483437  -2.232
## bs(maximo.ingreso, knots = c(6223, 37339, 70000))5  2.466501   5.315311   0.464
## bs(maximo.ingreso, knots = c(6223, 37339, 70000))6        NA         NA      NA
## sexoM                                               0.008838   0.083437   0.106
## edad                                                0.003428   0.002811   1.219
## percep.seguridadMuy Inseguro                       -0.321434   0.473209  -0.679
## percep.seguridadMuy Seguro                         -0.140526   0.311353  -0.451
## percep.seguridadSeguro                             -0.675971   0.447388  -1.511
## calidad.parquesSi                                   0.967067   0.088336  10.948
## corrupcionMuy Frecuente                            -0.760987   0.119753  -6.355
## corrupcionNo Ocurre                                 1.283384   0.142069   9.034
## corrupcionPoco Frecuente                            1.167688   0.100246  11.648
## internetSi                                          0.071189   0.117897   0.604
## estudios                                           -0.019021   0.017365  -1.095
## problemas.de.aguaninguno                           -0.091821   0.472345  -0.194
## problemas.de.aguapresion.agua                       0.538162   0.603448   0.892
## problemas.de.aguatodos                             -0.738461   0.436645  -1.691
## casas.abandonadasSi                                 0.003865   0.086695   0.045
## percep.aireExcelente                                0.279730   0.341944   0.818
## percep.aireMala                                    -0.644235   0.140482  -4.586
## percep.airePésima                                  -0.672030   0.171991  -3.907
## percep.aireRegular                                 -0.119659   0.096105  -1.245
##                                                    Pr(>|z|)    
## (Intercept)                                         0.98223    
## bs(maximo.ingreso, knots = c(6223, 37339, 70000))1  0.85107    
## bs(maximo.ingreso, knots = c(6223, 37339, 70000))2  0.00488 ** 
## bs(maximo.ingreso, knots = c(6223, 37339, 70000))3 1.25e-05 ***
## bs(maximo.ingreso, knots = c(6223, 37339, 70000))4  0.02561 *  
## bs(maximo.ingreso, knots = c(6223, 37339, 70000))5  0.64262    
## bs(maximo.ingreso, knots = c(6223, 37339, 70000))6       NA    
## sexoM                                               0.91564    
## edad                                                0.22267    
## percep.seguridadMuy Inseguro                        0.49697    
## percep.seguridadMuy Seguro                          0.65174    
## percep.seguridadSeguro                              0.13081    
## calidad.parquesSi                                   < 2e-16 ***
## corrupcionMuy Frecuente                            2.09e-10 ***
## corrupcionNo Ocurre                                 < 2e-16 ***
## corrupcionPoco Frecuente                            < 2e-16 ***
## internetSi                                          0.54596    
## estudios                                            0.27337    
## problemas.de.aguaninguno                            0.84587    
## problemas.de.aguapresion.agua                       0.37249    
## problemas.de.aguatodos                              0.09080 .  
## casas.abandonadasSi                                 0.96444    
## percep.aireExcelente                                0.41332    
## percep.aireMala                                    4.52e-06 ***
## percep.airePésima                                  9.33e-05 ***
## percep.aireRegular                                  0.21310    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 4286.5  on 3092  degrees of freedom
## Residual deviance: 3463.9  on 3068  degrees of freedom
## AIC: 3513.9
## 
## Number of Fisher Scoring iterations: 5

Los resultados indican que las variables significativas son: calidad de parques, corrupción, maximo ingreso y percepción de aire, pues son las unicas que tienen un valor significativo de p, y de estas la que tiene mayor impacto es la corrupción con un coeficiente de 1.296. Estas variables concuerdan con las anteirores pero no con las utilizadas por otro modelo. Debido a que nuestro modelo cuenta con muy pocas variables numericas, la mayoria siendo factores, splines no tiene mucha utilidad explicativa para este caso y por lo tanto se decidio no utilizarla.

## [1] 3093    6
## [1] 3093    6
## [1] 12446 12446 18670

En este caso R elige nodos a las edades de 12,446, 12,446 y 18,670, que corresponden al percentil 6223, 37339, 70000

# Ajustar el modelo con splines
fit2 <- glm(nivel.aprobacion ~ ns(maximo.ingreso, df=10) + sexo + edad + percep.seguridad + calidad.parques + corrupcion + internet + estudios + problemas.de.agua + casas.abandonadas + percep.aire, data=base.corregida, family=binomial)
summary(fit2)
## 
## Call:
## glm(formula = nivel.aprobacion ~ ns(maximo.ingreso, df = 10) + 
##     sexo + edad + percep.seguridad + calidad.parques + corrupcion + 
##     internet + estudios + problemas.de.agua + casas.abandonadas + 
##     percep.aire, family = binomial, data = base.corregida)
## 
## Coefficients: (4 not defined because of singularities)
##                                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                   -0.0193812  0.5999407  -0.032    0.974    
## ns(maximo.ingreso, df = 10)1   0.2735703  7.1045999   0.039    0.969    
## ns(maximo.ingreso, df = 10)2          NA         NA      NA       NA    
## ns(maximo.ingreso, df = 10)3  -0.4412845  0.3638126  -1.213    0.225    
## ns(maximo.ingreso, df = 10)4          NA         NA      NA       NA    
## ns(maximo.ingreso, df = 10)5          NA         NA      NA       NA    
## ns(maximo.ingreso, df = 10)6   0.0438477  0.3679965   0.119    0.905    
## ns(maximo.ingreso, df = 10)7   0.5432249  0.4899791   1.109    0.268    
## ns(maximo.ingreso, df = 10)8   0.9149999  1.7834144   0.513    0.608    
## ns(maximo.ingreso, df = 10)9  -0.5338351  3.3102736  -0.161    0.872    
## ns(maximo.ingreso, df = 10)10         NA         NA      NA       NA    
## sexoM                          0.0064340  0.0834667   0.077    0.939    
## edad                           0.0032812  0.0028164   1.165    0.244    
## percep.seguridadMuy Inseguro  -0.3103909  0.4710672  -0.659    0.510    
## percep.seguridadMuy Seguro    -0.1207623  0.3087358  -0.391    0.696    
## percep.seguridadSeguro        -0.6379123  0.4446660  -1.435    0.151    
## calidad.parquesSi              0.9656365  0.0884340  10.919  < 2e-16 ***
## corrupcionMuy Frecuente       -0.7545825  0.1200167  -6.287 3.23e-10 ***
## corrupcionNo Ocurre            1.2920241  0.1420550   9.095  < 2e-16 ***
## corrupcionPoco Frecuente       1.1682940  0.1002785  11.650  < 2e-16 ***
## internetSi                     0.0735233  0.1179466   0.623    0.533    
## estudios                      -0.0181708  0.0173583  -1.047    0.295    
## problemas.de.aguaninguno      -0.0654233  0.4702881  -0.139    0.889    
## problemas.de.aguapresion.agua  0.5490741  0.6027753   0.911    0.362    
## problemas.de.aguatodos        -0.7006450  0.4336784  -1.616    0.106    
## casas.abandonadasSi            0.0001643  0.0868133   0.002    0.998    
## percep.aireExcelente           0.2830007  0.3411202   0.830    0.407    
## percep.aireMala               -0.6495605  0.1405558  -4.621 3.81e-06 ***
## percep.airePésima             -0.6818259  0.1719774  -3.965 7.35e-05 ***
## percep.aireRegular            -0.1183747  0.0961640  -1.231    0.218    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 4286.5  on 3092  degrees of freedom
## Residual deviance: 3463.1  on 3067  degrees of freedom
## AIC: 3515.1
## 
## Number of Fisher Scoring iterations: 4

Modelos aditivos generalizados (3 puntos)

La diferencia de GAM con otros modelos es que x y y no tiene una relación directa, sino que se hace a través de una función. Las gráficas siguientes representan el comportamiento de cada variable dentro del modelo.

library(gam)
## Cargando paquete requerido: foreach
## Loaded gam 1.22-3
gam.lr<-gam(nivel.aprobacion~maximo.ingreso+s(edad, df=5)+sexo + edad + percep.seguridad + calidad.parques + corrupcion + internet + maximo.ingreso + estudios + problemas.de.agua + casas.abandonadas + percep.aire, family =binomial, data=base.corregida)
par(mfrow=c(1,3))
plot(gam.lr, se=T, col="green")

En la gráfica de edad se observa que a partir de los 70 años el modelo aumenta su error, lo cual quiere decir que al menos esa variable es menos precisa con personas mayores.

table(maximo.ingreso, nivel.aprobacion)
##               nivel.aprobacion
## maximo.ingreso  No  Si
##          0      21  18
##          6223  185 121
##          12446 786 562
##          18670 372 525
##          24893 111 261
##          31116  27  68
##          37339   8  15
##          43562   2   5
##          49786   3   1
##          62232   0   2

Árboles de decisión (3 puntos)

El árbol de decisión es una herramienta que ayuda a observar visualmente la relevancia de ciertas variables. Cuenta con los nodos terminales que representan la estimación o decisión final que se tomaría dadas ciertas circunstancias.

library(tree)
library(caret)
## Cargando paquete requerido: ggplot2
## Cargando paquete requerido: lattice
## 
## Adjuntando el paquete: 'lattice'
## The following object is masked from 'package:boot':
## 
##     melanoma
# Ajustar el árbol de decisión
set.seed(123)
tree.aprobacion <- tree(nivel.aprobacion ~ sexo + edad + maximo.ingreso + percep.seguridad + calidad.parques + corrupcion + internet + maximo.ingreso + estudios + problemas.de.agua + casas.abandonadas + percep.aire,
                        data = base.corregida,
                        control = tree.control(nobs = nrow(base.corregida), mincut = 5, minsize = 10, mindev = 0.002),
                        )

# Resumen del árbol
summary(tree.aprobacion)
## 
## Classification tree:
## tree(formula = nivel.aprobacion ~ sexo + edad + maximo.ingreso + 
##     percep.seguridad + calidad.parques + corrupcion + internet + 
##     maximo.ingreso + estudios + problemas.de.agua + casas.abandonadas + 
##     percep.aire, data = base.corregida, control = tree.control(nobs = nrow(base.corregida), 
##     mincut = 5, minsize = 10, mindev = 0.002))
## Variables actually used in tree construction:
## [1] "corrupcion"        "calidad.parques"   "maximo.ingreso"   
## [4] "percep.aire"       "casas.abandonadas" "edad"             
## [7] "estudios"          "problemas.de.agua"
## Number of terminal nodes:  18 
## Residual mean deviance:  1.095 = 3366 / 3075 
## Misclassification error rate: 0.2823 = 873 / 3093
# Plot del árbol de decisión
plot(tree.aprobacion)
text(tree.aprobacion, pretty = 0, cex=0.5)

Con este árbol se tienen 18 posibles caminos y resultados, con un error de 28% y la variable de corrupción y calidad de parques siendo las 2 más relevantes.

A continuación, se realiza el proceso de bagging, es decir se crea un conjunto de prueba para calcular el error del árbol usando el 30% de las observaciones como prueba. Utilizando este conjunto de prueba se realiza una predicción y luego se compara con el modelo normal. Después se utiliza Random Forest que sirve para la reducción del modelo, para que así las ramas y decisiones que se tomen a través del árbol estén más claras, y por último se calcula la varianza y relevancia de las variables en el modelo ya ajustado.

#Bagging
library(randomForest)
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
## 
## Adjuntando el paquete: 'randomForest'
## The following object is masked from 'package:ggplot2':
## 
##     margin
## The following object is masked from 'package:dplyr':
## 
##     combine
set.seed(1) #semilla  

# Dividir los datos en conjuntos de entrenamiento (70%) y prueba (30%)

trainDiv <- createDataPartition(base.corregida$nivel.aprobacion, p = 0.7, list = FALSE, times = 1)
trainBag<- base.corregida[trainDiv, ]
testBag<- base.corregida[-trainDiv, ]

# Ajustar el modelo de Bagging considerando todos los predictores

set.seed(1)
bag.mod <- randomForest(nivel.aprobacion~sexo + edad + maximo.ingreso + percep.seguridad + calidad.parques + corrupcion + internet + problemas.de.agua + casas.abandonadas + percep.aire, data = trainBag, mtry = 5, importance = TRUE)

# Predicciones en el conjunto de prueba utilizando la prueba

bag.pred <- predict(bag.mod, data = testBag)


# Ajustar el modelo de Random Forest con mtry = sqrt(p)

set.seed(1)
rf.mod <- randomForest(nivel.aprobacion~sexo + edad + maximo.ingreso + percep.seguridad + calidad.parques + corrupcion + internet + problemas.de.agua + casas.abandonadas + percep.aire, data = trainBag, mtry = sqrt(ncol(trainBag) - 1), importance = TRUE)


# Calcular el MSE para el modelo de Random Forest
rf.mse <- mean((bag.pred != testBag$nivel.aprobacion)^2)
## Warning in `!=.default`(bag.pred, testBag$nivel.aprobacion): longitud de objeto
## mayor no es múltiplo de la longitud de uno menor
## Warning in is.na(e1) | is.na(e2): longitud de objeto mayor no es múltiplo de la
## longitud de uno menor
rf.mse
## [1] 0.5032318
# Mostrar la importancia de las variables para el modelo de Random Forest
importance(rf.mod)
##                          No        Si MeanDecreaseAccuracy MeanDecreaseGini
## sexo               1.112606  3.176165            3.1334261         36.32889
## edad               2.327616  1.759177            2.9324486        222.03084
## maximo.ingreso    24.146980 15.374347           26.8805844         94.52958
## percep.seguridad  10.045101  7.177426           14.2064682         46.43022
## calidad.parques   35.798608 32.118255           47.3788862         81.41525
## corrupcion        67.202759 58.769990           82.4212885        169.77582
## internet           3.622966 -3.430956            0.4023315         25.79021
## problemas.de.agua  8.301730 10.847951           16.0295706         37.56610
## casas.abandonadas  5.564592  3.209372            6.1467007         35.74082
## percep.aire       22.378324 17.670167           29.2215545         88.68277
varImpPlot(rf.mod) 

Como se puede observar del lado izquierdo, las variables que menos aportan a la exactitud del modelo son el internet, la edad, el sexo, las casas abandonadas, y el internet. La mayoría de las variables se encuentran en un lugar parecido cuando se observa la tabla de error, sin embargo, la edad esta prácticamente en lo contrario, por lo que queda a consideración del analista decidir si la deja o no. En cuanto a las otras variables las que cuentan con mayor precisión son: la corrupción, calidad de parques, percepción del aire, máximo ingreso, problemas de agua y percepción de seguridad, las cuales concuerdan con las seleccionadas en el primer modelo.

# Validación Cruzada del Árbol, comparar tamaño del árbol vs. desviación
cv.aprobacion<-cv.tree(tree.aprobacion)
plot(cv.aprobacion$size, cv.aprobacion$dev, type="b")

# Podar Árbol
prune.aprobacion<-prune.tree(tree.aprobacion, best=6)
plot(prune.aprobacion)
text(prune.aprobacion, pretty=0)

Comparativas y selección del modelo final (2 puntos)

Todas las Variables

anova(glm.fit, fitpoly, fitsplines, fit2,  gam.lr, test="Chisq")
## Analysis of Deviance Table
## 
## Model 1: nivel.aprobacion ~ sexo + edad + maximo.ingreso + percep.seguridad + 
##     calidad.parques + corrupcion + internet + maximo.ingreso + 
##     estudios + problemas.de.agua + casas.abandonadas + percep.aire
## Model 2: nivel.aprobacion ~ poly(maximo.ingreso, 4) + sexo + edad + percep.seguridad + 
##     calidad.parques + corrupcion + internet + estudios + problemas.de.agua + 
##     casas.abandonadas + percep.aire
## Model 3: nivel.aprobacion ~ bs(maximo.ingreso, knots = c(6223, 37339, 
##     70000)) + sexo + edad + percep.seguridad + calidad.parques + 
##     corrupcion + internet + estudios + problemas.de.agua + casas.abandonadas + 
##     percep.aire
## Model 4: nivel.aprobacion ~ ns(maximo.ingreso, df = 10) + sexo + edad + 
##     percep.seguridad + calidad.parques + corrupcion + internet + 
##     estudios + problemas.de.agua + casas.abandonadas + percep.aire
## Model 5: nivel.aprobacion ~ maximo.ingreso + s(edad, df = 5) + sexo + 
##     edad + percep.seguridad + calidad.parques + corrupcion + 
##     internet + maximo.ingreso + estudios + problemas.de.agua + 
##     casas.abandonadas + percep.aire
##   Resid. Df Resid. Dev       Df Deviance  Pr(>Chi)    
## 1      3072     3486.2                                
## 2      3069     3464.8  3.00000  21.4202 8.610e-05 ***
## 3      3068     3463.9  1.00000   0.9187    0.3378    
## 4      3067     3463.1  1.00000   0.7351    0.3912    
## 5      3068     3479.7 -0.99971 -16.5781 4.666e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Comparar los modelos con todas las variables usando AIC y BIC
AIC(glm.fit, fitpoly, fitsplines, fit2,  gam.lr)
##            df      AIC
## glm.fit    21 3528.215
## fitpoly    24 3512.795
## fitsplines 25 3513.876
## fit2       26 3515.141
## gam.lr     21 3529.720
BIC(glm.fit, fitpoly, fitsplines, fit2,  gam.lr)
##            df      BIC
## glm.fit    21 3654.990
## fitpoly    24 3657.681
## fitsplines 25 3664.799
## fit2       26 3672.101
## gam.lr     21 3656.495

Variables de Ridge y Lasso

# Comparar los modelos usando AIC y BIC
AIC(glm.fit1, fit.lasso, fit.ridge)
##           df      AIC
## glm.fit1  13 3519.113
## fit.lasso 13 3517.275
## fit.ridge 15 3557.303
BIC(glm.fit1, fit.lasso, fit.ridge)
##           df      BIC
## glm.fit1  13 3597.593
## fit.lasso 13 3595.755
## fit.ridge 15 3647.857

Para las pruebas de ridge y lasso no es posible utilizar la prueba anova, por lo cual se utiliza con AIC y BIC, donde entre menos sea el resultado. En base a este resultado las mejores variables son maximo ingreso, calidad de parques, corrupción, problemas de agua, y percepción del aire

Conclusiones (2 puntos)

Durante el proceso de análisis y modelado en R para evaluar la aprobación del alcalde y la percepción del gobierno local por parte de los ciudadanos, se implementaron diversas estrategias con el objetivo de identificar el mejor modelo ajustado. Se llevaron a cabo etapas cruciales como la validación cruzada y el análisis de varianza (ANOVA), las cuales fueron fundamentales para evaluar la efectividad de los modelos propuestos. Inicialmente, se realizó una exhaustiva investigación para seleccionar las variables más pertinentes, complementada posteriormente con técnicas como Ridge y Lasso para validar esta selección.

Durante el proceso, se evaluó la viabilidad de ajustes polinómicos en las variables numéricas. Sin embargo, se determinó que dichos ajustes no eran necesarios debido a su complejidad y la falta de significancia adicional que aportaban al modelo. Asimismo, se construyó un árbol de decisión como herramienta visual para el análisis y la interpretación del modelo propuesto.

En la fase de selección final de modelos, se emplearon criterios como el Criterio de Información Bayesiano (BIC) y el Criterio de Información de Akaike (AIC). Se optó por el modelo con las variables seleccionadas con Lasso (sin ajustes polinómicos), el cual demostró tener el BIC más bajo (este criterio fue preferido sobre el AIC debido a su penalización más estricta hacia la complejidad del modelo). Este resultado indica que el modelo seleccionado ofrece el mejor ajuste a los datos observados sin complicaciones adicionales como los ajustes polinómicos de orden elevado, que podrían dificultar la interpretación y expresión del modelo.

Recomendaciones para el socio formador enfocadas en detección de problemáticas con las que se enfrentaron al usar la encuesta y propuestas para mejorarla (2 puntos)

Como recomendaciones para Cómo Vamos Nuevo León, sugerimos, en la base de datos, la implementación de más variables numéricas y la conversión de algunas variables categóricas a numéricas. Por ejemplo, el ingreso del hogar actualmente está categorizado, lo que es útil para la creación de gráficas pero puede sesgar resultados en análisis avanzados. Convertir estas variables a un formato numérico, que a su vez puede ser categorizado cuando sea necesario, permitirá una mayor flexibilidad y precisión en los análisis.

Asimismo, recomendamos enfocarse en las preguntas sin respuestas dentro de la base de datos, ya que para un análisis estadístico riguroso es necesario eliminarlas. Por ello, mejorar el proceso de captura de respuestas es pertinente. Esto garantizará una mayor integridad de los datos y reducirá la necesidad de eliminación, permitiendo un análisis más completo y preciso.

Adicionalmente, sugerimos agregar más información detallada en áreas como los gastos del hogar, similar a lo que hace la ENIGH, pero representativo a nivel municipal. Esto proporcionará datos valiosos para investigaciones locales en Nuevo León.

Por último, consideramos pertinente integrar el cuestionario completo dentro de la misma base de datos. Cambiar entre documentos para verificar la escala de las variables es hasta cierto punto ineficiente, por lo que incluir esta información en un solo archivo mejorará la fluidez del trabajo y reducirá errores.