Skip to main content

Regression Discontinuity

Regression discontinuity (RD) uses a treatment rule that changes at a cutoff of a running variable. Units just below and above the threshold may be comparable, making the outcome jump informative about a local effect. The cutoff is not automatically random, and the result is local.

Prerequisites​

Complete Event Studies and Parallel Trends. Review assignment mechanisms, local estimands, and interference.

Learning goals​

  • distinguish sharp and fuzzy RD and define the estimand at the cutoff.
  • estimate separate local outcome functions rather than a global high-order polynomial.
  • probe manipulation, covariate jumps, placebo cutoffs, bandwidth sensitivity, and concurrent rules.

Assignment mechanism and identification​

Suppose students with a placement score below 60 are offered Study Sprint. In a sharp RD, treatment received changes from zero to one at 60; the outcome discontinuity targets the average treatment effect at the threshold. In a fuzzy RD, the offer changes treatment probability and the ratio of outcome and receipt jumps targets a local complier effect under IV-like assumptions.

Identification requires continuity of untreated and treated potential-outcome regressions at the cutoff, no precise sorting that changes unit types discontinuously, a correctly recorded running variable, no other intervention changing at the same threshold, consistency, and no interference. Bandwidth choice trades bias against variance; it does not validate continuity.

Worked local fit and manipulation failure​

This deterministic simulation fits separate local lines around zero. The valid fixture contains an eight-point jump. The counterexample doubles the number of observations just above the cutoff, a visible sorting warning rather than an automatic correction.

def line(points):
xbar = sum(x for x, _ in points) / len(points)
ybar = sum(y for _, y in points) / len(points)
slope = sum((x - xbar) * (y - ybar) for x, y in points) / sum((x - xbar) ** 2 for x, _ in points)
return ybar - slope * xbar, slope

left = [(-3, 44), (-2, 46), (-1, 48)]
right = [(1, 60), (2, 62), (3, 64)]
left_intercept, left_slope = line(left)
right_intercept, right_slope = line(right)
manipulated_running_values = [-3, -2, -1, 0.2, 0.4, 0.7, 1, 2, 3]
left_count = sum(x < 0 for x in manipulated_running_values)
right_count = sum(x > 0 for x in manipulated_running_values)
print(f"local RD jump={right_intercept - left_intercept:.1f}")
print(f"left/right slopes={left_slope:.1f}/{right_slope:.1f}")
print(f"manipulation-fixture right/left count ratio={right_count / left_count:.1f}")
print("failure verdict=investigate sorting; a bandwidth cannot prove continuity")

Equal slopes are convenient here but not required. Real analyses use robust bias-aware local polynomial inference and show the data. A density discontinuity can reveal sorting, yet no detected density jump does not prove the absence of manipulation. Sorting may be imprecise and harmless, or subtle and consequential; investigate the institution.

Diagnostics and falsification​

Plot binned outcomes and raw observations without replacing estimation with the picture. Report local-linear estimates across defensible bandwidths and kernels, observation counts, mass points, and sensitivity to donut exclusions when measurement is heaped. Test predetermined covariates and negative-control outcomes for cutoff jumps, density for sorting, and placebo cutoffs where no rule changes.

Inventory every policy using the same threshold. A smooth baseline covariate does not rule out an unmeasured discontinuity, and a selected bandwidth producing significance is not design evidence. For fuzzy RD, show the treatment-probability jump and state exclusion and monotonicity assumptions.

Failure modes​

  • Counselors manipulate scores around the known cutoff.
  • Another scholarship begins at the same score.
  • A global polynomial drives the jump using distant observations.
  • The running variable is rounded or its definition changes.
  • The local effect is generalized to students far from 60.

Common mistakes​

  • Calling all observations above and below the cutoff exchangeable.
  • choosing bandwidths after inspecting favorable estimates.
  • fitting one high-order polynomial across the full range.
  • treating a strong first stage or smooth covariates as proof.
  • forgetting that fuzzy RD targets local compliers near the cutoff.

Practice​

Find a real threshold rule and document who knows the score, whether they can manipulate it, which other rules share the threshold, and which population lies within the plausible bandwidth. State when you would abandon RD.

Next steps​

Instrumental Variables generalizes the encouragement logic and makes exclusion, monotonicity, and local effects explicit.

Primary sources​

Checked 2026-10-15: Imbens and Lemieux, “Regression Discontinuity Designs”, McCrary, manipulation density test, and Cattaneo, Idrobo, and Titiunik, A Practical Introduction to Regression Discontinuity Designs.