Pearl 2014 - Appendix Derivations of Transport Formulas

Summary

The Appendix derives, line by line, the transport formulas (5.9) for Fig. 6(d) and (5.10) for Fig. 7, justifying each step by a condition of Theorem 3 or a do-calculus rule. The pattern is always: condition on the S-admissible set, peel -terms off using Rule 1 or 3, and finally replace -conditioned terms with starred (target) distributions.

Overview

Both derivations start from (for Fig. 7 with two selection variables, and ). Read the result as a recipe for what to measure where: factors containing a are estimated in the source experiment; factors containing only observed variables and the -node become starred factors estimated from the target’s observational data.

The PDF text of the appendix is two-column and garbled in places; the justification annotations below follow the paper’s printed order. The exact graph structure of Figs. 6(d) and 7 is drawn in the original; the roles of the variables below are inferred from the final formulas (so treat the role descriptions as a reading aid, not as a transcription of the figure).

Main Content

Derivation of (5.9), Fig. 6(d)

Variables: treatment, outcome, an S-admissible set, a set that separates from . Selection node .

Resulting formula (5.9)

Estimable pieces: and from the experiment on ; from observations on .

Derivation of (5.10), Fig. 7 (two selection nodes )

Reading from the final formula: is S-admissible, separates from , and is a set that is S’-affected and S-admissible for the effect on .

Resulting formula (5.10)

Measurement plan stated by the authors: variables and (present in Fig. 7) need not be measured; -specific causal effects need not be estimated in the experiment; only and are needed from the target.

Reading the derivation pattern

Step typeToolEffect on
Condition on (or , )law of total probabilitynone
Drop from a -termRule 1 + S-admissibilityremoves from the experimental factor so it can come from
Drop from a non- termRule 3 or ""converts the factor to observational form: stays as conditioning
Final replacementdefinition of the -node ()the factor becomes a target distribution

This is exactly Theorem 1’s criterion: ends up only as a conditioning variable in -free terms.

Python: Monte Carlo check of (5.9) on a toy chain

Model: latent , ; ; , so only the mechanism differs in the target. Experimental pieces and are estimated from simulated source experiments; from simulated target observational data; the answer is compared with the target ground truth (simulating in the target) and with naively reusing the source effect.

import numpy as np
rng = np.random.default_rng(0)
N = 400_000
def draw(n, tgt, do_x=None):
    u = rng.random(n) < .5                                  # latent confounder of X and W,Y? (here U->X, U->Y)
    x = (rng.random(n) < np.where(u, .7, .3)).astype(int) if do_x is None else np.full(n, do_x)
    w = (rng.random(n) < .2 + .5*x).astype(int)              # X -> W (shared mechanism)
    pz = (.5 + .3*w) if tgt else (.1 + .2*w)                 # W -> Z ; S -> Z changes this mechanism
    z = (rng.random(n) < pz).astype(int)
    y = (rng.random(n) < .2 + .5*z + .1*u).astype(int)       # Z -> Y (+ confounding by U), shared
    return x, w, z, y
# --- source experiment: estimate P(y|do(x),z) and P(w|do(x))
est_y = {}; est_w = {}
for x in (0, 1):
    _, w, z, y = draw(N, tgt=False, do_x=x)
    est_w[x] = w.mean()
    for zz in (0, 1): est_y[(x, zz)] = y[z == zz].mean()
# --- target observational data: estimate P*(z|w)
x, w, z, y = draw(N, tgt=True)
est_z = {ww: z[w == ww].mean() for ww in (0, 1)}             # P*(Z=1|w)
def eq59(x):
    tot = 0
    for zz in (0, 1):
        for ww in (0, 1):
            pw = est_w[x] if ww else 1-est_w[x]
            pz = est_z[ww] if zz else 1-est_z[ww]
            tot += est_y[(x, zz)] * pz * pw
    return tot
# --- target ground truth by simulating do(x) in the target
truth = {x: draw(N, tgt=True, do_x=x)[3].mean() for x in (0, 1)}
naive = {x: draw(N, tgt=False, do_x=x)[3].mean() for x in (0, 1)}
print("effect truth  :", round(truth[1]-truth[0], 3))
print("effect Eq 5.9 :", round(eq59(1)-eq59(0), 3))
print("effect naive  :", round(naive[1]-naive[0], 3))

Output (seed 0, ): truth , Eq. 5.9 , naive source effect . The formula recovers the target effect from source experiments plus target observations; carrying the source effect over understates it.

Examples

Measurement plan in a marketing rollout

Suppose a retailer ran a geo test on paid social () with intermediate metric = site visits and = add-to-cart rate, outcome = purchases. If the new market differs only in how visits convert to add-to-cart (the story of Fig. 6d), (5.9) says: take and from the test, but measure from the new market’s observational funnel data. No new experiment needed. See Pearl 2014 - Marketing Application Transporting Geo and Lift Results.

Connections

See Also