Tu MMM probablemente está mal: lo que aprendimos calibrando con geolifts
Un benchmark donde conocemos la respuesta correcta, cuatro MMM populares, más de 4,500 fits y un holdout en un retailer real. Correr experimentos importó más que elegir el modelo.
En este artículo
Medimos el canal de afiliados de un retailer con tres herramientas, en el mismo periodo. GA4 le atribuyó 50% de las ventas. El MMM le dio 30%. Un holdout geográfico, donde apagamos afiliados en regiones equiparables al resto del país, midió 9% incremental.
Afiliados: GA4 atribuía 50% de las ventas; el holdout midió 9%
Peso de afiliados en ventas según cada herramienta, mismo periodo
Afiliados era cerca de 40% del spend de esa cuenta. Tres respuestas tan distintas sobre el canal más grande no son un detalle técnico; son la diferencia entre subirle o bajarle presupuesto.
Con datos reales no hay forma de saber cuál de las tres le cree uno, porque nadie conoce el ROAS real. Por eso construimos un laboratorio: negocios simulados donde nosotros fijamos la respuesta, para ver qué tan cerca llega cada MMM y qué lo acerca. Lo que encontramos, en una frase: en todos los mundos que probamos, correr experimentos importó más que elegir el modelo.
Un laboratorio donde conocemos la respuesta
Un MMM puede ajustar bien las ventas, converger sin problemas y aun así estar muy equivocado en el ROAS de cada canal. Los diagnósticos usuales dicen si el modelo convergió, no si el ROAS es correcto. Antes de confiar en un instrumento, lo pruebas donde ya sabes el resultado.
Cada negocio simulado pasa por cuatro pasos, y el modelo solo ve el tercero:
- Crear el negocio. Margen de 10% a 80%, un ROAS fijado por canal (desde canales que no recuperan su costo hasta 4× el breakeven), saturación y carryover.
- Simular las decisiones. Los planners suben el spend cuando viene la demanda, como en la vida real. Hay precio, promociones y estacionalidad.
- Observar con ruido. Ventas semanales y spend con 5% de error de medición. Es lo único que recibe el modelo.
- Calificar contra la verdad. Comparamos el ROAS y el plan de presupuesto de cada MMM contra los reales.
Corrimos 7 mundos con 20 negocios cada uno, más de 4,500 fits en total. Lo que separa a los tres mundos principales es qué tanto el spend sigue a la demanda. En clean room no la sigue. En real world la sigue y además hay choques de demanda que el modelo no ve. En adversarial el spend casi copia a la demanda. Otros cuatro mundos (pricing dominante, interacciones entre canales, solo 39 semanas de datos y un cambio de régimen a mitad de la serie) quedaron guardados para la prueba final, para detectar modelos sobreajustados.
La objeción obvia es que diseñamos el benchmark para que los modelos fallen. No es así: un modelo que conoce la forma exacta del negocio recupera la verdad en clean room, con un sesgo de +0.08. Los datos se pueden aprender.
Tres métricas
- Sesgo de ROAS: ROAS estimado menos ROAS real, en puntos. Un sesgo de +7.5 significa que un canal con ROAS real de 2 aparece como 9.5. Para pasar, el sesgo tiene que quedar dentro de ±0.3.
- Cobertura: qué tan seguido el intervalo del 80% contiene el ROAS real. Pedimos al menos 0.60. Un intervalo estrecho y equivocado es peor que uno ancho y honesto.
- Regret: la que importa para decidir. Con el ROAS que estima el modelo armamos un plan que mueve hasta ±30% el presupuesto de cada canal. Como conocemos el negocio real, sabemos cuánto vende ese plan y cuánto vendería el plan óptimo. El regret es lo que se quedó en la mesa dividido entre la ganancia disponible. Si el óptimo agrega $100 y el plan del modelo captura $79, el regret es 0.21. El límite es 0.5.
Regret de 0.21: el plan del modelo capturó $79 de los $100 posibles
Ganancia disponible al pasar del plan actual al óptimo: $100
Un regret mayor a 1 significa algo peor que dejar dinero en la mesa: seguir al modelo baja la venta frente a no mover nada.
Los MMM populares fallan, incluso bien configurados
Con configuración default, ningún MMM popular pasó la prueba en real world. Luego hicimos lo que haría un buen analista: priors centrados en el breakeven a partir del margen, cadenas más largas y revisión de convergencia. El sesgo bajó alrededor de un tercio y aun así ninguno pasó.
Tunear bajó el sesgo, pero ningún modelo quedó cerca del límite
Sesgo mediano de ROAS en puntos (estimado menos real), real world
Sesgo mediano de ROAS en puntos, real world, 20 negocios por modelo, segunda ronda de experimentos. El límite para pasar es ±0.3.
En dinero: con un sesgo de +7.5, un canal que regresa $200 por cada $100 invertidos aparece regresando $950. Con esa lectura le subes presupuesto a un canal que, con 50% de margen, apenas recupera su costo.
Meridian empeoró al tunearlo. Su prior default funcionaba como shrinkage por accidente, y al centrarlo en la economía del negocio perdió ese freno.
Robyn salió con el sesgo más cercano a cero (entre −0.4 y −1.0), y es fácil leer eso como que funciona mejor. La razón es mecánica: su regresión ridge encoge todos los efectos hacia cero, y eso compensa el sesgo hacia arriba que mete el confounding. En promedio queda cerca; canal por canal sigue equivocado, no da intervalos y su plan de presupuesto fue el peor de todos, con regret de 1.18. Seguirlo vendía menos que no mover nada.
Dos sospechosos: la estructura y el confounding
Un modelo aditivo suma el efecto de medios a la base: el mismo spend vende lo mismo en enero que en diciembre. Uno multiplicativo lo escala con la demanda: el mismo spend vende más cuando la demanda ya está alta. Si el negocio es multiplicativo y el modelo asume lo aditivo, el modelo no tiene dónde poner la venta extra de temporada alta y se la da a los medios, que en esas semanas también suben.
Cambiar solo el likelihood de aditivo a multiplicativo bajó el sesgo en clean room de +3.4 a +1.3. Construimos nuestro propio modelo sobre esa idea. Después pre-registramos una prueba en mundos con otra estructura, con el criterio de que nuestro modelo no se castigara más que PyMC fuera de su forma. Falló: su sesgo empeoró +1.56 contra +1.10 de PyMC. Así que bajamos la afirmación a “específica de este benchmark”.
El segundo sospechoso no tiene arreglo dentro del modelo. El modelo correctamente especificado, cuyo forward model es idéntico al generador de datos, tiene un sesgo de +0.08 en clean room y de +2.6 en real world. Cuando el spend sigue a la demanda, ni el modelo perfecto encuentra el ROAS real. Lo que hace falta es evidencia de fuera de los datos: un experimento.
La calibración con geolifts corrige la mayor parte del sesgo
Con cinco geolifts, el sesgo de PyMC en real world bajó de +7.6 a +0.88. Los lifts simulados tienen ruido a propósito (±30% a 2σ), como los reales, con ventana de 4 semanas y 4 de cooldown.
Con cinco geolifts, el sesgo de PyMC bajó de +7.6 a +0.88
Sesgo mediano de ROAS en puntos, real world, 20 negocios, según cuántos lifts calibran el modelo
Sesgo mediano de ROAS, real world, 20 negocios. Los lifts cubren los canales de mayor spend, en orden.
Los otros modelos también mejoran, aunque no igual. NumPyro pasó de +5.3 a +1.5 con cinco lifts. Meridian pasó de +6.1 a +4.3, porque su calibración entra como prior de ROI por canal y no como likelihood: el mecanismo de calibración importa. En clean room, con cinco lifts, PyMC y Meridian quedan dentro del límite (+0.14 y +0.12).
El efecto globo
Con un solo lift, el canal probado queda bien medido y el sesgo se mueve a los canales que no probaste. Aprietas un lado del globo y se infla el otro. Con tres lifts la curva se dobla y el regret ya baja del límite en NumPyro y PyMC. Con cinco, los canales con más spend tienen ancla y el sesgo ya no tiene a dónde irse. Esto es justo lo que pasó con afiliados en el caso real del principio.
La prueba pre-registrada
Para la prueba final congelamos los criterios antes de correr, usamos una seed nueva y sumamos los cuatro mundos que ningún modelo había visto: 7 escenarios, 13 brazos, 1,820 fits y 0 errores. Nuestra apuesta registrada era que nuestro modelo ganaría. No ganó.
| Brazo (real world) | Sesgo | Regret |
|---|---|---|
| PyMC + 5 lifts | +0.40 | 0.21 |
| NumPyro + 5 lifts | +1.28 | 0.21 |
| Nuestro modelo + 5 lifts | +1.29 | 0.31 |
| Nuestro modelo, sin lifts | +2.82 | 0.61 |
| Incumbentes, sin lifts | +4.6 a +5.9 | 0.54 a 0.82 |
Ningún modelo pasó sin calibrar en ningún escenario. Con cinco lifts, el sesgo de todas las familias bajó entre 70% y 90%. Nuestro modelo fue el mejor sin calibrar y el más consistente en los mundos nuevos, pero no le ganó a un PyMC default con cinco lifts.
Dos caveats. En adversarial, la calibración ayuda a decidir pero empeora el sesgo de los canales sin probar. En el mundo de pricing dominante nadie pasa, ni el modelo perfecto.
También probamos la calibración en mundos construidos para contradecirnos: uno aditivo y otro con curvas de respuesta ruidosas. Con cinco lifts, el regret quedó en 0.032 y 0.084 (límite 0.25). La afirmación sobre estructura no sobrevivió esa prueba; la de calibración sí.
Cómo correr el geolift importa casi tanto como correrlo
Un geolift bien medido tiene tres etapas:
- Warm-up. Prendes el spend (o lo apagas, en un holdout) y el efecto incremental tarda en construirse por el carryover.
- Convergencia. El efecto llega a su meseta. Ese nivel es el lift que quieres medir, así que esperas a verlo antes de leer.
- Cooldown. Terminas la intervención y mides cuánto tarda el efecto en desaparecer.
El efecto tarda semanas en llegar a su meseta y en desaparecer
Efecto incremental como fracción de la meseta, con carryover de 0.6 por semana
Con un carryover de 0.6 por semana, si cortas durante el warm-up ves cerca de 67% del efecto real y el canal parece peor de lo que es. En simulación, las lecturas cortas subestimaron el lift 31% (mediana).
El cooldown, además, mide el adstock. Si cada semana sin spend conserva cerca de 60% del efecto de la anterior, el carryover es 0.6, y ese número entra al MMM como prior en lugar de adivinarlo de la serie histórica.
Aun así, un lift imperfecto es mucho mejor que ninguno. En una prueba exploratoria con 6 negocios por mundo, el regret en real world quedó así:
| Escenario | Nuestro modelo | PyMC |
|---|---|---|
| Sin lifts | 0.94 | 0.88 |
| 5 lifts bien leídos | 0.24 | 0.44 |
| 5 lifts cortos, sin cooldown | 0.27 | 0.49 |
| 5 lifts con sesgo de −30% | 0.30 | 0.45 |
Con lifts mal leídos, el regret quedó entre 2× y 3.5× por debajo de no tener lifts. La muestra es chica, así que esto indica la dirección y es menos sólido que las pruebas pre-registradas.
Qué canal probar primero
Construimos un selector sofisticado, Next Best Geolift (NBG), para elegir el siguiente test. Combina cuatro señales: qué tan incierto es si el canal está arriba o abajo del breakeven, la probabilidad de que dos canales estén en el orden equivocado, qué canales el modelo no logra separar entre sí, y un modelo de poder que dice cuántas semanas necesita el test.
Lo comparamos contra una regla simple: spend × tamaño del intervalo del ROAS. Es decir, probar primero el canal donde hay más dinero en juego y el modelo puede estar más equivocado. El protocolo, congelado antes de correr, pedía que NBG empatara o le ganara a la regla simple en los dos mundos después de un lift.
Después de un lift, la regla simple dejó menos regret que NBG en los dos mundos
Regret tras el primer lift según cómo se eligió el canal (menos es mejor)
Pre-registrado, 10 negocios por mundo, 140 fits. NBG perdió en los dos mundos y el canal aleatorio quedó último, así que la prueba sí discrimina.
Un negocio de la validación muestra por qué. La regla simple eligió un canal con 16% del spend y un rango de ROAS muy ancho: el modelo lo veía en 5.0 y en realidad rendía 9.35, el mejor del portafolio. El test corrigió el error más caro y el regret bajó de 0.56 a 0.29. NBG eligió el canal de más spend, cuyo ROAS real (2.1) ya estaba dentro del intervalo del modelo. El test confirmó lo que el modelo ya sabía y el regret se quedó en 0.56. Cuando todos los canales son ambiguos, NBG termina eligiendo por spend e ignora qué tan ancha es la incertidumbre, que es justo lo que usa la regla simple.
Nos quedamos con la regla simple. De NBG conservamos lo que sí sirve: cuántas semanas necesita el test y con qué canal está enredado.
Lo que muestran los geolifts reales
En datos reales, un MMM sin calibrar sirve para ordenar canales, no para medir su ROAS. Lo corrimos sin calibrar con seis clientes reales. Tres no llegaron a una respuesta estable porque tenían pocos datos. Los tres que sí convergieron tenían 126 semanas o más, y su ranking de aportación a ventas hizo sentido, probablemente porque la aportación que asigna el modelo sigue de cerca al propio spend.
Lo que sí se puede medir es con experimentos.
Retailer C: de vuelta a afiliados
El holdout de afiliados midió una caída de entre 8.7% y 11.3% en ventas al apagar el canal, según el pool de control. Usamos 9%, la lectura conservadora. Afiliados sí funciona, pero el MMM le daba más de tres veces lo que midió el experimento, y GA4 más de cinco.
En ROAS, con afiliados en cerca de 40% del spend: GA4 implicaba 1.25× el ROAS promedio de la cuenta, el MMM 0.75× y el holdout 0.23×. El canal rendía menos de un tercio de lo que decía el MMM.
El MMM estaba calibrado, pero con otros canales. Afiliados no tenía ancla y absorbió el sesgo: el efecto globo, en una cuenta real. La ineficiencia detectada vale varios cientos de millones de pesos.
Cuatro reglas para calibrar un MMM
- Corre al menos tres lifts antes de confiar en cualquier ROAS absoluto. Con uno solo, el sesgo se muda a los canales que no probaste.
- Calibra primero donde están el spend y la incertidumbre. Esa regla simple le ganó a nuestro selector sofisticado en una prueba pre-registrada, y es la que habría evitado el error en afiliados.
- Fija la duración antes de arrancar y lee con ventana de cooldown. Leer durante el warm-up subestima el lift y te quita la medición del adstock.
- Corre un lift recurrente cada trimestre. Los canales y la demanda cambian, y la calibración tiene que seguirles el paso.
Construimos nuestro propio modelo esperando que la estructura fuera la respuesta. En la prueba que nosotros mismos diseñamos, un PyMC default con cinco lifts le ganó. En todos los mundos que probamos, correr experimentos importó más que elegir el modelo.
Este artículo resume la charla que Entropy Labs presentó en MeasureCamp 2026.
