Randomization Buys You the Total Effect. The Funnel Is Not Included.

The strongest evidence a media measurement program ever produces is a randomized geo lift. It survives every objection: the treatment was assigned, not chosen, so no confounder can explain the difference. And it is routinely used to anchor a slide it cannot support. That slide is the funnel chart, where the channel's effect is split into a share that flows through awareness, a share through branded search, and a residual that goes direct. That split is a mediation estimand, and mediation estimands are not identified by randomizing media. Robins and Greenland proved this in 1992: direct and indirect effects cannot be separated when only the exposure is randomized. What licenses the split is a second and much stronger assumption, no unmeasured confounding between the mediator and the outcome, conditional on treatment. The single most common feature of a media data set violates that assumption by construction: a demand shock that lifts both awareness and sales at once. The result is an inversion worth sitting with. The funnel chart, which reads as the more mechanistic and therefore more causal object, is less identified than the flat total-effect number printed above it. An earlier post in this series argued you must stop conditioning on mediators if you want the total effect. That advice was right, and it does not transfer.

A Harder Question Than the One We Solved

The Table 2 fallacy post ended on a constructive note: when brand search sits on the causal path from TV to sales, do not throw it into the regression as a control. Conditioning on it blocks the mediated path and attenuates the channel toward zero. Model the mechanism instead, with a structural or nested MMM that recovers the total effect as the sum of the paths. That advice is correct, and this framework enforces it in code. It also happens to solve a strictly easier problem than the one the funnel chart poses.

Recovering the total effect through a mediator needs only that you not condition on the mediator. The mediated path stays open, the direct path stays open, and their sum is what an unconditional comparison (or a randomized geo lift) delivers. Splitting that sum into "60% of TV works through awareness" needs something entirely different: a claim about what would have happened to sales had awareness been held at its untreated level while TV ran anyway. Nothing in the data set corresponds to that world, because no geo ever saw TV run with awareness pinned in place. The split is a counterfactual about a variable nobody assigned.

This distinction gets lost because both questions are answered by the same fitted object. You build one nested model, and it emits a total contribution per channel and a mediated share per channel out of the same posterior and into the same table, carrying the same credible intervals. The uncertainty display gives no hint that one column is anchored by an experiment and the other is anchored by an assumption the experiment never tested. Everything in this post is about that second column.

Definition: natural direct and indirect effects

Write \( M(t) \) for the mediator (awareness, say) that would obtain under media level \( t \), and \( Y(t, m) \) for sales under media \( t \) and awareness pinned at \( m \). The total effect is \( Y(1, M(1)) - Y(0, M(0)) \): the thing a geo lift measures. It decomposes into a natural direct effect, \( Y(1, M(0)) - Y(0, M(0)) \), which runs the media while holding awareness where it would have been without the media, plus a natural indirect effect, \( Y(1, M(1)) - Y(1, M(0)) \) (Robins and Greenland, 1992; Pearl, 2001).

Look at \( Y(1, M(0)) \). It requires media on and awareness at its media-off value simultaneously. No experiment, however large, ever realizes that combination. It is a cross-world quantity. That is the formal reason the split is not an ordinary estimand you can design your way to.

What Randomization Actually Buys

Randomizing media assignment buys exactly one thing: independence between the treatment and everything unobserved. That closes every back-door path into media, which is why the total effect is identified, and why an experiment-calibrated MMM inherits a defensible total. It does nothing to the mediator. Awareness was never assigned. Whatever unobserved forces move awareness are free to move sales as well, and they sit downstream of the randomization where it cannot reach them.

Robins and Greenland (1992) made this precise. Their abstract states the result in one sentence: "even in a randomized crossover trial of exposure, direct and indirect effects cannot be separated without special assumptions; in other words, direct and indirect effects are not separately identifiable when only exposure is randomized." They also show that the intuitive fix (adjust for the intermediate variable and read the remaining coefficient as the direct effect) is biased, which is the same over-adjustment pathology approached from a different direction. Adjusting for the mediator destroys the total. Not adjusting for it leaves the split unidentified. There is no arrangement of the same variables that yields both.

The escape route they identify is instructive because of how demanding it is. A trial that randomizes both the exposure and an intervention that blocks the intermediate's effect can separate direct from indirect, but only if exposure and mediator never interact to produce the outcome. When they do interact, the paper shows that the two-randomization trial cannot separate them either. Even in the cases where it works, the estimation has to run through the g-computation algorithm rather than conventional adjustment. Two randomizations, not one. That is the price, and it is the price whether or not anyone quotes it.

Deep diveWhy a bigger experiment does not help

Non-identification is not a precision problem, and this is the part practitioners most often mis-file. A quantity is unidentified when two different parameter values imply exactly the same distribution of observable data. More data shrinks sampling error around the observable distribution. It does not tell you which of the observationally equivalent parameter values generated it. Imai, Keele and Yamamoto (2010) prove the sharpest possible version for the linear structural equation model everyone actually fits: absent the ignorability condition, the sharp bounds on their sensitivity parameter are \( (-1, 1) \) and the sharp bounds on the average causal mediation effect are \( (-\infty, \infty) \). Their conclusion is blunt. Under the LSEM, the data generating process is not informative at all about either the sensitivity parameter or the mediation effect. An infinite sample leaves the interval infinite.

This is the same epistemic shape as the observational-equivalence problem in saturation versus fatigue, where two structurally different models track the same weekly series to within a thousandth of \( R^2 \) and disagree 2.3× about the marginal-to-average ROAS a budget optimizer runs on. There, the tie is broken by a designed spend schedule. Here, it would have to be broken by a design that touches the mediator, and almost nobody runs one.

The Assumption That Licenses the Split

The assumption that turns a mediation model into a mediation estimate is sequential ignorability: conditional on treatment and pre-treatment covariates, the mediator is as good as randomly assigned with respect to the outcome. Imai, Keele and Yamamoto (2010) show the average causal mediation effect is nonparametrically identified under it, and they are candid about what it demands in exactly the setting we are in. Their words on randomized experiments where the treatment is randomized but the mediator is not: the treatment-side condition is satisfied, but the mediator-side condition may fail for two reasons. One is unmeasured pre-treatment covariates confounding the mediator–outcome relationship. The other is post-treatment confounders, observed or unobserved.

Now name the media version. Consumer demand rises on its own, pushed up by a category tailwind, or by a competitor who stumbled. Awareness surveys tick up because more people are in market and paying attention. Sales rise for the same reason, and neither movement was caused by media. The mediator–outcome relationship is confounded by a variable no adjustment set contains, and the mediation model, which reads awareness's correlation with sales as awareness's effect on sales, hands the entire demand cycle to the channels that fed awareness.

This framework's own specification document names the mechanism without flinching. From technical-docs/structural-nested-mmm.md, on why a latent demand factor must be modeled: "leaving it out confounds the mediated path (demand → consideration and demand → sales is a back-door through the mediator)." The pre-fit endogeneity diagnostic names the treatment-side twin in its module docstring: spend responds to expected demand, opening spend ← demand → sales. Both statements are true and both are in the repository. Only one of them has a diagnostic attached.

Imai, Keele and Yamamoto give the violation a single number. Write \( \varepsilon_2 \) for the error in the mediator equation and \( \varepsilon_3 \) for the error in the outcome equation, and define

$$ \rho \;\equiv\; \mathrm{Corr}(\varepsilon_2, \varepsilon_3), \qquad -1 \lt \rho \lt 1. $$

Sequential ignorability implies \( \rho = 0 \). A shared demand shock implies \( \rho \gt 0 \). Every mediation number you have ever been shown was computed at \( \rho = 0 \), and \( \rho \) is not a parameter the likelihood can see. That is what makes the next figure possible.

One fit, one total, every funnel

A worked example, with the fit held fixed at values a two-equation mediation model would return. A geo experiment pins TV's total effect at 0.60 sales-index points per standard deviation of TV. The mediation fit returns a TV→awareness coefficient of 1.00, an awareness→sales coefficient of 0.52, and residual standard deviations of 0.96 and 0.94. Now slide \(\rho\), the mediator–outcome residual correlation the data cannot measure. Every point on this axis reproduces the observed data identically.

0.00
Mediated share
Mediated effect
Total effect
Fit to the data

The total effect is flat by construction, because direct and mediated always sum to the randomization-identified 0.60. At the default \(\rho = 0\) the funnel reads 87% mediated. Push it to \(\rho = 0.22\) and it reads exactly 50%. By \(\rho = 0.47\) the mediated path is zero, and past that it turns negative. Residuals, log-likelihood and \(R^2\) are identical at every point, since \(\rho\) does not appear in either fitted equation.

Less Identified Than the Number Above It

Put the two objects on the same slide, which is where they normally live. The headline says TV returned 0.60 index points per unit. Underneath it, a Sankey diagram splits that into awareness, branded search, and direct. The headline is anchored by a randomized experiment and survives any unobserved confounder you care to posit. The diagram beneath it is a smooth function of a correlation the data are formally uninformative about, and it can be moved from 87% mediated to 0% mediated by a demand factor of entirely ordinary strength.

The inversion is that the diagram reads as the stronger claim. It is more mechanistic, and by naming its pathways it looks like the output of a model that understands the business rather than one that merely measured it. Every visual cue says "we opened the box," and opening the box required an assumption strictly stronger than the one holding up the number we opened it to explain. This is the same failure of visual calibration as scoring an MMM by out-of-sample accuracy: the audience reads confidence off the object that looks most like evidence, and in both cases the object that looks most like evidence is the one carrying the least of it.

⚠️ The calibration transfer that does not happen

Calibrating an MMM to a geo lift (the experiment as prior) adds a likelihood term on the channel's measured estimand. In this framework those estimands are contribution, ROAS, and marginal ROAS: three views of the same total counterfactual contrast. Every one of them is a constraint on the sum of the direct and mediated paths. A 20/80 split and an 80/20 split at the same total satisfy the calibration term equally well. So the experiment makes the headline more credible and the funnel beneath it no more credible at all, while visually appearing to bless both.

"Proportion Mediated" Is Not a Proportion

Set identification aside and look at the statistic itself: the most-quoted number in mediation reporting is not the kind of object its name implies. In this framework, as in every implementation of the two-equation tradition, it is a ratio of an effect to an effect:

$$ \text{proportion mediated} \;=\; \frac{\text{mediated effect}}{\text{total effect}} \;=\; \frac{\text{total} - \text{direct}}{\text{total}}. $$

Nothing constrains a ratio of two signed quantities to \( [0, 1] \). When a channel's direct path runs opposite to its mediated path, the denominator shrinks toward zero and the ratio detonates. That suppression pattern is completely ordinary in media, where a retargeting campaign can lift branded search while cannibalizing organic conversion. The framework's own line makes the pole explicit and guards against exactly the division that has no answer:

# illustrative: mmm_extensions/models/structural.py
total_draws  = (mu_base - mu_cf).sum(axis=-1)   # exact counterfactual, identified
mediated     = total - direct
prop         = mediated / total if total != 0 else np.nan

The statistic has a pole in it

Hold the mediated effect fixed at +0.30 and slide the direct effect. Proportion mediated is a hyperbola in the direct effect, with a vertical asymptote where the total effect crosses zero. The shaded band is the range readers assume the statistic lives in.

0.30
Total effect
Proportion mediated
What the Sankey draws
Verdict

At a direct effect of −0.24 against a mediated effect of +0.30, the channel is 500% mediated. Move the direct effect to −0.30 and the statistic is undefined. One more step, to −0.35, and it reads −600%. The channel with the most extreme funnel number in your deck is simply the one whose total effect sits closest to zero.

The third readout above is not a joke. This repository's interactive results report renders its mediation Sankey from a posterior proportion_mediated, and to make the diagram drawable it does the only thing a renderer can do with an unbounded quantity: prop = np.clip(prop.reshape(-1), 0.0, 1.0). The other code path, which reconstructs flows from per-pathway deterministics, handles the same problem by drawing negative flows as magnitudes and listing them in a note. Both are reasonable engineering. Both are also evidence: you do not need a clamp on a proportion.

None of this is news in epidemiology, where the mediation proportion's dependence on model, scale and the mediator's coding has been documented for two decades (Ditlevsen et al., 2005; VanderWeele, 2015). It is news in media, where the number is quoted as though it were a share of a budget. Three properties need stating precisely, because the loose version of this critique is easy to overclaim.

First, the statistic is invariant to a linear rescaling of the mediator. Awareness measured in percentage points or in index points gives the same answer, because rescaling multiplies one path coefficient and divides the other. That much is safe. Second, nothing beyond that is: recoding awareness from a level to a week-over-week change, or pushing it through a logit link, is a different regression rather than a rescaling, and the mediated share moves with it. In this framework's structural mediator block those links are real (binomial tracker mediators go through a sigmoid, Likert mediators through a cumulative logit), and the per-mediator attribution is explicitly labeled a "first-order approximation through sigmoid links and AR gains." Third, "direct" is a residual category defined by the mediators you happened to measure. Add branded search to a model that had only awareness and the direct effect shrinks by construction. The mediated share rises without a single new fact about the world entering the model.

💡 Two definitions, one column name

Inside this library, proportion_mediated is computed two different ways. NestedMMM builds it as a product-of-coefficients decomposition: total = direct + total_indirect, so the total is defined as the sum of the modeled paths. StructuralNestedMMM computes the total as an exact counterfactual (zero the channel, resample the graph, take the difference) and gets the mediated part by subtraction. The second is the more defensible total and the more fragile ratio: when a modeled path is missing, the exact total absorbs it and the "mediated" residual silently changes meaning. Same column header, different estimand. If you compare mediation percentages across two models, check which one you are reading.

Price the Assumption Instead of Hiding It

None of this argues for deleting the funnel. Clients need the answer, the framework ships the model class, and refusing to estimate a quantity does not make the decision go away. It just moves the estimate somewhere with no uncertainty attached. The job is to price the assumption. Alongside the identification theorem, Imai, Keele and Yamamoto built the sensitivity analysis that makes \( \rho \) a reportable object: vary it, trace the mediation effect, and find the \( \rho \) at which the conclusion flips. It has been a one-line call in their mediation R package for over a decade (Tingley et al., 2014). No equivalent exists in any MMM stack I am aware of, including this one.

The version that translates to a media audience is their alternative parameterization in terms of variance explained. Let \( R^{2*}_M \) be the share of the mediator equation's residual variance an unobserved confounder would explain, and \( R^{2*}_Y \) the same for the outcome equation. Then, up to the sign of the confounder's two loadings,

$$ \rho \;=\; \pm\,\sqrt{R^{2*}_M \cdot R^{2*}_Y}. $$

This is a sentence a marketing director can evaluate. "A demand factor that explains 15% of what we cannot already explain about weekly awareness, and 15% of what we cannot already explain about weekly sales, moves the reported funnel from 87% to 62%." That is a claim about the world, checkable against the strongest observed control you have. It is the same benchmarking logic behind the Cinelli–Hazlett robustness value (2020) this framework already computes for the media–to–KPI path.

How strong would the demand factor have to be?

Same worked fit. The horizontal axis is the share of residual awareness variance an unobserved factor explains, and each curve fixes that factor's grip on the sales equation. The marker sits on the equal-strength diagonal. Set it to whatever your strongest observed control explains, then read off the funnel that survives a confounder of that size.

15%
Implied ρ
Funnel at benchmark
Kills the mediated path at
Verdict

At 22% of residual variance in each equation the reported 87% funnel halves to 50%. At 47% the mediated path is gone. Whether 22% is a lot depends entirely on your data, and that is the point. The number is now a defensible or indefensible claim about demand, instead of an invisible zero.

Deep diveThe ρ that zeroes the mediated path, in closed form

Let \( \hat g \) be the fitted awareness→sales coefficient from the regression of \( Y \) on treatment and mediator, \( s_2 \) the residual standard deviation of the mediator equation, and \( s_3 \) that of the outcome equation. The true structural coefficient at a hypothesized \( \rho \) is

$$ g(\rho) \;=\; \hat g \;-\; \rho \,\frac{s_3}{s_2\sqrt{1-\rho^2}}, $$

because the outcome-equation omitted-variable bias is \( \rho\, s_\nu / s_2 \) and the observed residual standard deviation relates to the structural one by \( s_3 = s_\nu\sqrt{1-\rho^2} \). Setting \( g(\rho) = 0 \) and writing \( k = \hat g\, s_2 / s_3 \) gives

$$ \rho^{*} \;=\; \frac{k}{\sqrt{1+k^{2}}}. $$

A short calculation shows \( \rho^{*} \) equals the residual correlation between the total-effect regression (outcome on treatment alone) and the mediator regression. That is exactly Imai, Keele and Yamamoto's remark that the mediation effect is zero if and only if \( \rho \) equals that quantity. Two consequences for practice. \( \rho^{*} \) is increasing in \( k = \hat g\, s_2/s_3 \), which is essentially the mediator→outcome link's signal-to-noise ratio: a mediator whose connection to sales is sharply estimated relative to the outcome's residual noise is harder to explain away, and one whose connection is weak can be erased by a small confounder. That is a real robustness ordering, and it is not the ordering that "proportion mediated" reports. And because \( \rho^{*} \) is computable from quantities the fit already produces, there is no excuse for a mediation table that does not carry it.

What You Can Actually Have

Four things are available to a program that wants funnel answers and is unwilling to buy them with an invisible assumption.

Randomize the mediator. The natural direct and indirect effects are cross-world and unreachable. The controlled direct effect, meaning the effect of media with the mediator held at a fixed level for everyone, is identified whenever you can intervene on the mediator. In media you sometimes can. Turning off bids on your own branded terms in a randomized set of geos holds the paid-branded-search pathway at zero while upper-funnel media keeps running, and the difference in the upper-funnel channel's measured effect between bid-on and bid-off geos is a controlled direct effect contrast, estimated from two randomizations exactly as Robins and Greenland's escape route requires. It answers a narrower question than the Sankey does, one pathway at one level. And it answers it.

Use randomized interventional analogues. Sometimes the mediator cannot be intervened on. In other cases a mediator–outcome confounder is itself affected by media, and branded search volume is a textbook instance of that, since media moves it and it predicts sales. Either way, the natural effects are not identified at all. VanderWeele, Vansteelandt and Robins (2014) give three decompositions that stay identifiable in the presence of an exposure-induced mediator–outcome confounder. The most-used of them replaces "hold the mediator at the value it would have had" with "draw the mediator from its untreated distribution." They answer a slightly different question. Naming which question you answered is the whole of the discipline here.

Model the shared confounder, and be honest that this is a swap. The structural mediator block in this framework supports a shared latent factor that loads on both the mediator equation and the outcome equation. The design note is explicit that the demand factor is "deliberately shared (consideration and sales): a common-cause trend entering only the outcome would leave the mediator equation confounded." That is the right structure. It relocates the assumption rather than identifying the split: you now assume the modeled factor is the only mediator–outcome confounder, and the factor itself is only identified because the configuration requires it to enter at least one measured mediator equation. A better assumption, still an assumption.

Watch for variables that change graph position between questions. Chen and colleagues (2018) derive the canonical bias correction for paid search in MMM: search query volume proxies latent demand, ad targeting responds to it, and the back-door criterion says adjust for it. That is right for paid search. In the very same model, though, branded search volume is a mediator of TV. (That second observation is mine, not theirs.) One measured series, a confounder for one channel and a post-treatment variable for another, and the adjustment that de-biases the first is precisely the over-adjustment that annihilates the second's mediated path. No single control set is correct for both estimands. There are two analyses. The same tension appears whenever a downstream metric is asked to stand in for the outcome, which is why surrogate outcomes carry a full-mediation assumption of exactly this kind.

What This Framework Ships, and What It Owes You

This library holds two positions that are hard to reconcile, and the gap between them is the honest summary of the industry's state.

On one side, it treats mediator misuse as a correctness bug. CausalControlRole.MEDIATOR is documented as a variable that "lies on the causal path media → ... → KPI (post-treatment)" and that "must not be used as a control for a total-effect estimate," and the enum's docstring states that mediators and colliders "are refused at model-construction time." The refusal is real: model construction raises a ValueError rather than fitting, and the method's own docstring gives the reason: "a silently-conditioned mediator produces a confidently wrong number." The type system enforces that advice rather than merely recommending it.

On the other side, the moment you promote that same variable from control to mediator, every guard disappears. StructuralNestedMMM.get_mediation_effects() returns a per-channel proportion_mediated, and get_pathway_effects() returns per-pathway strengths. The reporting layer carries the column through reporting/helpers/mediated.py, the extended results dataclass, and the interactive report's Sankey. Nothing in that chain asks about \( \rho \). Nothing benchmarks a demand confounder, and nothing refuses to render.

To be fair to the code, the assumption is documented where a careful reader will find it. The README states plainly that the decomposition "is identified under the standard mediation assumptions (sequential ignorability), which require that there are no unmeasured confounders of (1) media–mediator, (2) mediator–outcome, or (3) media–outcome relationships." The causal-elicitation protocol lists sequential ignorability among the seven assumptions its gates are organized around.

The gap is between naming and testing. The elicitation stage tagged with sequential ignorability runs validate_causal_identification, which checks the back-door criterion and additionally reports front-door identification when the DAG declares mediators. Both are checks on the media–to–KPI effect: the back door asks whether the total effect is confounded, and the front door, when its conditions hold, identifies the total effect through the mediator. Neither says anything about the direct/indirect split, and a graphical criterion computed on a DAG cannot rule out an unmeasured node the DAG does not contain. Likewise validation/sensitivity_unobserved.py computes a robustness value per channel: how strong an unobserved confounder of spend and sales would have to be. There is no analogue for the mediator.

So the specification this post is really writing is small and mechanical. Every table that emits proportion_mediated should emit \( \rho^{*} \) beside it, rendered in the residual-variance units above, because \( \rho^{*} \) is a closed-form function of quantities the fit already has. The renderer should stop clipping and draw an out-of-range value as out of range. And the mediation section should report a funnel interval over a defensible \( \rho \) range rather than a point at \( \rho = 0 \). A Bayesian model already carries the machinery to put a prior on \( \rho \) instead of a point mass at zero, and a prior is a strictly better description of what anyone believes.

What This Does Not Establish

This post does not establish that any particular funnel number is wrong. Non-identification is symmetric: the reported 87% is as consistent with the data as the 50% and the 0%, and if your category has no unmodeled demand cycle at all then \( \rho \approx 0 \) and the naive read is correct. The argument is that the deck cites evidence (a randomized lift) that does not bear on the question, and that the assumption doing the actual work is currently invisible.

It also does not establish that mediation modeling is a mistake. Recovering a channel's total effect through an explicitly modeled mediator is strictly better than conditioning the mediator away, and that remains this framework's position. The critique is scoped to the split.

Two limits bound the recommended fix. First, the \( \rho \) sensitivity analysis is derived within a linear structural equation model. The framework's structural mediators run through sigmoid and cumulative-logit links, where the mapping from \( \rho \) to the decomposition is no longer the closed form in the deep dive, and the honest implementation would compute the curve by re-fitting under fixed error correlations rather than by formula. Second, \( \rho \) parameterizes a single scalar confounder acting linearly on both equations. A confounder that interacts with media, or a post-treatment confounder of the kind VanderWeele and colleagues address, is not fully captured by it. A \( \rho \) column is a large improvement over an invisible zero and it is not a proof of anything.

The Deliverable

The practical posture follows from separating the two columns. Report the total effect with its experimental anchor and the full confidence it has earned. Report the funnel as a conditional statement: "under the assumption of no unmeasured mediator–outcome confounding, awareness carries 87% of TV's effect. A demand factor explaining 22% of residual variance in both equations would take that to 50%, and 47% would take it to zero." Then let the audience decide whether a demand factor that size exists in their category. If it obviously does, you have learned that the funnel is not knowable from this data, and the next dollar of measurement budget belongs to a branded-search bid-off test, not another model refinement.

And when someone asks why the mediation percentages moved between quarters, start somewhere other than the media plan. Ask whether the total effect moved, or only its denominator.

Takeaways

  • Randomizing media identifies the total effect and never the funnel split. Robins and Greenland (1992): direct and indirect effects are not separately identifiable when only exposure is randomized. Separating them takes two randomizations, not one.
  • The split is licensed by sequential ignorability (no unmeasured mediator–outcome confounding), which a shared demand cycle violates by construction. This repository's own structural-model spec names it: demand → consideration and demand → sales is a back-door through the mediator.
  • The inversion: the funnel chart is less identified than the total-effect number printed above it, despite reading as the more mechanistic object. A residual correlation of 0.22 moves a worked example from 87% mediated to 50%. A correlation of 0.47 takes it to zero, with the fit unchanged at every point.
  • "Proportion mediated" is not a proportion. It is a ratio of signed effects with a pole where the total effect crosses zero, it exceeds 1 and goes negative under suppression, it is invariant to rescaling the mediator but not to recoding it, and "direct" is a residual defined by which mediators you measured. This framework's interactive report clips it to [0, 1] in one of its two code paths to make the Sankey drawable.
  • Price the assumption. Report \( \rho^{*} = k/\sqrt{1+k^{2}} \), the residual correlation that zeroes the mediated path, in benchmarkable units (\( \rho = \pm\sqrt{R^{2*}_M R^{2*}_Y} \)), next to every mediation number.
  • What you can actually buy: a controlled direct effect by randomizing the mediator (bid your branded terms off in half the geos), randomized interventional analogues when a mediator–outcome confounder is media-induced, and a modeled shared demand factor, which swaps the assumption for a better one rather than removing it.

References