Compatibilidad con encuestas internacionales (ES)
Source:vignettes/international-surveys-es.Rmd
international-surveys-es.RmdIntroduccion
La clase Survey y el pipeline de steps
(step_compute, step_recode,
step_rename, step_remove,
step_join) de metasurvey son agnosticos respecto a la
encuesta: funcionan con cualquier dato tabular. Esta vigneta demuestra
la compatibilidad con 7 encuestas de hogares de 6 paises, utilizando
datos reales incluidos en los paquetes cuando es posible.
Para cada encuesta mostramos el flujo completo: cargar datos, crear
un Survey, aplicar steps, estimar con
workflow() y empaquetar el pipeline como
Recipe.
Matriz de compatibilidad
| Funcionalidad | ECH | EPH | CASEN | PNADc | CPS | ENIGH | DHS |
|---|---|---|---|---|---|---|---|
step_compute |
✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
step_recode |
✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
step_rename |
✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
step_remove |
✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
add_weight |
✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
strata |
N/A | N/A | ✓ | ✓ | N/A | ✓ | ✓ |
psu |
N/A | N/A | ✓ | ✓ | N/A | ✓ | ✓ |
add_replicate |
✓ | N/A | N/A | ✓ | ✓ | N/A | N/A |
workflow |
✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Recipe |
✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Instalacion de paquetes complementarios
La mayoria de los paquetes estan en CRAN. El paquete
casen solo esta disponible desde GitHub. Los paquetes
faltantes se instalan automaticamente al construir esta vigneta, pero
tambien se pueden instalar manualmente:
# Paquetes de CRAN
install.packages(c("eph", "PNADcIBGE", "ipumsr", "rdhs"))
# Paquetes solo en GitHub
# install.packages("remotes")
remotes::install_github("pachadotdev/casen")ECH – Uruguay
La ECH (Encuesta Continua de Hogares) es la encuesta principal para la que se construyo metasurvey. Una muestra viene incluida en el paquete.
library(metasurvey)
library(data.table)
dt_ech <- fread(
system.file("extdata", "ech_2023_sample.csv", package = "metasurvey")
)
svy_ech <- Survey$new(
data = dt_ech,
edition = "2023",
type = "ech",
psu = NULL,
engine = "data.table",
weight = add_weight(annual = "W_ANO")
)
svy_ech <- svy_ech |>
step_recode(labor_status,
POBPCOAC == 2 ~ "Employed",
POBPCOAC %in% 3:5 ~ "Unemployed",
POBPCOAC %in% c(6:10, 1) ~ "Inactive or under 14",
comment = "Estado de actividad segun OIT"
) |>
step_compute(
income_pc = HT11 / nper,
comment = "Ingreso per capita del hogar"
) |>
bake_steps()
workflow(
list(svy_ech),
survey::svymean(~HT11, na.rm = TRUE),
estimation_type = "annual"
)
#> stat value se cv confint_lower
#> <char> <num> <num> <num> <num>
#> 1: survey::svymean: HT11 107869.1 3473.836 0.03220417 101060.5
#> confint_upper
#> <num>
#> 1: 114677.7Para el pipeline completo de la ECH, ver
vignette("ech-case-study").
EPH – Argentina
La EPH (Encuesta Permanente de Hogares) es la encuesta trimestral de
fuerza laboral de Argentina. El paquete eph (CRAN, GitHub) incluye una base de
juguete.
library(eph)
data("toybase_individual_2016_04", package = "eph")
dt_eph <- data.table(toybase_individual_2016_04)
svy_eph <- Survey$new(
data = dt_eph,
edition = "201604",
type = "eph",
psu = NULL,
engine = "data.table",
weight = add_weight(quarterly = "PONDERA")
)
svy_eph <- svy_eph |>
step_recode(labor_status,
ESTADO == 1 ~ "Employed",
ESTADO == 2 ~ "Unemployed",
ESTADO == 3 ~ "Inactive",
.default = NA_character_,
comment = "Estado de actividad (INDEC)"
) |>
step_recode(sex,
CH04 == 1 ~ "Male",
CH04 == 2 ~ "Female",
.default = NA_character_,
comment = "Sexo (CH04)"
) |>
step_compute(
employed = ifelse(ESTADO == 1, 1L, 0L),
comment = "Indicador de empleo"
) |>
bake_steps()
# Tasa de empleo
workflow(
list(svy_eph),
survey::svymean(~employed, na.rm = TRUE),
estimation_type = "quarterly"
)
#> stat value se cv confint_lower
#> <char> <num> <num> <num> <num>
#> 1: survey::svymean: employed 0.4378169 0.01668347 0.03810603 0.4051179
#> confint_upper
#> <num>
#> 1: 0.4705159Para descargar microdatos reales de la EPH:
eph::get_microdata(year = 2023, period = 3, type = "individual").
CASEN – Chile
La CASEN (Encuesta de Caracterizacion Socioeconomica Nacional) es la
principal encuesta socioeconomica de Chile. Utiliza muestreo
estratificado por conglomerados. El paquete casen (GitHub) incluye una
muestra de la region de Los Rios.
Instalar con
remotes::install_github("pachadotdev/casen").
# Requiere: remotes::install_github("pachadotdev/casen")
data("casen_2017_los_rios")
dt_casen <- data.table(casen_2017_los_rios)
svy_casen <- Survey$new(
data = dt_casen,
edition = "2017",
type = "casen",
psu = "varunit",
strata = "varstrat",
engine = "data.table",
weight = add_weight(annual = "expc")
)
svy_casen <- svy_casen |>
step_recode(sex,
sexo == 1 ~ "Male",
sexo == 2 ~ "Female",
.default = NA_character_,
comment = "Sexo (codebook MDS)"
) |>
step_recode(poverty_status,
pobreza == 1 ~ "Extreme poverty",
pobreza == 2 ~ "Non-extreme poverty",
pobreza == 3 ~ "Not poor",
.default = NA_character_,
comment = "Situacion de pobreza"
) |>
step_compute(
log_income = log(ytotcorh + 1),
comment = "Log del ingreso del hogar"
) |>
bake_steps()
# Ingreso medio del hogar
workflow(
list(svy_casen),
survey::svymean(~ytotcorh, na.rm = TRUE),
estimation_type = "annual"
)Para los microdatos completos de la CASEN:
descargar_casen_github(2017, tempdir()) del paquete
casen.
PNADc – Brasil
La PNADc (Pesquisa Nacional por Amostra de Domicilios Continua) es la
encuesta trimestral de fuerza laboral de Brasil, con muestreo
estratificado por conglomerados. El paquete PNADcIBGE (CRAN) incluye
microdatos de ejemplo.
library(PNADcIBGE)
dt_pnadc <- data.table(read_pnadc(
microdata = system.file("extdata", "exampledata.txt", package = "PNADcIBGE"),
input_txt = system.file("extdata", "input_example.txt", package = "PNADcIBGE")
))
svy_pnadc <- Survey$new(
data = dt_pnadc,
edition = "202301",
type = "pnadc",
psu = "UPA",
strata = "Estrato",
engine = "data.table",
weight = add_weight(quarterly = "V1028")
)
svy_pnadc <- svy_pnadc |>
step_recode(sex,
V2007 == 1 ~ "Male",
V2007 == 2 ~ "Female",
.default = NA_character_,
comment = "Sexo (V2007)"
) |>
step_compute(
age = as.integer(V2009),
comment = "Edad en anios"
) |>
bake_steps()
workflow(
list(svy_pnadc),
survey::svymean(~age, na.rm = TRUE),
estimation_type = "quarterly"
)
#> stat value se cv confint_lower
#> <char> <num> <num> <num> <num>
#> 1: survey::svymean: age 35.55343 0.856023 0.02407708 33.87566
#> confint_upper
#> <num>
#> 1: 37.23121Para microdatos reales de la PNADc:
PNADcIBGE::get_pnadc(year = 2023, quarter = 1). La descarga
es de aproximadamente 200 MB.
CPS – Estados Unidos
La CPS (Current Population Survey) es la encuesta mensual de fuerza
laboral de Estados Unidos. El paquete ipumsr (CRAN, GitHub) incluye un extracto
de CPS.
library(ipumsr)
ddi <- read_ipums_ddi(
system.file("extdata", "cps_00160.xml", package = "ipumsr")
)
dt_cps <- data.table(read_ipums_micro(ddi, verbose = FALSE))
svy_cps <- Survey$new(
data = dt_cps,
edition = "2011",
type = "cps",
psu = NULL,
engine = "data.table",
weight = add_weight(annual = "ASECWT")
)
svy_cps <- svy_cps |>
step_recode(health_status,
HEALTH == 1 ~ "Excellent",
HEALTH == 2 ~ "Very good",
HEALTH == 3 ~ "Good",
HEALTH == 4 ~ "Fair",
HEALTH == 5 ~ "Poor",
.default = NA_character_,
comment = "Estado de salud autopercibido"
) |>
step_compute(
log_income = log(INCTOT + 1),
comment = "Log del ingreso total"
) |>
bake_steps()
workflow(
list(svy_cps),
survey::svymean(~INCTOT, na.rm = TRUE),
estimation_type = "annual"
)
#> stat value se cv confint_lower
#> <char> <num> <num> <num> <num>
#> 1: survey::svymean: INCTOT 191645236 4277528 0.02232004 183261435
#> confint_upper
#> <num>
#> 1: 200029038Los datos de IPUMS requieren una cuenta gratuita en https://cps.ipums.org. El archivo DDI XML proporciona metadatos de variables para el etiquetado.
ENIGH – Mexico
La ENIGH (Encuesta Nacional de Ingresos y Gastos de los Hogares) es la encuesta de ingresos y gastos de Mexico. No existe un paquete de R dedicado; los datos estan disponibles en INEGI. A continuacion se presenta un ejemplo sintetico que replica la estructura real.
set.seed(42)
dt_enigh <- data.table(
id = 1:200,
upm = rep(1:40, each = 5),
est_dis = rep(1:10, each = 20),
factor = runif(200, 100, 500),
sexo_jefe = sample(1:2, 200, replace = TRUE),
edad_jefe = sample(18:80, 200, replace = TRUE),
ing_cor = rlnorm(200, 10, 1),
tam_hog = sample(1:8, 200, replace = TRUE)
)
svy_enigh <- Survey$new(
data = dt_enigh,
edition = "2022",
type = "enigh",
psu = "upm",
strata = "est_dis",
engine = "data.table",
weight = add_weight(annual = "factor")
)
svy_enigh <- svy_enigh |>
step_recode(sex_head,
sexo_jefe == 1 ~ "Male",
sexo_jefe == 2 ~ "Female",
.default = NA_character_,
comment = "Sexo del jefe de hogar"
) |>
step_compute(
income_pc = ing_cor / tam_hog,
comment = "Ingreso per capita del hogar"
) |>
bake_steps()
workflow(
list(svy_enigh),
survey::svymean(~income_pc, na.rm = TRUE),
estimation_type = "annual"
)
#> stat value se cv confint_lower
#> <char> <num> <num> <num> <num>
#> 1: survey::svymean: income_pc 11928.34 1473.022 0.1234893 9041.267
#> confint_upper
#> <num>
#> 1: 14815.41DHS – Internacional
El programa DHS (Demographic and Health Surveys) cubre mas de 90
paises. El paquete rdhs (CRAN, GitHub) proporciona acceso a
la API. Los datasets modelo (sin necesidad de autenticacion) estan
disponibles en https://dhsprogram.com/data/model-datasets.cfm.
library(haven)
# Descargar el modelo Individual Recode (sin credenciales)
tf <- tempfile(fileext = ".zip")
download.file(
"https://dhsprogram.com/data/model_data/dhs/zzir62dt.zip",
tf,
mode = "wb", quiet = TRUE
)
td <- tempdir()
unzip(tf, exdir = td)
dta_file <- list.files(td,
pattern = "\\.DTA$", full.names = TRUE,
ignore.case = TRUE
)
dt_dhs <- data.table(read_dta(dta_file[1]))
# Los ponderadores DHS deben dividirse por 1.000.000
dt_dhs[, wt := as.numeric(v005) / 1e6]
svy_dhs <- Survey$new(
data = dt_dhs,
edition = "2020",
type = "dhs",
psu = "v001",
strata = "v023",
engine = "data.table",
weight = add_weight(annual = "wt")
)
svy_dhs <- svy_dhs |>
step_recode(education,
v106 == 0 ~ "No education",
v106 == 1 ~ "Primary",
v106 == 2 ~ "Secondary",
v106 == 3 ~ "Higher",
.default = NA_character_,
comment = "Nivel educativo (v106)"
) |>
step_compute(
children = as.numeric(v201),
comment = "Hijos nacidos vivos"
) |>
bake_steps()
workflow(
list(svy_dhs),
survey::svymean(~children, na.rm = TRUE),
estimation_type = "annual"
)Los datos de DHS requieren registro en https://dhsprogram.com. El
paquete rdhs gestiona la autenticacion con la API. Los
ponderadores (v005) deben dividirse por 1.000.000 antes de usarlos.
Portabilidad de recipes
La misma estructura Recipe funciona independientemente
de la encuesta de origen:
set.seed(42)
dt_demo <- data.table(
id = 1:100,
age = sample(18:65, 100, replace = TRUE),
income = round(runif(100, 1000, 5000), 2),
w = round(runif(100, 0.5, 2), 4)
)
svy_demo <- Survey$new(
data = dt_demo,
edition = "2023",
type = "demo",
psu = NULL,
engine = "data.table",
weight = add_weight(annual = "w")
)
svy_demo <- svy_demo |>
step_compute(indicator = ifelse(age > 30, 1L, 0L)) |>
step_recode(age_group,
age < 30 ~ "Young",
age >= 30 ~ "Adult",
.default = NA_character_
)
my_recipe <- steps_to_recipe(
name = "Demo Indicators",
user = "Research Team",
svy = svy_demo,
description = "Indicadores demograficos reutilizables",
steps = get_steps(svy_demo),
topic = "demographics"
)
doc <- my_recipe$doc()
cat("Entradas:", paste(doc$input_variables, collapse = ", "), "\n")
#> Entradas: age
cat("Salidas:", paste(doc$output_variables, collapse = ", "), "\n")
#> Salidas: indicator, age_groupLos recipes capturan que transformaciones aplicar, no de que encuesta provienen. Un recipe construido para la EPH puede adaptarse para la PNADc simplemente renombrando variables.
Proximos pasos
- Primeros pasos – Objetos Survey y steps
- Disenos de encuestas y validacion – Disenos estratificados y por conglomerados, ponderadores de replicas
-
Paneles rotativos –
RotativePanelSurveyyPoolSurvey - Recipes – Crear, guardar y compartir recipes
- Caso de estudio ECH – Pipeline completo de la ECH de Uruguay