Math for Causal Inference

Day 76. Fuzzy RD as Local IV

When crossing the cutoff raises the probability of treatment without determining it, the discontinuity becomes an instrument. The ratio of the jump in outcomes to the jump in take-up identifies a local average effect for compliers at the cutoff, and is estimated by 2SLS within a bandwidth.

Video coming soon
Learning outcomes
  • ●Define the fuzzy RD estimand as a ratio of two jumps.
  • ●Prove that it equals the average effect for compliers at the cutoff under continuity and monotonicity.
  • ●Implement fuzzy RD as 2SLS with the same bandwidth and controls in both stages.
  • ●Apply it to class size, insurance at 65 and scholarship take-up, with attention to weak first stages.
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

Fuzzy designs

In a fuzzy RD, crossing the cutoff changes the probability of treatment by less than one:

lim⁡x↓cP(D=1∣X=x)−lim⁡x↑cP(D=1∣X=x)=π∈(0,1).\lim_{x \downarrow c}P(D = 1 \mid X = x) - \lim_{x \uparrow c}P(D = 1 \mid X = x) = \pi \in (0, 1).

Examples: eligibility rules with imperfect take-up, guidelines that doctors sometimes override, class-size caps that schools partly ignore.

Estimand

τFRD=lim⁡x↓cE[Y∣X=x]−lim⁡x↑cE[Y∣X=x]lim⁡x↓cE[D∣X=x]−lim⁡x↑cE[D∣X=x].\tau_{FRD} = \frac{\lim_{x \downarrow c}E[Y \mid X = x] - \lim_{x \uparrow c}E[Y \mid X = x]}{\lim_{x \downarrow c}E[D \mid X = x] - \lim_{x \uparrow c}E[D \mid X = x]}.

It is a Wald estimator (Day 62) using Z=1[X≥c]Z = \mathbf 1[X \ge c] as the instrument, evaluated at the cutoff. A sharp RD is the special case π=1\pi = 1.

Interpretation (Hahn, Todd and van der Klaauw)

Let D(x′)D(x') denote treatment if the cutoff rule were set as if the unit's running variable were x′x', with types defined at the cutoff. Under continuity of potential outcomes and type shares in xx, monotonicity (crossing the cutoff never discourages treatment) and exclusion (the cutoff affects YY only through DD),

τFRD=E[Y(1)−Y(0)∣complier,X=c].\tau_{FRD} = E[Y(1) - Y(0) \mid \text{complier}, X = c].

It is doubly local: compliers, and at the cutoff.

Estimation

Within bandwidth hh (kernel-weighted), run 2SLS:

  • First stage: Di=γ0+πZi+γ1(Xi−c)+γ2Zi(Xi−c)+viD_i = \gamma_0 + \pi Z_i + \gamma_1(X_i - c) + \gamma_2 Z_i(X_i - c) + v_i.
  • Second stage: Yi=α0+τDi+α1(Xi−c)+α2Zi(Xi−c)+εiY_i = \alpha_0 + \tau D_i + \alpha_1(X_i - c) + \alpha_2 Z_i(X_i - c) + \varepsilon_i.

With the same bandwidth, kernel and controls in both stages, τ^\hat\tau equals the ratio of the two local linear jumps. Bandwidths are chosen for the ratio (or for the reduced form), and RBC inference extends to the ratio.

Practical points

Always plot the first stage. A small jump in take-up is a weak instrument (Day 65): report the reduced form and weak-instrument-robust intervals.

Part 1 · Warm-up

Exercise 1 · A ratio of jumps

The outcome jumps by 6 at the cutoff and the treatment probability by 0.4. Estimate the fuzzy RD effect.

Show solution

Step 1. τ^=6/0.4=15\hat\tau = 6/0.4 = 15.

Exercise 2 · Types at the cutoff

At a scholarship cutoff, take-up approaches 0.15 from below and 0.70 from above. Under monotonicity, what are the shares of always-takers, never-takers and compliers among students at the cutoff?

Show solution

Step 1. Always-takers (funded anyway below the cutoff): 0.15.

Step 2. Never-takers (not taking it even when eligible): 1−0.70=0.301 - 0.70 = 0.30.

Step 3. Compliers: 0.70−0.15=0.550.70 - 0.15 = 0.55.

Exercise 3 · Sharp as a special case

Show that if P(D=1∣X)P(D = 1 \mid X) jumps from 0 to 1, the fuzzy estimand equals the sharp one.

Show solution

Step 1. The denominator is 1−0=11 - 0 = 1.

Step 2. The ratio equals the outcome jump, the sharp RD estimand.

Exercise 4 · The reduced form

In Exercise 1, what does the outcome jump of 6 estimate by itself?

Show solution

Step 1. The effect of eligibility (crossing the cutoff) on the outcome, averaged over all units at the cutoff: an intention-to-treat effect.

Answer: 6 is the ITT; dividing by take-up gives the effect of treatment for compliers.

Exercise 5 · A weak jump

Take-up jumps by 0.05 at the cutoff. What problems does this create?

Show solution

Step 1. The denominator is small and estimated with noise: the ratio is imprecise, biased towards OLS, and its usual CI unreliable (Day 65).

Answer: report the reduced form, the first stage with its F, and an Anderson–Rubin-type interval.

Part 2 · Proofs

Exercise 6 · Identification of the complier effect

Assume that, near the cutoff, Z=1[X≥c]Z = \mathbf 1[X \ge c] acts as a randomly assigned instrument in the limit: type shares and the conditional means of Y(1),Y(0)Y(1), Y(0) given type are continuous in xx at cc. Under monotonicity and exclusion, prove τFRD=E[Y(1)−Y(0)∣complier,X=c]\tau_{FRD} = E[Y(1) - Y(0) \mid \text{complier}, X = c].

Show solution

Step 1. Just above cc, treated units are compliers and always-takers; just below, always-takers only.

Step 2. Outcome jump: by continuity, always-takers' and never-takers' contributions are the same on both sides and cancel; compliers contribute πc(c) E[Y(1)−Y(0)∣c,X=c]\pi_c(c)\,E[Y(1) - Y(0) \mid c, X = c].

Step 3. Take-up jump: πc(c)\pi_c(c).

Step 4. Divide (the LATE theorem at the cutoff). ■\blacksquare

Exercise 7 · 2SLS equals the ratio of jumps

Show that, with a uniform kernel and the same window and controls (1,X−c,Z(X−c))(1, X - c, Z(X - c)) in both stages, 2SLS gives τ^=ρ^/π^\hat\tau = \hat\rho/\hat\pi, the ratio of the reduced-form and first-stage jumps.

Show solution

Step 1. The model is just identified, with ZZ the excluded instrument and the same controls W\mathbf W in both stages.

Step 2. By FWL, partial W\mathbf W out of YY, DD and ZZ: τ^=Z~⊤Y~/Z~⊤D~\hat\tau = \tilde Z^\top\tilde Y/\tilde Z^\top\tilde D.

Step 3. The reduced-form coefficient on ZZ is Z~⊤Y~/Z~⊤Z~\tilde Z^\top\tilde Y/\tilde Z^\top\tilde Z and the first-stage one Z~⊤D~/Z~⊤Z~\tilde Z^\top\tilde D/\tilde Z^\top\tilde Z; their ratio is the same expression. ■\blacksquare

Exercise 8 · A delta-method standard error

With reduced-form jump ρ^\hat\rho, first-stage jump π^\hat\pi and covariance matrix of the two, write the delta-method variance of τ^\hat\tau.

Show solution

Step 1. As in Day 62, Exercise 7:

Var⁡(τ^)≈Var⁡(ρ^)+τ2Var⁡(π^)−2τCov⁡(ρ^,π^)π2.■\operatorname{Var}(\hat\tau) \approx \frac{\operatorname{Var}(\hat\rho) + \tau^2\operatorname{Var}(\hat\pi) - 2\tau\operatorname{Cov}(\hat\rho, \hat\pi)}{\pi^2}. \quad \blacksquare

Exercise 9 · One-sided fuzziness

If nobody below the cutoff can be treated, show the fuzzy RD estimand is the average effect on treated units at the cutoff.

Show solution

Step 1. No always-takers: all treated units just above the cutoff are compliers.

Step 2. By Exercise 6 the estimand is the complier effect at cc, i.e. the effect on the treated at cc (Day 62, Exercise 8). ■\blacksquare

Exercise 10 · A direct effect of crossing the cutoff

If crossing the cutoff affects YY directly by δ\delta (exclusion fails), what does τFRD\tau_{FRD} estimate?

Show solution

Step 1. The outcome jump becomes πτ+δ\pi\tau + \delta.

Step 2. τFRD=τ+δ/π\tau_{FRD} = \tau + \delta/\pi.

Answer: biased, more so with a weak first stage; for instance an age-65 cutoff that also triggers retirement benefits. ■\blacksquare

Part 3 · Applied

Exercise 11 · Maimonides' rule and class size

When enrolment passes 40, the rule splits a cohort into two classes. At the cutoff, average class size drops by 8 pupils and reading scores rise by 2 points. Estimate the effect of one extra pupil per class.

Show solution

Step 1. First stage: −8-8 pupils. Reduced form: +2+2 points.

Step 2. τ^=2/(−8)=−0.25\hat\tau = 2/(-8) = -0.25 points per extra pupil.

Answer: reducing class size by 10 raises scores by about 2.5 points, for classes at the 40-pupil threshold.

Exercise 12 · Insurance at 65

At age 65, insurance coverage rises by 9 points and hospital admissions per 100 people per year rise from 10.0 to 10.8. Estimate the effect of insurance on admissions for those who gain coverage at 65.

Show solution

Step 1. Reduced form: +0.8+0.8 admissions per 100 people.

Step 2. First stage: 0.090.09.

Step 3. τ^=0.8/0.09≈8.9\hat\tau = 0.8/0.09 \approx 8.9 admissions per 100 newly insured people per year.

Answer: about 0.09 extra admissions per newly insured person, under exclusion (other changes at 65, such as retirement, would bias this).

Exercise 13 · Scholarship take-up

Eligibility raises scholarship take-up by 0.5 at the cutoff and college enrolment by 0.04. Estimate the effect of receiving the scholarship.

Show solution

Step 1. τ^=0.04/0.5=0.08\hat\tau = 0.04/0.5 = 0.08.

Answer: receiving the scholarship raises enrolment by 8 points for compliers at the cutoff.

Exercise 14 · A weak first stage

A guideline recommends a drug for patients with a risk score above 10; prescribing jumps by only 0.05 (SE 0.03) and the outcome by 0.01 (SE 0.008). What would you report?

Show solution

Step 1. First-stage t≈1.7t \approx 1.7, F≈2.8F \approx 2.8: very weak.

Step 2. The ratio 0.01/0.05=0.20.01/0.05 = 0.2 is uninformative; its AR set is unbounded (Day 65, Exercise 8).

Answer: report the reduced form (the effect of the guideline itself, 0.01 with SE 0.008) and state that the drug's effect is not identified with useful precision at this cutoff.

Exercise 15 · Same bandwidth in both stages

Why must the first stage and reduced form use the same bandwidth, kernel and polynomial order?

Show solution

Step 1. The ratio estimates the complier effect only if both jumps are measured on the same units with the same weights.

Step 2. Different windows would compare different populations (and different bias), so the ratio would not have the LATE interpretation.

Answer: use the 2SLS implementation within a common window, or a bandwidth selected for the ratio.

Verify in Python

import numpy as np

print("Ex 1:", 6 / .4, " Ex 2 types:", (.15, round(1 - .70, 2), round(.70 - .15, 2)), " Ex 11:", 2 / -8, " Ex 12:", round(.8 / .09, 2), " Ex 13:", .04 / .5)

# Simulated fuzzy RD with heterogeneous effects
rng = np.random.default_rng(76); n = 200_000
x = rng.uniform(-1, 1, n); z = (x >= 0).astype(float)
typ = rng.choice(["c", "a", "n"], n, p=[.55, .15, .30])
d = ((typ == "a") | ((typ == "c") & (z == 1))).astype(float)
gain = np.select([typ == "c", typ == "a", typ == "n"], [3.0, 1.0, 0.5]) + 2 * x        # effects vary with type and x
y = 10 + 4 * x + 2 * (typ == "a") + d * gain + rng.normal(0, 2, n)
h = .2; m = np.abs(x) <= h
W = np.column_stack([np.ones(m.sum()), x[m], z[m] * x[m]])
def coef_on(v, target):
    X = np.column_stack([W, v]); return np.linalg.lstsq(X, target, rcond=None)[0][-1]
rho, pi = coef_on(z[m], y[m]), coef_on(z[m], d[m])
Xs = np.column_stack([W, d[m]]); Zs = np.column_stack([W, z[m]])
Xh = Zs @ np.linalg.lstsq(Zs, Xs, rcond=None)[0]
tsls = np.linalg.lstsq(Xh, y[m], rcond=None)[0][-1]
print(f"reduced form {rho:.3f}, first stage {pi:.3f}, ratio {rho / pi:.3f}, 2SLS {tsls:.3f}  (complier effect at cutoff 3.0)")

Key takeaways

  • Fuzzy RD divides the outcome jump by the take-up jump; it is IV with the cutoff indicator as instrument.
  • It identifies the average effect for compliers at the cutoff, under continuity, monotonicity and exclusion.
  • Estimate by 2SLS with a common window and controls; plot the first stage and guard against weak jumps.

Simulation Lab: Fuzzy RD

Open full screen →

First-stage and reduced-form jumps; their ratio recovers the compliers' effect at the cutoff.

FIRST STAGE: P(treated | x)
00.250.50.751-1-0.500.51running variableshare treated
REDUCED FORM: E[Y | x]
1015-1-0.500.51running variableoutcome
first-stage jump
0.643
reduced-form jump
1.933
fuzzy RD = ratio
3.00
truth 3.00
treated vs untreated near cutoff
3.70

Crossing the cutoff makes treatment available to compliers; always-takers are treated on both sides, never-takers on neither. Left: take-up jumps by the complier share (first stage). Right: outcomes jump by compliers' share × their effect (reduced form). The ratio recovers the compliers' effect at the cutoff; comparing treated and untreated units near the cutoff does not.

Day 75Day 77