En Meridian, el valor de referencia representa el resultado esperado en la situación contrafáctica en la que todas las variables de tratamiento se establecen en sus valores de referencia (cero para los medios pagados y orgánicos, y el valor de referencia configurado para los tratamientos que no son de medios). Dado que el resultado no puede ser negativo, un valor de referencia negativo indica un error estadístico en la inferencia causal de los efectos del tratamiento, lo que suele significar que el modelo está asignando un crédito excesivo a las variables de tratamiento. Se espera que haya algún error estadístico en cualquier modelo, por lo que una caída ocasional y pequeña por debajo de cero no es motivo de preocupación, pero un valor de referencia sumamente negativo (o una alta probabilidad a posteriori de que el valor de referencia agregado durante todo el período sea negativo) es un indicador claro de que el modelo necesita un ajuste.
Si se establece allows_negative_aggregate_baseline=False en ModelSpec, se obtiene una probabilidad de referencia negativa de 0.0, según lo evaluado por la verificación de estado del modelo de referencia negativa. Restringe el valor de referencia del resultado agregado para que no sea negativo en cada extracción a priori y a posteriori, donde agregado significa que se suma en todos los períodos y ubicaciones geográficas (mientras que los valores de referencia para ubicaciones geográficas o períodos individuales pueden seguir siendo negativos).
De forma predeterminada, allows_negative_aggregate_baseline=True. Para habilitar la restricción, establece allows_negative_aggregate_baseline=False:
from meridian.model import model
from meridian.model import spec
model_spec = spec.ModelSpec(allows_negative_aggregate_baseline=False)
mmm = model.Meridian(input_data=data, model_spec=model_spec)
Cómo funciona la restricción
El valor de referencia esperado es la suma de varios componentes del modelo: efectos del tiempo (knot_values; consulta Cómo establecer nudos), efectos principales de las ubicaciones geográficas (tau_g_excl_baseline), variables de control y tratamientos no relacionados con los medios evaluados en sus valores de referencia.
Cuando allows_negative_aggregate_baseline=False, Meridian vuelve a parametrizar knot_values con un cambio ortogonal de base (una reflexión de Householder) para que el valor de referencia agregado en todos los períodos y ubicaciones geográficas se rija por un solo parámetro, mientras que los componentes \(K - 1\) restantes no tienen restricciones para capturar los efectos temporales.
Durante el muestreo de distribuciones a priori y a posteriori, Meridian primero toma muestras de los parámetros de ubicación geográfica, control y tratamiento no relacionado con los medios, y, luego, coloca una distribución a priori de TruncatedNormal en ese único parámetro de nudo con un límite inferior dinámico que depende de esos componentes muestreados, lo que garantiza un resultado de referencia agregado no negativo en cada extracción. Los valores de referencia para períodos o ubicaciones geográficas individuales pueden seguir siendo negativos cuando los datos lo justifiquen.
Para obtener todos los detalles técnicos, consulta el Apéndice matemático.
Propiedades principales
Restringir el valor de referencia agregado para que no sea negativo proporciona varias propiedades estadísticas y computacionales deseables:
- Probabilidad cero de un valor de referencia agregado negativo: Cada extracción de distribuciones a priori y a posteriori satisface la restricción de no negatividad en el valor de referencia del resultado agregado, lo que garantiza que
Analyzer.negative_baseline_probability()sea igual que0.0cuando se evalúa en todos los períodos y ubicaciones geográficas, y que el componente Valor de referencia negativo enModelReviewerdevuelvaPASS(probabilidad de0.0). La evaluación de un subconjunto de períodos ubicaciones geográficas (selected_geos,selected_times) o del valor de referencia del KPI (use_kpi=True) cuandorevenue_per_kpivaría según los períodos o las ubicaciones geográficas no está restringida y puede devolver una probabilidad distinta de cero. - Preserva la eliminación de variables de confusión causales: Los parámetros destinados a eliminar el sesgo de los efectos del tratamiento, incluidos los efectos principales de la ubicación geográfica, los coeficientes de las variables de control y los componentes restantes \(K - 1\) de
knot_values, no se truncan ni se restringen. - Compatible con todas las estructuras de modelos sin ajustes: Se activa con un solo interruptor booleano (
allows_negative_aggregate_baseline=False) sin necesidad de ajustar la penalización ni de realizar cambios en las distribuciones a priori predeterminadas de Meridian, y funciona sin problemas en los modelos a nivel geográfico y nacional, en cualquier especificación de nudos (un solo intercepto constante \(K = 1\), listas de nudos manuales, efectos de tiempo completo \(K = T\)o Selección automática de nudos), variables de control, tratamientos que no son de medios, medios orgánicos y canales de alcance y frecuencia (RF). - No hay ralentización del muestreo de MCMC: Debido a que la matriz de cambio de base ortogonal se calcula previamente en forma cerrada y solo se trunca un parámetro, la geometría posterior sigue siendo fluida para el No-U-Turn Sampler (NUTS) con una sobrecarga de procesamiento insignificante.
- Impacto mínimo cuando el valor de referencia ya es positivo: Truncar un solo parámetro de nudo transformado es un ajuste a priori mínimamente suficiente. Cuando los datos y las distribuciones a priori ya respaldan un valor de referencia agregado positivo, el umbral de truncamiento se encuentra en el extremo izquierdo de la distribución, por lo que las estimaciones a posteriori cambian solo un poco en comparación con el modelo sin restricciones. Debido a que el parámetro de configuración cambia la distribución a priori, los resultados siguen siendo diferentes para cada modelo, y la misma semilla aleatoria produce extracciones diferentes en los dos parámetros de configuración.
Interacción con las distribuciones a priori y el estado del modelo
Restringir el valor de referencia agregado para que no sea negativo interactúa con las distribuciones a priori de tu modelo y puede revelar conflictos entre los datos y las distribuciones a priori en los diagnósticos de estado del modelo.
Distribuciones a priori para los tratamientos y diagnósticos del estado del modelo
Cuando se habilita la restricción de referencia no negativa, es posible que, en ocasiones, veas que otros componentes del estado del modelo se ven afectados si tus distribuciones a priori de tratamiento entran en conflicto con una referencia agregada no negativa.
Un valor de referencia negativo en un modelo sin restricciones puede surgir de distribuciones a priori de tratamiento demasiado optimistas. Cuando las distribuciones a priori del ROI, el mROI o la contribución implican una contribución total del tratamiento que supera el resultado total observado, restringir el valor de referencia agregado para que no sea negativo genera un conflicto entre las distribuciones a priori y los datos, lo que puede hacer que el resultado total predictivo a posteriori supere el resultado total observado.
Cuando se produce este conflicto, la restricción impide que el modelo oculte el exceso de resultado incremental dentro de un valor de referencia negativo. En cambio, el conflicto puede aparecer en los diagnósticos de ModelReviewer:
- Convergencia: Valores de
R-hatelevados (max_r_hat >= 1.2) si las distribuciones a priori de tratamiento sólidas empujan el muestreador contra el límite de referencia no negativo - Valor P predictivo de la distribución a posteriori (PPP) bayesiano: Es un resultado de
FAIL(valor p< 0.05) cuando el resultado total predictivo de la distribución a posteriori supera el resultado total observado - Bondad del ajuste: Una disminución del R cuadrado
Si observas problemas de convergencia, un error de PPP bayesiano o un valor de R cuadrado más bajo después de habilitar la restricción, inspecciona y vuelve a calibrar tus distribuciones a priori para los tratamientos en lugar de permitir un valor de referencia negativo. Para obtener una guía paso a paso, consulta Mitiga el valor de referencia negativo o bajo.
Efecto en los requisitos de distribuciones a priori de knot_values y distribuciones a priori personalizadas
Según la restricción, la distribución a priori inducida en knot_values ya no es independiente ni está distribuida de forma idéntica (i.i.d.). Normal. Debido a que la primera coordenada de nudo transformada se trunca en un límite inferior que depende de los parámetros de ubicación geográfica, control y tratamiento que no es de medios, los valores de knot_values reconstruidos se correlacionan, se desplazan hacia arriba en el agregado y dependen de esos parámetros. Las distribuciones a priori marginales de los parámetros de ubicación geográfica, control y tratamiento que no es de medios no se modifican, ya que se muestrean antes de la coordenada del nudo truncado.
Las distribuciones a priori personalizadas de todos los demás parámetros del modelo, como roi_m, mroi_m, contribution_m, tau_g_excl_baseline, gamma_c y gamma_n de los medios, no tienen restricciones y se muestrean directamente de sus distribuciones especificadas.
Puedes inspeccionar la distribución a priori resultante con sample_prior. Las extracciones de distribución a priori contienen el knot_values reconstruido; los parámetros internos rotated_knot_0 y rotated_knot_rest no se guardan.
from meridian.analysis import analyzer
from meridian.model import model
from meridian.model import spec
model_spec = spec.ModelSpec(allows_negative_aggregate_baseline=False)
mmm = model.Meridian(input_data=data, model_spec=model_spec)
mmm.sample_prior(500)
# Prior draws of knot_values with dimensions (chain, draw, knots).
knot_values_prior = mmm.inference_data.prior.knot_values
# Prior probability of a negative aggregate baseline; 0.0 under the constraint.
analyzer.Analyzer(mmm).negative_baseline_probability(use_posterior=False)
Si comparas estas extracciones con las de un modelo sin restricciones (allows_negative_aggregate_baseline=True), verás cómo la restricción cambia la distribución a priori de knot_values. Después de ejecutar sample_posterior, también puedes trazar la distribución a priori y a posteriori de knot_values con ModelDiagnostics.plot_prior_and_posterior_distribution(parameter='knot_values').
Apéndice matemático
En esta sección, se describe la formulación matemática de la restricción de referencia agregada no negativa. Para obtener más detalles sobre la notación matemática que se usa en esta sección, consulta Notación matemática y Datos de entrada.
1. Condición de referencia agregada en la escala del KPI transformado
Supongamos que \(y_{g,t} = (\ddot{y}_{g,t}/p_g - m^{[Y]}) / s^{[Y]}\) denota el KPI centrado y ajustado según la población. En la situación contrafáctica de referencia en la que todas las variables de medios pagados y orgánicos se establecen en cero y los tratamientos que no son de medios se establecen en sus valores de referencia \(x^{[N](0)}_{g,t,i}\), el KPI transformado esperado en la ubicación geográfica \(g\) y el período \(t\) es el siguiente:
\[ \hat{y}^{\text{base}}_{g,t} := E\left(Y_{g,t} \;\middle|\; \left\{x^{(0)}_{g,t,i}\right\}, \left\{z_{g,t,i}\right\}\right) = \mu_t + \tau_g + \sum\limits_{i=1}^{N_C} \gamma^{[C]}_{g,i} z_{g,t,i} + \sum\limits_{i=1}^{N_N} \gamma^{[N]}_{g,i} x^{[N](0)}_{g,t,i} \]
donde:
- \(\mu_t = \sum_{k=1}^{K} W_{t,k} b_k\) es la intersección que varía con el tiempo determinada por la \(T \times K\) matriz de pesos de nudos \(W\) y los parámetros de nudos \(b = (b_1, \dots, b_K)^\top\) (consulta Cómo funciona el argumento
knots). - \(\tau_g\) es el efecto principal de la ubicación geográfica.
- \(\gamma^{[C]}_{g,i} z_{g,t,i}\) es la contribución de la variable de control\(i\).
- \(\gamma^{[N]}_{g,i} x^{[N](0)}_{g,t,i}\) es la contribución de la variable de tratamiento que no es de medios \(i\) evaluada en su valor de referencia contrafáctico\(x^{[N](0)}_{g,t,i}\).
Supongamos que \(u^{[Y]}_{g,t}\) denota revenue_per_kpi (con \(u^{[Y]}_{g,t} = 1\)cuando revenue_per_kpi es None) y define los pesos de los resultados normalizados\(w_{g,t}\):
\[ w_{g,t} = \frac{T \cdot p_g u^{[Y]}_{g,t}}{\sum\limits_{g'=1}^{G} \sum\limits_{t'=1}^{T} p_{g'} u^{[Y]}_{g',t'}} \]
para que \(\sum_{g=1}^{G} \sum_{t=1}^{T} w_{g,t} = T\). Invertir la transformación de escalamiento del KPI muestra que el resultado de referencia agregado sumado en todas las ubicaciones geográficas y períodos no es negativo si se cumple lo siguiente:
\[ \sum\limits_{k=1}^{K} W^*_k b_k + \text{offset}\left(\tau, \gamma^{[C]}, \gamma^{[N]}\right) \ge -\frac{T \cdot m^{[Y]}}{s^{[Y]}} \]
donde \(W^*_k = \sum_{t=1}^{T} W_{t,k} \left(\sum_{g=1}^{G} w_{g,t}\right)\)es la contribución total ponderada por el resultado del nudo \(k\), y\(\text{offset}(\tau, \gamma^{[C]}, \gamma^{[N]})\) agrega los términos de tratamiento no relacionados con los medios de referencia, control y ubicación geográfica ponderados por el resultado:
\[ \text{offset}\left(\tau, \gamma^{[C]}, \gamma^{[N]}\right) = \sum\limits_{g=1}^{G} \sum\limits_{t=1}^{T} w_{g,t} \left( \tau_g + \sum\limits_{i=1}^{N_C} \gamma^{[C]}_{g,i} z_{g,t,i} + \sum\limits_{i=1}^{N_N} \gamma^{[N]}_{g,i} x^{[N](0)}_{g,t,i} \right) \]
2. Cambio ortogonal de base para knot_values
Para aislar la combinación lineal \((W^*)^\top b = \sum_{k=1}^{K} W^*_k b_k\)en una sola coordenada sin alterar la geometría previa, Meridian construye una matriz ortogonal simétrica \(K \times K\) \(Q\)(\(Q Q^\top = I_K\)) como una reflexión de Householder de forma cerrada cuya primera fila es el vector unitario \(u = W^* / \|W^*\|_2\).
Definición de los parámetros de nudos transformados\(\tilde{b} = (\tilde{b}_1, \tilde{b}_2, \dots, \tilde{b}_K)^\top = Q b\)(de modo que \(b = Q^\top \tilde{b}\); en el grafo de procesamiento del modelo,\(\tilde{b}_1\) se denomina rotated_knot_0 y\((\tilde{b}_2, \dots, \tilde{b}_K)\) se denomina rotated_knot_rest):
La contribución agregada de los nudos depende exclusivamente de la primera coordenada transformada \(\tilde{b}_1\):
\[ (W^*)^\top b = (W^*)^\top Q^\top \tilde{b} = \|W^*\|_2 \, \tilde{b}_1 \]
Dado que \(Q\) es ortogonal, la distribución a priori normal isotrópica de media cero\(b_k \stackrel{\text{i.i.d.}}{\sim} \text{Normal}(0, \sigma_b)\) es invariable en las transformaciones ortogonales y genera distribuciones a priori\(\text{Normal}(0, \sigma_b)\) mutuamente independientes en las coordenadas transformadas\(\tilde{b}_1, \tilde{b}_2, \dots, \tilde{b}_K\):
\[ b_k \stackrel{\text{i.i.d.}}{\sim} \text{Normal}(0, \sigma_b) \quad \text{for } k = 1, \dots, K \quad \Longleftrightarrow \quad \tilde{b}_k \stackrel{\text{i.i.d.}}{\sim} \text{Normal}(0, \sigma_b) \quad \text{for } k = 1, \dots, K \]
3. Truncamiento dinámico en \(\tilde{b}_1\)
Durante el muestreo de las distribuciones a priori y a posteriori, Meridian primero toma muestras de \(\tau_g\),\(\gamma^{[C]}_{g,i}\)y \(\gamma^{[N]}_{g,i}\) , y evalúa el límite inferior dinámico:
\[ \tilde{b}_{1,\text{low}}\left(\tau, \gamma^{[C]}, \gamma^{[N]}\right) = \frac{-\frac{T \cdot m^{[Y]}}{s^{[Y]}} - \text{offset}\left(\tau, \gamma^{[C]}, \gamma^{[N]}\right)}{\|W^*\|_2} \]
y coloca una distribución a priori TruncatedNormal en el parámetro único \(\tilde{b}_1\):
\[ \tilde{b}_1 \sim \text{TruncatedNormal}\left(\text{loc}=0, \text{scale}=\sigma_b, \text{low}=\tilde{b}_{1,\text{low}}, \text{high}=\tilde{b}_{1,\text{high}}\right) \]
donde el límite de truncamiento superior se establece de la siguiente manera:
\[ \tilde{b}_{1,\text{high}} = \max\left(\tilde{b}_{1,\text{low}} + 50\sigma_b, \; 50\sigma_b\right) \]
El límite superior es un requisito numérico, no una restricción de modelado. El No-U-Turn Sampler (NUTS) toma muestras de \(\tilde{b}_1\) en una escala sin restricciones a través de la transformación sigmoidea que usa TruncatedNormal de TensorFlow Probability, que requiere límites finitos. Establecer el límite superior al menos \(50\sigma_b\) por encima de cero y\(\tilde{b}_{1,\text{low}}\) deja una probabilidad a priori insignificante en la cola superior, por lo que se comporta como \(+\infty\) en la práctica.
Los parámetros de nudos transformados \(K - 1\) restantes \(\tilde{b}_2, \dots, \tilde{b}_K \stackrel{\text{i.i.d.}}{\sim} \text{Normal}(0, \sigma_b)\) siguen siendo variables normales sin restricciones, y Meridian reconstruye los parámetros de nudos originales como \(b = Q^\top \tilde{b}\).