Ecuador, 2014

4 minute read

Published:

Situación inédita: Se registraron 1,070 homicidios, mientras que 1,353 muertes violentas quedaron sin clasificar, o, de manera equivalente, fueron categorizadas como muertes violentas "de intención no determinada" — según la Clasificación Internacional de Enfermedades, las muertes violentas "de intención no determinada" corresponden a situaciones en las que "la información disponible no permite distinguir entre accidente, lesión autoinfligida y agresión" (Link).

Una preocupación válida podría ser que todo esto se deba a un simple error, como la existencia de duplicidades en el registro de personas fallecidas. Para abordar esta inquietud, presento a continuación un algoritmo en R que extrae información directamente desde la microdata y corrige cualquier tipo de duplicidad.

Específicamente, el algoritmo previene la doble, triple y demás formas de contabilidad errónea mediante el uso de identificadores basados en la fecha de nacimiento del fallecido. La función a continuación mantiene solo la primera aparición de cada combinación única de las columnas especificadas y elimina cualquier duplicado posterior:



data <- data %>%
      distinct(year, !!sym(month_col), !!sym(day_col), !!sym(prov_col),
               !!sym(year_birth_col), !!sym(month_birth_col), !!sym(day_birth_col), 
               .keep_all = TRUE)



Este código utiliza la función distinct() del paquete dplyr para eliminar filas duplicadas. La función opera manteniendo solo la primera aparición de cada combinación única de las columnas especificadas y eliminando cualquier duplicado posterior. A continuación, se detallan las columnas utilizadas para la verificación de unicidad:

(a) year: La columna del año.

(b) !!sym(month_col): La columna que representa el mes (por ejemplo, 'mesf', 'mes_fall', o 'MESF').

(c) !!sym(day_col): La columna que representa el día ('dia_fall').

(d) !!sym(prov_col): La columna que representa la provincia ('prov_fall').

(e) !!sym(year_birth_col): La columna correspondiente al año de nacimiento ('anio_nac').

(f) !!sym(month_birth_col): La columna correspondiente al mes de nacimiento ('mes_nac').

(g) !!sym(day_birth_col): La columna correspondiente al día de nacimiento ('dia_nac').

Funcionamiento: La función distinct() verifica estas columnas en conjunto para identificar filas duplicadas. Si se encuentra una fila duplicada (es decir, todas las columnas especificadas tienen los mismos valores en más de una fila), la función mantiene solo la primera ocurrencia y elimina las restantes.

.keep_all = TRUE: Este argumento asegura que todas las demás columnas no incluidas en la verificación de unicidad se conserven en la salida final. Sin .keep_all = TRUE, solo las columnas especificadas permanecerían en el marco de datos resultante. Descargando los microdatos del año 2014 en este link: https://anda.inec.gob.ec/anda/index.php/catalog/545/study-description, podemos correr el siguiente código en R:



# Cargar librerías
library(dplyr)
library(haven)
library(purrr)
library(readr)
library(tidyr)

# Definir la ruta completa del archivo SPSS
spss_file <- "/EDG_2014.sav"

# Función para procesar el archivo SPSS
process_file <- function(file) {
  # Leer el archivo SPSS
  data <- read_sav(file)
  # Asignar el año directamente
  year <- 2014
  
  data <- data %>% 
    mutate(across(everything(), as.character), # Convertir todo a caracteres inicialmente
           year = year) # Añadir columna de año explícitamente
  
  # Identificar las columnas de interés
  month_col <- names(data)[tolower(names(data)) %in% c("mesf", "mes_fall", "MESF")]
  prov_col <- names(data)[tolower(names(data)) %in% c("prov_fall")]
  day_col <- names(data)[tolower(names(data)) %in% c("dia_fall")]
  
  # Identificar columnas de fecha de nacimiento
  year_birth_col <- names(data)[tolower(names(data)) == "anio_nac"]
  month_birth_col <- names(data)[tolower(names(data)) == "mes_nac"]
  day_birth_col <- names(data)[tolower(names(data)) == "dia_nac"]
  
  # Verificar que todas las columnas necesarias existen antes de procesar
  if (length(month_col) == 1 && length(prov_col) == 1 && length(day_col) == 1 && 
      length(year_birth_col) == 1 && length(month_birth_col) == 1 && length(day_birth_col) == 1) {
    
    # Convertir las columnas identificadas a numérico
    data <- data %>%
      mutate(across(c(!!sym(month_col), !!sym(prov_col), !!sym(day_col),
                      !!sym(year_birth_col), !!sym(month_birth_col), !!sym(day_birth_col)), 
                    ~ as.numeric(.)))
    
    # Definir los códigos 'Y' de interés
    y_codes <- paste0("Y", 10:34)
    
    # Crear una columna para identificar filas con códigos 'Y'
    data <- data %>%
      mutate(is_Y_code = ifelse(if_any(everything(), ~ . %in% y_codes), 1, 0))
    
    # Eliminar filas duplicadas basadas en columnas clave
    data <- data %>%
      distinct(year, !!sym(month_col), !!sym(day_col), !!sym(prov_col),
               !!sym(year_birth_col), !!sym(month_birth_col), !!sym(day_birth_col), 
               .keep_all = TRUE)
    
    # Agrupar y contar las ocurrencias de los códigos 'Y'
    counts <- data %>%
      group_by(year, month = !!sym(month_col), day = !!sym(day_col), province = !!sym(prov_col)) %>%
      summarise(total_count = sum(is_Y_code), .groups = 'drop')
    
    return(counts)
  } else {
    # Advertencia si faltan columnas necesarias
    warning("No se encontraron todas las columnas necesarias en: ", file)
    return(NULL)  
  }
}

# Procesar el archivo especificado
results <- process_file(spss_file)

# Calcular la cuenta final total de códigos 'Y'
if (!is.null(results)) {
  total_final <- sum(results$total_count, na.rm = TRUE)
  
  # Mostrar la cuenta final total
  print(paste("Cuenta final total:", total_final))
} else {
  print("No se pudo procesar el archivo por falta de columnas necesarias.")
}

Y obtenemos el total de 1,353 muertes violentas "de intención no determinada", superior a la cifra reportada de homicidios.

Por tanto, no existe simplemente un error de duplicidad de datos. Lo que sí existe: irregularidades en las cifras de muertes violentas.