Dans Meridian, la référence représente le résultat attendu dans le scénario contrefactuel où toutes les variables de traitement sont définies sur leurs valeurs de référence (zéro pour les médias payants et naturels, et la valeur de référence configurée pour les traitements non média). Comme le résultat ne peut pas être négatif, une référence négative indique une erreur statistique dans l'inférence causale des effets de traitement. Cela signifie généralement que le modèle surévalue les traitements. Une certaine erreur statistique est attendue dans tout modèle. Une légère baisse occasionnelle en dessous de zéro n'est donc pas préoccupante, mais une référence extrêmement négative (ou une forte probabilité a posteriori que la référence agrégée sur l'ensemble de la période soit négative) indique clairement que le modèle doit être ajusté.
La définition de allows_negative_aggregate_baseline=False dans ModelSpec entraîne une probabilité de référence négative de 0.0, telle qu'évaluée par la vérification de l'état du modèle Référence négative. Ce paramètre limite la référence de résultat agrégé pour qu'elle ne soit pas négative sur chaque tirage a priori et a posteriori, où agrégé signifie la somme de toutes les zones géographiques et périodes (alors que les valeurs de référence pour des zones géographiques ou des périodes individuelles peuvent toujours être négatives).
Par défaut, allows_negative_aggregate_baseline=True. Pour activer la contrainte, définissez 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)
Fonctionnement de la contrainte
La référence attendue est la somme de plusieurs composants du modèle : les effets temporels (knot_values ; voir Définir les nœuds), les principaux effets géographiques (tau_g_excl_baseline), les variables de contrôle et les traitements non média évalués à leurs valeurs de référence.
Si allows_negative_aggregate_baseline=False, Meridian reparamétrise knot_values à l'aide d'un changement de base orthogonal (une réflexion de Householder) afin que la référence agrégée pour toutes les zones géographiques et périodes soit régie par un seul paramètre, tandis que les composants \(K - 1\) restants ne sont pas limités pour capturer les effets temporels.
Lors de l'échantillonnage a priori et a posteriori, Meridian échantillonne d'abord les paramètres géographiques, de contrôle et de traitement non média, puis place un a priori TruncatedNormal sur ce paramètre de nœud unique avec une limite inférieure dynamique qui dépend de ces composants échantillonnés. Cela garantit une référence de résultat agrégé non négative à chaque tirage. Les valeurs de référence pour des zones géographiques ou des périodes individuelles peuvent toujours être négatives lorsque les données le justifient.
Pour obtenir tous les détails techniques, consultez l'annexe mathématique.
Propriétés clés
La contrainte de non-négativité de la référence agrégée offre plusieurs propriétés statistiques et de calcul intéressantes :
- Probabilité nulle d'une référence agrégée négative : chaque tirage a priori et a posteriori satisfait la contrainte de non-négativité sur la référence de résultat agrégé, ce qui garantit que
Analyzer.negative_baseline_probability()est égal à0.0lorsqu'il est évalué sur toutes les zones géographiques et toutes les périodes, et que le composant Référence négative dansModelReviewerrenvoiePASS(probabilité de0.0). L'évaluation d'un sous-ensemble de zones géographiques ou de périodes (selected_geos,selected_times), ou de la référence du KPI (use_kpi=True) lorsquerevenue_per_kpivarie selon les zones géographiques ou les périodes n'est pas limitée et peut renvoyer une probabilité non nulle. - Préserve la déconfusion causale : les paramètres destinés à réduire les biais des effets du traitement (y compris les principaux effets géographiques, les coefficients des variables de contrôle et les composants \(K - 1\) restants de
knot_values) ne sont pas tronqués ni limités. - Compatible avec toutes les structures de modèle sans réglage : activé avec un seul commutateur booléen (
allows_negative_aggregate_baseline=False) sans nécessiter de réglage de pénalité ni de modification des a priori par défaut de Meridian. Fonctionne de manière fluide sur les modèles au niveau géographique et national, toutes les spécifications de nœuds (une seule ordonnée à l'origine constante \(K = 1\), des listes de nœuds manuelles, des effets temporels complets \(K = T\)ou la sélection automatique de nœuds), les variables de contrôle, les traitements non média, les médias naturels et les canaux de couverture et de fréquence. - Aucun ralentissement de l'échantillonnage MCMC : étant donné que la matrice de changement de base orthogonal est précalculée sous forme fermée et qu'un seul paramètre est tronqué, la géométrie a posteriori reste lisse pour l'échantillonneur NUTS (No-U-Turn Sampler) avec un coût de calcul négligeable.
- Impact minimal lorsque la référence est déjà positive : tronquer un seul paramètre de nœud transformé est un ajustement a priori minimalement suffisant. Lorsque les données et les a priori sont déjà compatibles avec une référence agrégée positive, le seuil de troncation se situe loin dans la queue gauche de la distribution. Par conséquent, les estimations a posteriori ne changent que légèrement par rapport au modèle sans contrainte. Étant donné que le paramètre modifie l'a priori, les résultats diffèrent toujours pour chaque modèle, et la même graine aléatoire produit des tirages différents selon les deux paramètres.
Interaction avec les a priori et l'état du modèle
La contrainte de non-négativité de la référence agrégée interagit avec les a priori de votre modèle et peut faire apparaître des conflits entre les a priori et les données dans les diagnostics d'état du modèle.
A priori de traitement et diagnostics d'état du modèle
Lorsque la contrainte de référence non négative est activée, vous pouvez parfois voir d'autres composants d'état du modèle affectés si vos a priori de traitement sont en conflit avec une référence agrégée non négative.
Une référence négative dans un modèle sans contrainte peut provenir d'a priori de traitement trop optimistes. Lorsque les a priori sur le ROI, le ROIm ou la contribution impliquent une contribution totale du traitement qui dépasse le résultat total observé, le fait de contraindre la référence agrégée à être non négative crée un conflit entre les a priori et les données, ce qui peut entraîner un dépassement du résultat total observé par le résultat total prédictif a posteriori.
Lorsque ce conflit se produit, la contrainte empêche le modèle de masquer l'excédent de résultat incrémental dans une référence négative. À la place, le conflit peut apparaître dans les diagnostics ModelReviewer :
- Convergence : valeurs
R-hatélevées (max_r_hat >= 1.2) si des a priori de traitement forts poussent l'échantillonneur vers la limite de référence non négative. - Valeur-p prédictive a posteriori (PPP) bayésienne : résultat
FAIL(valeur-p< 0.05) lorsque le résultat total prédictif a posteriori dépasse le résultat total observé. - Qualité de l'adéquation : diminution du coefficient de détermination.
Si vous observez des problèmes de convergence, un échec de la valeur PPP bayésienne ou un coefficient de détermination plus faible après avoir activé la contrainte, inspectez et recalibrez vos a priori de traitement plutôt que d'autoriser une référence négative. Pour obtenir des instructions détaillées, consultez Ajuster une référence négative ou faible.
Effet sur les exigences d'a priori knot_values et d'a priori personnalisé
Sous la contrainte, l'a priori induit sur knot_values n'est plus une variable normale indépendante et identiquement distribuée (i.i.d.). Étant donné que la première coordonnée de nœud transformée est tronquée à une limite inférieure qui dépend des paramètres géographiques, de contrôle et de traitement non média, les knot_values reconstruites sont corrélées, décalées vers le haut sous forme agrégée et dépendent de ces paramètres. Les a priori marginaux sur les paramètres géographiques, de contrôle et de traitement non média ne sont pas modifiés, car ils sont échantillonnés avant la coordonnée du nœud tronqué.
Les a priori personnalisés sur tous les autres paramètres du modèle (tels que les paramètres média roi_m, mroi_m, contribution_m, tau_g_excl_baseline, gamma_c et gamma_n) ne sont pas limités et sont échantillonnés directement à partir de leurs distributions spécifiées.
Vous pouvez inspecter l'a priori obtenu avec sample_prior. Les tirages a priori contiennent les knot_values reconstruites. Les paramètres internes rotated_knot_0 et rotated_knot_rest ne sont pas enregistrés.
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)
La comparaison de ces tirages avec ceux d'un modèle sans contrainte (allows_negative_aggregate_baseline=True) montre comment la contrainte modifie l'a priori knot_values. Après avoir exécuté sample_posterior, vous pouvez également tracer les valeurs a priori et a posteriori de knot_values avec ModelDiagnostics.plot_prior_and_posterior_distribution(parameter='knot_values').
Annexe mathématique
Cette section décrit la formulation mathématique de la contrainte de référence agrégée non négative. Pour en savoir plus sur la notation mathématique utilisée dans cette section, consultez Notation mathématique et Données d'entrée.
1. Condition de référence agrégée sur l'échelle de KPI transformée
Soit \(y_{g,t} = (\ddot{y}_{g,t}/p_g - m^{[Y]}) / s^{[Y]}\) le KPI centré et à l'échelle de la population. Dans le scénario de référence contrefactuel où toutes les variables média payant et naturel sont définies sur zéro et où les traitements non média sont définis sur leurs valeurs de référence \(x^{[N](0)}_{g,t,i}\), le KPI transformé attendu pour la zone géographique \(g\) et la période \(t\) est le suivant :
\[ \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} \]
où :
- \(\mu_t = \sum_{k=1}^{K} W_{t,k} b_k\) est l'ordonnée à l'origine variable dans le temps déterminée par la matrice de pondération des nœuds \(T \times K\) et les paramètres des nœuds \(W\) (voir Fonctionnement de l'argument
knots). \(b = (b_1, \dots, b_K)^\top\) - \(\tau_g\) est le principal effet géographique.
- \(\gamma^{[C]}_{g,i} z_{g,t,i}\) est la contribution de la variable de contrôle\(i\).
- \(\gamma^{[N]}_{g,i} x^{[N](0)}_{g,t,i}\) est la contribution de la variable de traitement non média \(i\) évaluée à sa valeur de référence contrefactuelle\(x^{[N](0)}_{g,t,i}\).
Soit \(u^{[Y]}_{g,t}\) désignant revenue_per_kpi (avec \(u^{[Y]}_{g,t} = 1\)lorsque revenue_per_kpi est None), les pondérations normalisées des résultats\(w_{g,t}\)étant définies comme suit :
\[ 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'}} \]
afin que \(\sum_{g=1}^{G} \sum_{t=1}^{T} w_{g,t} = T\). L'inversion de la transformation d'échelle du KPI montre que le résultat de référence agrégé, calculé en faisant la somme des zones géographiques et des périodes, est non négatif si et seulement si :
\[ \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]}} \]
où \(W^*_k = \sum_{t=1}^{T} W_{t,k} \left(\sum_{g=1}^{G} w_{g,t}\right)\)est la contribution totale pondérée par le résultat du nœud \(k\), et\(\text{offset}(\tau, \gamma^{[C]}, \gamma^{[N]})\) regroupe les termes géographiques, de contrôle et de traitement non média de référence pondérés par le résultat :
\[ \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. Changement de base orthogonal pour knot_values
Pour isoler la combinaison linéaire \((W^*)^\top b = \sum_{k=1}^{K} W^*_k b_k\)dans une seule coordonnée sans modifier la géométrie a priori, Meridian construit une matrice orthogonale symétrique \(K \times K\) \(Q\)(\(Q Q^\top = I_K\)) sous la forme d'une réflexion de Householder fermée dont la première ligne est le vecteur unitaire \(u = W^* / \|W^*\|_2\).
Définition des paramètres de nœud transformés\(\tilde{b} = (\tilde{b}_1, \tilde{b}_2, \dots, \tilde{b}_K)^\top = Q b\)(de sorte que \(b = Q^\top \tilde{b}\) ; dans le graphique de calcul du modèle,\(\tilde{b}_1\) est nommé rotated_knot_0 et\((\tilde{b}_2, \dots, \tilde{b}_K)\) est nommé rotated_knot_rest) :
La contribution globale des nœuds dépend exclusivement de la première coordonnée transformée \(\tilde{b}_1\) :
\[ (W^*)^\top b = (W^*)^\top Q^\top \tilde{b} = \|W^*\|_2 \, \tilde{b}_1 \]
Comme \(Q\) est orthogonal, l'a priori normal isotrope à moyenne nulle\(b_k \stackrel{\text{i.i.d.}}{\sim} \text{Normal}(0, \sigma_b)\) est invariant sous les transformations orthogonales et induit des a priori\(\text{Normal}(0, \sigma_b)\) mutuellement indépendants sur les coordonnées transformées\(\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. Troncation dynamique sur \(\tilde{b}_1\)
Lors de l'échantillonnage a priori et a posteriori, Meridian échantillonne d'abord \(\tau_g\),\(\gamma^{[C]}_{g,i}\)et \(\gamma^{[N]}_{g,i}\) , évalue la limite inférieure dynamique :
\[ \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} \]
et place un a priori TruncatedNormal sur le paramètre unique \(\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) \]
où la limite de troncation supérieure est définie sur :
\[ \tilde{b}_{1,\text{high}} = \max\left(\tilde{b}_{1,\text{low}} + 50\sigma_b, \; 50\sigma_b\right) \]
La limite supérieure est une exigence numérique, et non une contrainte de modélisation. L'échantillonneur NUTS (No-U-Turn Sampler) échantillonne \(\tilde{b}_1\) sur une échelle sans contrainte via la transformation sigmoïde utilisée par TruncatedNormal de TensorFlow Probability, qui nécessite des limites finies. Définir la limite supérieure à une valeur au moins \(50\sigma_b\) supérieure à zéro et à\(\tilde{b}_{1,\text{low}}\) laisse une probabilité a priori négligeable dans la queue supérieure, de sorte qu'elle se comporte comme \(+\infty\) en pratique.
Les \(K - 1\) paramètres de nœud transformés \(\tilde{b}_2, \dots, \tilde{b}_K \stackrel{\text{i.i.d.}}{\sim} \text{Normal}(0, \sigma_b)\) restants restent des variables normales sans contrainte, et Meridian reconstruit les paramètres de nœud d'origine en tant que \(b = Q^\top \tilde{b}\).