Ir al contenido
σestadistica.ar

Script

ANOVA

De uno y de dos factores, con los supuestos adelante y las comparaciones de a pares atrás. Y con lo que casi nunca se informa: qué pasa cuando los dos factores interactúan.

Descargar

Proyecto en R y Python · ZIP · 144 KB

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

Un promedio que no describe a nadie

La base de ejemplo tiene un programa de apoyo —Control o Tratamiento— y el nivel educativo con el que cada persona llegó. La respuesta es el desempeño en la evaluación final. Lo primero que mira cualquiera es si el programa sirvió:

Control promedia 62,05 y Tratamiento 62,14. Nueve centésimas de diferencia, p = 0,384. El programa no sirve, entonces. Salvo que esto es lo que pasa adentro:

Nivel previoControlTratamientoDiferenciap
Primario54,566,4+11,97< 0,001
Secundario60,362,7+2,390,382
Superior70,160,0−10,09< 0,001

El programa levanta doce puntos a quien llega con primario y hunde diez a quien llega con superior. Los dos efectos son grandes, los dos son significativos, y se cancelan al promediarlos. Lo que queda es un efecto principal de cero con un valor p tranquilizador.

La interacción es la que avisa: F(2; 142) = 15,69, p < 0,001. Por eso, cuando la interacción sale significativa, el descargable calcula los efectos simples y pone la advertencia arriba de todo en el informe, antes que cualquier otro número.

No es un caso de laboratorio. Un programa que funciona distinto según con qué llega la gente es lo normal en política educativa, en salud y en capacitación laboral. Lo raro sería que el efecto fuera el mismo para todos, y sin embargo es lo que informa un efecto principal.

Dos decisiones que casi nadie declara

El tipo de suma de cuadrados

Con las celdas del mismo tamaño los tipos de suma de cuadrados dan lo mismo y la discusión no existe. Con celdas desparejas —o sea, casi siempre— dan distinto. El ejemplo tiene celdas de 14 a 35 casos, y el efecto del programa sale así:

Cómo se calculaSuma de cuadradosp
Tipo I, con nivel primero11,470,723
Tipo I, con grupo primero0,280,956
Tipo III69,560,384

La suma de cuadrados se multiplica por doscientos cincuenta según cuál se elija. Acá las tres conclusiones coinciden —ninguna es significativa—, pero no tiene por qué ser así, y por eso la tabla trae la columna cambia_la_conclusion.

anova() de R devuelve tipo I. SPSS devuelve tipo III. Dos personas con los mismos datos y distinto programa pueden publicar números distintos sin haberse equivocado en nada, y casi nunca aclaran cuál usaron.

Cuál corrección por comparaciones múltiples

El descargable corre los cuatro métodos siempre, y también la prueba sin corregir. No es indecisión: elegir el método después de ver cuál da significativo es exactamente la maniobra que las correcciones existen para impedir.

En el ejemplo son 15 comparaciones entre las seis celdas. Sin corregir darían 9 pares significativos; con Tukey quedan 5. Esos cuatro son el precio de haber hecho quince comparaciones. Y hay un par donde los cuatro métodos no coinciden:

Primario / Control contra Secundario / Tratamiento
Métodop¿Significativa?
Sin corregir0,004Sí
Tukey0,042Sí
Holm0,041Sí
Bonferroni0,055No
Scheffé0,128No

Ahí la conclusión no la deciden los datos: la decide el método. Lo honesto es decir que está en el borde, y la columna cambia_entre_correcciones lo marca sin que haya que buscarlo.

Qué deja

ArchivoQué trae
celdas.csvn, media, desvío, mediana, mínimo y máximo de cada celda
supuestos.csvShapiro-Wilk dentro de cada celda, con el veredicto
anova-un-factor.csvLa tabla clásica: entre, dentro y total
efecto-y-welch.csvη², ω², la versión de Welch y Levene, en una línea
anova-dos-factores.csvEl modelo completo por sumas de cuadrados de tipo III
tipos-de-suma.csvTipo I en los dos órdenes contra tipo III, y si cambia alguna conclusión
efectos-simples.csvEl efecto del segundo factor dentro de cada nivel del primero
post-hoc.csvCada par por los cuatro métodos, y también sin corregir
avisos.csvCada supuesto que no se cumple y cada conclusión que depende de una decisión
anova.mdEl informe redactado

El diseño se declara en datos/parametros.csv: la respuesta, el factor, el segundo factor y la confianza. Con el segundo factor vacío el proyecto hace un ANOVA de un factor y nada más.

Tres cosas que salen sí o sí

El ω² al lado del η². El η² siempre sobreestima, porque un factor explica algo de variabilidad aunque no haya ningún efecto real. En el ejemplo el η² da 4,3 % y el ω² 3,0 %: el segundo es el que conviene informar.

La versión de Welch al lado de la clásica, siempre, aunque Levene no rechace. Es más honesto que decidir cuál mostrar después de ver el resultado.

La normalidad, por celda y no sobre todo junto. Si los grupos tienen medias distintas, la respuesta apilada sale bimodal y Shapiro-Wilk rechaza aunque cada celda sea perfectamente normal. Lo que el ANOVA supone normal es el residuo, no la respuesta.

Sin aov, TukeyHSD ni ptukey

Porque las dos versiones escriben los once archivos byte a byte iguales y Python no tiene equivalentes exactos de ninguna de las tres. El cálculo se escribe una vez de cada lado, como en el descargable de regresión.

Con ptukey hay además una razón que no es de comodidad. La distribución del rango studentizado —la que necesita Tukey— es una integral doble que hay que resolver numéricamente, y la implementación de R la integra con dieciséis puntos fijos. Contra scipy.stats.studentized_range, que es una implementación independiente, el valor crítico para k = 4 y ν = 20 da 3,958293560921 acá, 3,958293560945 en scipy y 3,958293461450 en qtukey: las dos cuadraturas finas coinciden en once dígitos y la de R se despega en el octavo. Para decidir si un p es mayor o menor que 0,05 da exactamente igual, pero quien compare va a ver la diferencia y merece saber de dónde sale.

Lo que no hace

No hay medidas repetidas. Todas las comparaciones son entre sujetos distintos.

No hay más de dos factores, ni covariables (ANCOVA), ni efectos aleatorios.

No hay alternativa no paramétrica. Cuando la normalidad no se cumple, el aviso recomienda Kruskal-Wallis; el cálculo no está.

No elige por vos qué post hoc informar. Los cuatro salen en la misma tabla, y cuál declarar es una decisión de quien firma.

Cómo está verificado

Corriéndolo: el verificador descomprime lo publicado, lo corre con Python y con R, exige que los once archivos salgan idénticos y recalcula todo de dos maneras distintas. Contra scipy —Shapiro-Wilk, Levene con centro en la mediana, y el Tukey contra scipy.stats.studentized_range, que resuelve la misma integral doble con otra cuadratura—, y contra src/lib/anova.ts, la calculadora del propio sitio, invocada desde Node: si una fórmula cambia de un lado y no del otro, falla. Las sumas de cuadrados de dos factores van contra un ajuste por SVD con numpy, que es otro algoritmo que las ecuaciones normales del descargable, y se comprueban las identidades que no pueden fallar: que las sumas de tipo I cierren con la total, que la interacción dé lo mismo por los tres caminos, que el ω² nunca supere al η² y que Scheffé nunca sea menos conservador que Tukey. Prueba además cuatro bases distintas: un factor solo, varianzas veinte veces distintas, una celda vacía y un diseño balanceado —donde los tipos de suma de cuadrados tienen que coincidir, que es el control de que la diferencia del ejemplo viene del desbalance y no de un error de cuenta—. Son 2.210 comprobaciones, y los veinticinco sabotajes se detectan.