使用过往实验设置自定义投资回报率先验

Meridian 提供了通过 CalibrationBuilder 利用过往实验进行自动先验校准的功能,从而实现将增量实验结果自动转换为付费媒体和覆盖面和频次渠道的投资回报率先验。该构建工具支持接收来自任何实验来源的结果,并针对 Meridian GeoX 提供了直接集成,以简化工作流程。

校准需要定义 Meridian 先验,而增量实验结果是形成这一先验认知的重要依据。不过,MMM 和实验在一些重要方面存在差异,具体体现在范围、时间安排和时长上。为了帮助您弥合这一差距,CalibrationBuilder 旨在自动将这些差异纳入考量,将实验结果转化为稳健的先验。

CalibrationBuilder 会自动对实验结果进行调整,然后再将这些结果合并到每个渠道的单个校准后的先验分布中,从而消除这些差异。

工作流程如下:

  1. 注册实验:用户将通用实验或 Meridian GeoX 实验结果添加到渠道中。
  2. 应用调整CalibrationBuilder 会计算并应用支出、新近度和时长调整。
  3. 合并分布CalibrationBuilder 使用贝叶斯更新,将所有已注册实验的调整后分布合并。
  4. 拟合参数分布CalibrationBuilder 会将参数分布族(对数正态、伽玛或正态)拟合到后验分布,以生成最终的 roi_mroi_rf 先验分布。

第 1 步:注册实验

您可以使用 CalibrationBuilder Python API 注册实验。该构建工具支持两种类型的实验来源:

  • Meridian GeoX 实验:使用 with_meridian_geox_experiment_result 注册。直接接受来自 Google GeoX 工具的 AnalysisResult 对象。CalibrationBuilder 会自动从 AnalysisResult 中提取点估计值、标准误差、支出和实验日期,以计算调整。
  • 通用实验:使用 with_incrementality_experiment_result 注册。适用于非 GeoX 实验,在此类实验中您需要手动指定点估计值、标准误差、支出和日期。

如需查看完整的交互式代码演示,请参阅先验校准演示

第 2 步:应用校准调整

实验和 MMM 具有不同的衡量目标和条件。为了弥合这一差距,Meridian 会调整实验的点估计值(按比例 \(\gamma\)缩放),并增大标准误差(将方差乘以比例 \(\tau\)),以反映将实验结果转换为 MMM 先验时额外的不确定性。

单个实验的调整后平均值 (\(\mu_{adj}\)) 和标准差 (\(\sigma_{adj}\)) 的计算公式如下:

$$ \mu_{adj} = (\gamma_{duration} + \gamma_{user}) \cdot \mu_{exp} $$
$$ \sigma_{adj} = \sigma_{exp} \cdot \sqrt{1.0 + \tau_{spend} + \tau_{recency} + \tau_{duration} + \tau_{user} } $$

其中:

  • \(\mu_{exp}\) 是实验点估计值。
  • \(\sigma_{exp}\) 是实验标准误差。
  • \(\gamma_{duration}\) 是时长缩放比例(自动计算;当实验捕获 100% 的 Adstock 效应时,基准为 \(1.0\) )。
  • \(\gamma_{user}\) 是用户指定的点估计值调整(可选,默认值为 \(0\))。
  • \(\tau_{spend}\)、 \(\tau_{recency}\)和 \(\tau_{duration}\) 分别是支出、新近度和时长的方差调整(自动计算;不需要调整时,基准为 \(0.0\) )。
  • \(\tau_{user}\) 是用户指定的标准误差调整(可选,默认值为 \(0\))。

自动化和默认设置

虽然 \(\gamma_{user}\) 和 \(\tau_{user}\) 允许手动微调,并且默认设置为 \(0\),但其他调整(\(\tau_{spend}\)、 \(\tau_{recency}\)、\(\tau_{duration}\)和 \(\gamma_{duration}\))由CalibrationBuilder自动计算:

  • Meridian GeoX 实验:调整计算完全自动化。CalibrationBuilder 直接从 GeoX icpd 指标(metrics.icpd.point_estimatemetrics.icpd.standard_deviation)中提取 \(\mu_{exp}\) 和\(\sigma_{exp}\) ,从 estimated_bau_spend (metrics.descriptive_metrics.estimated_bau_spend) 中提取实验支出,并从 analysis_configanalysis_config.analysis_start_dateanalysis_config.analysis_end_date)中提取开始日期和结束日期。非收入 KPI 实验会使用模型的 revenue_per_kpi 自动转换为收入口径。您无需手动提供支出、时长或日期形参。
  • 通用实验CalibrationBuilder 使用您在 with_incrementality_experiment_result 中提供的支出、开始日期和结束日期实参,通过相同的公式计算调整。
  • 模型默认值:时长计算使用 CalibrationBuilder 衰减形参,默认值为 adstock_decay_spec='geometric'alpha=0.5max_lag=8(与 ModelSpec 默认值一致)。新近度计算使用固定的半衰期(52 周,即 1 年)。

支出调整

支出调整 (\(\tau_{spend}\)) 考虑了支出规模和强度的差异。实验通常仅涵盖在 MMM 时间窗口内所观察到的总支出的一小部分。为了在不考虑实验时长的情况下比较支出规模,Meridian 会将实验的平均每日支出与渠道在建模期内的平均每日支出进行比较。

对于 Meridian GeoX 实验,系统会自动从 GeoX AnalysisResult(位于 metrics.descriptive_metrics.estimated_bau_spend 下)中的 estimated_bau_spend 提取实验支出。

支出调整的计算方式如下:

$$ \tau_{spend} = \frac{1.0 - r}{r} $$

其中, \(r\) 是比较平均每日支出率的支出比率:

$$ r = \frac{ \min(\text{experiment_avg_daily_spend}, \text{channel_avg_daily_spend}) }{ \max(\text{experiment_avg_daily_spend}, \text{channel_avg_daily_spend}) } $$

其中:

  • \[\text{experiment_avg_daily_spend} = \frac{\text{experiment_total_spend}}{\text{experiment_duration_days}}\]
  • \[\text{channel_avg_daily_spend} = \frac{\text{total_channel_spend}}{\text{model_duration_days}}\]

  • 如果实验每日支出率与渠道每日支出率 (\(r = 1.0\)) 匹配,则 \(\tau_{spend} = 0.0\) (不增加不确定性)。

  • 随着实验支出率在渠道支出率 (\(r \rightarrow 0\)) 中所占比例变小(或变大), \(\tau_{spend}\) 会增加,从而扩大先验分布。

  • 支出比率 \(r\) 还考虑了媒体粒度方面的差异。 例如,如果您运行广告系列级实验,但在 MMM 中按渠道级建模,则系统会将实验支出率与整个渠道的总支出率进行比较。如果广告系列在渠道活动中占很大比例,那么该广告系列更能代表整个渠道,在转换结果时产生的不确定性也较小。相反,如果广告系列规模较小,则调整幅度会更大,以反映将该广告系列的提升效果扩展到整个渠道时存在的不确定性。

新近度调整

新近度调整会为较近期的实验赋予更高的权重,因为这些实验可能更能准确地对最新的增量效果建模。相对于 MMM 建模期的结束日期,实验开展的时间越久远,其结果反映当前业务实际情况的可能性就越低。

对于 Meridian GeoX 实验,系统会自动从 GeoX AnalysisResult 中的 analysis_config.analysis_end_date 提取实验结束日期。

新近度调整是使用半衰期为 52 周(1 年)的指数衰减计算的:

$$ \lambda = 0.5^{w / 52.0} $$
$$ \tau_{recency} = \frac{1.0 - \lambda}{\lambda} $$

其中, \(w\) 是指从实验结束日期到 MMM 中最后一个建模日期所经过的周数。

  • 如果实验在最后一个建模日期 (\(w = 0\)) 结束,则 \(\lambda = 1.0\) 和 \(\tau_{recency} = 0.0\)。
  • 对于较早的实验, \(\lambda\) 会减少,导致 \(\tau_{recency}\) 增大,从而增加更多不确定性。
  • 如果最后一个建模日期早于实验日期,则不应用任何调整 (\(\tau_{recency} = 0.0\))。

时长调整

时长调整(\(\gamma_{duration}\) 和 \(\tau_{duration}\))考虑了实验时长(\(D\),以周为单位)与模型的最大滞后窗口(\(L\),以周为单位)之间的差异。

对于 Meridian GeoX 实验,实验时长 (\(D\)) 会根据 GeoX AnalysisResult 中的 analysis_config.analysis_start_dateanalysis_config.analysis_end_date 自动计算。

由于营销效应具有时滞性(通过 Adstock 衰减进行建模),因此短期实验可能无法捕获媒体支出的完整长期效应。反之,如果实验持续时间很长,则可能会捕获超出模型截断滞后窗口的效应。

Meridian 会计算捕获比例 (\(p\)),即在实验开展的周数内捕获的 Adstock 衰减总权重的比例。

假设 \(w_s\) 是使用 Adstock 衰减函数(几何衰减或二项式衰减)计算得出的衰减权重,衰减率为 \(\alpha\) ,模型窗口为 \(L + 1\) (在 CalibrationBuilder 中配置,默认为 adstock_decay_spec='geometric'alpha=0.5max_lag=8):

  • 如果实验时长小于或等于模型窗口 (\(D \le L + 1\)):
    • 二项式和几何衰减:捕获比例 \(p\) 是截至 \(D\)的归一化衰减权重之和:
$$ p = \frac{\sum_{s=0}^{D-1} w_s}{\sum_{s=0}^{L} w_s} $$
  • 如果实验时长超过模型窗口 (\(D > L + 1\)):
    • 二项式衰减:二项式权重在回溯期内衰减至零,因此实验会捕获所有可能的效应: \(p = 1.0\)
    • 几何衰减:几何权重会无限衰减,因此分子包含几何级数的尾部,直至 \(D - 1\):
$$ p = \frac{\sum_{s=0}^{L} w_s + \sum_{s=L+1}^{D-1} \alpha^s}{\sum_{s=0}^{L} w_s} $$

捕获比例 \(p\) 的取值范围被限制在最小值 \(10^{-6}\) 和最大值 \(1.0\) 之间(对于二项式衰减)。

使用 \(p\)时,时长调整如下:

  • 点估计值缩放比例
$$ \gamma_{duration} = \frac{1.0}{p} $$

如果实验时长短于模型窗口 (\(p < 1.0\)),则会按比例放大点估计值 (\(\gamma_{duration} > 1.0\)),以估计完整的长期效应。如果实验时长更长(几何衰减时为\(p > 1.0\) ),则会按比例缩小点估计值 (\(\gamma_{duration} < 1.0\))。

  • 标准误差调整
$$ \tau_{duration} = \max\left(\frac{1.0 - p}{p}, 0.0\right) $$

如果实验时长较短 (\(p < 1.0\)),则会增加不确定性 (\(\tau_{duration} > 0.0\)),因为未观测到的效应尾部是外推得出的。如果实验时长更长或相等 (\(p \ge 1.0\)),则不会增加额外的不确定性 (\(\tau_{duration} = 0.0\))。


第 3 步:合并实验

如果您针对单个渠道注册了多项实验,Meridian 会使用贝叶斯更新将这些实验(以及可选的 baseline_prior)合并起来。

根据贝叶斯定理,渠道投资回报率的后验密度与基准先验和所有独立实验的似然函数的乘积成正比:

$$ p(\text{ROI} \mid \{\mu_{adj,i}, \sigma_{adj,i}\}) \propto \pi(\text{ROI}) \prod_{i=1}^N L_i(\text{ROI}; \mu_{adj,i}, \sigma_{adj,i}) $$

其中,每个实验 \(i\) 的似然函数为:

$$ L_i(\text{ROI}; \mu_{adj,i}, \sigma_{adj,i}) = \frac{1}{\sqrt{2\pi}\sigma_{adj,i}} \exp\left(-\frac{(\mu_{adj,i} - \text{ROI})^2}{2\sigma_{adj,i}^2} \right) $$

请注意,我们可以将此乘积定义本身视为一个贝叶斯模型。 从数学角度来看,我们将每个调整后的实验视为对真实渠道投资回报率的含噪声观测。该模型的公式如下:

$$ \begin{align*} \mu_{adj,i} &\sim \text{Normal}(\text{ROI}, \sigma_{adj,i}^2) \quad \text{for each experiment } i \\ \text{ROI} &\sim \pi(\cdot) \end{align*} $$

其中:

  • \(\mu_{adj,i}\) 是实验 \(i\)的调整后点估计值。
  • \(\sigma_{adj,i}\) 是实验 \(i\)的调整后标准误差。
  • \(\text{ROI}\) 是该渠道待估算的真实、未知投资回报率形参。
  • \(\pi(\cdot)\) 是 baseline_prior 分布。如果未指定基准先验,则会使用正实数上的非正常平坦均匀先验(\(\pi(\text{ROI}) \propto 1\) ,对于 \(\text{ROI} > 0\))。
  • \(N\) 是已注册实验的数量。

该构建工具会在自适应形参网格上以数值方式评估此后验密度,以得到合并后的分布。如需了解详情,请参阅技术附录

第 4 步:拟合和构建校准后的先验

最后,Meridian 会将标准参数分布族(对数正态、伽玛或正态)拟合到第 3 步中计算出的数值后验分布。候选分布族是根据 baseline_prior 选择的:始终考虑对数正态分布和伽玛分布,而当基准先验允许负支撑集时,则评估正态分布。Meridian 会通过最小化与数值后验分布之间的交叉熵损失(相当于最小化 KL 散度),选出拟合效果最佳的分布形状。

为每个校准渠道找到最佳先验分布后,CalibrationBuilder 会将其封装。对于未进行校准的所有渠道,CalibrationBuilder 会分配 custom_prior 中提供的自定义先验。仅当未为该渠道提供自定义先验时,才会使用默认投资回报率先验 \(\text{LogNormal}(0.2, 0.9)\) 。

build() 的最终输出是一个 CalibratedPriors 数据类,其中包含:

  • priors.roi_m:一个 CalibratedDistributionIndependentMultivariateDistribution 的子类),表示付费媒体渠道校准后的先验。
  • priors.roi_rf:一个 CalibratedDistributionIndependentMultivariateDistribution 的子类),表示覆盖面和频次渠道校准后的先验。

这些校准后的分布会传递给 PriorDistribution,然后传递给 ModelSpec,以初始化 Meridian 模型。


技术附录

本部分提供了 CalibrationBuilder 数值后验计算和分布拟合背后的数学公式和算法细节。

后验分布公式

对于给定渠道,假设 \(\theta\) 表示真实渠道投资回报率。观察\(N\) 独立的调整后实验结果。对于每个实验 \(i \in \{1, \ldots, N\}\),都有一个调整后的点估计值 \(\mu_{adj,i}\) 和一个调整后的标准误差 \(\sigma_{adj,i}\)。

假设每个调整后的点估计值都是围绕真实投资回报率的正态分布观测值:

$$ \mu_{adj,i} \mid \theta \sim \text{Normal}(\theta, \sigma_{adj,i}^2) $$

第 \(i\)个实验的似然函数为:

$$ L_i(\theta; \mu_{adj,i}, \sigma_{adj,i}) = \frac{1}{\sqrt{2\pi}\sigma_{adj,i}} \exp\left(-\frac{(\mu_{adj,i} - \theta)^2}{2\sigma_{adj,i}^2} \right) $$

如果提供了 baseline_prior,则将其概率密度函数表示为\(\pi(\theta)\)。如果未提供基准先验,则对正值使用非正常平坦均匀先验 \(\pi(\theta) \propto I_{\{\theta > 0\}}\),其中\(I\) 是指示函数。

根据贝叶斯定理,渠道投资回报率 \(p(\theta \mid \{\mu_{adj,i}, \sigma_{adj,i}\})\)的后验密度与先验和所有独立实验的似然函数的乘积成正比:

$$ p(\theta \mid \{\mu_{adj,i}, \sigma_{adj,i}\}) \propto \pi(\theta) \prod_{i=1}^N L_i(\theta; \mu_{adj,i}, \sigma_{adj,i}) $$

基于网格的数值积分

由于后验分布 \(p(\theta \mid \{\mu_{adj,i}, \sigma_{adj,i}\})\) 可能不具有标准解析形式(例如,使用对数正态或伽玛等非正态基准先验时),Meridian 会在网格上对其进行数值评估。

  1. 侦察阶段:Meridian 首先执行“侦察”阶段,以定位高概率质量所在区域。它定义了一个以各分布经验均值为中心的宽范围网格,并找出包含\(99.8\%\) 累积概率的范围(从第 \(0.1\)百分位数到第 \(99.9\)百分位数)。
  2. 精细网格评估:随后,它在确定的区域范围 \([\theta_{\text{min}}, \theta_{\text{max}}]\) 内构建一个包含 10,000 个等距点的精细网格,并在每个点上评估未归一化的后验密度。
  3. 归一化:使用黎曼和积分对密度进行归一化:

    $$ p(\theta_j \mid \{\mu_{adj,i}, \sigma_{adj,i}\}) = \frac{u(\theta_j)}{\sum_k u(\theta_k)\Delta\theta} $$

    其中, \(u(\theta)\) 是未归一化后验密度, \(\theta_j\) 是第 \(j\)个网格点, \(\Delta\theta\) 是步长。

分布拟合

在网格上计算出数值后验 PDF 后,Meridian 会拟合一个参数化分布 \(q(\theta; \phi)\) (其中 \(\phi\) 表示分布形参)来近似后验。

Meridian 会根据基准先验的支撑集确定候选分布族:

  • 非负支撑集(默认):如果未提供基准先验(默认为非负支撑集),或者基准先验将支撑集限制为非负值(例如 LogNormalGamma),Meridian 会考虑对数正态 (\((0, \infty)\)) 和伽玛 (\((0, \infty)\)) 分布族,而不考虑正态分布。
  • 负支撑集:如果基准先验在负值上(例如 Normal)分配了有限的概率密度,Meridian 会考虑正态(在 \((-\infty, \infty)\)上定义),还会考虑对数正态和伽玛。

对于每个候选分布族,Meridian 会寻找形参 \(\phi\) ,使数值后验分布 \(p(\theta)\) 与候选分布 \(q(\theta; \phi)\)之间的交叉熵损失最小:

$$ \text{Loss}(\phi) = -\sum_j p(\theta_j) \log q(\theta_j; \phi) \cdot \Delta\theta $$

从数学角度来看,最小化此损失相当于最小化从近似值\(q\) 到真实数值后验 \(p\)的 Kullback-Leibler 散度 \(D_{KL}(p \parallel q)\) 。

Meridian 使用 L-BFGS-B 优化算法来寻找最优形参。取得最低损失的分布族将被选为该渠道最终校准后的先验。