Transformations: Adstock and Saturation
Track 1 - Foundations · Module 1.5
All analysts
Course home
Learning ObjectivesModule 1.5 · ~40 min
Derive geometric adstock and read alpha as a half-life.
Explain the Hill saturation function's two parameters and what moving each one does to the response curve.
Read a production config's platform_cat_parameter_ranges block: discrete candidate grids per platform category, and why they differ by platform.
Adstock: modelling memory

An ad's effect does not vanish when the flight ends - people remember. Geometric adstock encodes that memory as a running total that decays:

At = xt + α · At-1
xt = this period's media (impressions), α = decay rate, 0 < α < 1

Each week the channel's effective pressure is this week's impressions plus a fraction α of everything carried from before. A burst of activity leaves a tail that fades geometrically: after one week a fraction α remains, after two weeks α², and so on. The natural way to read α is as a half-life - the number of periods for a burst's effect to halve:

half-life = ln(0.5) / ln(α)
solve αn = 0.5 for n
αHalf-life (weeks)Reads as
0.3~0.6Effect nearly gone within the week - intent media
0.51.0Halves every week
0.7~1.9Meaningful carry into a second and third week
0.85~4.3A month of memory - brand media territory
0.9~6.6Long tail - the TV end of the spectrum

Higher α means slower decay and a longer memory. The KT heuristic follows directly: TV adstock is the highest, most traditional media decays slower than digital, and intent-driven channels (search, e-com) barely carry at all.

Hill saturation: modelling diminishing returns

Doubling spend rarely doubles sales - audiences run out, frequency stops adding persuasion. The program applies a Hill transformation to the adstocked series to encode this:

response(x) = xβ / (γβ + xβ)
β = shape/steepness, γ = half-saturation point; response runs from 0 to 1

Two parameters, two distinct jobs:

  • γ (the half-saturation point) is the media level at which the response reaches exactly half its maximum - set x = γ and the formula returns 0.5. Moving γ slides the curve along the spend axis: a higher γ means the channel saturates later, so there is more headroom before returns flatten.
  • β (the shape) controls steepness. β ≤ 1 gives a concave curve - diminishing returns from the very first impression. β > 1 gives an S-shape - a slow start, a steep middle, then a plateau, the signature of channels that need threshold weight before they work.

One symbol caution: the methodology workbook's transformation images write this same function with different letters (its "alpha" is the Hill steepness and "theta" the half-saturation). The production config's vocabulary - which this course uses throughout - reserves alpha for adstock decay and beta for the Hill shape, matching alpha_range / beta_range in the YAML. Order of operations, per the pipeline: adstock first, Hill on the adstocked series. Control and base variables get neither - they receive plain min-max scaling (except variables that are already normalised, like percentages and indexes, listed in exclude_Scaling).

The transform pipeline: raw spend to model-ready variable
Synthetic weekly TV GRPs, 104 weeks. Every media variable passes through both transforms before the model ever sees it.
0.60
1.8
220 GRP
Raw GRPs (bars)
After adstock
After adstock + Hill (scaled, model input)
Read it like a modeler
Alpha stretches effect across weeks (carryover); the Hill pair then compresses heavy weeks (diminishing returns). High alpha + low gamma means even modest bursts saturate; low alpha + high gamma behaves almost linearly. In the production config each platform category gets its own candidate grid of alphas and the model search picks the best-fitting combination within those constraints.
How the config encodes it: discrete grids per platform

Open a real production config and find platform_cat_parameter_ranges: one entry per platform category, each holding an alpha_range and a beta_range. The structural fact that surprises every new analyst: despite the name, these are not [low, high] ranges - they are discrete candidate grids. The search only ever tries the listed values; a value between two grid points is never fitted.

platform_cat_parameter_ranges:
  tv:
    alpha_range: [ ...many candidates, highest values, finest grid... ]
    beta_range:  [ ...common grid... ]
  paid_social:
    alpha_range: [ ...three coarse low values... ]
    beta_range:  [ ...same common grid... ]

The alpha grids cluster into bands that mirror the funnel:

BandPlatform categoriesGrid character
Slowest decay (highest α)
tvExtends higher than every other platform, roughly twice as many candidates - the finest grid, including previously-fitted optima pinned back in
Upper-middle
digital_av, digital_video, digital_youtube, oohTight 5-6 value clusters just above the midpoint
Middle
radio, digital_display, digital_native, digital_partnerships, printTight ~5-value clusters straddling the midpoint
Fastest decay (lowest α)
search, ecomm_search, ecomm_display, paid_socialThree coarse, evenly spaced low values

The beta grid is identical for every platform in this config family - roughly 14 candidates spanning from below 1 to well above 1, so both concave and S-shaped saturation are searchable everywhere. All per-platform differentiation is carried by alpha; beta is left free on a common grid. Editing one platform's beta "to match TV" is a conceptual no-op and a red flag in review.

Why grids per platform category rather than one free parameter? Three reasons. First, business knowledge is real: TV genuinely carries longer than search, and letting search borrow a TV-like alpha invites the model to launder baseline into media. Second, the search is combinatorial - every alpha × beta combination per channel is transformed, fed to the model builder, and scored (the pipeline's stages: build on all possible combinations of transformed variables, then iterate parameter combinations until statistical and business KPIs are satisfied). Discrete grids keep that explosion affordable. Third, comparability: a header rule in the config states the alpha/beta chosen at L1 are retained for L2 and L3 - the grid search happens once per channel, not per level.

Copy-paste hazard: the TV grid's suspiciously precise many-decimal candidates are previous markets' fitted optima pinned into the grid. Copying a config to a new market silently carries those stale pins with it. Check the grids, not just the platform names.
Phase 2 exercise - hand-calc the pipeline. A notebook exercise gives you a synthetic weekly series and a stated alpha, beta and gamma: apply adstock by hand (a running loop), then Hill, then compare against vectorized numpy versions. Ten rows of arithmetic makes the two formulas permanently un-forgettable.
Check Yourself
Channel A has α = 0.85, channel B has α = 0.4. Which statement is right?
Why: alpha is the retained fraction per period, so higher alpha = more memory = slower decay. Half-life = ln(0.5)/ln(α): about 4.3 weeks at 0.85, about 0.8 weeks at 0.4.
Why does the config list discrete alpha candidates per platform instead of letting the model estimate alpha freely?
Why: transformations happen outside the model; the pipeline transforms every listed candidate combination and scores the resulting models. Discrete grids bound the compute and inject the funnel logic (TV slow, search fast) as a structural prior.
You double a channel's γ (half-saturation point) while keeping β fixed. What happens?
Why: gamma positions the curve; beta shapes it. The maximum of x^β / (γ^β + x^β) is always 1 - saturation level is a scaling matter for the coefficient, not for gamma.
Sources
Authored from:
  • MathCo Methodology Understanding_UL.xlsx sheet Media Data tranformation (the program's own adstock and Hill formulations, transcribed from the embedded images) and sheet Config Creation (parameter dictionary, quick checks)
  • Onboarding Docs\mmx_tool_config_UK_knorr_new_iteration-latest May12.yaml: platform_cat_parameter_ranges structure - grid bands described directionally only, no numeric values reproduced
  • UL_Rapid ROI_Pre-Read_Document 1.pptx slide 14, stages 2-3 (transformation parameter ranges from industry benchmarks, adstock then Hill, min-max scaling for control variables) and stages 5-6 (all-combinations build and tuning)
  • UL - KT (1).docx (4 Jun session): TV adstock highest, traditional above digital heuristic; UL - KT (4).docx (25 Jun session): transformations applied outside the model, parameters searched via partial correlations
Alpha/half-life table values are computed from the formula, not taken from any config.