Tae Hyun Kim (Lowell)
← All projects
Causal InferenceDecision-Making under Uncertainty

Causal Multi-Touch Attribution

A simulation study unifying Incremental·Shapley channel credit and a path-level decomposition on a single Inhomogeneous Poisson Process — answering channel budget, journey design, and population causal effect under one efficiency identity (18-method benchmark, ground-truth MAE 0.016,

2026 · Solo · end-to-end (DGP → model → evaluation·decisions)
PythonstatsmodelsNumPy/pandasPoisson GLM (IPP)Shapleymatplotlib
Try it yourself — 2 demos that make the result tangible

⏱️ TL;DR (30 seconds)

A credit layer and a path layer on a single Inhomogeneous Poisson Process, unifying channel budget, journey design, and population effect under one efficiency identity A credit layer and a path layer sit on a single Inhomogeneous Poisson Process (backbone), unifying channel budget · journey design · population effect under one efficiency identity (0.00% rel. error) — the core thesis of this work.


🎯 Key Results at a Glance

MetricValueNotes
Channel-credit errorMAE 0.016#1 of 18 methods (vs ground truth)
Budget-allocation accuracyMAE 0.019#2 (Du Incremental Shapley is #1 at 0.013)
Efficiency identity0.00% rel. errorchannel·journey·population views agree
Bootstrap stabilitymean CV 0.13its peers Incremental·Total Shapley sit at 0.60·0.99
Ranking agreementKendall τ = 0.905robust agreement with the GT ranking
Two estimandsConditional MAE 0.012 · Marginal MAE 0.020retrospective audit / forward, A/B-aligned
Data100K users · 7 channels · ~2.3% conversionsynthetic DGP (with ground truth)

All numbers are against simulation ground truthillustrative values produced by a synthetic DGP; real data has no ground truth (see Limitations).

🔬 The two experiments that matter most

The method’s two outputs, and the two experiments I consider most important here.

① Incremental vs Total — why “incremental” is non-negotiable. Raising the base conversion rate from ~3% to ~20%, I overlay two ground truths (GT_A = “who was present in the conversions”, the conditional / audit truth · GT_B = “what’s lost if you remove a channel”, the incremental / marginal truth an A/B test measures) and three operators (Incremental · Total · BackElim). The two truths share a ranking but differ in size (Paid Search GT_A 0.315 > GT_B 0.299; Display GT_B 0.084 > GT_A 0.061). Total Shapley credits the baseline too, so as the base rate rises it collapses upper-funnel (Display·Social) to zero and over-credits Paid Search beyond both truths. Incremental Shapley subtracts the baseline and stays inside the two-truth band — stable at any base rate.

In high-baseline businesses (subscription renewals, brand), using Total Shapley over-invests budget in Paid Search — not the real value driver. This is why incremental is required, not optional.

Two ground truths (GT_A conditional, GT_B incremental) vs three operators by base rate — Incremental stays in the truth band, Total collapses upper-funnel to zero Five bars: two ground truths — GT_A (gray, conditional) · GT_B (green, incremental; both black-edged) — and three operators. Incremental (pink) stays inside the two-truth band, while Total (blue) departs from both — over-crediting Paid Search (high base 0.400 vs GT ~0.29) and collapsing Display·Social to 0 (GT 0.080·0.059 → Total 0.00). BackElim (orange) over-concentrates on the last touch. — why the real incremental credit matters.

② Multi-path — scoring journeys, not channels. The same IPP is decomposed by journey template (ordered channel tuple) instead of by channel. Of 1,786 templates, a count ≥ 5 filter keeps 35 robust templates (covering 15.5% of converters) as reproducible campaign candidates. Top by total contribution (Email→Paid Search, …) = “what drives revenue now”; top by mean Δ (rare 3-step journeys) = “design candidates”.

“Which channel to fund” (budget) and “which journey to amplify” (campaign design) are usually separate analyses — here they come from the same efficiency identity, so the two decisions never contradict.

Multi-path contribution — Top-K of 35 robust journeys The 35 robust journeys ranked by path-level Incremental Shapley. (Left) total contribution = current revenue mainstays (short, frequent 2-step); (Right) mean Δ = design candidates (rare but strong 3-step). Color = journey length.

🧱 Method — three layers on a single IPP

The spine is three layers stacked on a single fitted Inhomogeneous Poisson Process (IPP). Fit the model once, then derive channel credit, journey decomposition, and population effect as the same game.

The three views are tied by one efficiency identity — verified at 0.00% relative error:

pathsΔpathjourney design  =  cϕcchannel budget  =  Eu[Δu]population effect  =  6.99×102\underbrace{\textstyle\sum_{\text{paths}} \Delta_{\text{path}}}_{\text{journey design}} \;=\; \underbrace{\textstyle\sum_{c} \phi_c}_{\text{channel budget}} \;=\; \underbrace{\mathbb{E}_u[\Delta_u]}_{\text{population effect}} \;=\; 6.99\times 10^{-2}

Per-channel decay curves learned by the IPP — Paid Search decays fast, Display slow The per-channel decay (β, log-intensity contribution) the IPP learns from data. Paid Search peaks at 0–1 day then drops (effective lifetime ~1 day); Display persists to two weeks — time structure estimated directly, no lookback window assumed.

Derivations (intensity·credit·estimand) and the full 11-experiment gallery are deferred to the GitHub repository and Methodology_05 — this page keeps the core narrative only.

📊 Impact — honest results

I evaluated 18 methods against ground truth (the known DGP parameters). The main method leads on the combination of accuracy, stability, and decision quality — not on any single metric.

MethodChannel MAE ↓Kendall τ ↑Allocation MAE ↓Bootstrap mean CV ↓Family
Survival/Poisson (Shapley)0.016 (#1)0.9050.019 (#2)0.13Causal (incremental)
Incremental Shapley (Du)0.0290.9050.013 (#1)0.60 ⚠️Causal (incremental)
CAMTA (Causal Attention)0.0230.9050.0360.10Causal DL
Shapley (model-based, Total)0.0350.9050.117 ⚠️0.99 ⚠️Game-theoretic
Last Click0.0380.8100.0540.31Rule-based
DML / IPW0.050 / 0.0740.524 / 0.3330.045 / 0.0900.93 / 0.66Causal (debiased)
Transformer (2L/2H)0.100 ❌−0.333 ❌0.59Deep Learning
First Click0.158 ❌−0.293 ❌0.14Rule-based

(Source: results/part1/{01_method_accuracy,07_budget_optimization,10_bootstrap_stability}.csv. Bootstrap CV = method-level mean of per-channel CV. means that exact variant was not bootstrapped.)

Four things to state honestly.

  1. “Best” — precisely. Survival/Poisson Shapley is a rare method that is #1 on error (0.016) and low in variance (mean CV 0.13). Its high-accuracy peers Incremental (0.60) and Total Shapley (0.99) are volatile, while the most stable method, Markov (~0.04), is inaccurate. So it leads on the combination, not on any single axis (CAMTA, at 0.023/0.10, is a close rival).
  2. Causal ≠ automatic win. Debiased estimators (DML 0.050, IPW 0.074) do not beat the best rule-based method (Last Click 0.038) under this DGP — confounding is moderate, so heavy debiasing yields no gain. The edge comes from the IPP + incremental modeling itself, not propensity correction.
  3. Total Shapley = a fragile winner. Its channel MAE (0.035) looks fine, but allocation MAE 0.117 and a mean CV of 0.99 (nearly the worst) make it unstable.
  4. The best rule-based is surprisingly competitive. Last Click’s MAE (0.038) isn’t bad. The real advantage of causal methods is satisfying ranking, allocation, and stability together and yielding interpretable outputs (decay curves, synergy, incremental vs total).

Accuracy (MAE) × ranking agreement (Kendall τ) landscape across 18 methods Ground-truth error (MAE, ↓ better) vs ranking agreement (Kendall τ, ↑ better). Causal / incremental methods (top-left) separate cleanly from heuristic / predict-only ones (bottom-right, negative τ).

🏭 How it’s used in practice — “Effect ≠ Efficiency”

The highest-effect channel can be the worst per-dollar. Attribution becomes an allocation decision only once combined with the cost structure.

ChannelEffect (β)Effect rankCost / touchEfficiency (conv/$)GT optimal budget
Paid Search1.2#1$2.50 (CPC)0.19 (last)0.09% ($181)
Email0.8#2$0.003152.7 (#1)73.7% ($147,345)
Social0.4#6$0.008 (CPM)16.17.8% ($15,505)
Display0.3#7$0.005 (CPM)38.318.5% ($36,969)

(Source: ground_truth.json — total budget $200K, revenue/conversion $100. Effect rank is over all 7 channels’ β; the table excerpts the 4 paid channels. Synthetic DGP values — illustrative.)

Per-method budget allocation vs ground-truth optimum — Effect ≠ Efficiency Paid Search ranks #1 on effect but, with an expensive CPC, its optimal budget is 0.09%; the true value driver is Email (73.7%). Incremental Shapley and Survival/Poisson Shapley land closest to the GT optimum.

Journey design — two lenses (a campaign question, not a budget one). Path-level Incremental Shapley reads the 35 robust templates (15.5% of converters) from two angles, turning them into an actionable playbook:

LensTop templates (observed)Action
Current revenue mainstays (total contribution)Email→Paid Search (n=37) · Direct→Paid Search (n=24)Defend·amplify — hold budget, strengthen bids
Design candidates (mean Δ per user)Direct→Paid Search→Paid Search (n=5) · Email→Email→Paid Search (n=5)Test·scale — design a nurture sequence via A/B

Budget defends the mainstays while experiment budget grows the high-Δ rare paths — and since both come from the same efficiency identity, they never contradict.

Why this upgrade fits industry (the managerial case). This isn’t a model flourish — it’s a change that de-risks budget decisions:

Ultimately these outputs map onto four decisions — budget reallocation · journey design · decision rule (past = Conditional, future = Marginal) · uncertainty (bootstrap CI gate). The point: one fitted IPP answers all four.

⚠️ Limitations — honest scoping


All numbers are the canonical values from committed artifacts (results/part1/*.csv, ground_truth.json), against simulation ground truth and thus illustrative. Failures / weak results (First Click·Transformer negative τ, debiased non-superiority, Total Shapley fragility, Markov-DGP collapse) are reported as they are. Derivations, the 11-experiment gallery, and Quick Start are in the GitHub repository and the Methodology docs.

Try it yourself 1

Effect ≠ Efficiency: where does the budget go?

Each channel shows only its effect (β). Allocate your budget chips and run — the hidden efficiency (conversions/$) is then revealed.

chips used
0 / 10 · remaining 10
  • Paid Search $2.50 / touch
    effect β 1.2
    efficiency (conv/$) ?
    0 chips
  • Email $0.003 / touch
    effect β 0.8
    efficiency (conv/$) ?
    0 chips
  • Display $0.005 / touch
    effect β 0.3
    efficiency (conv/$) ?
    0 chips
  • Social $0.008 / touch
    effect β 0.4
    efficiency (conv/$) ?
    0 chips

Try it yourself 2

Total vs Incremental: which credit do you trust?

Pick your business's base conversion rate, then choose the attribution method you'd budget with. On reveal, each method's channel credit is laid side-by-side against the ground truth.

natural conversion rate (base)
your business's natural conversion rate
attribution method

Artifacts