Diseño muestral de encuestas probabilÃsticas
Julio César MartÃnez Sánchez
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
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.
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 |
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:
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
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
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))
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 |
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
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 | 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 | 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 |
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.