# ROI priors for calibration

Meridian can be re-parameterized so the ROI of each channel is a model parameter. This lets you incorporate prior ROI information, such as incrementality experiments, industry benchmarks, or other domain knowledge. Alternatively, less informative priors can be used. ROI priors provide a way to treat all media channels equally. Additionally, ROI priors provide a way to apply equal regularization across channels in cases where regularization is needed to achieve better model convergence, or goodness of fit. For more information about this calibration method, see Media Mix Model Calibration with Bayesian Priors.

You have the option to either set prior distributions on the $$ROI_m$$ parameters or the $$\beta_m$$ parameters. The PriorDistribution object has arguments for both parameters, but only one will be used depending on the value of the boolean argument use_roi_prior in the ModelSpec. The re-parameterization is derived in the use case use_roi_prior=True (which is the default, and is strongly recommended).

For any media channel $$m$$, you can write:

$$IncrementalSales_m = \sum\limits_{g,t} \beta_{g,m} HillAdstock\left( \{x_{g,t-s,m}\}_{s=0}^L;\ \alpha_m, ec_m, slope_m \right)$$

The sum can be taken over all geos and time periods (by default), or it can be taken over a subset. The choice depends on the set of geos or time periods for which prior information is available. In most cases, we recommend defining the prior over all geos and time periods, but there can be special cases where it is preferable to consider only a subset.

If you define:

$$M_{g,t,m} =\ HillAdstock\left( \{x_{g,t-s,m}\}_{s=0}^L;\ \alpha_m, ec_m, slope_m \right)$$

then you can write:

\begin{align*} \sum\limits_{g,t}\beta_{g,m} M_{g,t,m} &= IncrementalSales_m \\ &= ROI_m \cdot Cost_m \\ &= ROI_m \sum\limits_{g,t} \overset \sim x_{g,t,m} \end{align*}

Now the geo-specific media coefficient can be parameterized in terms of a standard normal random variable:

\begin{align*} \beta_{g,m} &= \begin{cases} exp(\beta_m + \eta_mZ_{g,m}) &,\ \text{if}\ \texttt{media_effects_dist} = \texttt{LogNormal} \\ \beta_m + \eta_mZ_{g,m} &,\ \text{if}\ \texttt{media_effects_dist} = \texttt{Normal} \end{cases} \end{align*}

Where $$Z_{gm}\overset{i.i.d.}{\sim}Normal(0,1)$$.

And therefore write:

\begin{align*} \beta_m &= \begin{cases} log\left( ROI_m\sum\limits_{g,t} \overset \sim x_{g,t,m} \right) - log\left( \sum\limits_{g,t}exp\left( \eta_m Z_{g,t} \right) M_{g,t,m}\right) &, \text{if}\ \texttt{media_effects_dist} = \texttt{LogNormal} \\ \dfrac{ ROI_m \overset \sim x_{g,t,m} - \eta_m \sum\limits_{g,t}Z_{g,m}M_{g,t,m} }{ \sum\limits_{g,t} M_{g,t,m} } &, \text{if}\ \texttt{media_effects_dist} = \texttt{Normal} \end{cases} \\ &:=F\left( ROI_m,\alpha_m,slope_m,ec_m, \{Z_{g,m}\}^G_{g=1} \right) \end{align*}

Because $$\beta_m$$ can now be written as a function of $$ROI_m$$ plus the other parameters, the model can be re-parameterized using $$ROI_m$$ in place of $$\beta_m$$. Even though $$\beta_m$$ is no longer a model parameter, it can still be calculated for every Markov Chain Monte Carlo (MCMC) prior or posterior draw because it is a function of the parameters. Any user-specified prior distribution can be placed on the $$ROI_m$$ parameters.

Note that the calibration method is also applicable when the experiment captures only short-term effects, and doesn't represent the modeling-window ROI or when multiple incrementality experiments have been conducted for a single media channel. For more information, see section 3.4 in Media Mix Model Calibration with Bayesian Priors.

The same re-parameterization can be done for channels with reach and frequency data by setting:

$$M_{g,t,n} = Adstock\left( \left\{ r_{g,t-s,n} \cdot Hill\left( f_{g,t-s,n};\ ec^{(rf)}_n, slope^{(rf)}_n \right) \right\}^L_{s=0}\ ;\ \alpha^{(rf)}_n \right)$$

Everything else is the same, so the derivation is not repeated.

[{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"Missing the information I need" },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"Too complicated / too many steps" },{ "type": "thumb-down", "id": "outOfDate", "label":"Out of date" },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"Samples / code issue" },{ "type": "thumb-down", "id": "otherDown", "label":"Other" }]
[{ "type": "thumb-up", "id": "easyToUnderstand", "label":"Easy to understand" },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"Solved my problem" },{ "type": "thumb-up", "id": "otherUp", "label":"Other" }]