| Title: | Quantile Treatment Effects |
|---|---|
| Description: | Provides several methods for computing the Quantile Treatment Effect (QTE) and Quantile Treatment Effect on the Treated (QTT). The main cases covered are (i) treatment is randomly assigned, (ii) treatment is as good as randomly assigned after conditioning on covariates (selection on observables) using the methods of Firpo (2007) <doi:10.1111/j.1468-0262.2007.00738.x>, and (iii) identification is based on a Difference in Differences assumption, with support for several varieties including Athey and Imbens (2006) <doi:10.1111/j.1468-0262.2006.00668.x>, Callaway and Li (2019) <doi:10.3982/QE935>, and Callaway, Li, and Oka (2018) <doi:10.1016/j.jeconom.2018.06.008>. Version 2.0 adds a unified staggered treatment adoption API (built on 'ptetools') for all DiD-based estimators, as well as a new lagged-outcome unconfoundedness estimator ('lou_qte'). |
| Authors: | Brantly Callaway [aut, cre] |
| Maintainer: | Brantly Callaway <[email protected]> |
| License: | GPL-3 |
| Version: | 2.0.0 |
| Built: | 2026-07-04 06:32:59 UTC |
| Source: | https://github.com/bcallaway11/qte |
Provides several methods for computing the Quantile Treatment Effect (QTE) and Quantile Treatment Effect on the Treated (QTT). The main cases covered are (i) treatment is randomly assigned, (ii) treatment is as good as randomly assigned after conditioning on covariates (selection on observables) using the methods of Firpo (2007) doi:10.1111/j.1468-0262.2007.00738.x, and (iii) identification is based on a Difference in Differences assumption, with support for several varieties including Athey and Imbens (2006) doi:10.1111/j.1468-0262.2006.00668.x, Callaway and Li (2019) doi:10.3982/QE935, and Callaway, Li, and Oka (2018) doi:10.1016/j.jeconom.2018.06.008. Version 2.0 adds a unified staggered treatment adoption API (built on 'ptetools') for all DiD-based estimators, as well as a new lagged-outcome unconfoundedness estimator ('lou_qte').
Maintainer: Brantly Callaway [email protected]
Authors:
Brantly Callaway [email protected]
Useful links:
Report bugs at https://github.com/bcallaway11/qte/issues
Plot a QTE object as a quantile treatment effect curve
with optional confidence bands.
## S3 method for class 'QTE' autoplot(object, cband = TRUE, ylab = "QTE", ...)## S3 method for class 'QTE' autoplot(object, cband = TRUE, ylab = "QTE", ...)
object |
a |
cband |
logical; if |
ylab |
label for the y-axis. Default |
... |
unused. |
a ggplot object.
Computes Quantile Treatment effects on the Treated (QTT) and the Average Treatment Effect on the Treated (ATT) using the Change in Changes identification strategy of Athey and Imbens (2006). Handles two-period data and staggered treatment adoption uniformly: a two-period, two-group dataset is the degenerate single-(g,t) case. Supports both panel and repeated cross sections data.
cic( yname, gname, tname, idname = NULL, data, panel = TRUE, xformula = ~1, weightsname = NULL, control_group = "notyettreated", anticipation = 0, alp = 0.05, cband = TRUE, biters = 100, cl = 1, ret_quantile = NULL, gt_type = "att", probs = NULL )cic( yname, gname, tname, idname = NULL, data, panel = TRUE, xformula = ~1, weightsname = NULL, control_group = "notyettreated", anticipation = 0, alp = 0.05, cband = TRUE, biters = 100, cl = 1, ret_quantile = NULL, gt_type = "att", probs = NULL )
yname |
Name of the outcome variable in |
gname |
Name of the treatment group variable (first treatment period; 0 for never-treated units). |
tname |
Name of the time period variable. |
idname |
Name of the unit id variable. Required when
|
data |
A data frame. |
panel |
Logical; |
xformula |
One-sided formula for covariates used in the covariate
adjustment. Default |
weightsname |
Name of the column in |
control_group |
Which units to use as the comparison group:
|
anticipation |
Number of periods of anticipation. Default |
alp |
Significance level for confidence bands. Default |
cband |
Logical; if |
biters |
Number of bootstrap iterations. Default |
cl |
Number of clusters for parallel computation. Default |
ret_quantile |
Passed through to |
gt_type |
Type of group-time effect to compute. |
probs |
For |
For gt_type = "att", a pte_results object from
ptetools. For gt_type = "qtt", a pte_qtt object
with overall, group-specific, and dynamic QTT curves and bootstrap SEs.
Athey, Susan and Guido Imbens. “Identification and Inference in Nonlinear Difference-in-Differences Models.” Econometrica 74(2), pp. 431-497, 2006.
data(mpdta, package = "did") ## ATT aggregated across all groups and periods res_att <- cic(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "att", biters = 20) summary(res_att) ## Full QTT curve at selected quantiles res_qtt <- cic(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "qtt", probs = seq(0.1, 0.9, 0.1), biters = 20) summary(res_qtt)data(mpdta, package = "did") ## ATT aggregated across all groups and periods res_att <- cic(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "att", biters = 20) summary(res_att) ## Full QTT curve at selected quantiles res_qtt <- cic(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "qtt", probs = seq(0.1, 0.9, 0.1), biters = 20) summary(res_qtt)
Computes the Change in Changes (CiC) ATT and counterfactual
outcome distribution for a single 2x2 (pre/post x treated/control) data
subset. Serves directly as the attgt_fun argument to
ptetools::pte. Panel vs. repeated cross sections is detected
automatically from whether the same unit ids appear in both periods.
cic_gt(gt_data, xformula = ~1, ...)cic_gt(gt_data, xformula = ~1, ...)
gt_data |
A data frame (typically a |
xformula |
One-sided formula for covariates. Default |
... |
Additional arguments passed through by |
A ptetools::attgt_noif object with the ATT estimate and, in
extra_gt_returns, three objects: F1 (ECDF of observed
treated outcomes in the post period), F0 (ECDF of counterfactual
untreated outcomes for the treated group), and Fte (ECDF of
individual treatment effects under rank invariance; NULL for
repeated cross sections).
Athey, Susan and Guido Imbens. “Identification and Inference in Nonlinear Difference-in-Differences Models.” Econometrica 74(2), pp. 431-497, 2006.
Computes Quantile Treatment effects on the Treated (QTT) and
the Average Treatment Effect on the Treated (ATT) using the distributional
DiD identification strategy of Callaway, Li, and Oka (2018). Handles
two-period data and staggered treatment adoption uniformly via
ptetools. Requires panel data.
Identification. Under distributional parallel trends and a copula
restriction (the rank correlation of untreated potential outcomes between
the treated and control groups in the pre-period is preserved), the
counterfactual distribution is recovered
by adding each control unit's actual change
to the treated pre-period quantile at that control unit's rank. This
point-identifies the QTT with only two time periods, in contrast to
methods (e.g. panel_qtt) that require three periods.
Panel data required. Unlike cic, qdid, and
mdid, this estimator cannot be applied to repeated cross sections
because it requires observing the within-unit outcome change for each
control unit.
ddid( yname, gname, tname, idname, data, xformula = ~1, weightsname = NULL, control_group = "notyettreated", anticipation = 0, alp = 0.05, cband = TRUE, biters = 100, cl = 1, gt_type = "att", probs = NULL )ddid( yname, gname, tname, idname, data, xformula = ~1, weightsname = NULL, control_group = "notyettreated", anticipation = 0, alp = 0.05, cband = TRUE, biters = 100, cl = 1, gt_type = "att", probs = NULL )
yname |
Name of the outcome variable in |
gname |
Name of the treatment group variable (first treatment period; 0 for never-treated units). |
tname |
Name of the time period variable. |
idname |
Name of the unit id variable (required). |
data |
A data frame. |
xformula |
One-sided formula for covariates. Default |
weightsname |
Name of the column in |
control_group |
Which units to use as the comparison group:
|
anticipation |
Number of periods of anticipation. Default |
alp |
Significance level for confidence bands. Default |
cband |
Logical; if |
biters |
Number of bootstrap iterations. Default |
cl |
Number of clusters for parallel computation. Default |
gt_type |
Type of group-time effect to compute. |
probs |
For |
For gt_type = "att", a pte_results object from
ptetools. For gt_type = "qtt", a pte_qtt object.
Callaway, Brantly, Tong Li, and Tatsushi Oka. “Quantile Treatment Effects in Difference in Differences Models under Dependence Restrictions and with Only Two Time Periods.” Journal of Econometrics 206(2), pp. 395-413, 2018.
data(mpdta, package = "did") ## ATT aggregated across all groups and periods res_att <- ddid(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "att", biters = 20) summary(res_att) ## Full QTT curve at selected quantiles res_qtt <- ddid(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "qtt", probs = seq(0.1, 0.9, 0.1), biters = 20) summary(res_qtt)data(mpdta, package = "did") ## ATT aggregated across all groups and periods res_att <- ddid(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "att", biters = 20) summary(res_att) ## Full QTT curve at selected quantiles res_qtt <- ddid(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "qtt", probs = seq(0.1, 0.9, 0.1), biters = 20) summary(res_qtt)
Computes the distributional DiD ATT and counterfactual outcome
distribution for a single 2x2 (pre/post x treated/control) data subset.
Serves directly as the attgt_fun argument to ptetools::pte.
Identification. Under distributional parallel trends and a copula
restriction (Callaway, Li, and Oka 2018), the counterfactual outcome for
each control unit is
where
is the observed change for control unit , is that unit's rank in the control
pre-period distribution, and is the quantile
function of the treated pre-period distribution. The unconditional
counterfactual distribution is then the
(weighted) empirical CDF of .
Unlike CiC, QDiD, and MDiD, the counterfactual is indexed over
control units, not treated units. Consequently F0 and the
ATT counterfactual term are weighted by w_pre_ctrl, and no
individual treatment effect distribution (Fte) is returned.
Panel data required. The estimator needs the actual change
for each control unit, which requires
observing the same units in both periods.
ddid_gt(gt_data, xformula = ~1, ...)ddid_gt(gt_data, xformula = ~1, ...)
gt_data |
A data frame (typically a |
xformula |
One-sided formula for covariates. Default |
... |
Additional arguments passed through by |
A ptetools::attgt_noif object with the ATT estimate and, in
extra_gt_returns, F0 (weighted ECDF of counterfactual
outcomes indexed over control units), F1 (weighted ECDF of observed
treated post-period outcomes), and Fte = NULL (individual treatment
effect distribution is not identified for this estimator).
Callaway, Brantly, Tong Li, and Tatsushi Oka. “Quantile Treatment Effects in Difference in Differences Models under Dependence Restrictions and with Only Two Time Periods.” Journal of Econometrics 206(2), pp. 395-413, 2018.
Deprecated. Use autoplot() on a QTE
object instead.
ggqte( qteobj, main = "", ylab = "QTE", ylim = NULL, ybreaks = NULL, xbreaks = c(0.1, 0.3, 0.5, 0.7, 0.9), setype = "pointwise", alp = qteobj$alp )ggqte( qteobj, main = "", ylab = "QTE", ylim = NULL, ybreaks = NULL, xbreaks = c(0.1, 0.3, 0.5, 0.7, 0.9), setype = "pointwise", alp = qteobj$alp )
qteobj |
a QTE object |
main |
optional title |
ylab |
optional y axis label |
ylim |
optional limits of y axis |
ybreaks |
optional breaks in y axis |
xbreaks |
optional breaks in x axis |
setype |
options are "pointwise", "uniform" or both |
alp |
significance level override |
a ggplot object
lalonde contains data from the National Supported Work
Demonstration. This program randomly assigned applicants to the job
training program (or out of the job training program). The dataset is
discussed in Lalonde (1986). The experimental part of the dataset is
combined with an observational dataset from the Panel Study of Income
Dynamics (PSID). Lalonde (1986) and many subsequent papers (e.g.
Heckman and Hotz (1989), Dehejia and Wahba (1999), Smith and Todd (2005),
and Firpo (2007) have used this combination to study the effectiveness
of various ‘observational’ methods (e.g. regression, Heckman selection,
Difference in Differences, and propensity score matching) of estimating
the Average Treatment Effect (ATE) of participating in the job training
program. The idea is that the results from the observational method
can be compared to results that can be easily obtained from the
experimental portion of the dataset.
To be clear, the observational data combines the observations that are treated from the experimental portion of the data with untreated observations from the PSID.
data(lalonde)data(lalonde)
Four data.frames: (i) lalonde.exp contains a cross sectional version of the experimental data, (ii) lalonde.psid contains a cross sectional version of the observational data, (iii) lalonde.exp.panel contains a panel version of the experimental data, and (iv) lalonde.psid.panel contains a panel version of the observational data. Note: the cross sectional and panel versions of each dataset are identical up to their shape; in demonstrating each of the methods, it is sometimes convenient to have one form of the data or the other.
LaLonde, Robert. “Evaluating the Econometric Evaluations of
Training Programs with Experimental Data.” The American Economics Review,
pp. 604-620, 1986.
@source The dataset comes from Lalonde (1986) and has been studied in much
subsequent work. The qte package uses a version from the
causalsens package
(https://CRAN.R-project.org/package=causalsens)
The cross sectional verion of the experimental part of the
lalonde dataset. It
is loaded with all the datasets with the command data(lalonde)
The panel verion of the experimental part of the
lalonde dataset. It
is loaded with all the datasets with the command data(lalonde)
The cross sectional verion of the observational part of the
lalonde dataset. It
is loaded with all the datasets with the command data(lalonde)
The panel verion of the observational part of the
lalonde dataset. It
is loaded with all the datasets with the command data(lalonde)
Estimates the Quantile Treatment Effect on the Treated (QTT)
and Average Treatment Effect on the Treated (ATT) under a lagged-outcome
unconfoundedness assumption with staggered treatment adoption. The key
identifying assumption is
, i.e., conditional on
observed covariates and the pre-treatment outcome, treatment is as good
as randomly assigned within each cohort-period cell.
Estimation operates at the (g,t) level: for each cohort and
post-treatment period , a cross-sectional comparison is made
between the treated group and a not-yet-treated (or never-treated)
comparison group, adjusting for covariates and (optionally) the
pre-treatment outcome. Group-time estimates are then aggregated to
overall, dynamic, and group-specific summaries.
Three estimation methods are available:
"ipw"Propensity-score reweighting. Control units are
reweighted by
to approximate the covariate distribution of the treated group.
"or"Outcome regression. A quantile regression model is
fit on control units' post-period outcomes as a function of
, then predicted at treated units to
construct the counterfactual distribution (Melly 2006;
Chernozhukov, Fernandez-Val, and Melly 2013).
"aipw"Doubly-robust augmented IPW. Combines the propensity score and outcome models. Consistent if either model is correctly specified.
When lagged_outcome_cov = FALSE and xformula = ~1, all
three methods reduce to a simple distribution comparison within each
(g,t) cell, which is consistent under unconditional unconfoundedness.
The ATT analogue (without the QTT) for staggered adoption under lagged-outcome unconfoundedness is developed in Callaway (2023).
lou_qtt( yname, gname, tname, idname = NULL, data, xformula = ~1, lagged_outcome_cov = TRUE, est_method = c("ipw", "or", "aipw"), panel = TRUE, weightsname = NULL, control_group = "notyettreated", anticipation = 0, alp = 0.05, cband = TRUE, biters = 100, cl = 1, gt_type = c("att", "qtt"), probs = NULL )lou_qtt( yname, gname, tname, idname = NULL, data, xformula = ~1, lagged_outcome_cov = TRUE, est_method = c("ipw", "or", "aipw"), panel = TRUE, weightsname = NULL, control_group = "notyettreated", anticipation = 0, alp = 0.05, cband = TRUE, biters = 100, cl = 1, gt_type = c("att", "qtt"), probs = NULL )
yname |
Name of the outcome variable in |
gname |
Name of the treatment group variable (first treatment period; 0 for never-treated units). |
tname |
Name of the time period variable. |
idname |
Name of the unit id variable. Required when
|
data |
A data frame. |
xformula |
One-sided formula for additional covariates used in the
propensity score and/or outcome model. Default |
lagged_outcome_cov |
Logical; if |
est_method |
Estimation method: |
panel |
Logical; |
weightsname |
Name of the column in |
control_group |
Which units to use as the comparison group:
|
anticipation |
Number of periods of anticipation. Default |
alp |
Significance level for confidence intervals. Default |
cband |
Logical; if |
biters |
Number of bootstrap iterations. Default |
cl |
Number of clusters for parallel bootstrap. Default |
gt_type |
Type of group-time effect to compute. |
probs |
For |
For gt_type = "att", a pte_emp_boot object. For
gt_type = "qtt", a pte_qtt object with overall,
group-specific, and dynamic QTT curves, bootstrap standard errors,
and pointwise and uniform confidence bands.
Callaway, Brantly. “Policy Evaluation during a Pandemic.” Journal of Econometrics 236(2), 2023.
Melly, Blaise. “Estimation of Counterfactual Distributions Using Quantile Regression.” Working paper, University of St. Gallen, 2006.
Chernozhukov, Victor, Ivan Fernandez-Val, and Blaise Melly. “Inference on Counterfactual Distributions.” Econometrica 81(6), pp. 2205–2268, 2013.
unc_qte for the cross-sectional (non-staggered)
version. cic, qdid, mdid for
alternative identification strategies with staggered adoption.
data(mpdta, package = "did") ## ATT under lagged-outcome unconfoundedness (IPW with pre-period outcome) res_att <- lou_qtt( yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, lagged_outcome_cov = TRUE, est_method = "ipw", gt_type = "att", biters = 20 ) summary(res_att) ## QTT with doubly-robust estimation res_qtt <- lou_qtt( yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, lagged_outcome_cov = TRUE, est_method = "aipw", gt_type = "qtt", probs = seq(0.1, 0.9, 0.1), biters = 20 ) summary(res_qtt)data(mpdta, package = "did") ## ATT under lagged-outcome unconfoundedness (IPW with pre-period outcome) res_att <- lou_qtt( yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, lagged_outcome_cov = TRUE, est_method = "ipw", gt_type = "att", biters = 20 ) summary(res_att) ## QTT with doubly-robust estimation res_qtt <- lou_qtt( yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, lagged_outcome_cov = TRUE, est_method = "aipw", gt_type = "qtt", probs = seq(0.1, 0.9, 0.1), biters = 20 ) summary(res_qtt)
Computes Quantile Treatment effects on the Treated (QTT) and the Average Treatment Effect on the Treated (ATT) using the Mean Difference-in-Differences identification strategy. Handles two-period data and staggered treatment adoption uniformly. Supports both panel and repeated cross sections data.
Identification. MDiD assumes the counterfactual distribution of
untreated potential outcomes is a location shift of the treated group's
pre-treatment distribution. The size of the shift is the mean DiD
, so
.
This is stronger than parallel trends in means alone: it additionally
requires that the shape of the treated group's outcome distribution is
unchanged in the counterfactual. MDiD is a special case of QDiD that
applies a single mean shift rather than a rank-specific distributional
shift.
Covariate adjustment. When xformula is specified, the
scalar shift is replaced by a unit-specific conditional mean shift
,
estimated by weighted OLS. The counterfactual for treated unit is
, and the unconditional counterfactual
distribution is the empirical CDF of these values. By the law of iterated
expectations, this consistently estimates .
mdid( yname, gname, tname, idname = NULL, data, panel = TRUE, xformula = ~1, weightsname = NULL, control_group = "notyettreated", anticipation = 0, alp = 0.05, cband = TRUE, biters = 100, cl = 1, ret_quantile = NULL, gt_type = "att", probs = NULL )mdid( yname, gname, tname, idname = NULL, data, panel = TRUE, xformula = ~1, weightsname = NULL, control_group = "notyettreated", anticipation = 0, alp = 0.05, cband = TRUE, biters = 100, cl = 1, ret_quantile = NULL, gt_type = "att", probs = NULL )
yname |
Name of the outcome variable in |
gname |
Name of the treatment group variable (first treatment period; 0 for never-treated units). |
tname |
Name of the time period variable. |
idname |
Name of the unit id variable. Required when
|
data |
A data frame. |
panel |
Logical; |
xformula |
One-sided formula for covariates. Default |
weightsname |
Name of the column in |
control_group |
Which units to use as the comparison group:
|
anticipation |
Number of periods of anticipation. Default |
alp |
Significance level for confidence bands. Default |
cband |
Logical; if |
biters |
Number of bootstrap iterations. Default |
cl |
Number of clusters for parallel computation. Default |
ret_quantile |
Passed through to |
gt_type |
Type of group-time effect to compute. |
probs |
For |
For gt_type = "att", a pte_results object from
ptetools. For gt_type = "qtt", a pte_qtt object
with overall, group-specific, and dynamic QTT curves and bootstrap SEs.
Athey, Susan and Guido Imbens. “Identification and Inference in Nonlinear Difference-in-Differences Models.” Econometrica 74(2), pp. 431-497, 2006.
Thuysbaert, Bram. “Distributional Comparisons in Difference in Differences Models.” Working Paper, 2007.
data(mpdta, package = "did") ## ATT aggregated across all groups and periods res_att <- mdid(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "att", biters = 20) summary(res_att) ## Full QTT curve at selected quantiles res_qtt <- mdid(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "qtt", probs = seq(0.1, 0.9, 0.1), biters = 20) summary(res_qtt)data(mpdta, package = "did") ## ATT aggregated across all groups and periods res_att <- mdid(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "att", biters = 20) summary(res_att) ## Full QTT curve at selected quantiles res_qtt <- mdid(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "qtt", probs = seq(0.1, 0.9, 0.1), biters = 20) summary(res_qtt)
Computes the MDiD ATT and counterfactual outcome distribution
for a single 2x2 (pre/post x treated/control) data subset. Serves
directly as the attgt_fun argument to ptetools::pte. Panel
vs. repeated cross sections is detected automatically from whether the
same unit ids appear in both periods.
Identification. MDiD assumes that the counterfactual distribution of untreated potential outcomes for the treated group in the post period is a location shift of the treated group's pre-period distribution:
where is
the mean DiD (the change in mean outcomes for the untreated group). The
counterfactual quantile function is therefore
.
Covariate adjustment. With covariates, the scalar shift
is replaced by a unit-specific conditional mean shift
,
estimated by weighted OLS on the control group in each period. The
counterfactual for treated pre-period unit is
. The unconditional counterfactual
distribution is the empirical CDF of these shifted values, which by the
law of iterated expectations consistently estimates
.
mdid_gt(gt_data, xformula = ~1, ...)mdid_gt(gt_data, xformula = ~1, ...)
gt_data |
A data frame (typically a |
xformula |
One-sided formula for covariates. Default |
... |
Additional arguments passed through by |
A ptetools::attgt_noif object with the ATT estimate and, in
extra_gt_returns, three objects: F1 (weighted ECDF of
observed treated outcomes in the post period), F0 (weighted ECDF
of counterfactual untreated outcomes for the treated group), and Fte
(weighted ECDF of individual treatment effects; NULL for repeated
cross sections).
Athey, Susan and Guido Imbens. “Identification and Inference in Nonlinear Difference-in-Differences Models.” Econometrica 74(2), pp. 431-497, 2006.
Thuysbaert, Bram. “Distributional Comparisons in Difference in Differences Models.” Working Paper, 2007.
Computes Quantile Treatment Effects on the Treated (QTT) and
the Average Treatment Effect on the Treated (ATT) using the three-period
panel identification strategy of Callaway and Li (2019). Handles
two-period (one post + two pre-treatment periods) and staggered treatment
adoption via ptetools. Requires panel data for both groups.
Identification. Under a copula stability assumption and
distributional parallel trends on changes, the counterfactual distribution
is recovered from three periods of panel
data without requiring rank invariance.
pre_copula. Controls which pre-treatment periods are used as the copula-transfer base for post-treatment cells (g, g+e):
"long" (default)pre2 = 2*(g - anticipation) - (g+e) - 2, matching the copula window to the event horizon e. Cells where pre2 does not exist in the data are excluded from aggregation with two-step weight renormalization.
"short"pre2 = g - anticipation - 2, always anchored at treatment onset.
Pre-test placebo cells always use the sliding base regardless of
pre_copula.
panel_qtt( yname, gname, tname, idname, data, xformula = ~1, weightsname = NULL, control_group = "notyettreated", anticipation = 0, alp = 0.05, cband = TRUE, biters = 100, cl = 1, gt_type = "att", probs = NULL, pre_copula = "long" )panel_qtt( yname, gname, tname, idname, data, xformula = ~1, weightsname = NULL, control_group = "notyettreated", anticipation = 0, alp = 0.05, cband = TRUE, biters = 100, cl = 1, gt_type = "att", probs = NULL, pre_copula = "long" )
yname |
Name of the outcome variable. |
gname |
Name of the treatment group variable (first treatment period; 0 for never-treated units). |
tname |
Name of the time period variable. |
idname |
Name of the unit id variable (required). |
data |
A data frame. |
xformula |
One-sided formula for covariates. Default |
weightsname |
Name of the sampling weights column. Default |
control_group |
|
anticipation |
Number of periods of anticipation. Default |
alp |
Significance level. Default |
cband |
Logical; uniform confidence band if |
biters |
Number of bootstrap iterations. Default |
cl |
Number of parallel clusters. Default |
gt_type |
|
probs |
Quantile grid for |
pre_copula |
|
For gt_type = "att", a pte_emp_boot object. For
gt_type = "qtt", a pte_qtt object.
Callaway, Brantly and Tong Li. “Quantile Treatment Effects in Difference-in-Differences Models with Panel Data.” Quantitative Economics 10(4), pp. 1579-1618, 2019.
data(mpdta, package = "did") ## Panel QTT with rolling pre-period copula (default pre_copula = "long") res <- panel_qtt(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "qtt", probs = seq(0.1, 0.9, 0.1), biters = 20) summary(res)data(mpdta, package = "did") ## Panel QTT with rolling pre-period copula (default pre_copula = "long") res <- panel_qtt(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "qtt", probs = seq(0.1, 0.9, 0.1), biters = 20) summary(res)
Computes the panel QTT and counterfactual outcome distribution
for a single (g,t) cell using the three-period copula-stability estimator
of Callaway and Li (2019). Serves directly as the attgt_fun
argument to ptetools::pte.
Identification. Under copula stability
and distributional parallel trends on changes
the counterfactual outcome for each treated unit is
where is the treated pre1
quantile at rank
(the Rosenblatt transform), and
is the control change at rank
.
The goal is distributional: is a sample from
, not individual counterfactuals.
Panel data required for both groups. Three periods for treated (pre2, pre1, post) and two for control (pre1, post).
panel_qtt_gt(gt_data, xformula = ~1, ...)panel_qtt_gt(gt_data, xformula = ~1, ...)
gt_data |
A |
xformula |
One-sided formula for covariates. Default |
... |
Additional arguments passed through by |
A ptetools::attgt_noif object with att and, in
extra_gt_returns, F0 (counterfactual ECDF), F1
(observed post ECDF), and Fte (individual-effect ECDF).
Callaway, Brantly and Tong Li. “Quantile Treatment Effects in Difference-in-Differences Models with Panel Data.” Quantitative Economics 10(4), pp. 1579-1618, 2019.
Plots a QTE object using autoplot.QTE.
## S3 method for class 'QTE' plot(x, cband = TRUE, ylab = "QTE", ...)## S3 method for class 'QTE' plot(x, cband = TRUE, ylab = "QTE", ...)
x |
a |
cband |
logical; if |
ylab |
label for the y-axis. Default |
... |
passed to |
invisibly returns the ggplot object.
Prints a summary.QTE object.
## S3 method for class 'summary.QTE' print(x, ...)## S3 method for class 'summary.QTE' print(x, ...)
x |
A |
... |
unused. |
None. Called for its side effect of printing.
Computes Quantile Treatment effects on the Treated (QTT) and the Average Treatment Effect on the Treated (ATT) using the Quantile Difference-in-Differences identification strategy of Athey and Imbens (2006). Handles two-period data and staggered treatment adoption uniformly. Supports both panel and repeated cross sections data.
qdid( yname, gname, tname, idname = NULL, data, panel = TRUE, xformula = ~1, weightsname = NULL, control_group = "notyettreated", anticipation = 0, alp = 0.05, cband = TRUE, biters = 100, cl = 1, ret_quantile = NULL, gt_type = "att", probs = NULL )qdid( yname, gname, tname, idname = NULL, data, panel = TRUE, xformula = ~1, weightsname = NULL, control_group = "notyettreated", anticipation = 0, alp = 0.05, cband = TRUE, biters = 100, cl = 1, ret_quantile = NULL, gt_type = "att", probs = NULL )
yname |
Name of the outcome variable in |
gname |
Name of the treatment group variable (first treatment period; 0 for never-treated units). |
tname |
Name of the time period variable. |
idname |
Name of the unit id variable. Required when
|
data |
A data frame. |
panel |
Logical; |
xformula |
One-sided formula for covariates used in the covariate
adjustment. Default |
weightsname |
Name of the column in |
control_group |
Which units to use as the comparison group:
|
anticipation |
Number of periods of anticipation. Default |
alp |
Significance level for confidence bands. Default |
cband |
Logical; if |
biters |
Number of bootstrap iterations. Default |
cl |
Number of clusters for parallel computation. Default |
ret_quantile |
Passed through to |
gt_type |
Type of group-time effect to compute. |
probs |
For |
For gt_type = "att", a pte_results object from
ptetools. For gt_type = "qtt", a pte_qtt object
with overall, group-specific, and dynamic QTT curves and bootstrap SEs.
Athey, Susan and Guido Imbens. “Identification and Inference in Nonlinear Difference-in-Differences Models.” Econometrica 74(2), pp. 431-497, 2006.
data(mpdta, package = "did") ## ATT aggregated across all groups and periods res_att <- qdid(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "att", biters = 20) summary(res_att) ## Full QTT curve at selected quantiles res_qtt <- qdid(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "qtt", probs = seq(0.1, 0.9, 0.1), biters = 20) summary(res_qtt)data(mpdta, package = "did") ## ATT aggregated across all groups and periods res_att <- qdid(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "att", biters = 20) summary(res_att) ## Full QTT curve at selected quantiles res_qtt <- qdid(yname = "lemp", gname = "first.treat", tname = "year", idname = "countyreal", data = mpdta, gt_type = "qtt", probs = seq(0.1, 0.9, 0.1), biters = 20) summary(res_qtt)
Computes the QDiD ATT and counterfactual outcome distribution
for a single 2x2 (pre/post x treated/control) data subset. Serves
directly as the attgt_fun argument to ptetools::pte. Panel
vs. repeated cross sections is detected automatically from whether the
same unit ids appear in both periods.
qdid_gt(gt_data, xformula = ~1, ...)qdid_gt(gt_data, xformula = ~1, ...)
gt_data |
A data frame (typically a |
xformula |
One-sided formula for covariates. Default |
... |
Additional arguments passed through by |
A ptetools::attgt_noif object with the ATT estimate and, in
extra_gt_returns, three objects: F1 (weighted ECDF of
observed treated outcomes in the post period), F0 (weighted ECDF
of counterfactual untreated outcomes for the treated group), and Fte
(weighted ECDF of individual treatment effects; NULL for repeated
cross sections).
Athey, Susan and Guido Imbens. “Identification and Inference in Nonlinear Difference-in-Differences Models.” Econometrica 74(2), pp. 431-497, 2006.
Main class of objects. A QTE object is returned by
all of the methods that compute the QTE or QTET.
QTE( qte, ate = NULL, qte.se = NULL, qte.lower = NULL, qte.upper = NULL, ate.se = NULL, ate.lower = NULL, ate.upper = NULL, c = NULL, alp = 0.05, pscore.reg = NULL, probs, type = "On the Treated", F.treated.t = NULL, F.untreated.t = NULL, F.treated.t.cf = NULL, F.treated.tmin1 = NULL, F.treated.tmin2 = NULL, F.treated.change.tmin1 = NULL, F.untreated.change.t = NULL, F.untreated.change.tmin1 = NULL, F.untreated.tmin1 = NULL, F.untreated.tmin2 = NULL, condQ.treated.t = NULL, condQ.treated.t.cf = NULL, eachIterList = NULL, inffunct = NULL, inffuncu = NULL )QTE( qte, ate = NULL, qte.se = NULL, qte.lower = NULL, qte.upper = NULL, ate.se = NULL, ate.lower = NULL, ate.upper = NULL, c = NULL, alp = 0.05, pscore.reg = NULL, probs, type = "On the Treated", F.treated.t = NULL, F.untreated.t = NULL, F.treated.t.cf = NULL, F.treated.tmin1 = NULL, F.treated.tmin2 = NULL, F.treated.change.tmin1 = NULL, F.untreated.change.t = NULL, F.untreated.change.tmin1 = NULL, F.untreated.tmin1 = NULL, F.untreated.tmin2 = NULL, condQ.treated.t = NULL, condQ.treated.t.cf = NULL, eachIterList = NULL, inffunct = NULL, inffuncu = NULL )
qte |
The Quantile Treatment Effect at each value of probs |
ate |
The Average Treatment Effect (or Average Treatment Effect on the Treated) |
qte.se |
A vector of standard errors for each qte |
qte.lower |
A vector of lower confidence intervals for each qte (it is based on the bootstrap confidence interval – not the se – so it may not be symmyetric about the qte |
qte.upper |
A vector of upper confidence intervals for each qte (it is based on the bootstrap confidence interval – not the se – so it may not be symmetric about the qte |
ate.se |
The standard error for the ATE |
ate.lower |
Lower confidence interval for the ATE (it is based on the bootstrap confidence intervall – not the se – so it may not be symmetric about the ATE |
ate.upper |
Upper confidence interval for the ATE (it is based on the bootstrap confidence interval – not the se – so it may not be symmetric about the ATE |
c |
The critical value from a KS-type statistic used for creating uniform confidence bands |
alp |
The significance level |
pscore.reg |
The results of propensity score regression, if specified |
probs |
The values for which the qte is computed |
type |
Takes the values "On the Treated" or "Population" to indicate whether the estimated QTE is for the treated group or for the entire population |
F.treated.t |
Distribution of treated outcomes for the treated group at period t |
F.untreated.t |
Distribution of untreated potential outcomes for the untreated group at period t |
F.treated.t.cf |
Counterfactual distribution of untreated potential outcomes for the treated group at period t |
F.treated.tmin1 |
Distribution of treated outcomes for the treated group at period tmin1 |
F.treated.tmin2 |
Distribution of treated outcomes for the treated group at period tmin2 |
F.treated.change.tmin1 |
Distribution of the change in outcomes for the treated group between periods tmin1 and tmin2 |
F.untreated.change.t |
Distribution of the change in outcomes for the untreated group between periods t and tmin1 |
F.untreated.change.tmin1 |
Distribution of the change in outcomes for the untreated group between periods tmin1 and tmin2 |
F.untreated.tmin1 |
Distribution of outcomes for the untreated group in period tmin1 |
F.untreated.tmin2 |
Distribution of outcomes for the untreated group in period tmin2 |
condQ.treated.t |
Conditional quantiles for the treated group in period t |
condQ.treated.t.cf |
Counterfactual conditional quantiles for the treated group in period t |
eachIterList |
An optional list of the outcome of each bootstrap iteration |
inffunct |
The influence function for the treated group; used for inference when there are multiple periods and in the case with panel data. It is needed for computing covariance terms in the variance-covariance matrix. |
inffuncu |
The influence function for the untreated group |
summary.QTE summarizes a QTE object, returning
formatted data frames for the overall ATE and the QTE table suitable for
printing.
## S3 method for class 'QTE' summary(object, ...)## S3 method for class 'QTE' summary(object, ...)
object |
A |
... |
unused. |
A summary.QTE object (a list with overall_ate and
qte_table data frames).
Estimates the Quantile Treatment Effect (QTE) or Quantile
Treatment Effect on the Treated (QTT) under unconfoundedness, also known
as selection on observables. The key identifying assumption is
, i.e., potential outcomes are
independent of treatment conditional on covariates .
Three estimation methods are available via est_method:
"ipw"Propensity-score reweighting (Firpo 2007). The
propensity score is estimated by logit or
probit and used to reweight the sample so that the covariate
distributions of the treated and untreated groups match. For the QTE,
both groups are reweighted toward the population distribution; for the
QTT, only the untreated group is reweighted toward the treated
covariate distribution.
"or"Outcome regression via quantile regression inversion.
rq is fit on a dense internal grid of
values, yielding a conditional quantile function
for each arm . The marginal
distribution is recovered by averaging conditional quantile functions
over the empirical covariate distribution (Melly 2006; Chernozhukov,
Fernandez-Val, and Melly 2013).
"aipw"Doubly-robust augmented IPW. Combines the propensity score model with the conditional quantile outcome model. The CDF estimator is consistent if either the propensity score or the outcome model is correctly specified (semiparametric efficiency when both are correct).
When xformla = ~1 (the default), all three methods reduce to
simple quantile differences between the treated and untreated groups, which
is consistent under unconditional unconfoundedness. Covariates are required
for covariate-adjusted estimation.
Standard errors and uniform confidence bands are computed via the
empirical bootstrap. Setting biters = 0 is planned for a future
version to skip inference and return point estimates only.
unc_qte( yname, dname, data, xformla = ~1, weightsname = NULL, probs = seq(0.05, 0.95, 0.05), alp = 0.05, biters = 100, cband = TRUE, boot_type = "empirical", method = c("logit", "probit"), est_method = c("ipw", "or", "aipw"), target = c("qte", "qtt"), cl = 1 )unc_qte( yname, dname, data, xformla = ~1, weightsname = NULL, probs = seq(0.05, 0.95, 0.05), alp = 0.05, biters = 100, cband = TRUE, boot_type = "empirical", method = c("logit", "probit"), est_method = c("ipw", "or", "aipw"), target = c("qte", "qtt"), cl = 1 )
yname |
character; name of the outcome variable in |
dname |
character; name of the binary treatment indicator in
|
data |
data.frame containing the analysis data. |
xformla |
one-sided formula for covariates used in the propensity
score and/or outcome model, e.g. |
weightsname |
character; name of a column in |
probs |
numeric vector of quantile levels at which to evaluate the
QTE or QTT. Default |
alp |
significance level for confidence intervals. Default 0.05. |
biters |
number of bootstrap iterations for standard errors and confidence bands. Default 100. |
cband |
logical; if |
boot_type |
bootstrap variant. Currently only |
method |
propensity score link function: |
est_method |
estimation method; one of:
|
target |
target parameter; one of:
|
cl |
number of cores for parallel bootstrap. Default 1 (sequential). |
An object of class QTE containing:
qtenumeric vector of estimated QTE (or QTT) at each
element of probs.
ateestimated ATE (or ATT when target = "qtt").
qte.sebootstrap standard errors for qte.
qte.lower, qte.upper
confidence interval bounds
for qte; uniform when cband = TRUE, pointwise otherwise.
ate.se, ate.lower, ate.upper
SE and CI
for ate.
probsthe probs vector passed by the user.
pscore.regfitted propensity score glm object, or
NULL when est_method = "or" or xformla = ~1.
Use summary() to print a formatted table and plot() to
display the QTE curve with confidence bands.
Firpo, Sergio. “Efficient Semiparametric Estimation of Quantile Treatment Effects.” Econometrica 75(1), pp. 259–276, 2007.
Melly, Blaise. “Estimation of Counterfactual Distributions Using Quantile Regression.” Working paper, University of St. Gallen, 2006.
Chernozhukov, Victor, Ivan Fernandez-Val, and Blaise Melly. “Inference on Counterfactual Distributions.” Econometrica 81(6), pp. 2205–2268, 2013.
data(lalonde) ## IPW, no covariates (simple quantile differences) q1 <- unc_qte(yname = "re78", dname = "treat", data = lalonde.psid, biters = 20, probs = seq(0.05, 0.95, 0.05)) summary(q1) plot(q1) ## OR with covariates, QTE xf <- ~ age + I(age^2) + education + black + hispanic + married + nodegree q2 <- unc_qte(yname = "re78", dname = "treat", data = lalonde.psid, xformla = xf, est_method = "or", biters = 20, probs = seq(0.05, 0.95, 0.05)) summary(q2) ## AIPW with covariates, QTT q3 <- unc_qte(yname = "re78", dname = "treat", data = lalonde.psid, xformla = xf, est_method = "aipw", target = "qtt", biters = 20, probs = seq(0.05, 0.95, 0.05)) summary(q3)data(lalonde) ## IPW, no covariates (simple quantile differences) q1 <- unc_qte(yname = "re78", dname = "treat", data = lalonde.psid, biters = 20, probs = seq(0.05, 0.95, 0.05)) summary(q1) plot(q1) ## OR with covariates, QTE xf <- ~ age + I(age^2) + education + black + hispanic + married + nodegree q2 <- unc_qte(yname = "re78", dname = "treat", data = lalonde.psid, xformla = xf, est_method = "or", biters = 20, probs = seq(0.05, 0.95, 0.05)) summary(q2) ## AIPW with covariates, QTT q3 <- unc_qte(yname = "re78", dname = "treat", data = lalonde.psid, xformla = xf, est_method = "aipw", target = "qtt", biters = 20, probs = seq(0.05, 0.95, 0.05)) summary(q3)