Math for Causal Inference

Day 32. SUTVA & Interference

When one unit's treatment affects another's outcome, or the "treatment" comes in several versions. How to spot it, define new estimands, and design around it.

Video coming soon
Learning outcomes
  • ●State the two parts of SUTVA and recognise violations in economic and health settings.
  • ●Define direct, spillover and total effects using an exposure mapping.
  • ●Show how spillovers onto controls bias a simple difference in means.
  • ●Explain why saturation (two-stage) designs identify spillovers.
2-HOUR SESSION PLAN
Theory 25′Warm-up (1–5) 20′Proofs (6–10) 35′Applied (11–15) 25′Python & Lab 15′
Colab notebook (.ipynb) Jump to the simulator

Theory

The stable unit treatment value assumption

Writing Yi(1)Y_i(1) and Yi(0)Y_i(0) quietly assumed two things, together called SUTVA (Rubin 1980):

  1. No interference: unit ii's outcome depends only on its own treatment, not on who else is treated.
  2. No hidden versions (consistency): there is only one version of each treatment level, so Yi=Yi(Ti)Y_i = Y_i(T_i).

Without (1), unit ii has a potential outcome for every assignment vector t=(t1,…,tn)\mathbf t = (t_1, \dots, t_n): 2n2^n of them. Nothing can be learned without some structure.

Where interference comes from

MechanismExample
Contagionvaccination protects the unvaccinated (herd immunity); deworming cuts reinfection
Informationfarmers copy treated neighbours' techniques
Competition / displacementjob-search assistance helps treated jobseekers take jobs controls would have got
Prices (general equilibrium)cash transfers raise local prices, affecting non-recipients

Partial interference and exposure mappings

A common, testable structure: units interact within groups (villages, schools, markets) but not across them, and only through the share of their group that is treated. Then

Yig=Yig(tig, sg),sg=saturation (share treated in group g).Y_{ig} = Y_{ig}(t_{ig},\, s_g), \qquad s_g = \text{saturation (share treated in group } g).

Effects at saturation ss (averages over units):

  • Direct effect: DE(s)=E[Y(1,s)−Y(0,s)]\text{DE}(s) = E[Y(1, s) - Y(0, s)] (own treatment, holding others' fixed).
  • Spillover (indirect) effect: SE(s)=E[Y(0,s)−Y(0,0)]\text{SE}(s) = E[Y(0, s) - Y(0, 0)] (on the untreated, of others being treated).
  • Total effect: E[Y(1,s)−Y(0,0)]=DE(s)+SE(s)E[Y(1, s) - Y(0, 0)] = \text{DE}(s) + \text{SE}(s).

Designs

  • Cluster randomisation (Day 40) puts the whole group in one arm, so spillovers stay inside: estimates the total policy effect.
  • Saturation (two-stage) designs first randomise groups to saturations (0%, 50%, 100%…), then individuals within groups (Hudgens & Halloran 2008; Baird et al. 2018). Comparing untreated units in treated groups with pure controls identifies spillovers.

Part 1 · Warm-up

Exercise 1 · How many potential outcomes?

A village has 3 farmers. Without SUTVA, how many potential outcomes does each farmer have? With SUTVA?

Show solution

Step 1. Without no-interference, each farmer's yield can depend on all three treatments: 23=82^3 = 8 assignment vectors.

Step 2. With SUTVA, only own treatment matters: 2.

Answer: 8 versus 2. With 1,000 farmers it would be 210002^{1000} versus 2, which is why structure is essential.

Exercise 2 · Spot the violation

For each case, say whether SUTVA fails and which part: (a) a measles vaccine; (b) a training programme run by two NGOs of different quality; (c) fertiliser applied to a farmer's own field.

Show solution

Step 1. (a) Vaccinating others lowers my infection risk: interference.

Step 2. (b) "Training" is really two treatments: hidden versions.

Step 3. (c) Fertiliser on my plot affects my yield only (unless it runs off into neighbours' fields): SUTVA is plausible.

Exercise 3 · An exposure mapping

In a village of 10 households, 4 are treated, including household ii. What are ii's own treatment and the share of other households treated?

Show solution

Step 1. Own treatment ti=1t_i = 1.

Step 2. Other treated households: 4−1=34 - 1 = 3 of the other 9: share 3/9=1/33/9 = 1/3.

Answer: exposure (1,1/3)(1, 1/3).

Exercise 4 · Direct effect

At 50% saturation, treated households average 120 (consumption, $/month) and untreated households in the same villages average 100. What is the direct effect at s=0.5s = 0.5?

Show solution

Step 1. DE(0.5)=E[Y(1,0.5)]−E[Y(0,0.5)]\text{DE}(0.5) = E[Y(1, 0.5)] - E[Y(0, 0.5)], both measured in the same villages.

Step 2. 120−100=20120 - 100 = 20.

Answer: $20/month (assuming individuals were randomised within villages).

Exercise 5 · Spillover effect

Untreated households in pure-control villages average 92. With Exercise 4, compute the spillover and total effects.

Show solution

Step 1. Spillover =E[Y(0,0.5)]−E[Y(0,0)]=100−92=8= E[Y(0, 0.5)] - E[Y(0, 0)] = 100 - 92 = 8.

Step 2. Total =E[Y(1,0.5)]−E[Y(0,0)]=120−92=28=20+8= E[Y(1, 0.5)] - E[Y(0, 0)] = 120 - 92 = 28 = 20 + 8.

Answer: spillover $8, total $28.

Part 2 · Proofs

Exercise 6 · SUTVA collapses the outcomes

Show that under no interference Yi(t)=Yi(ti)Y_i(\mathbf t) = Y_i(t_i), and that consistency then gives Yi=TiYi(1)+(1−Ti)Yi(0)Y_i = T_iY_i(1) + (1 - T_i)Y_i(0).

Show solution

Step 1. No interference says Yi(t)=Yi(t′)Y_i(\mathbf t) = Y_i(\mathbf t') whenever ti=ti′t_i = t'_i, so Yi(t)Y_i(\mathbf t) depends on t\mathbf t only through tit_i: write it Yi(ti)Y_i(t_i).

Step 2. Consistency says the observed outcome equals the potential outcome of the treatment received: Yi=Yi(Ti)Y_i = Y_i(T_i).

Step 3. If Ti=1T_i = 1, Yi=Yi(1)Y_i = Y_i(1); if Ti=0T_i = 0, Yi=Yi(0)Y_i = Y_i(0). Both cases are TiYi(1)+(1−Ti)Yi(0)T_iY_i(1) + (1 - T_i)Y_i(0). ■\blacksquare

Exercise 7 · Within-group randomisation identifies the direct effect

Assume partial interference with exposure (t,s)(t, s). In groups assigned saturation ss, individuals are treated completely at random. Show E[Y∣T=1,s]−E[Y∣T=0,s]=DE(s)E[Y \mid T = 1, s] - E[Y \mid T = 0, s] = \text{DE}(s).

Show solution

Step 1. In a saturation-ss group, every unit has exposure (Ti,s)(T_i, s), so Yi=Yi(Ti,s)Y_i = Y_i(T_i, s).

Step 2. Within those groups, TiT_i is randomised, so it is independent of (Yi(1,s),Yi(0,s))(Y_i(1, s), Y_i(0, s)).

Step 3. Hence E[Y∣T=1,s]=E[Y(1,s)]E[Y \mid T = 1, s] = E[Y(1, s)] and E[Y∣T=0,s]=E[Y(0,s)]E[Y \mid T = 0, s] = E[Y(0, s)] (Day 6, Exercise 14).

Step 4. The difference is DE(s)\text{DE}(s). ■\blacksquare

Exercise 8 · Total = direct + spillover

Prove E[Y(1,s)−Y(0,0)]=DE(s)+SE(s)E[Y(1, s) - Y(0, 0)] = \text{DE}(s) + \text{SE}(s).

Show solution

Step 1. Add and subtract Y(0,s)Y(0, s): Y(1,s)−Y(0,0)=[Y(1,s)−Y(0,s)]+[Y(0,s)−Y(0,0)]Y(1, s) - Y(0, 0) = [Y(1, s) - Y(0, s)] + [Y(0, s) - Y(0, 0)].

Step 2. Take expectations (linearity): DE(s)+SE(s)\text{DE}(s) + \text{SE}(s). ■\blacksquare

Exercise 9 · Contaminated controls

Individuals are randomised within every village at saturation ss, and the analyst treats the within-village difference in means as "the effect". Show it equals the total effect minus the spillover on controls.

Show solution

Step 1. By Exercise 7 the comparison estimates E[Y(1,s)]−E[Y(0,s)]E[Y(1, s)] - E[Y(0, s)].

Step 2. Rewrite using Exercise 8: E[Y(1,s)]−E[Y(0,s)]=E[Y(1,s)−Y(0,0)]⏟total−E[Y(0,s)−Y(0,0)]⏟spillover on controlsE[Y(1, s)] - E[Y(0, s)] = \underbrace{E[Y(1, s) - Y(0, 0)]}_{\text{total}} - \underbrace{E[Y(0, s) - Y(0, 0)]}_{\text{spillover on controls}}.

Answer: positive spillovers (herd immunity) make the within-village comparison understate the policy's total benefit; negative spillovers (displacement) make it overstate it.

Exercise 10 · Hidden versions average out

A "treatment" has two versions, aa and bb, delivered with probabilities π\pi and 1−π1 - \pi independently of potential outcomes. Show the difference in means estimates π ATEa+(1−π) ATEb\pi\,\text{ATE}_a + (1 - \pi)\,\text{ATE}_b.

Show solution

Step 1. A treated unit's outcome is Yi(a)Y_i(a) with probability π\pi and Yi(b)Y_i(b) otherwise, so E[Y∣T=1]=πE[Y(a)]+(1−π)E[Y(b)]E[Y \mid T = 1] = \pi E[Y(a)] + (1 - \pi)E[Y(b)].

Step 2. E[Y∣T=0]=E[Y(0)]E[Y \mid T = 0] = E[Y(0)] by randomisation.

Step 3. Difference: π(E[Y(a)]−E[Y(0)])+(1−π)(E[Y(b)]−E[Y(0)])\pi(E[Y(a)] - E[Y(0)]) + (1 - \pi)(E[Y(b)] - E[Y(0)]). ■\blacksquare

The estimate is a mixture: it describes this blend of versions, not either version alone.

Part 3 · Applied

Exercise 11 · Deworming and reinfection

In a school deworming trial, infection rates are: treated pupils in treatment schools 0.20; untreated pupils in treatment schools 0.35; pupils in control schools 0.50. Compute the direct, spillover and total effects, and what a within-school comparison would report.

Show solution

Step 1. Direct effect (within treatment schools): 0.20−0.35=−0.150.20 - 0.35 = -0.15.

Step 2. Spillover on untreated pupils: 0.35−0.50=−0.150.35 - 0.50 = -0.15.

Step 3. Total effect for treated pupils: 0.20−0.50=−0.300.20 - 0.50 = -0.30.

Step 4. A within-school comparison reports the direct effect, −0.15.

Answer: the within-school comparison captures only half the benefit; deworming also protects untreated classmates. This was a central finding of Miguel & Kremer (2004).

Exercise 12 · Job-search assistance and displacement

Job-finding rates within 6 months: assisted jobseekers 0.40; unassisted jobseekers in labour markets where half were assisted 0.28; jobseekers in untreated markets 0.32. Compute the direct and spillover effects, and the net effect on the average jobseeker in a 50%-assisted market.

Show solution

Step 1. Direct effect: 0.40−0.28=0.120.40 - 0.28 = 0.12.

Step 2. Spillover on the unassisted: 0.28−0.32=−0.040.28 - 0.32 = -0.04 (they lose jobs to assisted competitors).

Step 3. Average job-finding in a 50%-assisted market: 0.5(0.40)+0.5(0.28)=0.340.5(0.40) + 0.5(0.28) = 0.34.

Step 4. Net effect versus untreated markets: 0.34−0.32=0.020.34 - 0.32 = 0.02.

Answer: the direct effect (12 points) vastly overstates the 2-point net gain: most of the "effect" is reshuffling who gets the jobs (as in Crépon et al., 2013).

Exercise 13 · Herd immunity

When 80% of a town is vaccinated, the infection risk of unvaccinated residents falls from 0.10 to 0.04. The vaccine reduces a vaccinated person's risk to 0.01 at that coverage. Compute the indirect and direct effects at 80% coverage.

Show solution

Step 1. Indirect (spillover) effect on the unvaccinated: 0.04−0.10=−0.060.04 - 0.10 = -0.06.

Step 2. Direct effect at 80% coverage: 0.01−0.04=−0.030.01 - 0.04 = -0.03.

Step 3. Total effect for a vaccinated person versus no programme: 0.01−0.10=−0.09=−0.03−0.060.01 - 0.10 = -0.09 = -0.03 - 0.06.

Answer: at high coverage, two-thirds of a vaccinated person's protection comes from others being vaccinated. A trial randomising individuals at low coverage would miss this.

Exercise 14 · Cash transfers and local prices

A large cash transfer to half the households in each village raises local food prices by 5%. Which SUTVA component fails, who is affected, and how should the experiment be designed?

Show solution

Step 1. No interference fails: non-recipients face higher prices, a (negative) spillover through markets.

Step 2. Recipients' measured gains are also net of the price rise.

Step 3. Design: randomise at the market (village or cluster-of-villages) level, ideally with varying saturations, and measure prices directly.

Answer: a within-village comparison mis-states welfare effects; market-level randomisation captures the general-equilibrium effect (as in Egger et al., 2022).

Exercise 15 · Two training providers

A national training programme is delivered by provider A (effect +$3,000) to 40% of trainees and provider B (effect +$1,000) to 60%, assigned independently of workers' potential earnings. What does the evaluation estimate, and what would scaling up through provider B alone deliver?

Show solution

Step 1. By Exercise 10: 0.4(3,000)+0.6(1,000)=1,200+600=1,8000.4(3{,}000) + 0.6(1{,}000) = 1{,}200 + 600 = 1{,}800.

Step 2. A scale-up through B only would deliver $1,000 per trainee.

Answer: the evaluation reports $1,800, which overstates the scale-up effect by 80%. Record which version each unit received; "the treatment" must match the policy being considered.

Verify in Python

import numpy as np

rng = np.random.default_rng(32)
G, m = 400, 20                                  # villages, households per village
sat = rng.choice([0.0, 0.5], G)                 # half the villages untreated, half 50% treated
DE, SPILL = 20.0, 8.0                           # direct effect and spillover at 50% saturation
rows = []
for g in range(G):
    T = np.zeros(m, bool)
    T[rng.choice(m, int(sat[g] * m), replace=False)] = True
    y = 92 + DE * T + SPILL * (sat[g] > 0) + rng.normal(0, 15, m)   # everyone in a treated village gets the spillover
    rows += [(sat[g], t, v) for t, v in zip(T, y)]
s, t, y = map(np.array, zip(*rows))
direct = y[(s == 0.5) & t].mean() - y[(s == 0.5) & ~t].mean()
spill = y[(s == 0.5) & ~t].mean() - y[s == 0].mean()
total = y[(s == 0.5) & t].mean() - y[s == 0].mean()
print(f"direct {direct:.1f} (truth 20), spillover {spill:.1f} (truth 8), total {total:.1f} (truth 28)")

# Job-search displacement (Exercise 12)
print("net effect in a 50% market:", round(0.5 * 0.40 + 0.5 * 0.28 - 0.32, 3))

Key takeaways

  • SUTVA = no interference + no hidden versions; without it, "the" effect is not even defined.
  • With spillovers, distinguish direct, spillover and total effects; within-group comparisons capture only the direct effect.
  • Saturation designs and cluster randomisation turn spillovers from a nuisance into an estimand.

Simulation Lab: Spillovers & Saturation

Open full screen →

Direct and spillover effects of deworming-style treatment; why within-village comparisons miss the total effect.

03467101134120.0Treated in treated villages100.0Untreated in treated villages92.0Pure control villages
within-village comparison
20.0
= direct effect
spillover on the untreated
8.0
total effect on the treated
28.0
direct + spillover
average effect per household
18.0
treated villages vs pure control

Spillovers scale with the share of the village treated (here: spillover = slider value × saturation / 0.5). A within-village comparison captures only the direct effect; pure control villages are needed to see spillovers and the policy's total effect.

Day 31Day 33