Section 3.14

Regression Discontinuity Design

A university awards a merit scholarship to every applicant who scores 60 or more on its entrance exam. Nobody wrote that rule as an experiment. It behaves like one anyway. An applicant who scored 59 and an applicant who scored 61 arrived with the same preparation, the same nerves and two points of luck between them, and only one of them got the money. If the funded one does better in first year, the explanation is short. Regression discontinuity is the machinery for making that comparison carefully, and for knowing when it has stopped working.

A rule, a line, and the people either side of it

The design needs three things. A running variable, which is a continuous score that every unit has: an exam mark, a household income, a birth date, a village population. A cutoff on that variable. And a rule that hands out the treatment by comparing the two. Benefits below an income line, a remedial class below a test score, a second teacher the moment enrollment passes forty, a pension from the month you turn sixty-five: none of these were built for research, and all of them create the same accident.

The accident is that the running variable is continuous while the treatment is not. Everything else about a person moves smoothly as their score moves. Ability, family income, motivation, whatever else drives the outcome: all of it drifts a little between 59 and 61 and drifts a lot between 40 and 80. Treatment is the one thing that leaps. So a leap in the outcome at exactly the cutoff, with no leap in anything else there, has one available explanation.

That argument is only as good as the neighborhood it is made in, and this is the design's price as well as its virtue. It is credible because it is local. The estimate describes people sitting at the cutoff, and it says nothing on its own about an applicant who scored 85 and was never in any danger of missing out. A finding that a scholarship is worth five grade points at a score of 60 does not license the sentence "the scholarship is worth five grade points". The previous lesson ran into the same wall from a different direction: an instrument recovers the effect for the people it moved, and a cutoff recovers the effect for the people standing next to it.

Reading the jump off a regression

The whole estimate is one coefficient, and the trick to getting it is centering the running variable. Replace X with X minus the cutoff, so that zero on the new scale is the threshold. Then fit

Y = b0 + b1D + b2(X − c) + b3D(X − c) + e

where D is 1 above the cutoff and 0 below it, and c is the cutoff. Each coefficient now has a job. b0 is the outcome a person right at the threshold would have had without the treatment. b2 is the slope of the outcome against the score below the cutoff, and b2 + b3 is the slope above it, so the interaction term is what lets the two sides bend away from each other. And b1 is the jump at the cutoff, which is the estimate. Leave the centering out and b1 still measures a vertical gap, but at X = 0 rather than at the threshold, which on an exam-score scale is a point no applicant occupies and the two fitted lines are miles apart.

Letting the slopes differ matters more than it looks. Force a single slope across the cutoff and any bend in the underlying relationship has to go somewhere, and where it goes is into b1. That is the most common way to report a jump that was never there, and the widget below turns it on with one click.

Keep the curve low-order. A line on each side inside a modest window is the modern default, a quadratic on each side is defensible, and a high-order polynomial fitted across the full range of the data is a known way to produce nonsense exactly at the boundary, where a flexible curve has the least data and the most freedom.

In the scholarship study, fitted inside twelve points either side of the cutoff, the line below predicted 62.0 at a score of 60 and the line above predicted 66.7. The scholarship is worth 4.7 grade points, SE = 1.05, t(412) = 4.48, p < .001, 95% CI [2.64, 6.76].

🎮 The Jump at the Cutoff

Six hundred applicants. The entrance exam score runs along the bottom, the first-year grade average up the side, and the scholarship goes to everyone at 60 or above (indigo). Orange lines are fitted inside the shaded window; the bracket between them at the cutoff is the estimate. The strip underneath counts applicants at each score, which is where manipulation shows itself.

True jump
Estimated jump
Its standard error
Applicants in the window
At the cutoff: below → above

Bandwidth is the real decision

Every regression discontinuity estimate is computed on a window around the cutoff, and choosing its width is the analyst's one genuinely consequential choice. Narrow the window and the people in it are more alike, so the comparison is more believable and the functional form you assumed matters less; you also throw away most of your data, and the standard error climbs. Widen it and the estimate gets precise, but it starts leaning on the line you drew to extrapolate scores that are nowhere near the threshold.

The scholarship estimate above came from a window of twelve points, with 416 applicants in it. Refit inside five points and 154 applicants remain: the estimate moves to 5.1 and its standard error nearly doubles to 1.72, t(150) = 2.97, p = .003, 95% CI [1.70, 8.50]. Neither number is the right one. They are the same design read at two resolutions, and the fact that they agree is the reassuring part.

Which is why the convention is to show several. An honest results section reports the estimate across a range of bandwidths, usually as a small plot or a row of columns, so a reader can see whether the finding survives the choice or depends on it. Published work almost always adds a data-driven bandwidth as the headline, chosen to minimize mean squared error, with confidence intervals corrected for the bias that optimal choice leaves behind. Software does that arithmetic; the reporting habit is yours.

Sharp cutoffs and fuzzy ones

Everything so far assumes the rule was obeyed exactly: score 60 and you are funded, score 59 and you are not. That is a sharp design, and the treatment indicator and the cutoff indicator are the same variable.

Rules are often softer. Appeals succeed, exceptions get granted, eligible people never apply. If crossing the cutoff raises the probability of treatment from 15% to 70% rather than from 0 to 1, the design is fuzzy, and the jump in the outcome now understates the effect of treatment, because only 55% of the people at the cutoff changed their treatment status. Divide by that share and you are done: the effect is the jump in the outcome over the jump in treatment probability.

That ratio is the Wald ratio from the previous lesson, with being above the cutoff playing the instrument. Fuzzy regression discontinuity is instrumental variables, with a reduced form that is the jump in the outcome and a first stage that is the jump in treatment. Everything that came with that machinery comes along too, including the weak-instrument problem when the cutoff barely shifts anyone, and the reading of the answer as an effect for compliers, who here are the people the rule actually moved and who happen to sit at the threshold.

How to referee one

Three checks separate a regression discontinuity you can believe from one you cannot, and every one of them is something to look for when the journal club hands you a paper.

The outcome should jump and nothing else should. Run the same regression with a pre-treatment covariate as the dependent variable: age, prior grades, household income, anything fixed before the cutoff was applied. Those are things the treatment could not possibly have changed, so a significant jump in one of them says the two sides of the cutoff differ for some other reason, and the design's central claim is already contradicted. This is the covariate balance table of a randomized trial, borrowed.

The density of the running variable should be smooth through the cutoff. If people can nudge their own score, the ones with most to gain will nudge it upward, and you will see a shortage just below the line and a pile-up just above it. That pile-up is fatal, because the people who moved are exactly the ones who cared most, and they are now all on the treated side. The formal version is the McCrary density test, which estimates the density of the running variable separately on each side of the cutoff and asks whether the two estimates meet there; a significant gap is evidence of sorting. Turn the manipulation slider up in the widget and watch the strip under the scatter pull apart while the estimate climbs and the fit goes on looking tidy.

Placebo cutoffs should find nothing. Rerun the analysis pretending the threshold was at 50, or 70, or any value where no rule exists. Those regressions should return small, insignificant jumps. If a design manufactures effects at made-up cutoffs, it was manufacturing the real one too.

What none of this reaches is the assumption itself, which is that everything other than the treatment varies smoothly through the cutoff. That is a statement about a counterfactual, the outcome people just above would have had under no treatment, and no dataset contains it. The checks are each an opportunity for the assumption to fail publicly, and passing them is evidence rather than proof. Section 3.12 makes the same distinction in another vocabulary: what you can adjust for is a matter of the data, and what you must assume is a matter of the design.

Why it matters: bureaucracies run on thresholds, and every threshold is an experiment somebody already ran. A score, a date, a population count and a strict rule are enough to get a causal estimate out of records that were never collected for research. What you owe in return is the honesty to say the estimate is local, to show it across several bandwidths, and to check the density before anyone else does. Quasi-experimental designs in the Research Toolkit sets this design beside the others that work the same way.

Common questions

How wide should the bandwidth be?

There is no width that is correct in advance, which is why the modern answer is to let an algorithm pick one and then show that the finding does not depend on it. The standard selector chooses the window that minimizes mean squared error, trading the bias of including people far from the cutoff against the variance of excluding almost everyone, and rdrobust in R or Python reports it by default. Two habits go with it. Because an optimal bandwidth deliberately tolerates some bias, the ordinary confidence interval around that estimate is a little too narrow, so report the bias-corrected robust interval the same command prints rather than the conventional one. And show a sensitivity plot: the estimate and its interval at half the selected bandwidth, at the selected one, and at twice it. A result that holds across that range is a result; one that appears only inside a particular window is a bandwidth, not a finding.

My running variable only takes whole numbers. Does that break the design?

Not by itself, but it changes what you can claim and how the standard errors should be computed. The design assumes a continuous score, and an exam mark recorded in whole points is a coarse version of one. With many distinct values either side of the cutoff the usual analysis is fine in practice. With few, two things go wrong: there is no neighborhood close to the threshold to shrink into, so the estimate leans entirely on the functional form you chose, and the conventional standard errors are too small because everyone sharing a score value also shares whatever is peculiar about that value. The standard fix is to cluster the standard errors on the running variable itself, which is the opposite of most clustering advice and follows from the same logic. If the score takes only a handful of values, say so plainly and treat the result as a parametric extrapolation rather than a local comparison.

Can I add control variables to a regression discontinuity?

Yes, and the reason to is precision rather than bias. If the design is sound, the people either side of the cutoff already match on everything, so adding a pre-treatment covariate should leave the estimate where it was while shrinking its standard error by soaking up outcome variance. That gives you a free diagnostic: an estimate that moves substantially when a covariate goes in is telling you the two sides were not balanced on that covariate, and the balance check would have caught it. Two rules keep it honest. Only ever adjust for variables fixed before the cutoff was applied, since anything measured afterward may itself be an effect of the treatment and adjusting for it would remove part of the answer. And decide the covariate list before looking at what each one does to the coefficient, because a list chosen by its effect on the estimate is a specification search with extra steps.