*! version 1 2024-05-21

Title

did_had -- Estimates the effect of a treatment on an outcome in a heterogeneous adoption design
with no stayers but some quasi stayers (see de Chaisemartin and D'Haultfoeuille (2024)).

Syntax

did_had Y G T D [if] [in]
[,
effects(#)
placebo(#)
level(#)
kernel(string)
dynamic
trends_lin
yatchew
no_updates
graph_off]

Description

did_had estimates the effect of a treatment on an outcome in a heterogeneous adoption
design (HAD) with no stayers but some quasi stayers. HADs are designs where all groups are untreated in the first period,
and then some groups receive a strictly positive treatment dose at a period F,
which has to be the same for all treated groups (with variation in treatment timing, the did_multiplegt_dyn package may be used).
Therefore, there is variation in treatment intensity, but no variation in treatment timing.
HADs without stayers are designs where all groups receive a strictly positive
treatment dose at period F: no group remains untreated. Then, one cannot use untreated units
to recover the counterfactual outcome evolution that treated groups would have experienced from before to after F,
without treatment. To circumvent this, did_had implements the estimator
from de Chaisemartin and D'Haultfoeuille (2024) which uses so-called "quasi stayers" as the control group.
Quasi stayers are groups that receive a "small enough" treatment dose at F to be regarded as "as good as untreated".
Therefore, did_had can only be used if there are groups with a treatment dose "close to zero".
Formally, the density of groups' period-two treatment dose needs to be strictly positive
at zero, something that can be assessed by plotting a kernel density estimate of that density.
The command makes use of the lprobust command by Calonico, Cattaneo and Farrell (2019) to determine an optimal bandwidth, i.e.
a treatment dose below which groups can be considered as quasi stayers.
To estimate the treatment's effect, the command starts by computing
the difference between the change in outcome of all groups and the intercept
in a local linear regression of the outcome change on the treatment dose
among quasi-stayers. Then, that difference is
scaled by groups' average treatment dose at period two. Standard errors and confidence intervals are also computed leveraging lprobust.
We recommend that users of did_had cite de Chaisemartin and D'Haultfoeuille (2024), Calonico, Cattaneo and Farrell (2019), and
Calonico, Cattaneo and Farrell (2018).

Y is the outcome variable.

G is the group variable.

T is the time period variable.

D is the treatment variable.

Options

effects(#) allows you to specify the number of effects did_had tries to estimate.
Effect ℓ is the treatment's effect at period F-1+ℓ, namely ℓ periods after adoption.
By default, the command estimates only 1 effect and in case you specified more effects than your data allows to
estimate the number of effects is automatically adjusted to the maximum.

placebo(#) allows you to specify the number of placebo estimates did_had tries to compute. Those placebos
are constructed symmetrically to the estimators of the actual effects, except that the outcome evolution from F-1 to F-1+ℓ in the
actual estimator is replaced by the outcome evolution from F-1 to F-1-ℓ in the placebo.

level(#) allows you to specify (1-the level) of the confidence intervals
shown by the command. By default this level is set to 0.05,
thus yielding 95% level confidence intervals.

kernel(string) allows you to specify the kernel function used by lprobust. Possible choices are triangular, epanechnikov, uniform and gaussian.
By default, the program uses a uniform kernel.

dynamic: when this option is specified, effect ℓ is scaled by groups' average total treatment dose received from period F to F-1+ℓ.
Without this option, effect ℓ is scaled by groups' average treatment dose at period F-1+ℓ.
The latter normalization is appropriate if one assumes that groups' outcome at F-1+ℓ is only affected by their current treatment (static model).
On the other hand, the former normalization is appropriate if one assumes that groups' outcome at F-1+ℓ can be affected by their current
and past treatments (dynamic model).

trends_lin: when this option is specified, the command allows for group-specific linear trends.
This is done by using groups' outcome evolution from period F-2 to F-1 as an estimator of each group-specific linear trend,
and then subtracting this trend from groups' actual outcome evolutions.
Note: due to the fitting of the linear trend in periods F-2 to F-1, the number of feasible placebo estimates is reduced by 1 with this option.

yatchew yields the result from a non-parametric test
that the conditional expectation of the F-1 to F-1+ℓ outcome evolution
given the treatment at F-1+ℓ is linear.
This test is implemented using an heteroskedasticity-robust version of the test of Yatchew (1997),
proposed in Section 3 of de Chaisemartin and D'Haultfoeuille (2024).
It is performed for all the dynamic effects
computed by did_had. It is also performed for the placebo estimators computed by the command.
There, the null being tested is that groups' F-1 to F-1-ℓ outcome evolution is mean independent of their
F-1+ℓ treatment, a non-parametric version of a standard pre-trends test where the F-1 to F-1-ℓ outcome evolution is regressed on groups'
F-1+ℓ treatment. This option requires the yatchew_test
package, which is currently available on SSC.

Interpreting the results from yatchew. Following Theorem 1 and Equation 5
of de Chaisemartin and D'Haultfoeuille (2024), in designs where there are stayers or
quasi-stayers, under a parallel trends assumption
the treatment coefficient from a regression of groups' F-1 to F-1+ℓ outcome evolution
on their the treatment at F-1+ℓ is unbiased for the Average Slope of Treated groups (AST) if and only if
the conditional expectation of the outcome evolution from F-1 to F-1+ℓ
given the treatment at F-1+ℓ is linear. As a result, if the linearity hypothesis cannot be rejected,
then one can unbiasedly estimate the
AST at period F-1+ℓ using the simple OLS regression described above, rather than resorting to the
non-parametric estimator computed by did_had.

no_updates: this option stops
automatic self-updates of the
program, which are performed
(on average) every 100 runs.

graph_off: by default, did_had outputs an event-study graph with the effect and placebo estimates and their confidence intervals.
When specifying graph_off, the graph is suppressed.

Example

: Artificial data from the GitHub page

The data for this example can be downloaded by running:

ssc install did_had, replace

use "https://raw.githubusercontent.com/chaisemartinPackages/did_had/main/tutorial_data.dta", clear

Estimating the effects over five periods and placebos for four pre-treatment periods:

did_had y g t d, effects(5) placebo(4)

Doing the same estimation, but with a triangular kernel and surpressing the graph output:

did_had y g t d, effects(5) placebo(4) kernel(tri) graph_off

Changing the level of the confidence interval:

did_had y g t d, effects(5) placebo(4) level(0.1)

References

de Chaisemartin, C and D'Haultfoeuille, X (2024).
Two-way Fixed Effects and Difference-in-Difference Estimators in Heterogeneous Adoption Designs.

Calonico, S., M. D. Cattaneo, and M. H. Farrell. 2019.
nprobust: Nonparametric Kernel-Based Estimation and Robust Bias-Corrected Inference.
Journal of Statistical Software, 91(8): 1-33.

Calonico, S., M. D. Cattaneo, and M. H. Farrell. 2018.
On the Effect of Bias Estimation on Coverage Accuracy in Nonparametric Inference.
Journal of the American Statistical Association 113(522): 767-779.

Yatchew, A (1997).
An elementary estimator of the partial linear model.
Economics Letters, Elsevier, vol. 62(3), pages 271-278.

Auxiliary packages

The command requires that the lprobust package be installed on the user's machine.

Authors

Clément de Chaisemartin, Economics Department, Sciences Po, France.

Diego Ciccia, Sciences Po, France.

Xavier D'Haultfoeuille, CREST-ENSAE, France.

Felix Knau, Sciences Po, France.

Doulo Sow, Sciences Po, France.

Contact

Mail:
chaisemartin.packages@gmail.com

GitHub:
https://github.com/chaisemartinPackages/did_had.

Saved results

Matrix:

e(estimates): Matrix storing the results table.