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
library(readr)
library(caret)
## Warning: package 'caret' was built under R version 4.5.3
## Cargando paquete requerido: ggplot2
## Cargando paquete requerido: lattice
## Warning: package 'lattice' was built under R version 4.5.3
library(pROC)
## Warning: package 'pROC' was built under R version 4.5.3
## Type 'citation("pROC")' for a citation.
## 
## Adjuntando el paquete: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
bd_limpia <- read_csv("bd_limpia_eav2025.csv") %>%
  mutate(
    cp2_1      = as.factor(cp2_1),
    nom_mun_mv = as.factor(nom_mun_mv),
    cp4_1      = as.numeric(cp4_1)
  )
## Rows: 4955 Columns: 34
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (14): nom_mun_mv, percepcion_seguridad_municipio, autoridad_denuncia, pr...
## dbl (20): cp4_1, cp2_1, razon_inseguridad_principal, victima_delito_hogar, d...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Verificar

names(bd_limpia)
##  [1] "cp4_1"                              "cp2_1"                             
##  [3] "nom_mun_mv"                         "percepcion_seguridad_municipio"    
##  [5] "razon_inseguridad_principal"        "victima_delito_hogar"              
##  [7] "denuncia_delito"                    "autoridad_denuncia"                
##  [9] "evaluacion_denuncia"                "probabilidad_castigo_delito"       
## [11] "autoridad_responsable_seguridad"    "aprobacion_fiscalia"               
## [13] "policia_presencia_suficiente"       "policia_genera_seguridad"          
## [15] "confianza_policia_colonia"          "policia_trato_respetuoso"          
## [17] "policia_resuelve_conflictos"        "policia_justa"                     
## [19] "evaluacion_policia_municipal"       "evaluacion_fuerza_civil"           
## [21] "evaluacion_guardia_nacional"        "evaluacion_ejercito_marina"        
## [23] "evaluacion_transito"                "contacto_policia"                  
## [25] "institucion_contacto"               "policia_cumplio_funcion"           
## [27] "policia_solicito_soborno"           "policia_respondio_llamado"         
## [29] "percepcion_violencia_mujeres_hogar" "acoso_callejero_ofensivo"          
## [31] "acoso_callejero_ofensivo.1"         "mujeres_responsables_vestimenta"   
## [33] "mujeres_responsables_no_alejarse"   "problema_seguridad_principal"
dim(bd_limpia)
## [1] 4955   34
nrow(bd_limpia)
## [1] 4955
str(bd_limpia)
## tibble [4,955 × 34] (S3: tbl_df/tbl/data.frame)
##  $ cp4_1                             : num [1:4955] 48 48 79 66 27 39 57 55 29 62 ...
##  $ cp2_1                             : Factor w/ 2 levels "0","1": 2 2 2 1 2 1 2 1 2 1 ...
##  $ nom_mun_mv                        : Factor w/ 41 levels "Agualeguas","Allende",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ percepcion_seguridad_municipio    : chr [1:4955] "Seguro(a)" "Seguro(a)" "Seguro(a)" "Seguro(a)" ...
##  $ razon_inseguridad_principal       : num [1:4955] NA NA NA NA NA 3 NA NA NA NA ...
##  $ victima_delito_hogar              : num [1:4955] 0 0 0 0 0 0 0 0 0 0 ...
##  $ denuncia_delito                   : num [1:4955] NA NA NA NA NA NA NA NA NA NA ...
##  $ autoridad_denuncia                : chr [1:4955] NA NA NA NA ...
##  $ evaluacion_denuncia               : num [1:4955] NA NA NA NA NA NA NA NA NA NA ...
##  $ probabilidad_castigo_delito       : chr [1:4955] "Probable" "Probable" "Probable" "Probable" ...
##  $ autoridad_responsable_seguridad   : chr [1:4955] "Policía Estatal" "La Fiscalía General de Justicia" "La Fiscalía General de Justicia" "La Fiscalía General de Justicia" ...
##  $ aprobacion_fiscalia               : num [1:4955] 1 1 1 1 8888 ...
##  $ policia_presencia_suficiente      : num [1:4955] 1 1 1 1 0 0 1 0 1 1 ...
##  $ policia_genera_seguridad          : chr [1:4955] "Sí" "Sí" "Sí" "Sí" ...
##  $ confianza_policia_colonia         : chr [1:4955] "Sí" "Sí" "Sí" "Sí" ...
##  $ policia_trato_respetuoso          : chr [1:4955] "Sí" "Sí" "Sí" "Sí" ...
##  $ policia_resuelve_conflictos       : chr [1:4955] "Sí" "Sí" "Sí" "Sí" ...
##  $ policia_justa                     : chr [1:4955] "Sí" "Sí" "Sí" "Sí" ...
##  $ evaluacion_policia_municipal      : num [1:4955] 9 10 9 9 1 5 9 7 8 8 ...
##  $ evaluacion_fuerza_civil           : num [1:4955] 9 10 9 9 5 5 10 8 8 9 ...
##  $ evaluacion_guardia_nacional       : num [1:4955] 8 10 9 9 5 5 10 8 8 9 ...
##  $ evaluacion_ejercito_marina        : num [1:4955] 9 10 9 9 5 8 10 8 8 9 ...
##  $ evaluacion_transito               : num [1:4955] 9 10 7 7 1 2 10 7 5 6 ...
##  $ contacto_policia                  : num [1:4955] 0 0 0 0 0 0 0 0 0 0 ...
##  $ institucion_contacto              : chr [1:4955] NA NA NA NA ...
##  $ policia_cumplio_funcion           : num [1:4955] NA NA NA NA NA NA NA NA NA NA ...
##  $ policia_solicito_soborno          : num [1:4955] NA NA NA NA NA NA NA NA NA NA ...
##  $ policia_respondio_llamado         : chr [1:4955] NA NA NA NA ...
##  $ percepcion_violencia_mujeres_hogar: chr [1:4955] "Casi no ocurre" "Casi no ocurre" "Casi no ocurre" "Casi no ocurre" ...
##  $ acoso_callejero_ofensivo          : num [1:4955] 1 1 0 0 1 ...
##  $ acoso_callejero_ofensivo.1        : num [1:4955] 1 1 0 0 1 0 0 1 1 1 ...
##  $ mujeres_responsables_vestimenta   : num [1:4955] 1 0 0 0 0 0 0 0 1 0 ...
##  $ mujeres_responsables_no_alejarse  : num [1:4955] 1 1 0 1 1 1 0 1 1 0 ...
##  $ problema_seguridad_principal      : chr [1:4955] "Robos patrimoniales" "Robos patrimoniales" "Ninguno" "Ninguno" ...

Primer análisis

# Variable a predecir

bd_analisis <- bd_limpia %>% 
  mutate(across(
    c(
      evaluacion_policia_municipal,
      evaluacion_fuerza_civil,
      evaluacion_guardia_nacional,
      evaluacion_ejercito_marina,
      evaluacion_transito
    ),
    ~ ifelse(. %in% c(7777, 8888, 9999), NA, .)
  )) %>% 
  mutate(
    confianza_policiaca = rowMeans(
      across(c(
        evaluacion_policia_municipal,
        evaluacion_fuerza_civil,
        evaluacion_guardia_nacional,
        evaluacion_ejercito_marina,
        evaluacion_transito
      )),
      na.rm = TRUE
    ),
    confianza_policiaca = ifelse(
      is.nan(confianza_policiaca),
      NA,
      confianza_policiaca
    )
  ) %>% 
  filter(
    percepcion_seguridad_municipio %in% c(
      "Muy seguro(a)",
      "Seguro(a)",
      "Inseguro(a)",
      "Muy inseguro(a)"
    )
  ) %>%
  mutate(
    percepcion_seguridad_municipio = as.factor(percepcion_seguridad_municipio)
  )

summary(bd_analisis$confianza_policiaca)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   1.000   6.800   7.800   7.494   8.600  10.000       9

Modelo lineal

# Primer modelo 
# Se crea una base específica para el modelo lineal
# Esto evita problemas con NA y con niveles nuevos al predecir

variables_lm <- c(
  "confianza_policiaca",
  "percepcion_seguridad_municipio",
  "razon_inseguridad_principal",
  "denuncia_delito"
)

bd_lm <- bd_analisis %>%
  select(all_of(variables_lm)) %>%
  mutate(
    percepcion_seguridad_municipio = as.factor(percepcion_seguridad_municipio),
    razon_inseguridad_principal = as.factor(razon_inseguridad_principal),
    denuncia_delito = as.factor(denuncia_delito)
  ) %>%
  na.omit() %>%
  droplevels()

table(bd_lm$percepcion_seguridad_municipio)
## 
##     Inseguro(a) Muy inseguro(a) 
##              86              11
m1 <- lm(
  confianza_policiaca ~ percepcion_seguridad_municipio + razon_inseguridad_principal + denuncia_delito,
  data = bd_lm
)

summary(m1)
## 
## Call:
## lm(formula = confianza_policiaca ~ percepcion_seguridad_municipio + 
##     razon_inseguridad_principal + denuncia_delito, data = bd_lm)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.0287 -0.8928  0.3312  1.0254  3.4377 
## 
## Coefficients:
##                                                Estimate Std. Error t value
## (Intercept)                                    6.374554   0.341695  18.656
## percepcion_seguridad_municipioMuy inseguro(a) -0.906490   0.509950  -1.778
## razon_inseguridad_principal2                   0.268246   0.370525   0.724
## razon_inseguridad_principal3                  -0.491699   0.617614  -0.796
## razon_inseguridad_principal4                  -0.658525   0.696090  -0.946
## razon_inseguridad_principal5                   2.225446   1.602751   1.389
## razon_inseguridad_principal6                  -0.767510   1.142375  -0.672
## razon_inseguridad_principal7                  -1.174554   1.602751  -0.733
## razon_inseguridad_principal9                  -1.560467   1.596538  -0.977
## razon_inseguridad_principal11                 -0.774554   1.602751  -0.483
## razon_inseguridad_principal12                 -0.001028   0.953215  -0.001
## razon_inseguridad_principal13                 -2.374554   1.602751  -1.482
## razon_inseguridad_principal14                 -1.360467   1.596538  -0.852
## denuncia_delito1                               0.185913   0.333610   0.557
##                                               Pr(>|t|)    
## (Intercept)                                     <2e-16 ***
## percepcion_seguridad_municipioMuy inseguro(a)   0.0791 .  
## razon_inseguridad_principal2                    0.4711    
## razon_inseguridad_principal3                    0.4282    
## razon_inseguridad_principal4                    0.3469    
## razon_inseguridad_principal5                    0.1687    
## razon_inseguridad_principal6                    0.5035    
## razon_inseguridad_principal7                    0.4657    
## razon_inseguridad_principal9                    0.3312    
## razon_inseguridad_principal11                   0.6302    
## razon_inseguridad_principal12                   0.9991    
## razon_inseguridad_principal13                   0.1422    
## razon_inseguridad_principal14                   0.3966    
## denuncia_delito1                                0.5788    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.566 on 83 degrees of freedom
## Multiple R-squared:  0.1419, Adjusted R-squared:  0.007448 
## F-statistic: 1.055 on 13 and 83 DF,  p-value: 0.4088
# Dividir en conjunto de prueba y de entrenamiento 
# Propuesta de división en 70% para train y 30% para prueba

set.seed(8)

entrenamiento <- createDataPartition(
  bd_lm$percepcion_seguridad_municipio,
  p = 0.7,
  list = FALSE
)

datos_entrenamiento <- bd_lm[entrenamiento, ]
datos_prueba <- bd_lm[-entrenamiento, ]

# Ajuste de niveles para evitar el error de new levels

niveles_percepcion <- levels(droplevels(datos_entrenamiento$percepcion_seguridad_municipio))
niveles_razon <- levels(droplevels(datos_entrenamiento$razon_inseguridad_principal))
niveles_denuncia <- levels(droplevels(datos_entrenamiento$denuncia_delito))

datos_entrenamiento <- datos_entrenamiento %>%
  mutate(
    percepcion_seguridad_municipio = factor(
      percepcion_seguridad_municipio,
      levels = niveles_percepcion
    ),
    razon_inseguridad_principal = factor(
      razon_inseguridad_principal,
      levels = niveles_razon
    ),
    denuncia_delito = factor(
      denuncia_delito,
      levels = niveles_denuncia
    )
  ) %>%
  droplevels()

datos_prueba <- datos_prueba %>%
  mutate(
    percepcion_seguridad_municipio = factor(
      as.character(percepcion_seguridad_municipio),
      levels = niveles_percepcion
    ),
    razon_inseguridad_principal = factor(
      as.character(razon_inseguridad_principal),
      levels = niveles_razon
    ),
    denuncia_delito = factor(
      as.character(denuncia_delito),
      levels = niveles_denuncia
    )
  ) %>%
  filter(
    !is.na(percepcion_seguridad_municipio),
    !is.na(razon_inseguridad_principal),
    !is.na(denuncia_delito)
  ) %>%
  droplevels()

cat("Entrenamiento =", nrow(datos_entrenamiento), "observaciones\n")
## Entrenamiento = 69 observaciones
cat("Prueba =", nrow(datos_prueba), "observaciones\n")
## Prueba = 27 observaciones
# Predicción de variable con base en entrenamiento 

mtrain <- lm(
  confianza_policiaca ~ percepcion_seguridad_municipio + razon_inseguridad_principal + denuncia_delito,
  data = datos_entrenamiento
)

summary(mtrain)
## 
## Call:
## lm(formula = confianza_policiaca ~ percepcion_seguridad_municipio + 
##     razon_inseguridad_principal + denuncia_delito, data = datos_entrenamiento)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.8750 -0.8710  0.1496  1.1250  2.9554 
## 
## Coefficients:
##                                               Estimate Std. Error t value
## (Intercept)                                    6.16116    0.48344  12.744
## percepcion_seguridad_municipioMuy inseguro(a) -0.73468    0.66640  -1.102
## razon_inseguridad_principal2                   0.45989    0.49970   0.920
## razon_inseguridad_principal3                   0.16419    0.86529   0.190
## razon_inseguridad_principal4                  -0.11073    0.86566  -0.128
## razon_inseguridad_principal5                   2.43884    1.78693   1.365
## razon_inseguridad_principal6                   0.58488    1.77420   0.330
## razon_inseguridad_principal9                  -1.21512    1.77420  -0.685
## razon_inseguridad_principal11                 -0.56116    1.78693  -0.314
## razon_inseguridad_principal12                  0.19908    1.07804   0.185
## razon_inseguridad_principal13                 -2.16116    1.78693  -1.209
## razon_inseguridad_principal14                 -1.01512    1.77420  -0.572
## denuncia_delito1                               0.05397    0.44985   0.120
##                                               Pr(>|t|)    
## (Intercept)                                     <2e-16 ***
## percepcion_seguridad_municipioMuy inseguro(a)    0.275    
## razon_inseguridad_principal2                     0.361    
## razon_inseguridad_principal3                     0.850    
## razon_inseguridad_principal4                     0.899    
## razon_inseguridad_principal5                     0.178    
## razon_inseguridad_principal6                     0.743    
## razon_inseguridad_principal9                     0.496    
## razon_inseguridad_principal11                    0.755    
## razon_inseguridad_principal12                    0.854    
## razon_inseguridad_principal13                    0.232    
## razon_inseguridad_principal14                    0.570    
## denuncia_delito1                                 0.905    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.72 on 56 degrees of freedom
## Multiple R-squared:  0.119,  Adjusted R-squared:  -0.06979 
## F-statistic: 0.6303 on 12 and 56 DF,  p-value: 0.8074
# Validación cruzada regresión lineal
# La validación cruzada se hace solo con datos_entrenamiento

control_lm <- trainControl(
  method = "cv",
  number = 5
)

modelo_cv_lm <- train(
  confianza_policiaca ~ percepcion_seguridad_municipio + razon_inseguridad_principal + denuncia_delito,
  data = datos_entrenamiento,
  method = "lm",
  trControl = control_lm
)
## Warning in predict.lm(modelFit, newdata): prediction from rank-deficient fit;
## attr(*, "non-estim") has doubtful cases
## Warning in predict.lm(modelFit, newdata): prediction from rank-deficient fit;
## attr(*, "non-estim") has doubtful cases
## Warning in predict.lm(modelFit, newdata): prediction from rank-deficient fit;
## attr(*, "non-estim") has doubtful cases
print(modelo_cv_lm)
## Linear Regression 
## 
## 69 samples
##  3 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 56, 56, 55, 54, 55 
## Resampling results:
## 
##   RMSE     Rsquared    MAE     
##   1.80831  0.04104261  1.511032
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE
cat("RMSE CV =", round(modelo_cv_lm$results$RMSE, 4), "\n")
## RMSE CV = 1.8083
cat("R2 CV =", round(modelo_cv_lm$results$Rsquared, 4), "\n")
## R2 CV = 0.041
# Evaluación final en conjunto de prueba

pred_lm <- predict(
  mtrain,
  newdata = datos_prueba
)

metricas_lm <- postResample(
  pred = pred_lm,
  obs = datos_prueba$confianza_policiaca
)

metricas_lm
##       RMSE   Rsquared        MAE 
## 1.29318830 0.06092538 1.13914840
cat("RMSE test =", round(metricas_lm["RMSE"], 4), "\n")
## RMSE test = 1.2932
cat("R2 test =", round(metricas_lm["Rsquared"], 4), "\n")
## R2 test = 0.0609
cat("MAE test =", round(metricas_lm["MAE"], 4), "\n")
## MAE test = 1.1391

Modelo logístico

# Variable dependiente
# contacto_policia 1 significa que sí tuvo contacto
# contacto_policia 0 significa que no tuvo contacto

bd_modelo <- bd_limpia %>%
  mutate(across(
    c(
      contacto_policia,
      evaluacion_policia_municipal,
      evaluacion_fuerza_civil,
      evaluacion_guardia_nacional
    ),
    ~ ifelse(. %in% c(7777, 8888, 9999), NA, .)
  )) %>%
  filter(!is.na(contacto_policia)) %>%
  filter(contacto_policia %in% c(0, 1)) %>%
  mutate(
    contacto_policia = ifelse(contacto_policia == 1, 1, 0),
    contacto_policia = factor(contacto_policia, levels = c(0, 1)),
    cp2_1 = as.factor(cp2_1),
    policia_presencia_suficiente = as.factor(policia_presencia_suficiente),
    policia_genera_seguridad = as.factor(policia_genera_seguridad),
    confianza_policia_colonia = as.factor(confianza_policia_colonia)
  ) %>%
  select(
    contacto_policia,
    cp4_1,
    cp2_1,
    policia_presencia_suficiente,
    policia_genera_seguridad,
    confianza_policia_colonia,
    evaluacion_policia_municipal,
    evaluacion_fuerza_civil,
    evaluacion_guardia_nacional
  ) %>%
  na.omit() %>%
  droplevels()

table(bd_modelo$contacto_policia)
## 
##    0    1 
## 4229  185
# Train y test 

set.seed(42)

trainIndex <- createDataPartition(
  bd_modelo$contacto_policia,
  p = 0.7,
  list = FALSE
)

train <- bd_modelo[trainIndex, ]
test  <- bd_modelo[-trainIndex, ]

# Ajuste de niveles para evitar problemas de predicción con factores

niveles_cp2_1 <- levels(droplevels(train$cp2_1))
niveles_presencia <- levels(droplevels(train$policia_presencia_suficiente))
niveles_seguridad <- levels(droplevels(train$policia_genera_seguridad))
niveles_confianza <- levels(droplevels(train$confianza_policia_colonia))

train <- train %>%
  mutate(
    cp2_1 = factor(cp2_1, levels = niveles_cp2_1),
    policia_presencia_suficiente = factor(
      policia_presencia_suficiente,
      levels = niveles_presencia
    ),
    policia_genera_seguridad = factor(
      policia_genera_seguridad,
      levels = niveles_seguridad
    ),
    confianza_policia_colonia = factor(
      confianza_policia_colonia,
      levels = niveles_confianza
    )
  ) %>%
  droplevels()

test <- test %>%
  mutate(
    cp2_1 = factor(as.character(cp2_1), levels = niveles_cp2_1),
    policia_presencia_suficiente = factor(
      as.character(policia_presencia_suficiente),
      levels = niveles_presencia
    ),
    policia_genera_seguridad = factor(
      as.character(policia_genera_seguridad),
      levels = niveles_seguridad
    ),
    confianza_policia_colonia = factor(
      as.character(confianza_policia_colonia),
      levels = niveles_confianza
    )
  ) %>%
  filter(
    !is.na(cp2_1),
    !is.na(policia_presencia_suficiente),
    !is.na(policia_genera_seguridad),
    !is.na(confianza_policia_colonia)
  ) %>%
  droplevels()

cat("Train =", nrow(train), "observaciones\n")
## Train = 3091 observaciones
cat("Test =", nrow(test), "observaciones\n")
## Test = 1323 observaciones
# Regresión logística

modelo_logit <- glm(
  contacto_policia ~ cp4_1 + cp2_1 + policia_presencia_suficiente + policia_genera_seguridad + confianza_policia_colonia +
    evaluacion_policia_municipal + evaluacion_fuerza_civil + evaluacion_guardia_nacional,
  data = train,
  family = binomial
)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(modelo_logit)
## 
## Call:
## glm(formula = contacto_policia ~ cp4_1 + cp2_1 + policia_presencia_suficiente + 
##     policia_genera_seguridad + confianza_policia_colonia + evaluacion_policia_municipal + 
##     evaluacion_fuerza_civil + evaluacion_guardia_nacional, family = binomial, 
##     data = train)
## 
## Coefficients:
##                                           Estimate Std. Error z value Pr(>|z|)
## (Intercept)                             -2.957e+01  1.132e+03  -0.026  0.97917
## cp4_1                                   -2.784e-02  5.904e-03  -4.716  2.4e-06
## cp2_11                                  -5.317e-02  1.822e-01  -0.292  0.77037
## policia_presencia_suficiente1            2.203e-01  2.411e-01   0.914  0.36093
## policia_presencia_suficiente8888         3.223e-01  1.048e+00   0.308  0.75839
## policia_presencia_suficiente9999         2.311e+00  1.562e+00   1.479  0.13909
## policia_genera_seguridadNo               1.392e+01  9.573e+02   0.015  0.98840
## policia_genera_seguridadNo hay policía  -2.153e-01  1.258e+03   0.000  0.99986
## policia_genera_seguridadSí               1.330e+01  9.573e+02   0.014  0.98892
## confianza_policia_coloniaNo              1.388e+01  6.047e+02   0.023  0.98168
## confianza_policia_coloniaNo hay policía -8.650e-01  1.138e+03  -0.001  0.99939
## confianza_policia_coloniaSí              1.408e+01  6.047e+02   0.023  0.98143
## evaluacion_policia_municipal            -1.369e-01  6.639e-02  -2.063  0.03916
## evaluacion_fuerza_civil                 -7.894e-02  7.191e-02  -1.098  0.27230
## evaluacion_guardia_nacional              1.934e-01  6.800e-02   2.844  0.00445
##                                            
## (Intercept)                                
## cp4_1                                   ***
## cp2_11                                     
## policia_presencia_suficiente1              
## policia_presencia_suficiente8888           
## policia_presencia_suficiente9999           
## policia_genera_seguridadNo                 
## policia_genera_seguridadNo hay policía     
## policia_genera_seguridadSí                 
## confianza_policia_coloniaNo                
## confianza_policia_coloniaNo hay policía    
## confianza_policia_coloniaSí                
## evaluacion_policia_municipal            *  
## evaluacion_fuerza_civil                    
## evaluacion_guardia_nacional             ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1078.3  on 3090  degrees of freedom
## Residual deviance: 1016.8  on 3076  degrees of freedom
## AIC: 1046.8
## 
## Number of Fisher Scoring iterations: 16
# Validación cruzada
# La validación cruzada se hace solo con train

control <- trainControl(method = "cv",number = 5)

modelo_cv <- train(
  contacto_policia ~ cp4_1 + cp2_1 + policia_presencia_suficiente + policia_genera_seguridad + confianza_policia_colonia +
    evaluacion_policia_municipal + evaluacion_fuerza_civil + evaluacion_guardia_nacional,
  data = train,
  method = "glm",
  family = binomial,
  trControl = control
)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
print(modelo_cv)
## Generalized Linear Model 
## 
## 3091 samples
##    8 predictor
##    2 classes: '0', '1' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 2473, 2473, 2472, 2473, 2473 
## Resampling results:
## 
##   Accuracy   Kappa        
##   0.9576193  -0.0006242122
# Predicciones sobre test

prob <- predict(modelo_logit,newdata = test,type = "response")

pred <- ifelse(prob > 0.5, 1, 0)

pred <- factor(pred,levels = c("0", "1"))

test$contacto_policia <- factor(test$contacto_policia,levels = c("0", "1"))

# Matriz de confusión
# Se indica que la clase positiva es 1

confusionMatrix(pred,test$contacto_policia, positive = "1"
)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction    0    1
##          0 1268   55
##          1    0    0
##                                           
##                Accuracy : 0.9584          
##                  95% CI : (0.9462, 0.9685)
##     No Information Rate : 0.9584          
##     P-Value [Acc > NIR] : 0.5358          
##                                           
##                   Kappa : 0               
##                                           
##  Mcnemar's Test P-Value : 3.305e-13       
##                                           
##             Sensitivity : 0.00000         
##             Specificity : 1.00000         
##          Pos Pred Value :     NaN         
##          Neg Pred Value : 0.95843         
##              Prevalence : 0.04157         
##          Detection Rate : 0.00000         
##    Detection Prevalence : 0.00000         
##       Balanced Accuracy : 0.50000         
##                                           
##        'Positive' Class : 1               
## 
# Precisión, sensibilidad y especificidad

metricas <- confusionMatrix(pred,test$contacto_policia,positive = "1"
)

cat("Precisión =", round(metricas$overall["Accuracy"], 4), "\n")
## Precisión = 0.9584
cat("Sensibilidad =", round(metricas$byClass["Sensitivity"], 4), "\n")
## Sensibilidad = 0
cat("Especificidad =", round(metricas$byClass["Specificity"], 4), "\n")
## Especificidad = 1
# Curva ROC

roc_logit <- roc(
  response = test$contacto_policia,
  predictor = prob,
  levels = c("0", "1")
)
## Setting direction: controls < cases
plot(roc_logit)

auc(roc_logit)
## Area under the curve: 0.6298