srvyr en RSOC9035 – Análisis Avanzado de Datos II
30 Mar 2026
En esta segunda sesión, nos enfocaremos en aplicar lo aprendido:
survey para análisis descriptivo y modelos, entendiendo su lógica.srvyr para realizar análisis de forma más intuitiva (estilo tidyverse).mean, lm, t.test…).Consecuencias de Ignorar el Diseño:
Necesitamos herramientas que “entiendan” el diseño.
Para hacer análisis válidos, debemos usar paquetes de R diseñados específicamente para encuestas complejas.
El principal es el paquete survey.
La idea central de survey es:
survey: El Objeto de Diseño Muestralids).strata).weights).survey::svydesign() (o srvyr::as_survey_design()).svymean, svytotal, svyglm…) necesitan este objeto como argumento para funcionar correctamente.survey::svydesign() (Repaso)Recordemos cómo creamos este objeto “receta” para CASEN en el práctico anterior:
ids, strata, weights) le da una pieza clave de la “receta” a R.casen_design) encapsula toda esta información.~) en R~) antes, probablemente en modelos como lm(y ~ x, data=...).svydesign (ids = ~varunit):
varunit en ese momento.svydesign: “La variable que identifica los conglomerados se llama varunit y está dentro de los datos que te pasé en data=casen”.~ logra esto: nombra la variable dentro del contexto del data frame.svymean (svymean(~edad, ...)):
svymean: “Calcula la media de la variable que se llama edad que se encuentra dentro del objeto design que te estoy pasando”.Es la forma estándar en R para referirse a variables dentro de funciones que operan sobre data frames o entornos específicos.
surveyUna vez creado el casen_design, podemos usar las funciones de survey. Todas ellas toman el objeto design como argumento principal.
svymean(~variable, design, na.rm=T):
variable es numérica) o proporciones (si variable es factor/categórica/dummy).weights del design para la ponderación y los strata e ids para calcular el error estándar (SE) correcto.surveysvytotal(~variable, design, na.rm=T):
variable (ej. suma ponderada de ingresos para estimar el ingreso total del país).svyquantile(~variable, design, quantiles=..., na.rm=T):
survey lo maneja.survey: svyby()Para calcular estadísticas por grupo (ej. media de ingreso por región), survey ofrece svyby().
# Calcular la media de 'edad' para cada nivel de la variable 'sexo'
svyby(
formula = ~edad, # La variable a analizar
by = ~sexo, # La variable que define los grupos
design = casen_design, # El objeto de diseño
FUN = svymean, # Función a aplicar a cada subgrupo
na.rm = TRUE # Argumento para pasar a svymean
)svyby es interesante porque toma otra función (svymean en este caso) como argumento (FUN).design según los niveles de by y aplica FUN (svymean) a cada subconjunto, luego junta los resultados.FUN = ...) puede ser menos familiar que el group_by %>% summarise de dplyr.survey: svyglm()Para regresión lineal, logística, etc., que consideren el diseño:
glm() o lm(), pero requiere el argumento design.srvyr: El Puente hacia el TidyverseSi bien survey es completo y fundamental, su sintaxis (especialmente para subgrupos) puede sentirse diferente si vienes del mundo tidyverse.
El paquete srvyr actúa como un “traductor” o “adaptador”:
dplyr (verbos como group_by, summarise, mutate) para realizar análisis de encuestas complejas.srvyr llama a las funciones de survey, asegurando que los cálculos sean correctos.srvyr: Creando el Objeto tbl_svyEl primer paso con srvyr es crear un objeto especial tbl_svy, análogo al survey.design. Se usa as_survey_design() (o simplemente as_survey).
~), como es usual en dplyr.casen_design_srvyr ahora puede ser usado en un pipeline %>%.srvyr: El Flujo group_by %>% summariseLa gran mayoría de los análisis descriptivos con srvyr siguen este patrón:
objeto_srvyr %>%
# Opcional: Filtrar casos si es necesario ANTES de agrupar/resumir
# filter(condicion) %>%
# Agrupar por las variables deseadas (si aplica)
group_by(variable_grupo1, variable_grupo2) %>%
# Calcular las estadísticas deseadas DENTRO de summarise
summarise(
nombre_stat1 = survey_mean(variable1, na.rm = TRUE, vartype = "ci"),
nombre_stat2 = survey_total(variable2, na.rm = TRUE),
nombre_stat3 = survey_quantile(variable1, quantiles = 0.5, na.rm = TRUE)
# etc.
)dplyr, usando las funciones survey_*() dentro de summarise.srvyr: Funciones Espejo survey_*()Dentro de summarise, usamos las funciones de srvyr que “imitan” a las de survey:
survey_mean(): Medias (continuas) y proporciones (categóricas/dummies).survey_total(): Totales poblacionales.survey_quantile(): Cuantiles (incluye mediana si quantiles=0.5).survey_median(): Atajo para la mediana.survey_ratio(num, den): Ratios.survey_var() / survey_sd(): Varianza / Desv. Estándar poblacional (menos común).srvyr: Funciones Espejo survey_*()Fuera de summarise:
survey_count(...) / survey_tally(): Conteos poblacionales estimados (similares a dplyr::count).Argumentos Importantes:
na.rm = TRUE: Necesario para manejar valores perdidos.vartype = c("se", "ci", "var", "cv"): Tipo de medida de variabilidad a reportar (error estándar, intervalo de confianza, varianza, coeficiente de variación). Por defecto es "se".level = 0.95: Nivel de confianza para el IC (por defecto 95%).survey vs srvyr (Media edad por sexo)Usando survey (svyby):
Usando srvyr:
Ambos dan el mismo resultado numérico, pero srvyr se integra más fluidamente en un flujo de trabajo tidyverse. En el práctico trabajaremos principalmente con srvyr.
No importa si usas survey o srvyr, el resultado siempre incluirá:
Recuerda:
vartype="ci" lo hace por ti) que te dan un rango plausible para el valor poblacional.En el bloque práctico de hoy:
tbl_svy para CASEN usando as_survey_design.srvyr.group_by.ggplot2.Pasemos a RStudio.
![]()
Análisis Avanzado de Datos II