Your Demand Proxy Is Not a Control Variable

Every media mix model rests on the same load-bearing assumption: that spend is exogenous. It obviously isn't. Planners raise budgets ahead of demand they can forecast, and the standard repair is to find a stand-in for demand (query volume, a category index, consumer confidence, weather) and put it in the control set. Everyone knows the stand-in is imperfect. The implicit theory is that imperfect help is still help: you close most of the back-door, residual confounding survives in proportion to the proxy's noise, and the estimate lands between the biased answer and the truth. That theory is wrong, and not at the edges. Adjusting for a proxy leaves the confounder in place and re-weights which part of it you are still confounded by. It also shrinks the treatment variation you were using to estimate the effect. Planners respond more strongly to the forecastable part of demand than to the unforecastable part, which is the definition of planning. Under that condition the two changes point the same way and the adjusted estimate lands further from the truth than the unadjusted one. There is a closed-form condition for when that happens, it contains no term for how good your proxy is, and it has an uncomfortable corollary: in that regime, improving the proxy makes the answer worse.

The Move Everybody Makes

Start with the diagnosis, which is not in dispute. Budgets respond to expected demand: topped up in a strong quarter, front-loaded into a forecastable season. That opens the back-door path spend ← demand → sales, so the raw association credits media with sales demand was going to deliver anyway. It is the structural failure that makes observational exposed-versus-unexposed comparisons flatter advertising by orders of magnitude. MMM's aggregation makes it smaller, not absent.

This framework ships a pre-fit screen for exactly that pattern. diagnostics/endogeneity.py runs a Granger-style lead/lag asymmetry test on differenced series (differencing first, so a shared trend or seasonal cycle doesn't spuriously correlate everything). Per channel, it compares whether a past KPI change predicts a current spend change against whether past spend predicts a later KPI change. When demand-leads-spend dominates, the channel is flagged, and the sentence the module writes is the premise of this post: spend “appears to respond to demand (past KPI movements lead spend), so the model may over-credit it: its effect can't be cleanly separated from demand without an experiment.” It runs pre-fit on raw arrays, and it is wired through the check_endogeneity tool, the endogeneity model op and a section of the pre-fit Model Design Readout. It is also deliberately conservative. When nothing is flagged, its own output says the screen “only rules out the obvious demand-chasing pattern.”

What happens next is where the trouble starts. The flag arrives, and the response is to go find a demand variable: category query volume, a syndicated sales index, consumer confidence, weather, a competitor-spend estimate. It goes into the control set, the fit reruns, the chasing channels' ROAS comes down a bit, and the deck says the model "controls for underlying demand." The residual bias is assumed smaller. Nothing in the fit output disagrees.

The Assumption Hiding in "Partial"

The assumption doing the work is that partial adjustment produces partial correction. It deserves a hearing, because in the textbook case it is true. That is why the intuition is so durable. Let \( U \) be demand, \( A \) spend, \( Y \) sales, with \( A = \kappa U + \varepsilon_A \) and \( Y = \tau A + \theta U + \varepsilon_Y \). Your proxy is classical: \( W = \lambda U + \varepsilon_W \), where the measurement error \( \varepsilon_W \) is independent of everything else. Regress \( Y \) on \( A \) and \( W \). A few lines of covariance algebra give the residual bias on \( \tau \):

$$ \mathrm{bias}_{\text{adj}} \;=\; \frac{\theta\,\kappa\,\sigma_W^2}{\kappa^2\sigma_W^2 + \sigma_A^2\lambda^2 + \sigma_A^2\sigma_W^2}, \qquad \mathrm{bias}_{\text{unadj}} \;=\; \frac{\theta\,\kappa}{\kappa^2 + \sigma_A^2}. $$

Their ratio is \( (\kappa^2\sigma_W^2 + \sigma_A^2\sigma_W^2) \,/\, (\kappa^2\sigma_W^2 + \sigma_A^2\lambda^2 + \sigma_A^2\sigma_W^2) \), which is at most one because the extra term \( \sigma_A^2\lambda^2 \) in the denominator is never negative. Adjustment always shrinks the bias, never past zero, monotonically in the proxy's reliability. Perfect attenuation. This is the linear-Gaussian instance of a general result. Ogburn and VanderWeele (2013) establish bias-attenuation conditions for nondifferentially mismeasured ordinal and coarsened confounders, and Zhang and Lee (2025) give a general condition for attenuation by a nondifferentially mismeasured confounder.

Read those titles carefully, though. They are theorems about when attenuation holds. Zhang and Lee need monotone outcome regressions and propensity scores, plus positive dependence between the true and mismeasured confounder. Attenuation is a conclusion with hypotheses, not a law of adjustment. Strip the monotonicity and the conclusion fails, which is why Peña's (2021) companion result is titled for the non-monotonicity rather than the attenuation. The single-confounder classical-error setup satisfies the hypotheses. Media data does not, for a reason that is structural rather than incidental.

Definition: nondifferential measurement error

A proxy \( W \) for a confounder \( U \) is nondifferentially measured when its error is independent of treatment and outcome given \( U \). A noisy read of \( U \), and nothing else. The attenuation results assume this, plus that \( U \) is the only confounder and that \( W \) is not itself caused by treatment or outcome. Every clause is a substantive, separately falsifiable claim about a marketing dataset.

When Adjustment Moves the Wrong Way

Demand is not one thing. It has a part planners can see coming (seasonality, promotions on the calendar, a category index that publishes weekly, the macro cycle) and a part they cannot: a competitor's surprise launch, a viral moment, an unmodelable shift in intent. Both parts move sales. Only the first reliably moves next month's budget, because a plan responds to a forecast, not to a surprise.

That asymmetry is the whole problem, and it is exactly what a demand proxy is built to measure. A category index or a query-volume series tracks the forecastable component well, almost by construction, since that is what makes it publishable and subscribable in the first place. About the unforecastable component it has close to nothing to say.

So write demand as \( U = U_s + U_h \), a seen component and a hidden one, and let coverage \( c \) be the share of demand's variance the proxy could in principle see, so \( \mathrm{Var}(U_s) = c \) and \( \mathrm{Var}(U_h) = 1-c \). Let spend respond to both, but harder to the forecastable part, at a planning gain \( g \gt 1 \):

$$ A \;=\; \kappa\,(\,g\,U_s + U_h\,) + \varepsilon_A, \qquad Y \;=\; \tau A + \theta\,(U_s + U_h) + \varepsilon_Y . $$

Sales respond to demand uniformly. Only the budget distinguishes the forecastable part. Now condition on a proxy that captures \( U_s \) with reliability \( r \), where \( r = 0 \) is no adjustment and \( r = 1 \) a perfect read of the seen component. The residual bias on \( \tau \) is

$$ b(r) \;=\; \frac{\theta\kappa\,\big(g\,v_s + v_h\big)}{\kappa^2\big(g^2 v_s + v_h\big) + \sigma_A^2}, \qquad v_s = c\,(1-r), \quad v_h = 1-c . $$

Differentiate with respect to \( v_s \), the seen-demand variance still contaminating spend. The resulting sign turns on one comparison, and not on \( r \) at all:

$$ \frac{\partial b}{\partial v_s} \;\propto\; \sigma_A^2 \;-\; \kappa^2\,(1-c)\,(g-1). $$

⚠️ The condition, and what it says

Adjusting for a demand proxy reduces bias if and only if

$$ \sigma_A^2 \;\gt\; \kappa^2\,(1-c)\,(g-1), $$

and increases it otherwise. In words: the spend variation that has nothing to do with demand must exceed the spend variation driven by hidden demand, multiplied by the planner's excess responsiveness to forecastable demand. Two consequences follow immediately. First, the inequality contains no term for the proxy's quality, so the direction of the effect is fixed by the world, and a better proxy simply moves you further along whichever direction that is. Second, the cure is on the left-hand side: deliberate, demand-independent variation in spend is what makes proxy adjustment safe.

The mechanism is not mysterious once the algebra is in front of you. Bias is a ratio of residual confounding to residual treatment variation. Conditioning shrinks the numerator. But it also strips the seen component out of the denominator, and that slice is large precisely because \( g \gt 1 \) means planners lean on it. Remove enough denominator while hidden demand stays in the numerator and the ratio rises. This is bias amplification, the phenomenon that makes conditioning on an instrument-like covariate a mistake in propensity-score practice: Pearl (2011) gives the mechanism for covariates more strongly associated with the exposure than with the outcome, and Ding, VanderWeele, and Robins (2017) show it holds beyond linear models, for a wide class satisfying certain monotonicity conditions. A demand proxy behaves like a partial instrument for spend, because planning responds to forecasts and not to surprises, so \( g \gt 1 \) tilts the seen component toward the treatment side. That application is my extension of their result, an inference those papers never make about marketing data.

Better measurement, worse answer

Residual bias against proxy coverage, the share of demand's variance the proxy could see. Three strategies: no adjustment, one noisy proxy, and a latent factor pooled from four indicators (more reliable, by Spearman–Brown, than any one). Indicator noise fixed at ση = 0.5, so the four-indicator factor's reliability follows Spearman–Brown. Curves are exact population regressions, not simulations. There is no sampling noise in this figure.

0.35
3.0
1.00
No adjustment
One noisy proxy
Latent factor, 4 indicators
Verdict

At the defaults the media effect is overstated by 35.4% unadjusted, 36.7% after controlling for the proxy, and 38.0% after replacing it with a better-measured latent factor. Monotone in the wrong direction. Right of the dashed crossover intuition holds: at c = 0.9 the latent factor nearly halves the bias. Push designed variation up and the crossover marches left until the harmful region disappears.

Deep diveWhy the sign does not depend on the proxy's quality

Write \( N = \theta\kappa(g v_s + v_h) \) and \( D = \kappa^2(g^2 v_s + v_h) + \sigma_A^2 \), so \( b = N/D \). Both are affine in \( v_s \), with \( \partial N/\partial v_s = \theta\kappa g \) and \( \partial D/\partial v_s = \kappa^2 g^2 \). The quotient rule gives \( \partial b/\partial v_s = (\,\theta\kappa g D - \kappa^2 g^2 N\,)/D^2 \), and substituting,

$$ \theta\kappa g\,D - \kappa^2 g^2 N \;=\; \theta\kappa g\Big[\kappa^2 g^2 v_s + \kappa^2 v_h + \sigma_A^2 - \kappa g\big(g v_s + v_h\big)\kappa\Big] \;=\; \theta\kappa g\Big[\sigma_A^2 - \kappa^2 v_h (g-1)\Big]. $$

The \( v_s \) terms cancel exactly. Since \( v_h = 1-c \) does not involve \( r \), the sign of \( \partial b / \partial v_s \) is a constant of the world: \( \operatorname{sign}\!\big(\sigma_A^2 - \kappa^2 (1-c)(g-1)\big) \). Better measurement lowers \( v_s \). Whether that raises or lowers bias is therefore settled before you choose a proxy. It is a monotone slide in a direction you do not get to pick, which is why "we upgraded to a better demand signal" is not a defense.

Two boundary checks. At \( g = 1 \), meaning no planning at all, the right-hand side is zero and adjustment always helps. That recovers the classical attenuation result above. As \( c \to 1 \) the proxy spans all of demand and adjustment fully identifies \( \tau \). The damage lives strictly in the interior, which is where every real proxy lives.

The threshold on \( g \) is low. With \( \kappa = \sigma_A = 1 \) the condition requires \( g \gt 1 + 1/(1-c) \), about 2.5 at \( c = 0.35 \), which a budget process that re-plans monthly against a published category forecast clears without effort. A channel bought a year ahead on an upfront has a large \( \sigma_A^2 \) and is safe. So the condition sorts channels, not companies, and it points at the same remedy as most identification problems in this field: the left-hand side is a design variable. A channel flighted through deliberate, demand-independent levels has a large \( \sigma_A^2 \), which is the same schedule that breaks the saturation-versus-fatigue tie.

One Column, Two Roles

The amplification result assumes the proxy is at least a legitimate stand-in for the confounder. The second failure is that the same column is often not playing the same role for every channel.

The clearest case is organic search query volume, and the industry has already thought about it more carefully than the folk version of this critique allows. Google's Meridian documentation calls organic query volume “an important confounder for search ads,” warns that “[f]ailing to control for GQV can lead to overestimation of the causal effect of paid search,” and matches the published back-door analysis of paid search from Chen and colleagues (2018), who summarize the query set by destination URL and validate the resulting correction against randomized experiments. And it goes further than being right about search: the same documentation states outright that “query volume might be a mediator for some media channels, but a confounder for other media channels,” notes that other forms of media drive search behavior, and instructs the analyst to “decide either to assume query volume is a confounder and include it in the model, or to assume query volume is a mediator and exclude it from the model.” Nobody has missed the dual role.

The problem is the shape of that instruction. It is one decision, taken once at the level of the model, about a variable whose role differs by channel inside that same model. Query volume confounds paid search because demand raises queries and queries gate search impressions. Upper-funnel advertising generates queries (that is most of what brand television is for), so for television the identical column is a mediator, and the identical documentation is explicit that “[m]ediator variables shouldn't be included as control variables, because including them will bias causal inference estimates on the treatment variables.” Both statements are correct. Together they instruct you to include a column and to exclude it. A design matrix has no place to record which channel each decision applies to, so however you set the switch, one channel's number answers a question nobody asked. And because the two errors have opposite signs, they do not partially cancel in a total. The Table 2 fallacy is usually a story about reading the wrong row of a coefficient table. Here it is a column with no single correct treatment at all.

There is a third mechanism stacked on top, and the calculation below produces it without being asked. Query volume is caused by demand and by television. That makes it a collider on the path TV → queries ← demand → sales. Conditioning on a collider opens that path, so television is penalized twice: once for the mediated effect it loses, and again for confounding it acquires.

No setting of the switch is right for both

A world where demand drives query volume, search spend, and sales, and television drives query volume and sales. Television is bought on an upfront, so its weekly spend does not chase demand. Query volume is therefore a confounder proxy for search and a mediator-plus-collider for TV. Bars are exact population regression coefficients. Diamonds mark the true total effects.

0.80
1.20
TV error, no GQV
TV error, with GQV
Search error, no GQV
Search error, with GQV

At the defaults, leaving query volume out gets television exactly right and overstates search by 117%. Putting it in cuts the search error to 47% and drives television 58% below its true effect. Of that drop, 0.4 is the deleted mediated path and the remaining 0.42 is collider bias. Confirm by sliding θ to zero and watching television land exactly on its direct effect.

The slider at \( \theta = 0 \) makes the decomposition visible. With no direct demand–sales path there is no collider to open, so conditioning on query volume costs television precisely its mediated effect and nothing more: 0.40, exactly \( \mathrm{TV}\rightarrow Q \) times \( Q \rightarrow \) sales. It still repairs search, which without the control reads 34% high through the surviving demand → queries → sales route. Even with no direct demand effect on sales, search is confounded, just by a longer path. Restore \( \theta \) and the collider term appears, scaling exactly linearly in it. Double the confounding you are trying to fix and you double the collider bias you import while fixing it. Splitting television's total effect into the part that runs through search and the part that does not is a separate identification problem with its own assumptions, and it is the subject of a companion post. The point here is prior to that one. You cannot even keep the totals honest with one column and one switch.

💡 This framework has the same gap, and it is structural

The fix people reach for is “mark it a confounder for search and a mediator for TV.” That request is really for two estimands. One regression cannot report a total effect for TV and a demand-adjusted effect for search unless the graph derives each separately, which is what good-control/bad-control reasoning is for. This library gets further than most and still stops short. CausalControlRole types every control as CONFOUNDER, PRECISION_CONTROL, MEDIATOR, or COLLIDER, routes confounders to a wide un-shrunk prior, and refuses at construction to condition on a mediator or collider, on the stated grounds that “a silently-conditioned mediator produces a confidently wrong number.” But the role is one value per column, not per channel-and-column pair. And the DAG validator permits a MEDIATOR edge into the KPI, another outcome, or another mediator, never into MEDIA. “Query volume causes paid search spend” cannot be drawn, so the structure that would resolve the conflict cannot be stated. Today's workaround is two models with two declared estimands.

What a Proxy Could Actually Buy

All of that is diagnosis. There is a body of theory that answers the constructive question, which is what a proxy would have to be in order to identify anything, and its answer is sharper than practice assumes. Proximal causal inference starts from the observation that the useful structure is a pair of variables with complementary exclusion restrictions. One noisy version of the confounder does none of that work. Miao, Geng, and Tchetgen Tchetgen (2018) show that with two proxies of an unmeasured confounder (one with no direct effect on the outcome, one not affected by the treatment) satisfying a rank condition, plus a solution to an integral equation known as a bridge function, the causal effect is nonparametrically identified even when the measurement-error mechanism itself is not. Not attenuated: identified, without ever measuring the confounder and without knowing how badly the proxies measure it. Kuroki and Pearl (2014) had earlier established related effect-restoration results for measurement bias, and Tchetgen Tchetgen and colleagues (2024) give the modern synthesis.

Definition: the two kinds of proxy

Proximal causal inference needs two columns of complementary kinds. A negative-control exposure is a variable associated with the confounder that cannot affect the outcome. A negative-control outcome is a variable associated with the confounder that cannot be affected by the treatment. The names come from Lipsitch, Tchetgen Tchetgen, and Cohen (2010), who introduced negative controls as a general device for detecting confounding. Proximal inference is the machinery that turns two of them into an estimate.

Marketing panels are unusually rich in candidates: a category index published before the campaign period, a competitor's spend estimate, sales in a geography you did not advertise in, a product line that shares the demand shock but received no media. These are plausibly proxies of the two required kinds. The industry's habit is to license whichever one it can and add it to the control set, which uses neither correctly. A negative-control outcome on the right-hand side of a regression is not doing the job the theory assigns it.

⚠️ Do not read this as a recipe

Proximal identification is a theory of what is possible, not a method to deploy next quarter. Estimation requires solving for a bridge function, an integral equation whose inversion is ill-posed. Doing that on roughly 150 weekly observations, with two candidate proxies whose exclusion restrictions you are asserting rather than verifying, is not a well-conditioned problem. The rank condition is a relevance requirement, the direct analogue of instrument strength, and weak proxies produce the pathologies weak instruments do. Ringlein and colleagues (2025) devote a practitioner-facing review to proxy selection precisely because getting it wrong is easy. Treat proximal inference as the thing that tells you what your proxy is not buying, and as a research direction for panels with many geographies and product lines, not a switch to flip.

The Bargain This Framework Ships

This framework's own answer to latent demand is a different trade, and since it is the shipped one it deserves the harsher reading rather than the softer one.

examples/garden_models/latent_factor_mmm.py estimates the confounder jointly. Four noisy indicators (GDP growth, consumer confidence, unemployment, retail sales) are treated as manifestations of one latent "economic health" factor. Its measurement block is estimated inside the same PyMC graph as the MMM, with the factor entering the KPI mean as a covariate. The module is explicit about why this beats the two-stage alternative: taking the latent's posterior mean and plugging it in is "the classic generated regressor: it throws away the factor's uncertainty and understates the MMM's." Identification is delicate and the code says so: the factor is standardized in-graph (otherwise its variance trades off against the loadings and they collapse toward zero), and only the anchor loading is sign-pinned, so unemployment can recover its negative loading.

Three real things come with that. Uncertainty propagates instead of being discarded. The factor becomes a named, reusable series rather than four opaque regression coefficients, and pooling several indicators of one construct raises reliability.

There is an answer key for it. synth/dgp.py::make_economic_health plants a latent economic-health factor that drives both spend and baseline sales, with Search and Social chasing it hardest, measured by four indicators with known loadings including a deliberate −0.7 on unemployment. The teaching notebook nbs/causal/causal_04_latent_confounders.ipynb grades three rungs against it: ignore the confounder, use the four indicators as controls, model the measurement jointly. Mean absolute error on the chasing channels' counterfactual contribution runs 406%, then 101%, then 112%. The first step is enormous. The second buys no accuracy at all. On this world the joint model is marginally worse on point error than dumping the indicators into the control set.

What the joint model recovers instead is the measurement claim itself: the factor's trajectory at a correlation of 0.981 with the planted truth, and the loading pattern with its negative sign intact (−0.83 estimated against −0.7 planted). The notebook's verdict is that when the middle and top rungs tie on point error the joint model "is not an accuracy purchase: it's a knowledge purchase," and it adds the sentence that should end every discussion of observational de-confounding: neither rung removes the residual bias, "because it lives in the part of the confounder the indicators simply don't measure. No observational structure can reach it."

Higher reliability does not escape the coverage problem either. That is exactly where Figure 1 bites, since a better-measured factor only moves you further along a curve whose direction the world already fixed. And the factor model is itself an assertion: that the indicators' shared variance is the confounder and their residual variance is noise. The literature has litigated that assertion. Wang and Blei (2019) argued a factor model over multiple causes controls confounding. Ogburn, Shpitser, and Tchetgen Tchetgen (2020) gave counterexamples showing it does not in general, and the exchange that followed added assumptions sufficient to make it work. Those added assumptions are what you sign when you fit a joint latent factor. So the two bargains differ in what they charge. Proximal inference buys identification with weaker structure and a much harder estimation problem. The joint factor buys honest uncertainty, a reusable construct, and reliability that is only worth having on the correct side of the inequality. Neither is a way to observe something you did not measure.

The Test You Can Run This Week

Everything above is unfalsifiable from the fit output alone, which is the practical scandal. A model with amplified bias has a good posterior, plausible channel splits, and no diagnostic complaining. Holdout error will not find it either, because residual confounding lives in the decomposition, which holdout error does not constrain. A genuine negative-control outcome will.

Pick a \( Y_{nc} \) that media provably cannot move but that shares the demand shock: sales in a geography that received no media in the period, a product line in the same category with no support, category sales excluding your brand. Fit the identical specification (same controls, same proxy, same adstock) with \( Y_{nc} \) as the outcome. Media's effect on it is zero by construction, so any coefficient you recover reads the confounding your specification failed to close. In the linear case the reading is quantitative, a rescaling and not a bare signal: the expected negative-control coefficient equals the main model's residual bias times the ratio of the control outcome's demand loading to the KPI's.

Does the falsification test have teeth?

Sampling distribution of the media coefficient on a negative-control outcome, under a specification that closed the back-door (centered at zero) and under one whose proxy left residual confounding. Both are standardized. The shaded tails are the two-sided 5% rejection region.

35%
0.80
156
Expected NCO coefficient
Detection probability
Verdict

At the defaults (three years of weekly data, a control outcome sharing 80% of the demand loading, 35% residual bias) the test catches the confounding 94% of the time. Drop the sharing to 0.3 and detection falls to 26%: a control outcome that barely shares the confounder gives a reassuring null that means nothing. A pass is evidence only when the readout says the test could have failed.

An honest accounting is required here, because this framework does not ship that test. validation/validator.py::_refute_negative_control is named negative_control_outcome and runs by default, but the source does something different: it permutes the KPI and refits, passing when the refit \( R^2 \) on the scrambled outcome falls below a threshold (0.30, raised from 0.25 after knife-edge verdict flips). The config docstring is accurate: "a valid, regularized model should be unable to fit the scrambled outcome." That is a worthwhile specification check, and it catches a model flexible enough to fit noise. It is not a negative control in the Lipsitch sense. A permuted KPI destroys the confounder along with everything else, so it shares no demand shock and carries no information about residual confounding. The real test needs a real column, not a permuted one:

# illustrative
# What the shipped refutation does: destroy the outcome, check the model can't chase it.
y_scrambled = rng.permutation(y)          # confounder destroyed along with signal

# What a negative-control outcome does: keep the confounder, remove the causal path.
y_nc = unadvertised_geo_sales             # demand shock intact, media effect zero
fit(y_nc ~ media + controls + demand_proxy)
# any nonzero media coefficient here is residual confounding, read directly

Three habits follow, none needing new machinery. Run the endogeneity screen before you fit, and treat a flag as a statement about which channels need an experiment rather than a prompt to go shopping for a control column. Before adding a demand proxy, ask the inequality's question out loud: does this channel have meaningful spend variation unrelated to demand, and does the plan lean much harder on forecastable demand than on surprises? If the answers are "no" and "yes," the proxy is likelier to hurt than help, and the honest output is an unadjusted estimate with a wide interval and a named open back-door. And when a channel's ROAS is load-bearing, the only thing that closes the path is an experiment feeding a calibrated prior, which is what the diagnostic's own message said all along.

What This Does Not Establish

The amplification result is derived in a linear-Gaussian model with additive effects and one latent construct split in two. Real MMMs have adstock, saturation, and hierarchical structure, and the exact inequality does not survive that translation unchanged. What survives is the mechanism, since it is a property of adjustment and not of linearity: bias is a ratio of residual confounding to residual treatment variation, and conditioning moves both. Read the condition as a diagnostic question, not a number to compute from your data.

Nor does this establish that demand proxies are generally harmful. Figure 1 has a large region where adjustment works as advertised, and the framework's own answer-key world is one where indicators-as-controls cut the error by a factor of four. I have not shown what fraction of real proxies fall on the wrong side of the inequality. That needs a study across many advertisers with known ground truth, and I do not have one. The honest position is that the wrong side exists, that nothing in a standard fit tells you which side you are on, and that "partial adjustment, partial correction" is not a safe default.

Finally, the negative-control test detects confounding. It does not remove it, and a null is weak evidence unless the power readout says otherwise. Proximal inference could in principle remove it, and I have deliberately not claimed it is ready for a 150-week panel. The one thing that reliably closes the back-door is still randomization.

Takeaways

  • Partial adjustment is not attenuation. Classical measurement error on a single confounder does attenuate monotonically. But that is a theorem with hypotheses, and marketing data violates them structurally.
  • Adjusting for a demand proxy reduces bias if and only if \( \sigma_A^2 \gt \kappa^2(1-c)(g-1) \): demand-independent spend variation must exceed hidden-demand-driven variation times the planner's excess response to forecastable demand. Planning is what makes \( g \gt 1 \).
  • That inequality contains no term for proxy quality. On the wrong side of it a better proxy gives a worse estimate. At 35% coverage the bias runs 35.4% unadjusted, 36.7% with one proxy, 38.0% with a four-indicator latent factor.
  • "Confounder" is a property of a variable and a channel. Meridian's documentation says so outright: query volume "might be a mediator for some media channels, but a confounder for other media channels." Then it asks for one model-level decision anyway. Including it costs TV 58% of its true effect (0.40 mediated path, 0.42 collider). Excluding it overstates search by 117%. This framework cannot express the fix either: a control's causal role is one value per column, and a mediator edge into a media node is rejected by the DAG validator.
  • Proximal causal inference says what proxies could buy: two proxies of complementary kinds plus a bridge function identify the effect without measuring the confounder. That is a statement about what is possible, not a recipe for 150 weekly rows.
  • Estimating the confounder jointly is the other bargain, and on the framework's answer-key world it cuts chaser-channel error from 406% to 112% without beating four indicators used as controls (101%). What it buys is a falsifiable measurement model (factor recovered at 0.981 correlation, the planted negative loading intact), priced as a factor-model assumption the deconfounder debate already showed is not free.
  • A genuine negative-control outcome reads residual confounding directly. This framework's negative_control_outcome refutation permutes the KPI instead, destroying the confounder and answering a different question. The cure remains designed, demand-independent spend variation, which is another name for an experiment.

References