Python Data Science Program
📓 Abrir notebook en GitHub

Clase 181 — Corrección de comparaciones múltiples (Bonferroni, FDR)

Parte: 3 — Estadística Inferencial y Causal · Fuente: ISLP, cap. 13 Multiple Testing + Benjamini & Hochberg (1995). ⏱️ Duración estimada: 70 min.

🎯 Objetivo

Entender por qué hacer 100 tests al α=0.05 produce ≈ 5 falsos positivos esperados aunque todas las H₀ sean verdaderas, y aplicar las dos familias de corrección: family-wise error rate (FWER) con Bonferroni y Holm, y false discovery rate (FDR) con Benjamini-Hochberg (BH). Saber elegir entre ambas según el contexto (medicina/seguridad → FWER; screening exploratorio → FDR).

📚 Resultados de aprendizaje

Al finalizar, el estudiante podrá:

🗺️ Temas

📖 Definiciones y características

📂 Dataset / recursos

🧪 Ejercicios

  1. Inflación de α: simulá 10 000 experimentos. En cada uno, hacé 20 tests con H₀ verdadera (scipy.stats.ttest_ind entre dos grupos N(0,1), n=30). Contá en qué % al menos 1 da p<0.05. Verificá que ≈ 64 %.
  2. Bonferroni: con un vector pvals de 20 p-values, calculá pvals_adj = np.minimum(pvals * 20, 1) y compará contra multipletests(pvals, method='bonferroni').
  3. Holm: multipletests(pvals, alpha=0.05, method='holm'). Comparar cuántos rechaza vs Bonferroni con el mismo vector.
  4. BH/FDR: genera 1000 p-values, 950 de Uniform(0,1) y 50 de Beta(0.5, 5) (concentrados cerca de 0 — alternativos). Aplicá multipletests(pvals, alpha=0.05, method='fdr_bh'). Contá cuántos rechaza y estimá el FDR empírico (rechazos del primer grupo / total rechazos).
  5. Comparación: mismo vector del ej. 4, aplicar Bonferroni, Holm y BH. Tabla con: # rechazos, % de los 50 verdaderos descubiertos (recall), FDR empírico. Verificá que BH descubre mucho más con FDR controlado.

📝 Homework verificable

Sobre un dataset con 30 features y un target binario (ej.: load_breast_cancer):

  1. Para cada feature, t-test entre la clase 0 y la clase 1.
  2. Aplicar tres correcciones: Bonferroni, Holm, BH (q=0.05).
  3. Tabla comparativa: # features significativas según cada método.
  4. Justificar en 3 líneas qué método elegirías si: (a) vas a publicar los hallazgos en un paper médico, (b) usás esto como screening para una etapa siguiente.

Criterio de aceptación: BH debe descubrir más features que Holm, que descubre que Bonferroni. La justificación debe mencionar que (a) → FWER (Bonferroni/Holm), (b) → FDR (BH).

⚠️ Errores comunes

Síntoma / mensaje Causa y cómo arreglar
Hago 50 t-tests sin corrección y reporto los significativos como hallazgos Cherry-picking estadístico. Fix: BH como mínimo.
Aplico Bonferroni con m=1000 y no rechaza nada Demasiado conservador para screening. Fix: BH si el contexto admite FDR.
Aplico BH a tests no independientes (ej.: features correlacionadas en regresión) BH clásico asume independencia o PRDS. Fix: BY (Benjamini-Yekutieli, method='fdr_by') que tolera dependencia arbitraria — más conservador.
Reporto p-value ajustado como "probabilidad de error" El p-value ajustado sigue siendo un p-value (bajo H₀), no P(H₀\|datos). Fix: usar lenguaje preciso ("controlando FDR al 5 %").
Decido cuál corrección usar después de ver los resultados También es p-hacking. Fix: pre-especificar la corrección.

❓ Preguntas frecuentes

❓ ¿Cuándo Bonferroni y cuándo BH?

Regla simple: Bonferroni cuando el costo de un falso positivo es alto (medicina, seguridad, decisiones binarias). BH cuando hacés screening y aceptás cierta proporción de FP entre los hallazgos para no perder verdaderos (genómica, A/B testing masivo, feature selection).

❓ ¿Por qué Holm es siempre mejor que Bonferroni?

Porque rechaza al menos los mismos tests y a veces más, sin perder control del FWER. La única razón para usar Bonferroni es simplicidad pedagógica.

❓ ¿BH controla FDR exactamente al 5 %?

Controla FDR ≤ q · (m₀/m), donde m₀ es el número de H₀ verdaderas. En la práctica, m₀ ≤ m, así que FDR ≤ q. Si esperás muchos nulos, BH es un poco más conservador de lo que parece.

❓ ¿Storey's q-value es lo mismo que BH?

Es una versión adaptativa: estima π₀ = m₀/m de los datos y corrige menos cuando hay muchos rechazos esperados. En genómica es estándar; en data science general, BH alcanza.

❓ ¿Tengo que corregir si los tests son sobre datasets distintos?

Si forman parte del mismo objetivo de inferencia (la misma "familia"), sí. Si son análisis independientes con conclusiones separadas, no. El límite es subjetivo; pre-registrar la familia ayuda.

🔗 Referencias

📥 Material descargable

➡️ Siguiente clase

Clase 182 — Intervalos de confianza