Response Curve Estimation
Adstock, saturation, and priors, plus the harder question underneath them: what in the spend history is doing the identifying, and where does the curve stop being estimated and start being assumed.
The decision it encodes
What does the next dollar in this channel return, and where does it stop paying?
The model fits well. The curve for the channel is smooth, plausible, and says saturation sets in around three times current spend, so there is room to scale.
The channel has never been run above 1.2 times current spend. Everything the curve says past that point came from the functional form and the prior, not from anything the business has observed. It is an extrapolation drawn with the same line weight as the fitted part, and the plan treats both halves as findings.
The decision it encodes
What does the next dollar in this channel return, and where does it stop paying?
Both halves are curve questions rather than average questions, and that is the distinction most reporting collapses. Marginal, not average works through why a channel with excellent blended efficiency can still be the wrong place for the next dollar.
Two transforms, both weakly identified
A response curve is usually two transforms stacked. Adstock carries some of this week’s spend into following weeks, because people do not act the day they see something. Saturation bends the curve over, because the tenth impression to the same person does less than the first.
Both are estimated from the same spend series, and they trade off against each other. A long carryover with early saturation and a short carryover with late saturation can fit a history almost equally well while disagreeing completely about what more spend would do. Adstock, saturation, and honest curves shows two such curves fitted to one dataset, both within a few percent on fit and far apart on the recommendation.
Identification comes from spend variation that was not chosen for demand
The uncomfortable question is what in the history is doing the work. If spend in a channel was set by a rule, always-on at a fixed daily budget, or scaled with last month’s revenue, or ramped every November, then spend correlates with demand for reasons that have nothing to do with the channel working. The regression will happily attribute the demand to the spend.
This is the same confound that attribution cannot escape either, arriving at weekly aggregate level rather than at click level. Nothing about the model’s sophistication addresses it. What addresses it is variation the business did not choose for demand reasons, which is what a geo test manufactures on purpose.
An experiment does less than the word “identified” suggests, and it is worth being exact. A geo test identifies the effect of the spend change it made, over the range it made it, in the markets and weeks where it ran. That anchors the level and the local slope of the curve there. Between anchored points the model interpolates; outside them it extrapolates; and priors constrain how implausible either may become without adding identification of their own. A curve is “experimentally anchored” where the business created spend variation and “assumed” everywhere else, and the plot should say which is which.
Which is why this component is drawn as depending on the test calendar rather than only on the spend series. A curve can be fitted the day the spend spine exists. A curve anybody should plan against needs something in the history that was not chosen for demand reasons, and on most spend series the only such thing is a test somebody scheduled.
The difference that makes is worth seeing rather than asserting. Below, the same channel and the same three years, fitted once against the spend as it ran and once against a flighted schedule that switched the channel on and off.
- Marginal return across surviving curves
- The value that generated the data
Show the data
| Schedule | Tolerance | Curves surviving | Marginal return per $1k | Carryover range |
|---|---|---|---|---|
| As the spend actually ran | Within 0.25% | 3 of 180 | 3.41 to 3.53 | 0.05 to 0.1 |
| As the spend actually ran | Within 1% | 53 of 180 | 3.41 to 5.68 | 0.05 to 0.55 |
| As the spend actually ran | Within 5% | 161 of 180 | 3.04 to 6.16 | 0.05 to 0.7 |
| With the channel flighted | Within 0.25% | 3 of 180 | 3.30 to 3.67 | 0.45 to 0.45 |
| With the channel flighted | Within 1% | 8 of 180 | 2.90 to 3.87 | 0.4 to 0.45 |
| With the channel flighted | Within 5% | 40 of 180 | 2.06 to 4.59 | 0.3 to 0.55 |
The support problem
A curve is only estimated over the range of spend observed. Outside that range the shape comes from the functional form, and the functional form was chosen for convenience rather than because anyone believes the world is a Hill curve.
Two practical consequences. Recommendations should be bounded to moves inside observed support, or clearly flagged when they are not. And the plot should show where the observed range ends, because a curve drawn to the edge of the axis invites a reader to plan against the part that is entirely assumption.
Priors communicate uncertainty
Bayesian priors are the right tool for saying that a channel’s effect is probably positive and probably not enormous, and for keeping an unidentified coefficient from wandering somewhere absurd. They do not manufacture information the data does not contain.
A tight prior on an unidentified coefficient produces a narrow posterior that is almost entirely the prior. That is not a measurement of the channel; it is a restatement of what somebody assumed, with an interval that looks like evidence. What a mix model can and cannot do covers where this line sits, and when a posterior is prior-dominated, say so rather than quoting it.
Maturity, honestly staged
Stage 1: curves fitted, with the observed spend range marked on every plot. The extrapolated part stops being presented as though it were measured.
Stage 2: identification stated per channel. Each coefficient carries a note on what varied in the history, and channels whose spend followed a rule are labeled unidentified rather than quoted.
Stage 3: priors set deliberately and their influence reported. Comparing the posterior against the prior shows how much of each answer came from the data.
Stage 4: curves anchored by experiments, with the anchored range marked. The channels that matter most are pinned by a measured effect over the tested range rather than by the history, which is what the calibration step exists to do, and the plot distinguishes tested, observed, and extrapolated spend.
The two transforms, and why they fight Technical
Adstock is usually a geometric decay: the media pressure in week
t is x_t + λ · a_(t−1), with
λ between zero and one setting how long an impression keeps
working. Saturation is then a concave transform of that pressure, commonly a
Hill function a^k / (a^k + h^k), where h is the
half-saturation point and k the steepness.
The identification problem is that λ and h both
control how much a spend increase raises the transformed input, in different
ways that a smooth spend history cannot separate. Raising
λ spreads pressure across weeks, which looks similar to lowering
saturation, and a likelihood surface with a long ridge along that trade-off
is the usual result. Optimizers find a point on the ridge, report it, and
nothing in the output says the ridge was there.
The two things that help are both about variation rather than method. Sharp on-off changes in spend separate carryover from saturation, because a hard stop reveals the decay directly. And cross-sectional variation across markets identifies saturation even when the national time series cannot, which is one more reason to keep the spine at geo grain.
Context
Best suited for
Programs where several channels compete for one budget, the outcome cannot be attributed to individuals reliably, and someone has to say what the next increment returns rather than what the last quarter averaged.
Data requirements
- Two to three years of spend and outcome at weekly grain, and geo grain if the curves are to be identified cross-sectionally
- Delivery measures alongside spend, since saturation is about impressions reaching people rather than dollars spent
- Controls for the things that move demand on their own: promotions, price, distribution, seasonality
- A record of how each budget was set, which decides whether the coefficient means anything
What changes by context
- B2C ecommerce
- Promotions move demand and spend together, so a curve fitted without promotion controls reads promotional lift as media effectiveness. Marginal returns also bend early here, so the interesting part of the curve is inside observed support rather than beyond it.
- B2C subscription
- The outcome that matters lands months after the spend, so the curve should be fitted against retained value rather than signups, or against signups with the retention rate stated as a separate assumption rather than folded in silently.
- Marketplace
- Spending on demand raises prices for supply and vice versa, so the two sides are not separable response functions. A curve per side fitted independently will attribute the interaction to whichever side is being modeled.
When it breaks down
- Channels whose spend never varied outside a narrow band, where the curve is a functional form with a prior on it and should be described that way.
- Fewer than about two years of history, where seasonality and trend consume the degrees of freedom before any channel gets one.
- Channels that always move together, where the model cannot separate them and the output is a combined coefficient rather than two confident ones.
- Organizations that will act on the extrapolated part of the curve, for whom a fitted model is more dangerous than none.