⚠️ Traducción en desarrollo. Esta edición en español aún no incorpora las revisiones más recientes y puede contener pasajes desactualizados. La edición en inglés es la versión de referencia.

15  Investigación experimental causal

WarningEn desarrollo

Este capítulo forma parte de un libro en desarrollo activo y todavía no ha pasado por la revisión del autor. El contenido puede cambiar a medida que avanza la revisión.

Open In Colab

La decisión de investigación. Decide si la manera en que se asignó el tratamiento en tu estudio te permite leer una diferencia simple de resultados como un efecto causal, y luego nombra exactamente qué cantidad estima esa diferencia y de quién es ese efecto. Nadie más puede confirmar cómo repartiste tus unidades, así que ninguna herramienta declara que tu diseño prueba una causa.

15.1 Por qué importa esta decisión

La decisión sobre la mesa: si tu diferencia de resultados se ganó la palabra “porque”, y a quién describe de verdad esa diferencia.

“Todo el mundo me muestra que al grupo tratado le fue mejor. También les fue mejor a quienes ya estaban más sanos de entrada, o eran más organizados, o más jóvenes. ‘Mejor después del tratamiento’ no es ‘el tratamiento funcionó’. Muéstrenme que el azar, y no el tipo de paciente, decidió quién recibió tratamiento, y díganme exactamente de quién habla su número.” — una revisora de ensayos clínicos, leyendo una afirmación de que un nuevo recordatorio mejoró la adherencia a la medicación

Una afirmación causal es lo más difícil que sostendrás en este libro. Hoy una herramienta puede limpiar tus datos, correr la comparación y entregarte un número seguro en segundos. Esa velocidad es el peligro. Si pegas de vuelta “el tratamiento funcionó”, firmaste con tu nombre una afirmación que no te ganaste. A la revisora de arriba no le importa qué tan fluida sonó la salida. A ella le importa cómo se asignó el tratamiento y a quién describe el número. Este capítulo te da el único movimiento que gana la palabra porque, y la disciplina para decir a quién se aplica.

15.2 El concepto

Empieza con una pregunta causal, una pregunta sobre qué cambiaría si intervinieras, no sobre qué cosas simplemente van juntas. Ejemplo: “¿un recordatorio por mensaje de texto eleva la proporción de pacientes que resurten su receta a tiempo?”, no “¿quienes recibieron recordatorios resurten más?”.

Para una unidad, una paciente, escribe dos números. El resultado potencial Y(1) es lo que esa unidad mostraría con el tratamiento. Ejemplo: si la Sra. R resurte a tiempo cuando recibe los mensajes. El resultado potencial Y(0) es lo que la misma unidad mostraría sin él. Ejemplo: si esa misma Sra. R resurte cuando no recibe nada. El efecto causal para ella es Y(1) menos Y(0). Ahora la regla que gobierna todo el campo, el problema fundamental de la inferencia causal: para cualquier unidad individual solo llegas a ver uno de esos dos números. A la Sra. R o se le envió mensaje o no, nunca ambas cosas, así que su efecto individual es irrecuperable.

Entonces renuncias al individuo y persigues el promedio. El efecto promedio del tratamiento (ATE) es el promedio de Y(1) menos Y(0) a lo largo de todas tus unidades, el efecto típico en vez del de una unidad cualquiera. Ejemplo: en promedio, el recordatorio elevó los resurtidos a tiempo en unos pocos puntos. Un solo movimiento desbloquea una estimación honesta de ese promedio. La asignación aleatoria deja que el puro azar, una moneda al aire, decida qué unidades reciben tratamiento. Ejemplo: una computadora lanza una moneda justa para cada paciente. El azar no sabe nada de salud ni de organización, así que los dos grupos que arma son parecidos en promedio, y el resultado del grupo sin tratar hace de sustituto honesto de lo que el grupo tratado habría hecho sin tratamiento. Eso es lo que derrota la asignación aleatoria: un factor de confusión, un tercer rasgo que empuja a la vez sobre quién recibe tratamiento y sobre el resultado. Ejemplo: las personas más organizadas resurten de todos modos y son más fáciles de inscribir, así que un recordatorio parece efectivo aunque no haya hecho nada. Aleatorizar rompe el vínculo entre cualquier rasgo y quién recibe tratamiento, y ese vínculo roto es toda la razón por la que un experimento puede decir porque.

15.3 Un ejemplo resuelto

Diriges una clínica y quieres saber si un recordatorio diario por mensaje de texto eleva la proporción de pacientes con hipertensión que resurten a tiempo su receta para la presión arterial. Inscribes a 800 pacientes y dejas que una computadora lance una moneda justa por cada una: 400 al brazo con recordatorio (el tratamiento) y 400 a un brazo de control sin mensajes.

Para la Sra. R, Y(1) es si resurte cuando recibe los mensajes, y Y(0) es si resurte cuando no recibe nada. Solo llegarás a ver uno. Sobre las 800, estimas el ATE como la diferencia en las tasas de resurtido a tiempo entre los brazos. Digamos que el brazo con recordatorio resurte al 71 por ciento y el de control al 62 por ciento, una brecha de 9 puntos porcentuales. Como fue la moneda, y no la organización de cada paciente, la que armó los brazos, esos 9 puntos son una estimación honesta del efecto promedio del recordatorio.

Ahora la prueba de honestidad. Supón que algunas pacientes dejaron de responder antes de la medición final. La atrición es que el resultado de una unidad desaparezca después de la asignación. Ejemplo: pacientes que cambian de teléfono, se mudan o abandonan en silencio, y cuya tasa final de renovación nunca queda registrada.

Aquí está la parte que tumba a mucha gente. Es tentador decir que la brecha de 9 puntos ahora describe a “las pacientes que se quedaron”. Cuidado con esa frase. Cuando el propio tratamiento puede cambiar quién se queda, el brazo con recordatorio te muestra pacientes que se quedaron con recordatorios y el brazo de control te muestra pacientes que se quedaron sin ellos, y esos dos grupos observados no tienen por qué ser el mismo tipo de gente. Su diferencia es un contraste de casos completos, una comparación de quienes por casualidad fueron medidas en cada brazo. Un efecto para algún grupo común de quienes permanecen puede existir como idea, pero este contraste no lo entrega sin supuestos que tendrías que enunciar y defender.

¿Cuándo engaña de verdad el contraste? No simplemente porque se fue gente, y no simplemente porque los brazos perdieron fracciones distintas. El daño llega cuando quién se va está amarrado a cuál habría sido su resultado. Si el brazo con recordatorio pierde a sus pacientes más enfermas, el promedio de las que quedan sube por razones que nada tienen que ver con que el recordatorio funcione. La retención desigual entre brazos es una luz de advertencia que vale reportar siempre, pero es solo una luz: los brazos pueden perder fracciones distintas de pacientes parecidas con poco daño, y perder fracciones idénticas de pacientes muy distintas con un daño enorme. Las tasas solas no condenan ni absuelven; te dicen dónde excavar.

Así que reporta primero la retención por brazo, antes de cualquier efecto, y luego hazte la pregunta de sensibilidad que un extraño te hará: ¿qué tan malos tendrían que ser los resultados faltantes para cambiar la conclusión? Ejemplo: supón que un cuarto del brazo con recordatorio quedó sin medir. Si esas pacientes renovarían a solo 50 por ciento, el promedio verdadero del brazo es 0,75 × 71 + 0,25 × 50, cerca de 66, y la brecha de 9 puntos se encoge a cerca de 4. Si se parecen a las pacientes que sí mediste, la brecha aguanta en 9. Trabajar dos o tres de esos “qué pasaría si” te dice si tu hallazgo sobrevive a un pesimismo honesto, y ese rango pertenece al informe.

La atrición tiene dos hermanas que el laboratorio ejercita. El incumplimiento ocurre cuando unidades asignadas nunca toman el tratamiento, como pacientes que cambiaron de número y nunca recibieron un mensaje. El derrame (spillover) ocurre cuando el tratamiento llega al brazo de control, como una paciente con mensajes que le recuerda a una amiga sin tratar. Cada uno deja intacta la moneda al aire y aun así cambia qué cantidad describe tu número. Nombrar esa cantidad es la decisión que habilita este capítulo.

15.4 Una simulación con semilla

La aleatorización es una promesa sobre el procedimiento: asigna el tratamiento a cara o cruz, y la diferencia de medias queda correcta en promedio, con una oscilación que puedes cuantificar. El código de abajo mantiene esa promesa a la vista. Les da a 200 pacientes sus dos tasas potenciales de renovación de receta — sin recordatorio, y con un recordatorio que de verdad agrega 5 puntos porcentuales — y luego repite la asignación aleatoria 2.000 veces, registrando la estimación que cada asignación habría producido. La semilla hace que cada corrida reproduzca exactamente esta figura.

import numpy as np
import matplotlib.pyplot as plt

SEED = 464
rng = np.random.default_rng(SEED)

n, tau = 200, 5.0                            # efecto verdadero: +5 puntos
y0 = np.clip(rng.normal(70, 12, n), 20, 95)  # tasa de renovación sin recordatorio
y1 = y0 + tau                                # exactamente +5 para cada paciente

estimaciones = []
for _ in range(2000):
    tratados = rng.permutation(n) < n // 2   # una nueva asignación al azar
    estimaciones.append(y1[tratados].mean() - y0[~tratados].mean())
estimaciones = np.array(estimaciones)

fig, ax = plt.subplots(figsize=(7.6, 3.2))
ax.hist(estimaciones, bins=40, color="#2a78d6", edgecolor="white", lw=.4)
ax.axvline(tau, color="#333333", ls="--", lw=1.2)
ax.text(.02, .92, f"efecto verdadero = {tau:.1f} pp", color="#333333",
        fontsize=9, transform=ax.transAxes)
ax.text(.02, .82, f"media de las estimaciones = {estimaciones.mean():.1f} pp",
        color="#2a78d6", fontsize=9, transform=ax.transAxes)
ax.set_xlabel("Efecto estimado del recordatorio (puntos porcentuales)")
ax.set_ylabel("Número de reasignaciones")
plt.show()

Histograma de 2.000 efectos estimados en azul, aproximadamente en forma de campana desde cerca de 0 hasta 10 puntos porcentuales, con una línea vertical discontinua en el efecto verdadero de 5,0 y una anotación con la media de las estimaciones en 5,0.

El histograma de 2.000 estimaciones reasignadas se centra en el efecto verdadero de 5 puntos.

El histograma es la distribución de aleatorización: cada estimación que este mismo experimento pudo haber producido bajo otro sorteo. Se centra casi exactamente en la verdad (media de las estimaciones 5,0 contra un 5,0 verdadero), que es la promesa del “correcto en promedio”, cumplida y visible. Pero la mayoría de las corridas cayó entre unos 2 y 8 puntos, y los extremos fueron de abajo de cero a arriba de 10. Tu único experimento realizado es una sola extracción de este histograma, y ese reparto es la incertidumbre que un informe honesto debe llevar junto a la estimación. En el cuaderno de acompañamiento, duplica n y mira el histograma estrecharse: el tamaño de muestra compra precisión — es la aleatorización la que compra verdad en promedio.

15.5 Lo que la atrición le hace a esa promesa

El código de abajo mantiene la moneda exactamente tan honesta como antes y cambia una sola cosa: quién puede seguir siendo medido al final. Cada uno de los 2.000 pacientes recibe un beneficio verdadero de 5 puntos. Bajo control, los pacientes abandonan solo si su salud es mala. Bajo el recordatorio, el corte es más duro, así que más de los pacientes más enfermos quedan sin medir. Luego el estudio se re-sortea 2.000 veces, y cada vez tomamos la diferencia simple entre los pacientes que todavía podemos ver.

import numpy as np
import matplotlib.pyplot as plt

SEED = 464
rng = np.random.default_rng(SEED)

N, reps, tau = 2000, 2000, 5.0
salud = rng.normal(size=N)
y0 = 60 + 10 * salud + rng.normal(0, 5, size=N)   # tasa de renovación sin recordatorio
y1 = y0 + tau                                     # ... con el recordatorio
r0 = salud > -0.8         # aún medible bajo control
r1 = salud > -0.2         # ... bajo el recordatorio: los más enfermos desaparecen

contrastes = []
for _ in range(reps):
    z = rng.permutation(N) < N // 2               # una moneda honesta
    y = np.where(z, y1, y0)
    medido = np.where(z, r1, r0)
    contrastes.append(y[z & medido].mean() - y[(~z) & medido].mean())
contrastes = np.asarray(contrastes)

print("efecto verdadero para todos los inscritos:", np.mean(y1 - y0))
print("contraste promedio de casos completos:    ", contrastes.mean().round(2))

Histograma de 2.000 contrastes de casos completos en naranja, centrado cerca de 8,1 puntos porcentuales, con una línea vertical discontinua en el efecto verdadero de 5,0 bien a la izquierda de toda la distribución.

Los contrastes de casos completos se apilan cerca de 8 puntos, lejos del efecto verdadero de 5.

Mira dónde queda la línea discontinua. La verdad es 5 puntos, y ninguno de los 2.000 re-sorteos produjo un contraste ni cerca de ella. Se apilan alrededor de 8,1. Nada aquí es mala suerte de una muestra desafortunada, y ningún dato extra empujaría la pila hacia la izquierda, porque la inclinación no es ruido. Quitar a los pacientes más enfermos de un brazo sube el promedio de ese brazo, y la brecha hereda la subida.

Fíjate en lo que la simulación no hizo. Nunca tocó la moneda, y nunca hizo que el recordatorio valiera más de 5 puntos para nadie. La asignación aleatoria hizo todo su trabajo. El daño llegó después, cuando los resultados desaparecieron de una manera que el propio tratamiento controlaba. Por eso la retención por brazo entra en tu informe antes que cualquier efecto: el 59 por ciento del brazo con recordatorio siguió medido contra el 80 por ciento del control. Lee esa brecha como luz de advertencia, no como veredicto. Lo que sesgó este contraste no fueron las tasas desiguales en sí, sino que la salida estaba amarrada a la salud, que también mueve el resultado. Un diseño puede perder fracciones distintas de pacientes parecidos casi sin daño, y fracciones iguales de pacientes muy distintos con un daño desastroso. Las tasas dicen dónde excavar; la excavación es el trabajo de sensibilidad de la prueba de honestidad de arriba.

15.6 El laboratorio en Colab

Este capítulo tiene su propio cuaderno de acompañamiento: ábrelo en Colab con la insignia de arriba. El cuaderno reúne los prompts y el código del capítulo y termina con el espacio de trabajo Ahora te toca a ti, para que completes el paso del capítulo en tu proyecto sin salir de Colab. El laboratorio de aula completo detrás de este capítulo es el cuaderno del curso nb09 — Experimental causal research (investigación experimental causal) (abrir en Colab), parte del curso de acompañamiento presentado en el apéndice Para docentes. Ahí analizas un experimento de campo real para movilizar el voto, estimas el efecto como una diferencia de promedios y le pones alrededor un intervalo por inferencia de aleatorización. Luego ves cómo la atrición, el incumplimiento y el derrame doblan cada uno una estimación limpia, para que aprendas a nombrar qué cantidad sobrevive de verdad.

15.7 Prompts de IA recomendados

Comprométete primero con tu propia respuesta y luego delega. Cada prompt de abajo es una tarea verificable, no un pedido de veredicto. Trabájalos como un bucle de IA: el ciclo prompt → respuesta → interrogación → refinamiento → nueva ejecución. La primera respuesta es un borrador: encuentra la afirmación que no puedes comprobar, dilo en tu siguiente mensaje y vuelve a correrlo. Algunas herramientas corren ese bucle completo sin supervisión y te entregan un análisis terminado. Esa apariencia de terminado es justamente lo que hace que valga la pena hacer las preguntas de este capítulo antes de aceptarlo.

Localiza la herramienta estándar.

Act as a statistics assistant. I ran a two-arm randomized trial and computed a
plain difference in on-time refill rates between a reminder arm and a control arm.
Before any code, name the standard way to attach a 95% interval to a difference in
two proportions, and one resampling alternative, citing where each is documented.
Only name methods you are confident exist.

Después de ejecutarlo, verifica: abre la documentación citada y confirma que el método y su fórmula existen tal como se describen. Contrarresta la fabricación confiada (confident fabrication): un nombre de método inventado llega con la misma seguridad que uno real.

Enumera los supuestos por verificar.

Here is my analysis of a randomized reminder trial: [paste your cell]. List, as a
table, every assumption my causal reading rests on: that assignment was truly
random, that no one dropped out in a way tied to the outcome, that the control arm
got no treatment. For each, say what I would check in my own data to confirm it.

Después de ejecutarlo, verifica: contrasta cada supuesto listado con tu diseño real y con tus números de retención antes de aceptar la lectura causal. Contrarresta el cambio silencioso de alcance: una asociación reportada sin aviso como una causa establecida.

Haz red team a tu efecto.

My claim: "the reminder raised on-time refills by 9 points." Act as a hostile
clinical-trial reviewer. Name every way dropout, noncompliance, or spillover could
make this number describe a different group than everyone I enrolled. Do not
rewrite the claim for me.

Después de ejecutarlo, verifica: si solo elogia el diseño, insiste y exige la peor amenaza, luego pruébala contra tu retención por brazo. Contrarresta el acuerdo complaciente: elogios que revisan tu ego, no tu evidencia.

ImportantNo delegues

Tres decisiones nunca salen de tus manos. Tú decides si de verdad hubo asignación aleatoria en tu estudio, porque una herramienta no puede ver cómo armaste los brazos. Tú decides qué cantidad estima tu número y para quién: si todavía habla por todas las personas inscritas, o si la atrición te dejó sin ningún número causal hasta que enuncies un supuesto y pruebes cuánto pesa. Y tú decides si el efecto es lo bastante grande como para actuar, y si es siquiera ético aleatorizar a pacientes reales y negarle algo al brazo de control. La oración final es tuya, con su frontera y su incertidumbre.

15.8 Un caso de falla de la IA

Pegas tu ensayo en la herramienta y reporta, con plena seguridad: “el recordatorio elevó los resurtidos a tiempo en 12 puntos, y el efecto es significativo”. El código corre sin un solo error. Aquí está la trampa. Un tercio del brazo con recordatorio, las pacientes con la peor presión arterial, dejó de responder al seguimiento y abandonó el estudio, así que la herramienta calculó la brecha entre quienes se quedaron y la etiquetó “el efecto del recordatorio”. Eso es un cambio silencioso de alcance. El número es un contraste de casos completos: no es el efecto para todas las que inscribiste, y soltar a las pacientes más enfermas de un brazo lo empujó hacia arriba.

Lo detectas revisando la retención por brazo y quiénes se perdieron, no releyendo el párrafo fluido. El brazo con recordatorio perdió muchas más pacientes, y las que perdió eran las más enfermas, así que quién se quedó estaba amarrado a cuál habría sido el resultado. Eso vuelve esos 12 puntos un contraste de casos completos: no el efecto para todas las inscritas, y no automáticamente un efecto para ningún grupo común de quienes se quedaron, ya que cada brazo produjo el suyo. Una palomita verde no es un resultado correcto. Reescribes la oración para reportar la retención en ambos brazos, para decir con todas sus letras que este ensayo, tal como corrió, no entrega el efecto para todas las inscritas, y para correr el “qué pasaría si” de la prueba de honestidad: ¿qué tan bajas tendrían que ser las renovaciones de las pacientes sin medir para que el hallazgo se voltee?

15.9 Ahora te toca a ti

Tu diseño ya está declarado y diagnosticado. Este paso pregunta si se ganó la palabra “porque”, y te obliga a decir en voz alta de quién es el efecto que reporta tu número.

  1. Escribe tu tratamiento y tu resultado como dos frases cortas. Luego escribe una oración sobre cómo una unidad termina tratada. Si la respuesta es algo distinto de “lo decidió un mecanismo de azar”, esta ruta todavía no es la tuya.
  2. Toma una unidad real de tu estudio y escribe Y(1) y Y(0) para ella en palabras simples. Marca con un círculo la que de verdad llegarás a ver. Ese círculo es el problema fundamental de la inferencia causal con la letra de tu propio proyecto.
  3. Nombra la cantidad a la que apunta tu estimación y para quién, en una oración que alguien desconocido pueda repetirte correctamente. “Todas las personas que inscribí” es el punto de partida. “Solo quienes cumplieron” y “solo quienes se quedaron” son grupos que tu tratamiento pudo haber ayudado a crear, así que ninguno sale de una comparación simple de subgrupos: nombrar uno te compromete con supuestos que debes enunciar. Si la atrición tocó tus datos, di qué supones sobre las personas que no mediste, y muestra cómo se mueve la conclusión cuando ese supuesto se dobla.
  4. Nombra la amenaza más cercana a tu diseño, sea atrición, incumplimiento o derrame, y la comprobación que correrás en tus propios datos para ver qué tan grave es: retención por brazo, adopción por brazo, contacto entre brazos.
  5. Si no puedes aleatorizar, corre los pasos 1 a 4 como ejercicio y luego nombra el factor de confusión que la asignación aleatoria habría matado por ti y el movimiento observacional que usarás en su lugar.
  6. Registra el paso en tu AI Research Ledger (registro de investigación con IA) y verifica al menos una salida con un método nombrado de la Guía de Verificación. El resultado de este capítulo merece dos: código alternativo, recalculando tu diferencia a mano y llegando al mismo número, y simulación, revolviendo las etiquetas de tratamiento miles de veces para ver con qué poca frecuencia el azar solo produce una brecha tan grande como la tuya. Una IA revisora puede hacer las comprobaciones contigo; la decisión de aceptar o rechazar es tuya.