Script
Intervalos de confianza
Los cinco que hacen falta en un informe, sobre el total y dentro de cada grupo. Y la columna que avisa cuando mirar dos intervalos por separado lleva a la conclusión contraria.
Proyecto en R y Python · ZIP · 84 KB
En R alcanza con lo que ya trae; en Python hace falta SciPy, y solo para los cuantiles.
El error que este proyecto quiere que no cometas
Publicás el intervalo de cada grupo, ves que se pisan y concluís que no hay diferencia. Es lo que hace casi todo el mundo, y no se sigue. Mirá las horas de estudio del ejemplo que viene adentro:
| Horas de estudio por semana | n | Media | IC 95 % |
|---|---|---|---|
| Control | 75 | 11,64 | [10,60; 12,69] |
| Tratamiento | 75 | 13,45 | [12,48; 14,43] |
| La diferencia | — | −1,81 | [−3,23; −0,39] |
Los dos primeros intervalos se pisan —12,69 contra 12,48— y el tercero no contiene al cero. Las dos cosas son ciertas al mismo tiempo, y la que hay que informar es la tercera.
La aritmética es la de siempre: el error estándar de la diferencia es √(EE₁² + EE₂²), no EE₁ + EE₂. Acá los errores estándar de los dos grupos son 0,5245 y 0,4906. Sumados dan 1,0151; la raíz de la suma de los cuadrados da 0,7181, un 29 % menos. Ese 29 % es exactamente el rango de diferencias donde los dos intervalos se pisan y el de la diferencia igual excluye al cero.
Por eso ic-diferencias.csv trae tres columnas al lado del intervalo: se_pisan_los_individuales, excluye_cero y conclusion_distinta, que dice «Sí» cuando las dos primeras se contradicen. En el ejemplo pasa en tres de las once comparaciones, y el informe lo pone arriba de todo antes de que alguien lea la lista.
Wilson, Wald y Clopper-Pearson, los tres juntos
Para cada categoría salen los tres métodos, no para que elijas el que más te guste sino para que veas cuánto se separan cuando la categoría es rara. En el ejemplo la beca la tienen 7 de 150:
variable,etiqueta,categoria,ambito,n,exitos,proporcion,metodo,inferior,superior,ancho beca,Tiene beca,Sí,Total,150,7,0.046667,wilson,0.022787,0.093186,0.070400 beca,Tiene beca,Sí,Total,150,7,0.046667,wald,0.012912,0.080421,0.067508 beca,Tiene beca,Sí,Total,150,7,0.046667,clopper-pearson,0.018966,0.093786,0.074820
Wald arranca en 1,3 % y Clopper-Pearson en 1,9 %: casi el doble. Con 7 casos la aproximación normal no da, y Wald —la fórmula clásica p ± z·√(p(1−p)/n)— es justamente la que la usa. El informe redactado sale con Wilson, que es el que corresponde salvo que haya una razón para otro, y los tres quedan en el CSV para que se puedan comparar.
Qué deja
| Archivo | Qué trae |
|---|---|
| ic-medias.csv | La media de cada variable numérica, con su error estándar y sus grados de libertad |
| ic-varianzas.csv | La varianza y el desvío, por chi-cuadrado |
| ic-proporciones.csv | Cada categoría, por Wilson, Wald y Clopper-Pearson |
| ic-diferencias.csv | Cada par de grupos, con las columnas que dicen si mirarlos por separado engaña |
| avisos.csv | Cada supuesto que no se cumple, con el intervalo que lo disparó |
| intervalos.md | El informe redactado, listo para pegar |
Cada fila lleva un ámbito: Total para la muestra entera y el nombre del grupo para los de adentro de cada grupo. La confianza y el tamaño de la población van en datos/parametros.csv, no en el código: son los dos parámetros que más se tocan. Si completás la población, los intervalos de una muestra se achican y el aviso dice cuánto.
Los avisos son los de la calculadora
avisos.csv no trae texto escrito para este descargable: trae lo que dice la calculadora de intervalos del sitio, palabra por palabra. El verificador le pasa los mismos casos a las funciones de la calculadora y exige que los avisos coincidan, así que si alguna vez dijeran cosas distintas sería un error de una de las dos y no una diferencia de criterio.
En el ejemplo aparecen trece avisos distintos: el de la categoría con menos de cinco casos, el de los grados de libertad decimales de Welch, el del intervalo de la varianza —el menos robusto de todos— y el de que Wilson no está centrado en la proporción observada, que es correcto y es justamente lo que lo hace mejor que Wald.
Diez dígitos significativos, y ni uno más
Los archivos de R y los de Python tienen que salir idénticos byte a byte, y acá eso se puso difícil por primera vez en la serie. La varianza de un ingreso en pesos anda por 10¹¹: con seis decimales eso pide dieciocho dígitos significativos, más de los que un double tiene. Y qchisq no devuelve el mismo último bit en R que en SciPy —son dos implementaciones distintas de la misma función—, así que el archivo salía distinto en cada idioma por un dígito que no significaba nada.
La solución es redondear a diez dígitos significativos antes de escribir. Son muchos más de los que cualquier dato de una encuesta justifica, y los dos idiomas coinciden en todos.
Cómo está verificado
Corriéndolo: el verificador descomprime lo publicado, lo corre con Python y con R, exige que los siete archivos sean idénticos y recalcula cada límite de cada intervalo con una implementación aparte de las cinco fórmulas. Después le pasa los mismos casos a la calculadora del sitio desde Node y compara números y avisos. Prueba además cuatro bases distintas: sin variable de grupo, con tres grupos y 90 % de confianza, con una población de 200 —que enciende la corrección por población finita— y con una categoría que no aparece en uno de los grupos, donde Wald da un intervalo de ancho cero y Clopper-Pearson no. Son 2.865 comprobaciones, y los catorce sabotajes se detectan.