logo_unam_enacif

Diseño muestral de encuestas probabilísticas

Julio César Martínez Sánchez


Introducción

El propósito de este tutorial es proporcionar una visión general sobre el diseño de encuestas probabilísticas. Iniciamos con la estimación del tamaño de muestra y la forma de asignar las cuotas en los diferentes estratos. Luego calculamos las probabilidades de inserción, las cuales son fundamentales para crear los ponderadores base. Por último, mostramos el procedimiento de cómo ajustarlos ponderadores para lograr que los estimadores reflejen el comportamiento del universo de estudio.

Para llevar a cabo los ejercicios utilizaremos los siguientes datos simulados:

  • marco_de_viviendas.xlsx Este documento contiene un marco muestral ficticio con información de viviendas, las cuales serán las unidades de análisis en nuestro estudio, así como detalles sobre las UPM y los estratos.

  • encuesta.xlsx Este archivo presenta datos de una encuesta imaginaria que recoge la frecuencia de uso de redes sociales como Facebook y YouTube.

Todo el material de apoyo, incluyendo los scripts y bases de datos necesarias para replicar este tutorial, se puede encontrar en el siguiente: material



Muestreo

El muestreo es el proceso mediante el cual seleccionamos un grupo de individuos del universo de estudio, con el objetivo de hacer inferencias sobre la población completa. Este método es útil en la investigación sociodemográfica, ya que permite generar inferencias sobre el comportamiento de la población total sin necesidad de examinar a cada uno de sus miembros.


Entorno de trabajo

Este código elimina las variables existentes y cierra gráficos previos, lo que ofrece un punto de partida limpio. Simultáneamente, desactiva las advertencias para una ejecución más fluida de los scripts. Los paquetes que vamos a utilizar son: tidyverse para manipulación y visualización de datos, data.table para manejo eficiente de conjuntos de datos grandes, readxl, writexl, y openxlsx para leer y escribir archivos Excel, foreign y haven para trabajar con diferentes formatos, survey para el análisis de encuestas complejas y PracTools para técnicas de muestreo.

En caso de que falten, los instala y carga automáticamente, asegurando que el usuario cuente con todas las herramientas esenciales desde el inicio.

rm(list=ls()); graphics.off(); options(warn=-1)
paquetes=c("tidyverse", "date", "data.table", "questionr", "readxl", "writexl", "openxlsx", "foreign", "survey", "PracTools", "haven","knitr","kableExtra")
for (i in paquetes) {if (!require(i, character.only = TRUE)) {install.packages(i);library(i, character.only = TRUE)} else {library(i, character.only = TRUE)}}

u=read.xlsx("marco_de_viviendas.xlsx", sheet = "Universo")



CVE_GEO ESTRATO CVE_ENT CVE_MUN UPM/conglomerados VIVIENDA_ID TOTAL HOMBRES MUJERES X10 X11 X12 X13 X14 X15 X16
19010367 3 19 19 367 713 1666 818 848 NA NA NA NA NA NA NA
19070346 1 19 18 346 172 18381 9609 8772 NA NA NA NA NA NA NA
19070347 1 19 18 347 122 13223 6786 6437 NA NA NA NA NA NA NA
19070348 1 19 18 348 482 1446 770 676 NA Paso 1. Vamos a seleccionar UPM/Conglomerados dentro de cada estrato pr_1 NA NA NA NA
19070349 1 19 18 349 860 1333 685 648 NA Paso 2. Vamos a seleccionar viviendas dentro de cada UPM pr_2 NA NA NA NA
19070350 1 19 18 350 337 2399 1211 1188 NA NA NA NA NA NA NA


1. Tamaño de muestra

Calcular el tamaño de muestra es un paso crucial en el diseño de encuestas probabilísticas, ya que determina el número de participantes a encuestar. Los elementos clave en este proceso incluyen: la definición del universo o población de referencia (\(N\)), el establecimiento de un margen de error tolerable (\(e\)), la selección de un nivel de confianza que nos asegure la fiabilidad de los estimadores (\(Z\)) y la identificación del indicador más relevante para el estudio (\(p\)). La fórmula para llevar a cabo el cálculo es la siguiente:
\[n = \frac{N \cdot p\cdot q\cdot Z^2}{e^2 \cdot (N-1) + Z^2 \cdot p \cdot q}\] Donde:

  • N: Tamaño total de la población o universo.
  • p: Proporción estimada.
  • q: Complemento de la proporción estimada: (1-p).
  • e: Margen de error.
  • Z: Valor crítico asociado con el nivel de confianza deseado.


Si bien ya existen paquetes que calculan el tamaño de muestra, para mostrar paso a paso el procedimiento creamos la función tamanio_muestra. Esta función recibe como parámetros: el valor Z a partir del nivel de confianza especificado. Luego, utiliza esta información junto con el tamaño de la población N, la proporción estimada p y el margen de error e para calcular el tamaño de muestra. Finalmente, redondea el resultado hacia arriba para asegurar que el tamaño de muestra calculado cumpla con el margen de error deseado, incluso después de considerar la tasa de no respuesta.

tamanio_muestra=function(p, E, confianza, NR, N) {

  # Determinar el valor Z según el nivel de confianza
  alpha=1 - confianza
  Z=qnorm(1 - alpha/2)
  
  # Calcular el tamaño de la muestra con la fórmula proporcionada
  numerador=N * p * (1 - p) * Z^2
  denominador=E^2 * (N - 1) + p * (1 - p) * Z^2
  n=(numerador / denominador) * (1 / (1 - NR))
  
  # Redondear hacia arriba para asegurar el margen de error
  return(ceiling(n))
}


Ahora, ajustamos los parámetros para obtener el tamaño de muestra mínimo.

p = 0.5
E = 0.01
confianza = 0.95
NR = 0.10
N = 10000


n_elementos=tamanio_muestra(p, E, confianza, NR, N)
cat("El tamaño de muestra calculado es:", n_elementos)
## El tamaño de muestra calculado es: 5444


2. Afijación

Considerando que el universo de estudio se organiza en tres estratos, el siguiente paso es repartir el tamaño de muestra. Para ello calculamos el porcentaje que corresponde a cada uno de dichos estratos y asignamos los 5444 unidades de selección del paso anterior de manera proporcional entre cada uno de ellos.

u$E=1
l=aggregate(E ~ ESTRATO, data = u, sum)[["E"]]
pr=prop.table(l)
n=round(n_elementos * pr / 10)
n
## [1]  26  58 460


3. Probabilidades de inserción

A continuación calculamos el ponderador base (\(bw\)). Para ello, primero determinamos la probabilidad de selección 1 (\(\pi_{1}\)), la cual refleja la probabilidad de elegir una Unidad Primaria de Muestreo (UPM) dentro de cada estrato. Después calculamos (\(\pi_{2}\)), el cual corresponde a la probabilidad de elegir a las viviendas dentro de cada UPM. Para este ejercicio, vamos a suponer que elegimos a 10 viviendas.

Así, el ponderador base (\(bw\)) que, según la literatura, es el inverso de la probabilidad de selección se calcula de la siguiente manera: \[bw=\frac{1}{\pi_{1}\cdot \pi_{2}}\]


De esta forma obtenermos el ponderador base.

h=n/l
u$prob_1[u$ESTRATO %in% seq_along(n)]=h

u=u %>% 
  mutate(prob_2 = 10/TOTAL, 
         bw = 1/(prob_1 * prob_2))


Para validar los valores de (\(bw\)), podemos generar una gráfica de caja para ver su comportamiento.

ggplot(u, aes(x = factor(ESTRATO), y = bw, fill = factor(ESTRATO))) + 
  geom_boxplot() + 
  labs(title = "Distribución del Ponderador Base (bw) por Estrato",
       x = "Estrato",
       y = "Ponderador Base (bw)") +
  scale_fill_brewer(palette = "Pastel1") +  
  theme_minimal() +
  theme(axis.title = element_text(size = 12),
        axis.text = element_text(size = 10),
        plot.title = element_text(hjust = 0.5))


4. Generación de la muestra

La generación de la muestra consiste en seleccionar a las viviendas dentro de las Unidades Primarias de Muestreo (UPM) que fuero elegidas en la primera etapa, las cuales, a su vez, pertenecen a un estrato en particular. Para ello, definimos la función select_upm., la cual recibe cuatro argumentos: el conjunto de datos (data), el nombre de la columna que identifica los estratos (estrato_col), el nombre de la columna que identifica las UPMs (upm_col) y el número de UPMs a seleccionar en cada estrato (n_upms).

Una vez ejecutada la selección, el resultado es almacenado en muestra_simple, un nuevo conjunto de datos que contiene solo las UPMs seleccionadas para cada estrato.

set.seed(123)

# Función para seleccionar el número de UPMs en cada estrato usando muestreo aleatorio simple
select_upm=function(data, estrato_col, upm_col, n_upms){
  data %>% 
    group_by(!!sym(estrato_col)) %>% 
    sample_n(size = n_upms[unique(!!sym(estrato_col))])
}

# Usar la función para seleccionar UPMs
muestra_simple=select_upm(u, "ESTRATO", "UPM", n)
CVE_GEO ESTRATO CVE_ENT CVE_MUN UPM/conglomerados VIVIENDA_ID TOTAL HOMBRES MUJERES X10 X11 X12 X13 X14 X15 X16 E prob_1 prob_2 bw
19072279 1 19 18 2279 458 1544 835 709 NA estrato 3 12 3.1413612565445025E-2 12.94240837696335 1.294240837696335 12.94241 1 0.1903186 0.0064767 811.2713
19072555 1 19 18 2555 90 920 473 447 NA NA NA NA NA NA NA 1 0.1903186 0.0108696 483.4000
19072827 1 19 18 2827 293 2085 1095 990 NA NA NA NA NA NA NA 1 0.1901639 0.0047962 1096.4224
19072548 1 19 18 2548 471 3410 1774 1636 NA 25-35 NA NA NA NA NA 1 0.1901639 0.0029326 1793.1897
19072845 1 19 18 2845 271 3094 1622 1472 NA NA NA NA NA NA NA 1 0.1901639 0.0032321 1627.0172
19072843 1 19 18 2843 447 1832 943 889 NA NA NA NA NA NA NA 1 0.1903186 0.0054585 962.5965


5. Ponderador base (bw)

El ponderador base, o ponderador de diseño, es el valor que representa cada una de las unidades de selección de manera téorica. En el punto 4 hicimos el supuesto de que el total de viviendas dentro de cada estrato es de 10. Si al llevar a cabo el levantamiento lograramos colectar este número de encuestas (lo cual es poco probable), entonces al multiplicar el ponderador por las diez encuestas sum(muestra_simple$bw*10) obtendríamos una cifra que debería de ser muy parecida al universo de estudio.

Para comprobar este supuesto, calculamos (abs(1 - (poblacion_universo / poblacion_muestra)) * 100), la cual mide la discrepancia entre la estimación de la población basada en la muestra y el tamaño real o conocido del universo. El resultado se redondea a tres decimales para facilitar su interpretación.

Este cálculo es crucial para evaluar la precisión de la muestra. Una diferencia porcentual pequeña indica que la muestra seleccionada representa adecuadamente al universo de estudio, mientras que una diferencia grande podría señalar problemas en la selección de la muestra o en la asignación de los ponderadores. En este ejercicio obtenemos una diferencia de 6.8%, por lo que podemos asumir que nuestra muestra sí refleja el comportamiento del universo de estudio.

Cabe mencionar que esta validación es a nivel teórico, pero la recolección de datos en campo es el factor clave para determinar si una encuesta realmente tiene la capacidad de reflejar el comportamiento de la población real.


poblacion_muestra=sum(muestra_simple$bw*10)
poblacion_universo=sum(u$TOTAL)


(abs(1 - (poblacion_universo/poblacion_muestra))*100) %>% round(3)
## [1] 6.808


6. Calibración del ponderador

Para ajustar los ponderadores base y obtener los ponderadores finales que reflejen adecuadamente el universo de estudio, calibramos los ponderadores base. Este proceso implica ajustar los ponderadores iniciales utilizando información adiciona,l o características conocidas, de la población total. Los pasos típicos para realizar este ajuste incluyen:

Identificar Variables de Calibración: Seleccionar variables clave de la población total, como pueden ser distribuciones por edad, género, ubicación geográfica, entre otras, que son conocidas a priori.

Calcular Totales de Población para Variables de Calibración: Estos totales pueden provenir de censos, encuestas anteriores o cualquier otra fuente de datos confiable que proporcione información sobre la distribución real de las variables de calibración en la población total.

Con esta información, un método comúnmente utilizado es el raking (también conocido como post-estratificación). Este método ajusta los ponderadores para que, las sumas ponderadas de las variables de calibración, coincidan con los totales conocidos.

encuesta=read_excel("encuesta.xls")


ESTRATO UPM r_edad sexo Facebook Youtube bw
2 3385 1 2 Dos o más veces a la semana Diariamente 1062.8923
1 2863 4 1 Una vez a la semana Nunca/no lo uso/no tengo cuenta 780.3793
3 2894 5 1 Diariamente Diariamente 669.9293
3 1154 2 2 Dos o más veces a la semana Nunca/no lo uso/no tengo cuenta 711.3846
2 2282 2 1 Nunca/no lo uso/no tengo cuenta Diariamente 824.5517
3 1179 2 1 Una vez a la semana Dos o más veces a la semana 718.2694


Totales de Población para Variables de Calibración

# Rangos de edad
# 18 a 24   
# 25 a 34   
# 35 a 44   
# 45 a 59   
# 60 o mas  

r_edad_1000=c(672123, 971188, 841651, 1056259, 737297)
sexo = c(2135736, 2142782)
N = 4278518


Aplicar un Método de Calibración

diseno=svydesign(ids = ~UPM, 
                 strata = ~ESTRATO,   
                 data = encuesta,
                 nest=TRUE,
                 weights = ~bw)


rake.dsgn=calibrate(design = diseno,
                    formula = ~as.factor(r_edad) + as.factor(sexo),
                    calfun = "raking",
                    population = c("(Intercept)" = N, r_edad_1000[-1], sexo[-1]))
## Sample: [1] "(Intercept)"        "as.factor(r_edad)2" "as.factor(r_edad)3"
## [4] "as.factor(r_edad)4" "as.factor(r_edad)5" "as.factor(sexo)2"  
## Popltn: [1] "(Intercept)" ""            ""            ""            ""           
## [6] ""
encuesta$fac=weights(rake.dsgn)


ESTRATO UPM r_edad sexo Facebook Youtube bw fac
2 3385 1 2 Dos o más veces a la semana Diariamente 1062.8923 6588.923
1 2863 4 1 Una vez a la semana Nunca/no lo uso/no tengo cuenta 780.3793 3764.131
3 2894 5 1 Diariamente Diariamente 669.9293 3362.196
3 1154 2 2 Dos o más veces a la semana Nunca/no lo uso/no tengo cuenta 711.3846 5638.412
2 2282 2 1 Nunca/no lo uso/no tengo cuenta Diariamente 824.5517 6957.030
3 1179 2 1 Una vez a la semana Dos o más veces a la semana 718.2694 6060.289


enc=sum(encuesta$fac)
comparacion=cbind(poblacion_universo, enc) %>% as.data.frame()
names(comparacion)=c("Universo","Encuesta")


Los datos de la encuesta reflejan con precisión los del universo poblacional, lo cual se debe a que hemos ajustado los ponderadores base utilizando los datos poblacionales. Este ajuste se realiza con el propósito específico de equiparar ambos valores, lo cual cumpe con el objetivo de que los resultados de la encuesta sean representativos de la población total.

Universo Encuesta
4278518 4278518
t1=wtd.table(encuesta$Facebook, weights = encuesta$fac) %>% prop.table() %>% round(3)*100
t2=wtd.table(encuesta$Facebook) %>% prop.table() %>% round(3)*100

comparacion2=cbind(t1, t2) %>% as.data.frame()
names( comparacion2)=c("Ponderado","Sin ponderar")


Finalmente, al contrastar los resultados ponderados y no ponderados de la variable Facebook, observamos que las cifras son cercanas, exhibiendo leves discrepancias en ciertas categorías. Esto indica que el factor de ponderación ejerce un impacto mínimo sobre la muestra, lo cual es un escenario óptimo. Por el contrario, cuando las diferencias son más marcadas, la varianza de los estimadores tiende a incrementarse, afectando negativamente la precisión de los mismos.

Ponderado Sin ponderar
Al menos una vez al mes 2.6 2.7
Diariamente 48.5 48.0
Dos o más veces a la semana 13.1 12.0
NS/NC 0.7 0.9
Nunca/no lo uso/no tengo cuenta 27.1 29.4
Una vez a la semana 8.0 6.9

Material extra

Te invito a visitar mi canal de YouTube Link, en el cual comparto videos sobre estadística multivariada y demografía. Si consideras que el contenido es de tu interés y utilidad, te agradecería mucho si decides suscribirte.