Autor/a

Aníbal Olivera

Fecha de publicación

8 de enero de 2025

Introducción

Este módulo prepara los datos de la American National Election Studies (ANES) 2016 para replicar el análisis de McPherson & Smith (2019). Nuestro objetivo es construir un dataset analítico que contenga: 1. Outcome: Escala de afinidad hacia el Partido Demócrata (Democrat Scale). 2. Demográficos: Edad, Educación, Género, Raza/Etnicidad, Religión.

Utilizaremos el archivo original anes_timeseries_2016.dta.

Carga de Datos

Código
library(haven)
library(dplyr)
library(stringr)

# Ruta al archivo original
DATA_PATH <- "data/anes_timeseries_2016.dta"

if (file.exists(DATA_PATH)) {
    anes_raw <- read_dta(DATA_PATH)
    cat("Dataset cargado. Dimensiones:", dim(anes_raw), "\n")
} else {
    stop("Archivo ANES no encontrado.")
}
Dataset cargado. Dimensiones: 4270 1842 

Selección y Transformación

Seleccionamos las variables basándonos en los códigos del codebook (inspeccionados previamente).

Mapeo de Variables: * V161095: Democrat Thermometer (0-100) * V161267: Edad * V161270: Educación * V161342: Género * V161310x: Raza (Resumen) * V161265x: Religión (Resumen) * V160101: Peso Pre-electoral

Código
anes_subset <- anes_raw %>%
    select(
        case_id = V160001,
        weight = V160101,
        dem_therm = V161095,
        age = V161267,
        educ_raw = V161270,
        gender_raw = V161342,
        race_raw = V161310x,
        relig_raw = V161265x
    ) %>%
    # Filtrar casos con peso válido y outcome válido (0-100)
    filter(weight > 0, dem_therm >= 0, dem_therm <= 100)

clean_df <- anes_subset %>%
    mutate(
        # Outcome: Asegurar numérico para análisis espacial
        y = as.numeric(dem_therm),

        # Age: Códigos negativos son missing
        age = if_else(age < 0, NA_real_, as.numeric(age)),

        # Gender: 1=Male, 2=Female
        female = case_when(
            gender_raw == 2 ~ 1,
            gender_raw == 1 ~ 0,
            TRUE ~ NA_real_
        ),

        # Education: Tratamos como escala numérica simple
        educ = if_else(educ_raw < 0, NA_real_, as.numeric(educ_raw)),

        # Variables Categóricas (Dummies para Tabla 2)
        # Race Ref: White (1)
        race_white_dummy = if_else(race_raw == 1, 1, 0),
        race_black = if_else(race_raw == 2, 1, 0),
        race_asian = if_else(race_raw == 3, 1, 0), # Asian/Pac Islr
        race_native = if_else(race_raw == 4, 1, 0),
        race_hispanic = if_else(race_raw == 5, 1, 0),
        race_other = if_else(race_raw == 6, 1, 0),

        # Religion Ref: Protestant (1, 2, 3)
        # 1=Mainline, 2=Evangelical, 3=Black Prot
        relig_protestant_dummy = if_else(relig_raw %in% c(1, 2, 3), 1, 0),
        relig_catholic = if_else(relig_raw == 4, 1, 0),
        relig_jewish = if_else(relig_raw == 6, 1, 0),
        relig_none = if_else(relig_raw == 8, 1, 0), # Not religious
        relig_other = if_else(relig_raw %in% c(5, 7), 1, 0)
    )

# Filtrar casos completos
final_df <- clean_df %>%
    haven::zap_labels() %>% # Eliminar etiquetas para evitar problemas de tipo (haven_labelled)
    filter(
        !is.na(y), !is.na(age), !is.na(educ), !is.na(female),
        !is.na(race_raw), !is.na(relig_raw)
    ) %>%
    as.data.frame() # Importante para compatibilidad con spdep

cat("N Final analítico:", nrow(final_df), "\n")
N Final analítico: 4045 

Guardar Datos Derivados

Guardamos el dataset limpio para su uso en el módulo de imputación de redes.

Código
dir.create("data/anes_2016_derived", showWarnings = FALSE)
saveRDS(final_df, "data/anes_2016_derived/anes_clean.rds")