Why is the model additive rather than log-log?

PanelMMM fits an additive mean in scaled target space with a Normal likelihood. Econometricians arriving from demand estimation often expect a log-log specification with constant elasticities. This page explains what the additive form commits you to, where the elasticity information lives instead, and what changes if you log the target yourself.

What the additive specification is

The model of the scaled target is

yt=a+cβcfλc ⁣(adstock(xc,t))+γzt+effectst+εt,εtN(0,σ2), y^*_t = a + \sum_c \beta_c\, f_{\lambda_c}\!\big(\text{adstock}(x_{c,t})\big) + \gamma' z_t + \text{effects}_t + \varepsilon_t, \qquad \varepsilon_t \sim \mathcal{N}(0, \sigma^2),

where yty^*_t is the scaled target in period tt , aa is the intercept, xc,tx_{c,t} is spend on channel cc , adstock()\text{adstock}(\cdot) carries spend forward in time, fλc()f_{\lambda_c}(\cdot) is the saturation function with curvature parameter λc\lambda_c , βc\beta_c is the channel amplitude, ztz_t is the vector of control columns with coefficients γ\gamma , effectst\text{effects}_t collects seasonality, trend and event terms, and εt\varepsilon_t is Gaussian noise with standard deviation σ\sigma . The target and channels are max-abs scaled by default. Three properties follow.

Contributions are in outcome units. Each channel’s contribution is an amount of the target, and the decomposition sums to the fitted mean. This is what makes contribution charts, ROAS and budget optimisation coherent, and it is the main reason the model is additive: the business questions are asked in currency, not in percentages.

Effects do not scale with the baseline. A channel’s contribution at a given spend is the same amount whether the week is a seasonal peak or a trough. In a log-log model the same coefficient implies a larger absolute effect on a larger base. If you believe media multiplies demand rather than adding to it, the additive model misstates the seasonal pattern of the effect, and the posterior predictive residuals will often show it.

Diminishing returns come from saturation, not from logs. The log-linear shortcut buys concavity by transforming spend; AMMM3 buys it with an explicit saturation function whose curvature is estimated. See Adstock and saturation for econometricians for why the explicit transform is preferred.

Where the elasticity lives

There is no constant elasticity to read off a coefficient, because the model is not constant-elasticity. The point elasticity of the target with respect to channel spend is a derived quantity that varies with the operating point:

ηc,t=ytxc,txc,tyt, \eta_{c,t} = \frac{\partial y_t}{\partial x_{c,t}} \cdot \frac{x_{c,t}}{y_t},

where yty_t is the outcome and xc,tx_{c,t} is spend on channel cc in period tt , and the derivative comes from the fitted adstock and saturation. In practice, inspect sample_saturation_curve(...) for the curve and its slope, and treat the elasticity as local: it is largest where the curve is steep and falls toward zero at the plateau. A single elasticity number for a channel is a summary of one point on that curve, and it should be reported with the spend level it refers to.

For controls the model is linear in the supplied column, so a log-price control against a logged target does carry an elasticity reading; the conditions are set out in Price and promotion in an MMM.

The likelihood and heteroscedasticity

The Normal likelihood on the scaled target assumes additive noise with constant variance. Sales data whose noise grows with the level, or strictly positive data spanning orders of magnitude, violate that. The symptoms appear in the posterior predictive checks: residual spread that widens with the fitted level, and predictive intervals that are too wide at the trough and too narrow at the peak. There is no log-normal or count likelihood option; the specification decision is made in how you supply the target.

Supplying a logged target

You can fit log outcome by logging the column before it reaches the model. target_type is reporting metadata and does not transform anything, so a logged target is simply a different variable. The consequences are systematic:

QuantityRaw targetLogged target
Channel contributionOutcome units, sums to the fitted meanLog-units; approximately a percentage effect, and exponentiation does not give an additive currency decomposition
ROASContribution over spend, in currencyNot meaningful without back-transformation and a variance correction
Media effect on the levelAdditiveMultiplicative: the same spend is worth more in a high-demand week
Noise assumptionAdditive, constant varianceMultiplicative on the level, often more realistic for sales
Budget optimiser objectiveMedia contribution in outcome unitsMedia contribution in log-units, which is not the business objective

The practical rule follows from the last row. If the deliverable is a contribution decomposition, ROAS or a budget recommendation, keep the target in level space and let saturation carry the curvature; check the residuals for level-dependent spread and report it if present. Log the target when the question is itself on the log scale, an elasticity of a control such as price, and treat contributions and ROAS as unavailable from that fit rather than back-transforming them informally.

Do not mix the two readings in one deliverable. A percentage effect from a logged fit and a currency contribution from a level fit are answers to different questions, and reconciling them requires the delta method or a refit, not a slide transition.