メリディアンでは、ベースラインは、すべての介入変数がベースライン値(有料メディアとオーガニック メディアの場合は 0、メディア以外の介入群の場合は設定された値)である反事実的シナリオにおいて期待される結果を表します。結果が負になることはないため、ベースラインが負の場合、介入効果の因果推論に統計誤差があることを示しています。通常、これはモデルが介入群を過大評価していることを意味します。どのモデルでも統計誤差は想定されるため、ゼロを下回る小さな落ち込みが時折あっても心配する必要はありませんが、ベースラインが極端な負になった場合(または、期間全体で集計されたベースラインが負になる事後確率が高い場合)は明らかに、モデルの調整が必要です。
ModelSpec で allows_negative_aggregate_baseline=False を設定すると、負のベースライン モデルの健全性チェックで評価されるベースラインが負になる確率は 0.0 になります。これにより、すべての事前分布と事後分布の抽出において、集計結果のベースラインが負でない値に制限されます。ここで、集計とは、すべての地域と期間にわたって合計されることを意味します(個々の地域または期間のベースライン値は負になる可能性があります)。
デフォルトは allows_negative_aggregate_baseline=True です。制約を有効にするには、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)
制約の仕組み
予想されるベースラインは、時間効果(knot_values、ノットを設定するを参照)、地域メイン効果(tau_g_excl_baseline)、コントロール変数、ベースライン値で評価されたメディア以外の介入群など、複数のモデル コンポーネントの合計です。
allows_negative_aggregate_baseline=False の場合、メリディアンは、直交基底変換(ハウスホルダー鏡映)を使用して knot_values を再パラメータ化します。これにより、すべての地域と期間にわたる集計ベースラインが単一のパラメータに則って制御され、残りの \(K - 1\) コンポーネントは制約を受けずに時間効果を捉えることができます。
事前分布サンプリングと事後分布サンプリングの際、メリディアンはまず地域、コントロール、メディア以外の介入群のパラメータをサンプリングし、次に、サンプリングされたコンポーネントに依存する動的な下限を持つ単一のノット パラメータに TruncatedNormal 事前分布を設定します。これにより、すべての抽出において、集計結果のベースラインが負にならないことが保証されます。データによって妥当とされる場合、個々の地域または期間のベースライン値は負の値をとる可能性があります。
技術的な詳細については、数学的付録をご覧ください。
基本特性
集計ベースラインを負でない値に制限すると、次のような望ましい統計的特性と計算特性が得られます。
- 集計ベースラインが負になる確率がゼロ: すべての事前分布と事後分布の抽出結果は、集計結果ベースラインの非負制約を満たします。これにより、すべての地域と期間で評価した場合に
Analyzer.negative_baseline_probability()が0.0と等しくなり、ModelReviewerの負のベースライン コンポーネントがPASS(0.0の確率)を返すことが保証されます。地域または期間のサブセット(selected_geos、selected_times)や、revenue_per_kpiが地域または期間によって異なる場合の KPI ベースライン(use_kpi=True)の評価には制約がかからず、ゼロ以外の確率を返す可能性があります。 - 因果効果の非交絡化を維持: 介入効果のバイアスを排除するためのパラメータ(地域主効果、コントロール変数の係数、
knot_valuesの残りの \(K - 1\) コンポーネントなど)は、切り捨てられたり制約されたりしません。 - チューニングなしですべてのモデル構造に対応: ペナルティのチューニングやメリディアンのデフォルトの事前分布の変更を必要とせず、1 つのブール値スイッチ(
allows_negative_aggregate_baseline=False)で有効にできます。地域レベルと全国レベルの両方のモデル、任意のノット仕様(単一の定数切片 \(K = 1\)、手動ノットリスト、全時間効果 \(K = T\)、自動ノット選択)、コントロール変数、メディア以外の介入群、オーガニック メディア、リーチとフリークエンシー(RF)チャネルでシームレスに機能します。 - MCMC サンプリングの速度低下がない: 直交基底変換行列は閉形式で事前に計算され、1 つのパラメータのみが切り捨てられるため、No-U-Turn Sampler(NUTS)の事後分布の幾何学的構造は滑らかなままで、計算オーバーヘッドは無視できる程度です。
- ベースラインがもともと正の場合の影響は最小限: 変換された単一のノット パラメータを切り捨てることは、最小限の十分な事前調整です。データと事前分布がもともと正の集計ベースラインを示している場合、切り捨てしきい値は分布の左側の裾に位置するため、事後推定値は制約のないモデルと比較してわずかに変化するだけです。この設定によって事前分布が変化するため、結果はモデルごとに異なり、同じランダムシードでも 2 つの設定で異なる抽出結果が生成されます。
事前分布とモデルの健全性の相互作用
集計ベースラインを負でない値に制限すると、モデルの事前分布と相互作用し、事前分布とデータの競合がモデルの健全性診断で表面化する可能性があります。
介入群の事前分布とモデルの健全性診断
非負のベースライン制約が有効になっている場合、介入群の事前分布が非負の集計ベースラインと競合すると、他のモデルの健全性コンポーネントに影響が及ぶことがあります。
制約のないモデルでベースラインが負になるのは、介入群の事前分布が過度に楽観的であるためと考えられます。ROI、mROI、または貢献度の事前分布が、観測された合計結果を超える介入群の合計貢献度を意味する場合、集計ベースラインを非負に制限すると、事前分布とデータの間に競合が生じ、事後予測の合計結果が観測された合計結果を超える可能性があります。
この競合が発生すると、制約により、モデルが負のベースライン内に過剰な増分結果を隠すことができなくなります。代わりに、この競合が ModelReviewer 診断で確認できるようになります。
- 収束: 強力な介入群の事前分布によってサンプラーが非負のベースライン境界に押し付けられると、
R-hat値(max_r_hat >= 1.2)が上昇します。 - ベイズ事後予測 P 値(PPP): 事後予測の合計結果が観測された合計結果を上回る場合に発生する
FAILの結果(p 値< 0.05)。 - 適合度: 決定係数の低下。
制約を有効にした後に、収束の問題、ベイズ PPP の失敗、決定係数の低下が見られる場合は、負のベースラインを許可するのではなく、介入群の事前分布を調べて再調整します。手順については、負のベースライン、または低いベースラインを緩和するをご覧ください。
knot_values の事前要件とカスタムの事前要件への影響
この制約の下では、knot_values に対して誘導される事前分布は、独立同分布(i.i.d.)の正規分布ではなくなります。変換された最初のノット座標は、地域、コントロール、メディア以外の介入パラメータに依存する下限で切り捨てられるため、再構築された knot_values は相関関係があり、全体的に上方にシフトし、これらのパラメータに依存します。地域、コントロール、メディア以外の介入群のパラメータ自体の周辺事前分布は、ノット座標が切り捨てられる前にサンプリングされるため、変更されません。
他のすべてのモデル パラメータ(メディア roi_m、mroi_m、contribution_m、tau_g_excl_baseline、gamma_c、gamma_n など)のカスタム事前分布は制限されず、指定された分布から直接サンプリングされます。
結果の事前分布は sample_prior で確認できます。事前抽出には再構成された knot_values が含まれます。内部パラメータ rotated_knot_0 と rotated_knot_rest は保存されません。
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)
これらの抽出を制約のないモデル(allows_negative_aggregate_baseline=True)の抽出と比較すると、制約によって knot_values の事前分布がどのように変化するかがわかります。sample_posterior を実行した後、ModelDiagnostics.plot_prior_and_posterior_distribution(parameter='knot_values') を使用して knot_values の事前分布と事後分布をプロットすることもできます。
数学的付録
このセクションでは、非負の集計ベースライン制約の数学的定式化について説明します。このセクションで使用されている数学表記の詳細については、数学表記と入力データをご覧ください。
1. 変換された KPI スケールでの集計ベースライン条件
\(y_{g,t} = (\ddot{y}_{g,t}/p_g - m^{[Y]}) / s^{[Y]}\) を、人口でスケーリングされた KPI の中心化された値とします。すべての有料メディア変数とオーガニック メディア変数が 0 に設定され、メディア以外の介入群がベースライン値 \(x^{[N](0)}_{g,t,i}\)に設定されている反事実的ベースライン シナリオでは、地域 \(g\) と期間 \(t\) において期待される変換後の KPI は次のようになります。
\[ \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} \]
ここで
- \(\mu_t = \sum_{k=1}^{K} W_{t,k} b_k\) は、 \(T \times K\) ノット重み行列 \(W\) とノット パラメータ \(b = (b_1, \dots, b_K)^\top\) によって決定される、時間とともに変化する切片です(
knots引数の仕組みを参照)。 - \(\tau_g\) は地域の主効果です。
- \(\gamma^{[C]}_{g,i} z_{g,t,i}\) は、コントロール変数\(i\)の貢献度です。
- \(\gamma^{[N]}_{g,i} x^{[N](0)}_{g,t,i}\) は、反事実的ベースライン値\(x^{[N](0)}_{g,t,i}\)で評価された、メディア以外の介入変数 \(i\) の貢献度です。
\(u^{[Y]}_{g,t}\) を revenue_per_kpi と表し(revenue_per_kpi が None の場合は \(u^{[Y]}_{g,t} = 1\)とする)、正規化された結果の重み\(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'}} \]
これにより \(\sum_{g=1}^{G} \sum_{t=1}^{T} w_{g,t} = T\)となります。KPI スケーリング変換を反転すると、すべての地域と期間で合計された集計ベースラインの結果が、次の場合にのみ非負になることがわかります。
\[ \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]}} \]
ここで、 \(W^*_k = \sum_{t=1}^{T} W_{t,k} \left(\sum_{g=1}^{G} w_{g,t}\right)\)はノット \(k\)の結果で重み付けされた合計貢献度、\(\text{offset}(\tau, \gamma^{[C]}, \gamma^{[N]})\) は結果で重み付けされた地域、コントロール、ベースラインのメディア以外の介入群の項を集計したものです。
\[ \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. knot_values の直交基底変換
事前分布の幾何学的性質を変えずに、線形結合 \((W^*)^\top b = \sum_{k=1}^{K} W^*_k b_k\)を単一の座標に分離するため、メリディアンは、最初の行が単位ベクトル \(u = W^* / \|W^*\|_2\)である閉形式のハウスホルダー鏡映として、 \(K \times K\) 対称直交行列 \(Q\)(\(Q Q^\top = I_K\))を構築します。
変換されたノット パラメータ\(\tilde{b} = (\tilde{b}_1, \tilde{b}_2, \dots, \tilde{b}_K)^\top = Q b\)を定義します( \(b = Q^\top \tilde{b}\)となるように。モデル計算グラフでは、\(\tilde{b}_1\) は rotated_knot_0、\((\tilde{b}_2, \dots, \tilde{b}_K)\) は rotated_knot_rest という名前になります)。
ノット貢献度の合計は、最初の変換された座標 \(\tilde{b}_1\)にのみ依存します。
\[ (W^*)^\top b = (W^*)^\top Q^\top \tilde{b} = \|W^*\|_2 \, \tilde{b}_1 \]
\(Q\) は直交しているため、等方性ゼロ平均正規事前分布\(b_k \stackrel{\text{i.i.d.}}{\sim} \text{Normal}(0, \sigma_b)\) は直交変換の下で不変であり、変換された座標\(\tilde{b}_1, \tilde{b}_2, \dots, \tilde{b}_K\)に対して相互に独立した\(\text{Normal}(0, \sigma_b)\) 事前分布を誘導します。
\[ 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. \(\tilde{b}_1\)での動的切り捨て
事前サンプリングと事後サンプリングでは、メリディアンはまず \(\tau_g\)、\(\gamma^{[C]}_{g,i}\)、 \(\gamma^{[N]}_{g,i}\) をサンプリングし、動的な下限を評価します。
\[ \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} \]
単一のパラメータ \(\tilde{b}_1\)に TruncatedNormal 事前分布を設定します。
\[ \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) \]
ここで、切り捨ての上限は次のように設定されます。
\[ \tilde{b}_{1,\text{high}} = \max\left(\tilde{b}_{1,\text{low}} + 50\sigma_b, \; 50\sigma_b\right) \]
上限は数値要件であり、モデリングの制約ではありません。No-U-Turn Sampler(NUTS)は、TensorFlow Probability の TruncatedNormal が使用するシグモイド変換を介して、制約のないスケールで \(\tilde{b}_1\) をサンプリングします。これには有限の境界が必要です。上限を 0 と\(\tilde{b}_{1,\text{low}}\) の両方より少なくとも \(50\sigma_b\) 大きく設定すると、事前分布の上側の裾に残る確率は無視できるほど小さくなるため、実際には \(+\infty\) と同様に機能します。
残りの \(K - 1\) 個の変換されたノット パラメータ \(\tilde{b}_2, \dots, \tilde{b}_K \stackrel{\text{i.i.d.}}{\sim} \text{Normal}(0, \sigma_b)\) は、制約なく正規分布に従う変数として残り、メリディアンは元のノット パラメータを \(b = Q^\top \tilde{b}\)として再構築します。