Regression Discontinuity Design
Sharp and fuzzy RDD, bandwidth selection, manipulation test, local randomisation
A scholarship is awarded to students who score ≥ 70 on an entrance exam. You want to know if the scholarship improves graduation rates. You cannot randomize scholarship receipt — it is rule-based. But students just above and just below 70 are essentially identical in every way except scholarship receipt. A student scoring 69 and one scoring 71 have the same underlying ability, preparation, and motivation — they differ only in their eligibility. Comparing outcomes for students just above and just below the threshold identifies the causal effect of the scholarship without measuring any confounders, because near the cutoff the assignment is locally as-good-as-random.
RDD exploits a threshold rule in treatment assignment. The running variable (exam score) determines treatment. The key identifying assumption: no other variable changes discontinuously at the cutoff. Any discontinuity in the outcome at the cutoff is caused by the treatment, because nothing else jumped there.
Sharp RDD: exactly at the cutoff, treatment probability jumps from 0 to 1. Local linear regression fits separately on each side of the cutoff within a bandwidth h. The treatment effect equals the difference in the regression line values at the cutoff — the discontinuity. Fuzzy RDD: at the cutoff, treatment probability jumps from p to p′ but not all the way. Use the threshold indicator as an instrument (IV): the estimate is the ratio of the jump in the outcome regression at the cutoff to the jump in the treatment-probability regression at the cutoff — the same difference-in-fits computation as Sharp RDD, taken twice (once for the outcome, once for treatment probability) and divided. This Wald-style ratio estimates the LATE for compliers at the cutoff.
Bandwidth selection is the central technical tradeoff. Too narrow: too few observations, high variance. Too wide: units far from the cutoff are not locally comparable, high bias. The Calonico-Cattaneo-Titiunik (CCT) data-driven selector minimizes MSE. Report estimates at multiple bandwidths — a result that changes dramatically with bandwidth choice is not robust.
What RDD requires that must always be checked: units cannot precisely manipulate which side of the cutoff they land on. If students can adjust their score to land just above 70, the units just above are not comparable to units just below — they are systematically different in their ability or motivation to game the system. Always test for bunching in the running variable distribution using the McCrary density test. Significant bunching at or just above the cutoff means the local randomization assumption is violated.
Key points
- Always run the McCrary density test before reporting RDD results. If the density of the running variable has a discontinuity at the cutoff, there is strategic manipulation — units just above the cutoff are not comparable to units just below. This takes two lines of code and catches the most common RDD validity threat. A visible spike in the histogram before the formal test is already a red flag.
- Trap: using global polynomial regression on the full sample instead of local linear regression near the cutoff. Higher-order polynomials fit poorly near the boundaries and are sensitive to outliers far from the cutoff. Local linear regression with MSE-optimal bandwidth (rdrobust package) is the standard. The polynomial degree should be chosen by cross-validation, not by visual appeal of the fit. This trap is about fitting a high-order polynomial across the *entire* sample — it is different from a local quadratic, a low-order polynomial fit only *within* the local bandwidth window on each side of the cutoff, which is a legitimate bias-correction tool when the outcome is visibly curved near the threshold.
- Diagnostic: run the RDD on placebo outcomes — pre-treatment outcomes, or outcomes that should not be affected by the treatment. If there is a discontinuity in these outcomes at the cutoff, something else is causing a jump at the threshold. Your continuity assumption is violated. Significant covariate jumps at the cutoff (from pre-treatment variables) are the same signal: something other than the treatment is discontinuous there. This is why the covariates checked must be pre-treatment: a covariate measured after treatment can itself be changed BY the treatment, so balance on a post-treatment covariate (e.g., GPA measured after the scholarship decision) proves nothing about validity — it is the same post-treatment-bias ("bad control") problem as controlling for a mediator, and it cannot substitute for checking pre-treatment variables.
RDD achieves high local credibility without measuring confounders — but only near the cutoff, only when units did not manipulate their running variable, and only if nothing else changes discontinuously at the same threshold.
Recap
- RDD exploits a threshold rule in treatment assignment: a student scoring 69 vs 71 on a scholarship-at-70 exam has the same underlying ability and motivation, differing only in eligibility — so near the cutoff assignment is locally as-good-as-random and you identify the effect *without measuring any confounders*.
- The key identifying assumption: *no other* variable changes discontinuously at the cutoff — so any jump in the outcome at the threshold is caused by the treatment, because nothing else jumped there.
- Sharp RDD: exactly at the cutoff, treatment probability jumps 0→1; fit a local linear regression on each side within a bandwidth and the effect is the vertical discontinuity between the two fits at the cutoff.
- Fuzzy RDD: treatment probability jumps only from p to p′ (not all the way); the estimate is the ratio of the jump in the outcome regression at the cutoff to the jump in the treatment-probability regression at the cutoff — a Wald/IV ratio, the same difference-in-fits idea as Sharp RDD applied to both regressions and divided — estimating the LATE for compliers at the cutoff.
- Bandwidth is the central trade-off: too narrow = too few observations = high variance; too wide = units far from the cutoff aren't comparable = high bias. The CCT data-driven selector minimises MSE — report estimates at several bandwidths, since a result that swings wildly with bandwidth isn't robust.
- Manipulation test — McCrary density: units must not be able to precisely control which side of the cutoff they land on. Bunching in the running-variable density at or just above the cutoff means they gamed it, and the local-randomisation assumption is violated.
- Placebo checks: run the RDD on pre-treatment outcomes and covariates — a jump at the cutoff in something the treatment can't have affected means the continuity assumption is broken and something else is discontinuous there.
Check your understanding
Q1. A university gives scholarships to students who score above 70 on entrance exam. You want to estimate the effect on graduation rates using RDD. Select the two genuinely required validity checks.
- A) Run a McCrary density test on the running variable around 70 — a spike in density just above the cutoff signals manipulation, and the formal version of this check is implemented in the rddensity package
- B) Run a covariate balance test by regressing pre-determined covariates (prior GPA, family income) on the running variable and testing for a jump at 70, since a jump there would signal something other than treatment is discontinuous
- C) Check balance on post-treatment covariates such as GPA after enrollment and class attendance on both sides of the cutoff — if these look balanced, that alone is sufficient to certify the RDD estimate is valid
- D) Verify the scholarship amount is large enough to plausibly move graduation rates, and confirm students just below 70 applied for other financial aid — if they did, the RDD estimate is read as the scholarship's net effect
Q2. You run sharp RDD and get significant effect with bandwidth ±10. With ±5 the effect is larger; with ±15 it shrinks to near zero. What does this pattern tell you?
- A) This is expected and entirely unremarkable — narrower bandwidths mechanically produce larger RDD estimates because they use only the most comparable units, so the ±15 result is simply the least credible of the three
- B) This is a warning sign, not routine noise. Explanations: nonlinearity near the cutoff (use local quadratic), or localized manipulation in ±5 (re-check McCrary density there). Report CIs at several bandwidths
- C) The shrinking effect at ±15 actually confirms the RDD is valid, since the effect is inherently local to the cutoff and should weaken as you widen the window to include units farther from the local-randomization region
- D) The larger effect at ±5 indicates the whole result is driven by regression to the mean — students just above 70 had unusually high scores relative to their true ability, and the scholarship really has no real effect at all
Q3. A government policy provides business subsidies to firms with revenue below £500k. McCrary test shows significant bunching just below £500k. Can you still use RDD?
- A) Yes without qualification — bunching below £500k simply confirms firms are aware of the threshold, which makes the subsidy salient and, if anything, makes the RDD estimate more credible than usual to readers
- B) Yes — apply a density-weighting correction that downweights observations near the bunching region, which adjusts for the manipulation and by itself recovers an unbiased RDD estimate with absolutely no further caveats
- C) Bunching signals deliberate manipulation — firms below and above are no longer comparable. Remedies: donut RDD excluding the band, explicit bunching-estimator modeling, or reporting only a lower bound if asymmetric
- D) Yes — simply restrict the sample to firms whose revenue did not change year-over-year, since firms with stable revenue are by definition not manipulating and form a perfectly valid comparison group for the RDD
Try it interactively
ML Systems Lab is a free interview-prep platform for ML engineers — work through the full interactive module, quizzes, and drills.
Open ML Systems Lab →