Ir al contenido
σestadistica.ar

Script

Muestreo

Cinco diseños sacados del mismo marco, los ponderadores que les corresponden, y el error estándar del diseño al lado del que sale de ignorarlo. Con la selección reproducible en cualquier R.

Descargar

Proyecto en R y Python · ZIP · 276 KB

En R alcanza con lo que ya trae; en Python hace falta SciPy.

Los datos no son una muestra: son la población

El marco tiene los 4.000 hogares de una ciudad inventada, en 4 regiones y 200 radios censales. Eso permite hacer lo único que en la vida real nunca se puede hacer: mirar si el intervalo le acertó.

El ingreso se armó en dos capas —un efecto de radio y un ruido de hogar— porque es lo que pasa en cualquier ciudad: los vecinos se parecen. Toda la lección sale de ahí.

El promedio con los pesos y el error estándar sin ellos

Es el error más común en el análisis de encuestas y el más difícil de ver, porque el número que sale es perfectamente plausible. Sobre la muestra bietápica del ejemplo —320 hogares en 32 radios, de los que contestaron 276— para el ingreso medio:

estimación                     616.932
error estándar del diseño      48.275
error estándar ignorándolo     25.390

El segundo es la mitad del primero. El intervalo que sale de él es la mitad de ancho, y es el que aparece en la mayoría de los informes.

Y no es mala suerte de una muestra. El descargable vuelve a sacar la muestra 500 veces y cuenta cuántas veces cada intervalo del 95 % contiene al valor verdadero, que acá se conoce:

con el diseño          cubre el 92,0 %
ignorando el diseño    cubre el 61,0 %

Un intervalo que promete 95 y entrega 61. Esa es la diferencia entre las dos fórmulas, medida y no discutida.

El efecto de diseño no siempre es un castigo

Los cinco diseños salen del mismo marco, con el mismo n y la misma semilla:

DiseñoEfecto de diseñon efectivo
Aleatorio simple1,000320
Sistemático1,000320
Estratificado proporcional0,965332
Estratificado de Neyman0,902355
Bietápico3,61589

La estratificación gana precisión: saca de la varianza las diferencias entre regiones, y con la afijación de Neyman —más muestra donde hay más dispersión— la muestra de 320 rinde como una de 355. El conglomerado la paga: 320 hogares en 32 radios rinden como 89 hogares sueltos, porque los vecinos se parecen y el décimo hogar de un radio agrega mucho menos información que el primero.

Eso no significa que conglomerar esté mal. Significa que se paga, y que el tamaño de muestra hay que decidirlo sabiendo cuánto. Visitar 32 radios cuesta una fracción de lo que cuesta visitar 320 direcciones dispersas.

Una sola fórmula para los cinco diseños

La varianza se calcula siempre por el método de la última etapa: dentro de cada estrato, la variabilidad entre los totales ponderados de cada unidad primaria. Con conglomerados, la unidad primaria es el conglomerado. Sin conglomerados, cada unidad es su propia unidad primaria y la fórmula se reduce exactamente a la del estratificado; con un solo estrato, a la del aleatorio simple con corrección por población finita.

Dos detalles que están adentro y casi nunca se ven. La linealización: una media ponderada es una razón y su denominador también es aleatorio, así que hay que restarle la estimación a cada valor antes de acumular por conglomerado. Y los grados de libertad: son unidades primarias menos estratos, acá 28 y no 319. Usar n − 1 angosta el intervalo de más, encima de todo lo demás.

La selección se hace con el generador de R

Una muestra hay que poder volver a sacarla. Si alguien pregunta cómo se eligieron esos 320 hogares, la respuesta tiene que ser un par de líneas que cualquiera pueda correr.

El estándar de hecho para eso es R. Por eso la versión en R usa set.seed y sample.int tal cual, y la de Python reimplementa ese generador bit por bit. Es el único archivo de toda la serie que no tiene equivalente del otro lado, y la asimetría es a propósito: al revés no serviría, porque nadie audita una selección corriendo el random de Python.

Lo que hay que copiar y no es obvio: el sembrado pasa la semilla cincuenta veces por una congruencial antes de tocar el estado; la primera posición del vector es el índice y se descarta; y desde la versión 3.6 R sortea enteros por rechazo, con un bucle de bits que va de 0 a bits inclusive, así que con 16 bits justos hace dos tandas y no una. Parece un descuido de R y es lo que R hace: copiarlo «corregido» daría otra muestra. La calculadora de muestreo del sitio hace lo mismo en TypeScript, así que la página, el descargable y R coinciden.

Los ponderadores, en tres momentos

MomentoQué tiene que cumplir
De diseñoSumar exactamente la población. Si no, hay un error en las probabilidades de inclusión
Ajustados por no respuestaVolver a sumarla, después de repartir el peso de los que no contestaron
Post-estratificadosDar los totales conocidos por celda

En el ejemplo contestaron 276 de 320. El ajuste reparte el peso de los que faltan entre sus vecinos del mismo radio —lo que supone que se parecen, y eso es un supuesto, no un dato— y los pesos vuelven a sumar 4.000 exacto.

La post-estratificación se hace sobre el tamaño del hogar, que es un dato que un censo conoce y que el diseño no controló. La muestra se había quedado corta de hogares chicos y grandes —factores de 1,043 y 1,103— y larga de medianos —0,925—. La calibración lo corrige, y esa es la parte del sesgo de no respuesta que sí se puede arreglar.

Ojo con qué variable se calibra. Si se calibra sobre la misma que estratificó el diseño, todos los factores dan uno y no se corrige nada: el descargable lo avisa cuando pasa. Calibrar sobre algo que el diseño ya controla da la sensación de haber hecho algo sin haberlo hecho.

Qué deja

ArchivoQué trae
disenos.csvLos cinco diseños: n, unidades primarias, suma y rango de los pesos
muestra.csvLos casos seleccionados, con su probabilidad de inclusión y su peso
ponderadores.csvLos tres momentos del ponderador, con el efecto de Kish
calibracion.csvEl total del marco, el estimado y el factor de cada celda
estimaciones.csvPor diseño y variable: el error estándar del diseño y el ingenuo, con el deff
por-estrato.csvLa misma media dentro de cada estrato, con sus grados de libertad
cobertura.csvCuántas veces le acierta cada intervalo, simulando la muestra muchas veces
avisos.csvCada supuesto que no se cumple y cada conclusión que depende de una decisión
muestreo.mdEl informe redactado

Lo que no hace

No hay selección con probabilidad proporcional al tamaño (PPS). Es lo que usa cualquier encuesta de hogares grande y merece su propio proyecto.

No hay remuestreo para la varianza —ni jackknife por grupos ni bootstrap de conglomerados—. La linealización alcanza para medias, totales y proporciones, que es lo que este proyecto estima.

No hay calibración con varias variables a la vez. Con una sola es una cuenta de una línea; con varias hay que iterar, que es el «raking».

No hay tamaño de muestra. Para eso están la calculadora y la plantilla.

Cómo está verificado

Hay dos cosas que verificar y son de naturaleza distinta. La selección tiene que dar exactamente lo que da R: no parecido, la misma muestra. Se comprueba contra sample.int de R en vivo, y contra src/lib/muestreo.ts —el mismo generador reimplementado en TypeScript— invocado desde Node. Hasta el fixup, que actúa una vez cada 2³² números y que ninguna comparación contra un chorro aleatorio ejercita, se prueba por separado. La estimación tiene que dar lo que dice la teoría: se recalcula con numpy y se comprueban las identidades que no pueden fallar —que los pesos sumen la población en los tres momentos, que el peso sea la inversa de la probabilidad de inclusión, que el deff de Kish sea 1 + cv², que el deff de un aleatorio simple valga exactamente uno porque la fórmula de la última etapa se reduce a la del MAS, y que la cobertura simulada quede cerca de la nominal—. Prueba además tres marcos con otros parámetros: conglomerados de dos hogares, confianza del 99 % y una no respuesta del 45 %. Son 786 comprobaciones, los veintiún sabotajes se detectan, y R y Python escriben los diez archivos idénticos byte a byte.