Adstock and saturation for econometricians

Adstock and saturation specify how media enters the conditional response model. ammm estimates their parameters jointly with the other model parameters. These transformations do not establish that the estimated response is causal.

Geometric carryover

The GeometricAdstock component defaults to normalize=True and trailing convolution. For L = l_max, its transformed input is

xt∗=∑ℓ=0L−1αℓxt−ℓ∑ℓ=0L−1αℓ. x^*_t = \frac{\sum_{\ell=0}^{L-1}\alpha^\ell x_{t-\ell}} {\sum_{\ell=0}^{L-1}\alpha^\ell}.

The current observation counts towards l_max. Missing lag history is padded with zeros. Supply the supported trailing-history option for future prediction when you need continuity with the fitted period.

The default decay prior is Beta(alpha=1, beta=3). The analyst still chooses l_max. When decay is near one, the last included lag can retain substantial weight. Check sensitivity to the horizon and prior rather than assuming that an arbitrary upper bound is harmless.

An infinite unnormalised recurrence, xt∗=xt+αxt−1∗x^*_t=x_t+\alpha x^*_{t-1} , is a related distributed-lag model. It has different scaling and memory from the default component. The low-level geometric_adstock function separately defaults to normalize=False; distinguish it from the component wrapper.

Weibull PDF adstock can represent a delayed peak. The implemented Weibull CDF weights are cumulative products of survival probabilities and are non-increasing under trailing convolution. Choose the kernel for its assumptions about the lag profile. An estimated lag profile alone does not measure brand equity or establish a long-term causal effect.

Logistic saturation

The default LogisticSaturation component uses

f(x)=β1−e−λx1+e−λx=βtanh⁡(λx/2). f(x)=\beta\frac{1-e^{-\lambda x}}{1+e^{-\lambda x}} =\beta\tanh(\lambda x/2).

For positive parameters and non-negative spend, the curve increases towards beta and is concave for positive spend. lam controls the horizontal scale; it does not move an inflection point into the positive-spend domain. The half-saturation input is log⁡(3)/λ\log(3)/\lambda on the model’s scaled input axis.

Default priors are Gamma(alpha=3, beta=1) for lam and HalfNormal(sigma=2) for beta. beta is the media amplitude in this parameterisation. There is no additional static channel coefficient beyond that amplitude in the default model. Time-varying media adds a multiplier.

A log-spend specification has no finite upper asymptote, although its marginal response tends towards zero. Choosing a bounded curve imposes a different functional assumption. Neither functional form is universally appropriate.

Joint parameter uncertainty

Joint sampling propagates uncertainty in decay, curvature and amplitude into conditional contribution estimates. A workflow that fixes transformation parameters reports uncertainty conditional on those fixed choices unless it propagates their uncertainty separately.

Joint estimation does not resolve weak information about response shape. Correlated spending, limited spend ranges and a flexible baseline can leave attribution sensitive to priors even when predictions fit well. Posterior intervals remain conditional on the model and its assumptions.

Transformation order

adstock_first=True is the default. It applies adstock and then saturation. With False, saturation acts on each period before adstock averages the transformed responses.

The operations generally differ for varying spend. Under the default normalised geometric weights, a constant input with complete lag history stays constant after adstock. Both orders then return the same saturated response. Repeated moderate spend does not accumulate without bound under that normalisation. Start-up periods can differ because of zero padding.

Choose order using a stated response mechanism and assess sensitivity. A channel label alone does not determine the correct order. Optimisation and scenario outputs inherit this modelling choice.