{smcl}
{* 30sep2016}{...}
{hline}
help for {hi:rd}
{hline}

{title:Regression discontinuity (RD) estimator}

{title:Syntax}

{p 6 16 2}
{cmd:rd} [{vars}] {ifin} {weight}
[{cmd:,} {it:{help rd##options:options}}]

{p 6 16 2}where
{cmd:varlist} has the form {it:outcomevar} [{it:treatmentvar}]
{it:assignmentvar} 

{marker weights}{dlgtab:Weights}

{pstd}
{cmd:aweight}s, {cmd:fweight}s, and {cmd:pweight}s
are allowed; see help {help weights}.  Under Stata 
versions 9.2 or before (using
{help locpoly} to construct local regression estimates)
{cmd:aweight}s and {cmd:pweight}s will be converted to {cmd:fweight}s
automatically and the data {help expand}ed. If this would
exceed system memory limits, error {search r(901)} will be issued; in 
this case, the user is advised to round weights.  In any case, 
the validity of bootstrapped standard errors will depend on
the {help expand}ed data correctly representing sampling variability,
which may require rounding or replacing weight variables.
Under Stata 
versions 10 or later (using
{help lpoly} to construct local regression estimates), all weights
will be treated as {cmd:aweight}s.  

{p 6 16 2}
{cmd: bs} [, {it:{help bootstrap:options}}]: {cmd:rd} {vars} {ifin} {weight}
[{cmd:,} {it:{help rd##options:options}}]

{marker contents}{dlgtab: Table of Further Contents}
{p 6 16 2}

{p 2}{help rd##description:General description of estimator}{p_end}
{p 2}{help rd##examples:Examples}{p_end}
{p 2}{help rd##options:Detailed syntax}{p_end}
{p 2}{help rd##options:Description of options}{p_end}
{p 2}{help rd##macros:Remarks and saved results}{p_end}
{p 2}{help rd##refs:References}{p_end}
{p 2}{help rd##acknow:Acknowledgements}{p_end}
{p 2}{help rd##citation:Citation of {cmd:rd}}{p_end}
{p 2}{help rd##citation:Author information}{p_end}

{marker description}{dlgtab:Description}

{p}{cmd:rd} implements a set of regression-discontinuity 
estimation methods that are thought to have very good 
internal validity, for estimating the causal effect of 
some explanatory variable (called the treatment variable) 
for a particular subpopulation, under some often plausible 
assumptions.  In this sense, it is much like an 
experimental design, except that levels of the treatment 
variable are not assigned randomly by the researcher. 
Instead, there is a jump in the conditional mean of the 
treatment variable at a known cutoff in another variable, 
called the assignment variable, which is perfectly observed,
and this allows us to estimate the effect of treatment {it:as if} it were randomly assigned in 
the neighborhood of the known cutoff.

{p}{cmd:rd} is an alternative to various regression techniques
that purport to allow causal inference (e.g. panel methods such as {help xtreg}), instrumental
variables (IV) and other IV-type methods
(see the {stata "view http://fmwww.bc.edu/repec/bocode/i/ivreg2.hlp":ivreg2} 
help file and references therein),
and matching estimators (see the {stata "view http://fmwww.bc.edu/repec/bocode/p/psmatch2.hlp":psmatch2} 
and {stata "view http://fmwww.bc.edu/repec/bocode/n/nnmatch.hlp":nnmatch} help files and references therein).
The {cmd:rd} approach is in fact an IV model with one exogenous variable excluded
from the regression ({it:excluded instrument}), an indicator for the assignment variable above the cutoff,
and one endogenous regressor (the treatment 
variable).

{p}{cmd:rd} estimates local linear or {help lpoly##kernel :kernel} regression models on both sides of the cutoff, using a {help lpoly##kernel :triangle kernel}.
Estimates are sensitive to the choice of bandwidth, so by default several estimates
are constructed using different bandwidths. In practice, {cmd:rd} uses kernel-weighted
{help suest} (or {help ivreg} if {help suest} fails) to estimate the local linear regressions and reports analytic SE based on the regressions.

{p}Further discussion of {cmd:rd} appears in {help rd##refs:Nichols (2007)}.

{marker examples}{dlgtab:Examples}

{p}In the simplest case, assignment to treatment depends on a variable Z being above a cutoff Z0.  
Frequently, Z is defined so that Z0=0. In this case, treatment is 1 for Z>=0 and 0 for Z<0, and we estimate 
local linear regressions on both sides of the cutoff to obtain estimates of the outcome at Z=0. 
The difference between the two estimates (for the samples where Z>=0 and where Z<0) is the estimated 
effect of treatment. 

{p}For example, having a Democratic representative in the US Congress may be considered a treatment
applied to a Congressional district, and the
assignment variable Z is the vote share garnered by the Democratic candidate.  At Z=50%, the probability
of treatment=1 jumps from zero to one. Suppose we are interested in the effect a
Democratic representative has on the federal spending
within a Congressional district.
{cmd:rd} estimates local linear regressions on both sides of the cutoff like so:

{col 9}{stata "ssc inst rd, replace" : ssc inst rd, replace}
{col 9}{stata "net get rd" : net get rd}
{col 9}{stata "use votex" : use votex}
{col 9}{stata `"rd lne d, gr mbw(100)"' : rd lne d, gr mbw(100)}
{col 9}{stata `"rd lne d, gr mbw(100) line(`"xla(-.2 "Repub" 0 .3 "Democ", noticks)"')"' : rd lne d, gr mbw(100) line(`"xla(-.2 "Repub" 0 .3 "Democ", noticks)"')}
{col 9}{stata "rd lne d, gr ddens" : rd lne d, gr ddens}
{col 9}{stata "rd lne d, mbw(25(25)300) bdep ox" : rd lne d, mbw(25(25)300) bdep ox}
{col 9}{stata "rd lne d, x(pop-vet)" : rd lne d, x(pop-vet)}
{col 9}{stata "rd lne d, mbw(100) bin binvar(bins) scopt(mcol(black))" : rd lne d, mbw(100) bin binvar(bins) scopt(mcol(black))}

{p}In a fuzzy RD design, the conditional mean of treatment jumps at the cutoff, and that jump forms the 
denominator of a Local Wald Estimator. The numerator is the jump in the outcome, and both are reported
along with their ratio. The sharp RD design is a special case of the fuzzy RD design, since the denominator in the sharp case is just one.

{col 9}{stata "g byte ranwin=cond(uniform()<.1,1-win,win)" : g byte ranwin=cond(uniform()<.1,1-win,win)}
{col 9}{stata "rd lne ranwin d, mbw(100)" : rd lne ranwin d, mbw(100)}

{p}The default bandwidth from Imbens and Kalyanaraman (2009)
is designed to minimize MSE, or squared bias plus variance, in a sharp RD design. Note that a smaller bandwidth tends to produce
lower bias and higher variance. The optimal bandwidth will tend to be larger for a fuzzy design
due to the additional variance arising from the estimation of the jump in the conditional mean of treatment.
Unfortunately, a larger bandwidth also leads to additional bias, which will be greater if the curvature of 
the response function is greater (meaning that a linear regression over a larger range is a poorer approximation).
The increase in squared bias due to dividing by the estimated jump in the conditional mean of treatment
(using observations away from the discontinuity) can easily dominate the increase in variance and lead to the optimal
bandwidth in a fuzzy design to be smaller than in the sharp design.  No clear guidance is offered; conducting simulations using
plausible generating functions for your specific application are highly recommended.
The {cmd:rd} option {cmd:bdep} facilitates visualizing the dependence of the estimate on bandwidth.

{p}There are also a varitey of alternative implementations on {browse:https://sites.google.com/a/umich.edu/cattaneo/software}{the website of Matias Cattaneo}.

{col 9}{stata "rd lne ranwin d, mbw(25(25)300) bdep ox" : rd lne ranwin d, mbw(25(25)300) bdep ox}

{marker options}{dlgtab:Detailed Syntax and Options}

{p}There should be two or three variables specified after the {cmd:rd} command; if two are specified, a sharp
RD design is assumed, where the treatment variable jumps from zero to one at the cutoff.  If no variables
are specified after the {cmd:rd} command, the estimates table is displayed.

{p 6 16 2}
{cmd:rd} {it:outcomevar} [{it:treatmentvar}]
{it:assignmentvar} {ifin} {weight}
[{cmd:,} {it:{help rd##options:options}}]

{pstd}

{dlgtab:Options summary}

{p 0 4}{cmd:mbw(}{help numlist}{cmd:)}  specifies a list of multiples for bandwidths, in percentage terms. 
The default is "100 50 200" (i.e. half and twice the requested bandwidth) and 100 is always included in the list,
regardless of whether it is specified.

{p 0 4}{cmd:z0(}{it:real}{cmd:)}  specifies the cutoff Z0 in {it:assignmentvar} Z.

{p 0 4}{cmdab:str:ineq} specifies that mean treatment differs at Z0 from all Z>Z0 (e.g. treatment is 1 for Z>0 and 0 for Z<=0); the default assumption is that
mean treatment differs at Z0 from all Z<Z0 (e.g. treatment is 1 for Z>=0 and 0 for Z<0).

{p 0 4}{cmd:x(}{it:varlist}{cmd:)} requests estimates of jumps in control variables {it:varlist}.

{p 0 4}{cmdab:dd:ens} requests a computation of a discontinuity in the density of Z.  This is computed in a relatively ad hoc way, 
and should be redone using McCrary's test described at 
{browse "http://www.econ.berkeley.edu/~jmccrary/DCdensity/":http://www.econ.berkeley.edu/~jmccrary/DCdensity/}.{p_end}

{p 0 4}{cmd:s(}{it:stubname}{cmd:)} requests that estimates be saved as new variables beginning with {it:stubname}.

{p 0 4}{cmdab:gr:aph} requests that local linear regression graphs for each bandwidth be produced.

{p 0 4}{cmdab:nosc:atter} suppresses the scatterplot on those graphs.

{p 0 4}{cmdab:cl:uster(}{it:varlist}{cmd:)} requests standard errors robust to clustering on distinct combinations of {it:varlist} (e.g. {it:stratum psu}).

{p 0 4}{cmdab:sco:pt(}{it:string}{cmd:)} supplies an option list to the scatter plot.

{p 0 4}{cmdab:line:opt(}{it:string}{cmd:)} supplies an option list to the overlaid line plots.

{p 0 4}{cmd:n(}{it:real}{cmd:)}  specifies the number of points at which to calculate local linear regressions. 
The default is to calculate the regressions at 50 points above the cutoff, with equal steps in the grid, and to
use equal steps below the cutoff, with the number of points determined by the step size.

{p 0 4}{cmdab:bw:idth(}{it:real}{cmd:)} allows specification of a bandwidth for local linear regressions. 
The default 
is to use the estimated optimal bandwidth for a "sharp" design as given by Imbens and Kalyanaraman (2009).
The optimal bandwidth minimizes MSE, or squared bias plus variance, where a smaller bandwidth tends to produce
lower bias and higher variance. Note that the optimal bandwidth will often tend to be larger for a fuzzy design,
due to the additional variance that arises from the estimation of the jump in the conditional mean of treatment.

{p 0 4}{cmdab:bd:ep} requests a graph of estimates versus bendwidths.

{p 0 4}{cmdab:bin:graph} requests a graph of binned means instead of a scatterplot, in bins defined by binvar.

{p 0 4}{cmd:binvar(}{it:varname}{cmd:)} specifies the variable across which binned means should be calculated.

{p 0 4}{cmdab:ox:line} adds a vertical line at the default bandwidth.

{p 0 4}{cmdab:k:ernel(}{cmdab:rec:tangle}{cmd:)} requests the use of a rectangle (uniform) {help lpoly##kernel:kernel}. The default is a triangle (edge) {help lpoly##kernel:kernel}.

{p 0 4}{cmdab:cov:ar(}{it:varlist}{cmd:)} adds covariates to Local Wald Estimation, which is generally a Very Bad Idea.  It is possible that covariates could reduce 
residual variance and improve efficiency, but estimation error in their coefficients could also reduce efficiency, and any violations of the assumptions
that such covariates are exogenous and have a linear impact on mean treatment and outcomes could greatly increase bias.


{marker macros}{dlgtab:Remarks and saved results}


{p}To facilitate {help bootstrap}ping, {cmd:rd} saves the following results in {cmd:e()}:

Scalars
{col 4}{cmd:e(N)}{col 18}Number of observations used in estimation
{p 3 18 2}{cmd:e(w)} {space 8} Bandwidth in base model; other bandwidths are reported in e.g. e(w50) for the 50% multiple.

Macros
{col 4}{cmd:e(cmd)}{col 18}{cmd:rd}
{col 4}{cmd:e(rdversion)}{col 18}Version number of {cmd:rd}
{col 4}{cmd:e(depvar)}{col 18}Name of dependent variable

Matrices
{p 3 18 2}{cmd:e(b)} {space 8} Coefficient vector of estimated jumps in variables at different percentage bandwidth multiples

Functions
{col 4}{cmd:e(sample)}{col 18}Marks estimation sample


{marker refs}{title:References}

{p}Many references appear in {p_end}

{phang}Nichols, Austin. 2007.
{browse "http://www.stata-journal.com/sjpdf.html?articlenum=st0136":Causal Inference with Observational Data. Stata Journal 7(4): 507-541}.{p_end}

{p}but the interested reader is directed also to{p_end}

{phang}Imbens, Guido and Thomas Lemieux. 2007. "Regression Discontinuity Designs: A Guide to Practice." 
{browse "http://nber.org/papers/w13039":NBER Working Paper 13039}.

{phang}McCrary, Justin. 2007. "Manipulation of the Running Variable in the Regression Discontinuity Design: 
A Density Test." {browse "http://nber.org/papers/t0334":NBER Technical Working Paper 334}.

{phang}Shadish, William R., Thomas D. Cook, and Donald T. Campbell. 2002. 
{it: Experimental and Quasi-Experimental Designs for Generalized Causal Inference}. 
Boston: Houghton Mifflin.
 
{phang}Fuji, Daisuke, Guido Imbens, and Karthik Kalyanaraman. 2009. "Notes for Matlab and Stata Regression Discontinuity Software."
{browse "http://www.economics.harvard.edu/faculty/imbens/software_imbens":http://www.economics.harvard.edu/faculty/imbens/software_imbens}

{phang}Imbens, Guido, and Karthik Kalyanaraman. 2009. "Optimal Bandwidth Choice for the Regression Discontinuity Estimator." {browse "http://www.nber.org/papers/w14726":NBER WP 14726}.

{marker acknow}{title:Acknowledgements}

{p}I would like to thank Justin McCrary for helpful discussions.  Any errors are my own.{p_end}

{p}The optimal bandwidth calculations are from Fuji, Imbens, and Kalyanaraman (2009),
available at {browse "http://www.economics.harvard.edu/faculty/imbens/software_imbens":http://www.economics.harvard.edu/faculty/imbens/software_imbens}.{p_end}

{marker citation}{title:Citation of {cmd:rd}}

{p}{cmd:rd} is not an official Stata command. It is a free contribution
to the research community, like a paper. Please cite it as such: {p_end}

{phang}Nichols, Austin. 2011.
rd 2.0: Revised Stata module for regression discontinuity estimation.
{browse "http://ideas.repec.org/c/boc/bocode/s456888.html":http://ideas.repec.org/c/boc/bocode/s456888.html}{p_end}

{title:Author}

    Austin Nichols 
    Principal Scientist, Abt Associates, Bethesda MD
    austinnichols@gmail.com

{title:Also see}

{p 1 14}Manual:  {hi:[U] 23 {help est: Estimation} and {help postest: post-estimation} commands}{p_end}
{p 10 14}{manhelp bootstrap R}{p_end}
{p 10 14}{manhelp lpoly R} in Stata 10, else {help locpoly} ({stata "findit locpoly":findit locpoly} to install){p_end}
{p 10 14}{manhelp ivregress R} in Stata 10, else {manhelp ivreg R}{p_end}
{p 10 14}{manhelp regress R}{p_end}
{p 10 14}{manhelp xtreg XT}{p_end}

{p 1 10}On-line: help for (if installed)  {help rd_obs} (prior version of {cmd:rd}), {help ivreg2},
{help overid}, {help ivendog}, {help ivhettest}, {help ivreset},
{help xtivreg2}, {help xtoverid}, {help ranktest},
{help condivreg}; {help psmatch2}, {help nnmatch}.
{p_end}
