Package 'qte'

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

Help Index


qte: A package for computing quantile treatment effects

Description

logo

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').

Author(s)

Maintainer: Brantly Callaway [email protected]

Authors:

See Also

Useful links:


autoplot.QTE

Description

Plot a QTE object as a quantile treatment effect curve with optional confidence bands.

Usage

## S3 method for class 'QTE'
autoplot(object, cband = TRUE, ylab = "QTE", ...)

Arguments

object

a QTE object, as returned by unc_qte.

cband

logical; if TRUE (default), show the uniform confidence band stored in object$qte.upper / object$qte.lower. If FALSE, show pointwise intervals computed from object$qte.se.

ylab

label for the y-axis. Default "QTE".

...

unused.

Value

a ggplot object.


Change in Changes

Description

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.

Usage

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
)

Arguments

yname

Name of the outcome variable in data.

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 panel = TRUE.

data

A data frame.

panel

Logical; TRUE (default) for panel data, FALSE for repeated cross sections.

xformula

One-sided formula for covariates used in the covariate adjustment. Default ~1 uses no covariates.

weightsname

Name of the column in data containing sampling weights. Default NULL uses equal weights.

control_group

Which units to use as the comparison group: "notyettreated" (default) or "nevertreated".

anticipation

Number of periods of anticipation. Default 0.

alp

Significance level for confidence bands. Default 0.05.

cband

Logical; if TRUE (default) compute a uniform confidence band rather than pointwise intervals.

biters

Number of bootstrap iterations. Default 100.

cl

Number of clusters for parallel computation. Default 1.

ret_quantile

Passed through to ptetools for the "qott" case. Ignored when gt_type = "qtt" (use probs instead).

gt_type

Type of group-time effect to compute. "att" (default) returns ATT(g,t). "qtt" returns the full QTT curve over probs using mixture-CDF aggregation. "qott" returns the quantile of the individual treatment effect distribution under rank invariance (panel only).

probs

For gt_type = "qtt", the quantile grid at which to evaluate the QTT curve. Default is seq(0.05, 0.95, 0.05).

Value

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.

References

Athey, Susan and Guido Imbens. “Identification and Inference in Nonlinear Difference-in-Differences Models.” Econometrica 74(2), pp. 431-497, 2006.

Examples

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)

Change in Changes: group-time estimator

Description

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.

Usage

cic_gt(gt_data, xformula = ~1, ...)

Arguments

gt_data

A data frame (typically a gt_data_frame from ptetools) with columns name ("pre" or "post"), D (treatment dummy), Y (outcome), id (unit identifier), and any covariate columns referenced by xformula.

xformula

One-sided formula for covariates. Default ~1 uses no covariates. With covariates, covariate-conditioned quantile regressions are used following Athey and Imbens (2006).

...

Additional arguments passed through by ptetools; not used directly.

Value

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).

References

Athey, Susan and Guido Imbens. “Identification and Inference in Nonlinear Difference-in-Differences Models.” Econometrica 74(2), pp. 431-497, 2006.


Distributional Difference-in-Differences

Description

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 FY(0),postD=1F_{Y(0),\text{post}|D=1} is recovered by adding each control unit's actual change ΔYctrl,j\Delta Y_{\text{ctrl},j} 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.

Usage

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
)

Arguments

yname

Name of the outcome variable in data.

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 ~1 uses no covariates.

weightsname

Name of the column in data containing sampling weights. Default NULL uses equal weights.

control_group

Which units to use as the comparison group: "notyettreated" (default) or "nevertreated".

anticipation

Number of periods of anticipation. Default 0.

alp

Significance level for confidence bands. Default 0.05.

cband

Logical; if TRUE (default) compute a uniform confidence band rather than pointwise intervals.

biters

Number of bootstrap iterations. Default 100.

cl

Number of clusters for parallel computation. Default 1.

gt_type

Type of group-time effect to compute. "att" (default) returns ATT(g,t). "qtt" returns the full QTT curve over probs using mixture-CDF aggregation.

probs

For gt_type = "qtt", the quantile grid. Default is seq(0.05, 0.95, 0.05).

Value

For gt_type = "att", a pte_results object from ptetools. For gt_type = "qtt", a pte_qtt object.

References

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.

Examples

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)

Distributional DiD: group-time estimator

Description

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 jj is

kcfj=ΔYctrl,j+Q1,pre(uj)kcf_j = \Delta Y_{\text{ctrl},j} + Q_{1,\text{pre}}(u_j)

where ΔYctrl,j=Ypost,jYpre,j\Delta Y_{\text{ctrl},j} = Y_{\text{post},j} - Y_{\text{pre},j} is the observed change for control unit jj, uj=F0,pre(Ypre,j)u_j = F_{0,\text{pre}}(Y_{\text{pre},j}) is that unit's rank in the control pre-period distribution, and Q1,preQ_{1,\text{pre}} is the quantile function of the treated pre-period distribution. The unconditional counterfactual distribution FY(0),postD=1F_{Y(0),\text{post}|D=1} is then the (weighted) empirical CDF of {kcfj}\{kcf_j\}.

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 ΔYctrl,j\Delta Y_{\text{ctrl},j} for each control unit, which requires observing the same units in both periods.

Usage

ddid_gt(gt_data, xformula = ~1, ...)

Arguments

gt_data

A data frame (typically a gt_data_frame from ptetools) with columns name ("pre" or "post"), D (treatment dummy), Y (outcome), id (unit identifier), .w (sampling weights), and any covariate columns referenced by xformula. Control units must be observed in both periods.

xformula

One-sided formula for covariates. Default ~1 uses no covariates. With covariates, the unconditional rank uju_j is replaced by a conditional rank estimated via quantile regression on the control pre-period (QR0tmin1), and the treated pre-period quantile is replaced by a conditional quantile (QR1tmin1) evaluated at that rank and the control unit's own covariate values.

...

Additional arguments passed through by ptetools; not used directly.

Value

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).

References

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.


ggqte

Description

Deprecated. Use autoplot() on a QTE object instead.

Usage

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
)

Arguments

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

Value

a ggplot object


Lalonde (1986)'s NSW Dataset

Description

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.

Usage

data(lalonde)

Format

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.

References

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)


Lalonde's Experimental Dataset

Description

The cross sectional verion of the experimental part of the lalonde dataset. It is loaded with all the datasets with the command data(lalonde)


Lalonde's Panel Experimental Dataset

Description

The panel verion of the experimental part of the lalonde dataset. It is loaded with all the datasets with the command data(lalonde)


Lalonde's Observational Dataset

Description

The cross sectional verion of the observational part of the lalonde dataset. It is loaded with all the datasets with the command data(lalonde)


Lalonde's Panel Observational Dataset

Description

The panel verion of the observational part of the lalonde dataset. It is loaded with all the datasets with the command data(lalonde)


Lagged Outcome Unconfoundedness QTT

Description

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 Yg,t(0)DX,YpreY_{g,t}(0) \perp D \mid X, Y_{\text{pre}}, 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 gg and post-treatment period tt, 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 p^(X,Ypre)/(1p^(X,Ypre))\hat p(X,Y_{\text{pre}})/(1-\hat p(X,Y_{\text{pre}})) 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 (X,Ypre)(X, Y_{\text{pre}}), 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).

Usage

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
)

Arguments

yname

Name of the outcome variable in data.

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 panel = TRUE.

data

A data frame.

xformula

One-sided formula for additional covariates used in the propensity score and/or outcome model. Default ~1 uses no additional covariates beyond the lagged outcome (when lagged_outcome_cov = TRUE).

lagged_outcome_cov

Logical; if TRUE (default), the pre-treatment outcome is added as a covariate in both the propensity score and outcome models. Requires panel = TRUE.

est_method

Estimation method: "ipw" (default), "or", or "aipw". See Details.

panel

Logical; TRUE (default) for panel data, FALSE for repeated cross sections. lagged_outcome_cov = TRUE requires panel = TRUE.

weightsname

Name of the column in data containing sampling weights. Default NULL uses equal weights.

control_group

Which units to use as the comparison group: "notyettreated" (default) or "nevertreated".

anticipation

Number of periods of anticipation. Default 0.

alp

Significance level for confidence intervals. Default 0.05.

cband

Logical; if TRUE (default), report a simultaneous confidence band (uniform over all quantiles in probs) in addition to pointwise intervals.

biters

Number of bootstrap iterations. Default 100.

cl

Number of clusters for parallel bootstrap. Default 1.

gt_type

Type of group-time effect to compute. "att" (default) returns the ATT curve aggregated over (g,t) cells. "qtt" returns the full QTT curve over probs using mixture-CDF aggregation.

probs

For gt_type = "qtt", the quantile grid at which to evaluate the QTT. Default seq(0.05, 0.95, 0.05).

Value

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.

References

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.

See Also

unc_qte for the cross-sectional (non-staggered) version. cic, qdid, mdid for alternative identification strategies with staggered adoption.

Examples

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)

Mean Difference-in-Differences

Description

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 Δ=E[YpostD=0]E[YpreD=0]\Delta = E[Y_{\text{post}}|D=0] - E[Y_{\text{pre}}|D=0], so QY(0),postD=1(τ)=QY,preD=1(τ)+ΔQ_{Y(0),\text{post}|D=1}(\tau) = Q_{Y,\text{pre}|D=1}(\tau) + \Delta. 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 Δ(Xi)=E[YpostD=0,Xi]E[YpreD=0,Xi]\Delta(X_i) = E[Y_{\text{post}}|D=0,X_i] - E[Y_{\text{pre}}|D=0,X_i], estimated by weighted OLS. The counterfactual for treated unit ii is Ypre,i+Δ(Xi)Y_{\text{pre},i} + \Delta(X_i), and the unconditional counterfactual distribution is the empirical CDF of these values. By the law of iterated expectations, this consistently estimates FY(0),postD=1F_{Y(0),\text{post}|D=1}.

Usage

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
)

Arguments

yname

Name of the outcome variable in data.

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 panel = TRUE.

data

A data frame.

panel

Logical; TRUE (default) for panel data, FALSE for repeated cross sections.

xformula

One-sided formula for covariates. Default ~1 uses no covariates.

weightsname

Name of the column in data containing sampling weights. Default NULL uses equal weights.

control_group

Which units to use as the comparison group: "notyettreated" (default) or "nevertreated".

anticipation

Number of periods of anticipation. Default 0.

alp

Significance level for confidence bands. Default 0.05.

cband

Logical; if TRUE (default) compute a uniform confidence band rather than pointwise intervals.

biters

Number of bootstrap iterations. Default 100.

cl

Number of clusters for parallel computation. Default 1.

ret_quantile

Passed through to ptetools for the "qott" case.

gt_type

Type of group-time effect to compute. "att" (default) returns ATT(g,t). "qtt" returns the full QTT curve over probs using mixture-CDF aggregation. "qott" returns the quantile of the individual treatment effect distribution (panel only).

probs

For gt_type = "qtt", the quantile grid at which to evaluate the QTT curve. Default is seq(0.05, 0.95, 0.05).

Value

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.

References

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.

Examples

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)

Mean Difference-in-Differences: group-time estimator

Description

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:

FY(0),postD=1(y)=FY,preD=1(yΔ)F_{Y(0),\text{post}|D=1}(y) = F_{Y,\text{pre}|D=1}(y - \Delta)

where Δ=E[YpostD=0]E[YpreD=0]\Delta = E[Y_{\text{post}}|D=0] - E[Y_{\text{pre}}|D=0] is the mean DiD (the change in mean outcomes for the untreated group). The counterfactual quantile function is therefore QY(0),postD=1(τ)=QY,preD=1(τ)+ΔQ_{Y(0),\text{post}|D=1}(\tau) = Q_{Y,\text{pre}|D=1}(\tau) + \Delta.

Covariate adjustment. With covariates, the scalar shift Δ\Delta is replaced by a unit-specific conditional mean shift Δ(Xi)=E[YpostD=0,Xi]E[YpreD=0,Xi]\Delta(X_i) = E[Y_{\text{post}}|D=0, X_i] - E[Y_{\text{pre}}|D=0, X_i], estimated by weighted OLS on the control group in each period. The counterfactual for treated pre-period unit ii is Ypre,i+Δ(Xi)Y_{\text{pre},i} + \Delta(X_i). The unconditional counterfactual distribution is the empirical CDF of these shifted values, which by the law of iterated expectations consistently estimates FY(0),postD=1(y)=FY,preD=1,X=x(yΔ(x))dFXD=1(x)F_{Y(0),\text{post}|D=1}(y) = \int F_{Y,\text{pre}|D=1,X=x}(y - \Delta(x))\,dF_{X|D=1}(x).

Usage

mdid_gt(gt_data, xformula = ~1, ...)

Arguments

gt_data

A data frame (typically a gt_data_frame from ptetools) with columns name ("pre" or "post"), D (treatment dummy), Y (outcome), id (unit identifier), .w (sampling weights), and any covariate columns referenced by xformula.

xformula

One-sided formula for covariates. Default ~1 uses no covariates. With covariates, separate weighted OLS regressions are fit on the control group in each period; see Details above.

...

Additional arguments passed through by ptetools; not used directly.

Value

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).

References

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.


Panel QTT (Callaway-Li 2019)

Description

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 FY(0)postD=1F_{Y(0)^{\text{post}}|D=1} 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.

Usage

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"
)

Arguments

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 ~1.

weightsname

Name of the sampling weights column. Default NULL.

control_group

"notyettreated" (default) or "nevertreated".

anticipation

Number of periods of anticipation. Default 0.

alp

Significance level. Default 0.05.

cband

Logical; uniform confidence band if TRUE (default).

biters

Number of bootstrap iterations. Default 100.

cl

Number of parallel clusters. Default 1.

gt_type

"att" (default) or "qtt".

probs

Quantile grid for gt_type = "qtt". Default seq(0.05, 0.95, 0.05).

pre_copula

"long" (default) or "short". See Details.

Value

For gt_type = "att", a pte_emp_boot object. For gt_type = "qtt", a pte_qtt object.

References

Callaway, Brantly and Tong Li. “Quantile Treatment Effects in Difference-in-Differences Models with Panel Data.” Quantitative Economics 10(4), pp. 1579-1618, 2019.

See Also

cic, qdid, mdid, ddid

Examples

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)

Panel QTT: group-time estimator (Callaway-Li 2019)

Description

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

C(FYpre2D=1,FΔYpreD=1)=C(FYpre1(0)D=1,FΔYpost(0)D=1)C(F_{Y^{\text{pre2}}|D=1},\, F_{\Delta Y^{\text{pre}}|D=1}) = C(F_{Y^{\text{pre1}}(0)|D=1},\, F_{\Delta Y^{\text{post}}(0)|D=1})

and distributional parallel trends on changes

FΔYpost(0)D=1=FΔYctrlF_{\Delta Y^{\text{post}}(0)|D=1} = F_{\Delta Y^{\text{ctrl}}}

the counterfactual outcome for each treated unit ii is kcfi=Li+Ci,kcf_i = L_i + C_i, where Li=QYpre1D=1(ui)L_i = Q_{Y^{\text{pre1}}|D=1}(u_i) is the treated pre1 quantile at rank ui=FYpre2D=1(Yipre2)u_i = F_{Y^{\text{pre2}}|D=1}(Y^{\text{pre2}}_i) (the Rosenblatt transform), and Ci=QΔYctrl(vi)C_i = Q_{\Delta Y^{\text{ctrl}}}(v_i) is the control change at rank vi=FΔYpreD=1(ΔYipre)v_i = F_{\Delta Y^{\text{pre}}|D=1}(\Delta Y^{\text{pre}}_i). The goal is distributional: {kcfi}\{kcf_i\} is a sample from FY(0)postD=1F_{Y(0)^{\text{post}}|D=1}, not individual counterfactuals.

Panel data required for both groups. Three periods for treated (pre2, pre1, post) and two for control (pre1, post).

Usage

panel_qtt_gt(gt_data, xformula = ~1, ...)

Arguments

gt_data

A gt_data_frame with columns name ("pre2", "pre1", "post"), D, Y, id, .w, and any covariate columns.

xformula

One-sided formula for covariates. Default ~1.

...

Additional arguments passed through by ptetools.

Value

A ptetools::attgt_noif object with att and, in extra_gt_returns, F0 (counterfactual ECDF), F1 (observed post ECDF), and Fte (individual-effect ECDF).

References

Callaway, Brantly and Tong Li. “Quantile Treatment Effects in Difference-in-Differences Models with Panel Data.” Quantitative Economics 10(4), pp. 1579-1618, 2019.


plot.QTE

Description

Plots a QTE object using autoplot.QTE.

Usage

## S3 method for class 'QTE'
plot(x, cband = TRUE, ylab = "QTE", ...)

Arguments

x

a QTE object, as returned by unc_qte.

cband

logical; if TRUE (default), show the uniform confidence band. If FALSE, show pointwise intervals.

ylab

label for the y-axis. Default "QTE".

...

passed to autoplot.QTE.

Value

invisibly returns the ggplot object.


Print summary.QTE

Description

Prints a summary.QTE object.

Usage

## S3 method for class 'summary.QTE'
print(x, ...)

Arguments

x

A summary.QTE object.

...

unused.

Value

None. Called for its side effect of printing.


Quantile Difference-in-Differences

Description

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.

Usage

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
)

Arguments

yname

Name of the outcome variable in data.

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 panel = TRUE.

data

A data frame.

panel

Logical; TRUE (default) for panel data, FALSE for repeated cross sections.

xformula

One-sided formula for covariates used in the covariate adjustment. Default ~1 uses no covariates.

weightsname

Name of the column in data containing sampling weights. Default NULL uses equal weights.

control_group

Which units to use as the comparison group: "notyettreated" (default) or "nevertreated".

anticipation

Number of periods of anticipation. Default 0.

alp

Significance level for confidence bands. Default 0.05.

cband

Logical; if TRUE (default) compute a uniform confidence band rather than pointwise intervals.

biters

Number of bootstrap iterations. Default 100.

cl

Number of clusters for parallel computation. Default 1.

ret_quantile

Passed through to ptetools for the "qott" case.

gt_type

Type of group-time effect to compute. "att" (default) returns ATT(g,t). "qtt" returns the full QTT curve over probs using mixture-CDF aggregation. "qott" returns the quantile of the individual treatment effect distribution (panel only).

probs

For gt_type = "qtt", the quantile grid at which to evaluate the QTT curve. Default is seq(0.05, 0.95, 0.05).

Value

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.

References

Athey, Susan and Guido Imbens. “Identification and Inference in Nonlinear Difference-in-Differences Models.” Econometrica 74(2), pp. 431-497, 2006.

Examples

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)

Quantile Difference-in-Differences: group-time estimator

Description

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.

Usage

qdid_gt(gt_data, xformula = ~1, ...)

Arguments

gt_data

A data frame (typically a gt_data_frame from ptetools) with columns name ("pre" or "post"), D (treatment dummy), Y (outcome), id (unit identifier), .w (sampling weights), and any covariate columns referenced by xformula.

xformula

One-sided formula for covariates. Default ~1 uses no covariates. With covariates, conditional quantile regressions are used following Athey and Imbens (2006).

...

Additional arguments passed through by ptetools; not used directly.

Value

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).

References

Athey, Susan and Guido Imbens. “Identification and Inference in Nonlinear Difference-in-Differences Models.” Econometrica 74(2), pp. 431-497, 2006.


QTE

Description

Main class of objects. A QTE object is returned by all of the methods that compute the QTE or QTET.

Usage

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
)

Arguments

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

Description

summary.QTE summarizes a QTE object, returning formatted data frames for the overall ATE and the QTE table suitable for printing.

Usage

## S3 method for class 'QTE'
summary(object, ...)

Arguments

object

A QTE object, as returned by unc_qte.

...

unused.

Value

A summary.QTE object (a list with overall_ate and qte_table data frames).


unc_qte

Description

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 (Y(0),Y(1))DX(Y(0), Y(1)) \perp D \mid X, i.e., potential outcomes are independent of treatment conditional on covariates XX.

Three estimation methods are available via est_method:

"ipw"

Propensity-score reweighting (Firpo 2007). The propensity score p(X)=P(D=1X)p(X) = P(D=1|X) 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 τ\tau values, yielding a conditional quantile function QYX,D=j(τ)Q_{Y|X,D=j}(\tau) for each arm jj. 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.

Usage

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
)

Arguments

yname

character; name of the outcome variable in data.

dname

character; name of the binary treatment indicator in data (1 = treated, 0 = untreated).

data

data.frame containing the analysis data.

xformla

one-sided formula for covariates used in the propensity score and/or outcome model, e.g. ~ age + I(age^2) + education. Default ~1 uses no covariates (simple quantile differences).

weightsname

character; name of a column in data containing sampling weights. Default NULL applies equal weights.

probs

numeric vector of quantile levels at which to evaluate the QTE or QTT. Default seq(0.05, 0.95, 0.05).

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 TRUE (default), report a uniform confidence band (simultaneous over all quantiles in probs) in addition to pointwise intervals.

boot_type

bootstrap variant. Currently only "empirical" is supported.

method

propensity score link function: "logit" (default) or "probit". Used by est_method = "ipw" and "aipw".

est_method

estimation method; one of:

  • "ipw" (default) — inverse propensity weighting

  • "or" — outcome regression via quantile regression inversion

  • "aipw" — doubly-robust augmented IPW

target

target parameter; one of:

  • "qte" (default) — population QTE: QY(1)(τ)QY(0)(τ)Q_{Y(1)}(\tau) - Q_{Y(0)}(\tau)

  • "qtt" — QTT (effect on the treated): QY(1)D=1(τ)QY(0)D=1(τ)Q_{Y(1)|D=1}(\tau) - Q_{Y(0)|D=1}(\tau)

cl

number of cores for parallel bootstrap. Default 1 (sequential).

Value

An object of class QTE containing:

qte

numeric vector of estimated QTE (or QTT) at each element of probs.

ate

estimated ATE (or ATT when target = "qtt").

qte.se

bootstrap 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.

probs

the probs vector passed by the user.

pscore.reg

fitted 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.

References

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.

Examples

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)