*! version 0.95 12Aug2017

Title

rdbounds -- Manipulation Robust Regression Discontinuity Bounds Estimation.

Syntax

rdbounds depvar runningvar [if] [in]
[,
covs(covsvars)
treatment(treatmentvar)
c(#)
discretex
discretey
]
bwsx(#)
[
bwy(#)
kernel(kernelname)
orders(#)
evaluation_ys(yvalues)
ymin(#)
ymax(#)
type(typename)
percentiles(percentiles)
num_tau_pairs(#)
num_bootstraps(#)
kn(#)
alpha(#)
potential_taus(taulist)
righteffects
yextremes(# #)
num_lambdas(#)
num_rs(#)
kernel_y(kernelname)
outputfile(stringname)
outputfileInputs(stringname)
replace
verbose
]

Description

This function implements the estimation procedure developed in Gerard, Rokkanen, and Rothe (2018), to estimate bounds on treatment effects under potential manipulation of the running variable.

Dependencies

This function requires the package moremata, which is used to speed up matrix computations. It can be installed via ssc install moremata.

Options

depvar specifies the dependent/outcome variable for the RDD.

runningvar specifies the running variable for the RDD.

covs(covsvars) specifies covariate(s) to implement the covariate-based refinement.

treatment(treatmentvar) specifies the treatment status variable if implementing a Fuzzy RDD. Defaults to computation of Sharp RDD results only.

c(#) specifies the threshold for assignment to treatment (assigned iff runningvar >= #}). Defaults to 0.

discretex if set, treat each value of x as a mass-point for density estimation.

discretey if set, treat each value of y as a mass-point for density estimation.

bwsx(#) is a numlist of bandwidths in x, respectively for 1) estimation of the discontinuity in the density of x at the cutoff; and 2)local polynomial estimation of conditional means. Expects either a single bandwidth to be used for both or a numlist of two. Required.

bwy(#) is a bandwidth for density estimation of y, implemented if discretey not set. Required if discretey not set.

kernel(kernelname) specificies a kernel function to be used throughout estimation for runningvar. Choices are triangular, rectangular, gaussian and epanechnikov. Defaults to triangular.

orders(#) specifies the order of polynomial regression, for: 1) estimation of the discontinuity in the density at the cutoff (tau in paper), and 2) local polynomial regressions. Expects either a single integer to be used for both or a vector of two values. Defaults to 1 (local linear regression) for all. Estimation of tau can only be implemented up to quadratic order if discretex not set.

evaluation_ys(yvalues) an explicit numlist of values of depvar (i.e. "y") to evaluate CDF's at (and PDF's if discretey not set). Values must be in ascending order with no repeats. If evaluation_ys() is not set, the set of unique values of y in the sample will be used. Caution is required if discretey is set, because computation will assume a probability mass function can be estimated from differences in estimated CDF's at subsequent values of evaluation_ys(). This can bias FRD estimates if evaluation_ys() does not contain all values in the support of dependent variable. evaluation_ys() can take a numlist in the form e.g. evaluation_ys("0 0.1 to 10"), for instance to create a list of values from 0 to 10 by increments of 0.1.

ymin(#) left/lower bound on depvar at which to implement a boundary kernel correction if discretey is not set and depvar is a variable with bounded support (e.g. after censoring). If omitted, no boundary kernel correction is implemented on the left side of the support of depvar.

ymax(#) right/upper bound on depvar at which to implement a boundary kernel correction if discretey is not set and depvar is a variable with bounded support (e.g. after censoring). If omitted, no boundary kernel correction is implemented on the right side of the support of depvar.

type(typename) typename = ate for average treatment effects (default) or qte for quantile treatment effects at the percentiles given by parameter percentiles. Defaults to ate.

percentiles(percentiles) numlist of percentiles at which to asses quantile treatment effects. Defaults to median (50). User may add -1 as a percentile, in order to estimate average treatment effects along with QTE's. Must be integers between 1 and 99 (aside from -1 if included, which must come first). For example, percentiles(-1,30,50) will compute ATEs as well as the 30 percent and 50 percent QTEs.

num_tau_pairs(#) integer number of points to search over in the set of possible values for (tau0, tau1) in notation of paper, for fuzzy RD estimation. Defaults to 50. If set to 1, the single tau is set to the "rightmost" (t=1) extreme of the set T (Section 3.1 of paper), such that user can enforce the assumption that always-assigned units always receive treatment ("Refinement B", or Theorem 4 in paper), if this is consistent with data. If only sharp estimands are desired (i.e. treatment is not set) it is most efficient to set this to zero.

refinementA if set, additionally calculate refined bounds with the restriction that always assigned units are at least as likely to be treated as potentially assigned units (i.e. tau1 ge tau; see Corollary 1 in paper)

refinementB if set, additionally calculate refined bounds with the restriction that always assigned units are always treated (i.e. tau0 = 0; see Corollary 2 in paper)

num_bootstraps(#) number of bootstrap samples for estimating confidence intervals (and for diagnostic testing of the estimated discontinuity in the density at the cutoff). To avoid bootstrap testing altogether, set num_bootstraps(0).

kn(#) a hardcoded constant for kappa_n (see Section 5.2 on inference in paper). Defaults to log(n)^{1/2}, where n is the number of observations

alpha(#) sets the level for confidence intervals. Defaults to alpha=.05 for 95 percent confidence intervals

potential_taus(taulist) numlist of different values of tau to use for the confidence intervals estimating the potential impact of manipulation, e.g. potential_taus(.025 .05 .1 .2).

righteffects if set, additionally estimate causal effects for units just to the right of the cutoff (Section 4.3 of paper).

yextremes(# #) extreme values (lower and upper) to assume if righteffects is set, e.g. yextremes(0 10). Defaults to the sample range of

num_lambdas(#) integer number of points to search over for the causal effect of units just to the right of the cutoff (lambda in paper). Defaults to 50.

num_rs(#) integer number of points to search over to find r_alpha when computing confidence intervals (see Section 5.2 of paper). Defaults to 100.

kernel_y(kernelname) allows a separate kernel for density estimation of depvar. Same choices as kernel for runningvar. Defaults to kernel specified for use with runningvar.

bwsxcov(#) an optional separate bwsx to use for quantities that are computed on a subsample conditioned on a value of covs (e.g. covariate-conditional CDFs).

bwycov(#) an optional separate bwy to use for quantities that are computed on a subsample conditioned on a value of covs (e.g. covariate-conditional CDFs).

outputfile(filename) saves as filename a Stata dataset containing intermediate estimands, in particular averages (and/or quantiles) of potential outcome distributions corresponding to all of the estimands.

outputfileInputs(filename) saves as filename a Stata dataset containing fundamental estimated inputs (densities, CDFs, and basic quantities like G and s(y)(1-tau0)) (see paper for notation) for the main sample (not for bootstrap samples).

replace allows outputfile and outputfileInputs to overwrite an existing file.

verbose allows more detailed reporting of warnings in estimation.

Example: simulated sample data

Generate sample data

. rdbounds_sampledata, samplesize(50000) covs clear

Run estimation

. rdbounds y x, c(0) treatment(treatment) covs(cov) bwsx(.2, .5) bwy(.1) evaluation_ys("0 .2 to 23") orders(1) kernel(epanechnikov) type(ate) refinementA refinementB righteffects yextremes(0 23) num_bootstraps(0)

Display results

. disp "tau_hat: `e(tau_hat)'"

. matrix list e(treatment_effects_ATE)

Saved results

rdbounds saves the following in e():

Scalars

e(tau_hat) estimated discontinuity in the density of running variable at cutoff

e(takeup_increase) estimated increase in probability of treatment at the cutoff (if fuzzy RDD)

e(seconds_taken) length of time taken for computation in seoonds

e(tau_hat_CI_lower) lower limit of confidence interval for tau_hat

e(tau_hat_CI_upper) upper limit of confidence interval for tau_hat

e(takeup_CI_lower) lower limit of confidence interval for takeup_increase

e(takeup_CI_upper) upper limit of confidence interval for takeup_increase

e(treatment_effects_effect) table of treatment effect estimates and confidence intervals for treatment effect effect, e.g. ATE, QTE10, QTE50, etc.

e(fixedtau_effect) table of treatment effect estimates and confidence intervals for treatment effect effect and fixed values of tau specified through the potential_taus option

References

F. Gerard, M. Rokkanen, and C. Rothe. 2016. Bounds on Treatment Effects in Regression Discontinuity Designs under Manipulation of the Running Variable, with an Application to Unemployment Insurance in Brazil. NBER Working Paper 22892. http://www.nber.org/papers/w22892.

Authors

Francois Gerard, Columbia University.
fgerard@columbia.edu.

Leonard Goff, Columbia University.
leonard.goff@columbia.edu.

Miikka Rokkanen, Amazon.
miikka.rokkanen@gmail.com.

Christoph Rothe, University of Mannheim.
rothe@vwl.uni-mannheim.de.

See Also

rdbounds_sampledata