This is a major update that extends all estimators to support staggered treatment adoption. The API has changed substantially — please read this section before upgrading.
unc_qte() — cross-sectional QTE and QTT under unconfoundedness. Supports
IPW, outcome regression, and doubly robust (AIPW) estimation. Uses a
yname/dname interface consistent with the did/ptetools convention.
Replaces ci.qte() and ci.qtet(), which are retained as deprecated
wrappers.
cic() / cic_gt() — Change in Changes estimator for staggered treatment
adoption (Athey and Imbens 2006). Supports panel and repeated cross sections
data, and returns either ATT (gt_type = "att") or a full QTT curve
(gt_type = "qtt"). Replaces CiC(), which is retained as a deprecated
wrapper.
qdid() / qdid_gt() — Quantile Difference in Differences estimator for
staggered treatment adoption (Callaway, Li, and Oka 2018). Replaces QDiD(),
which is retained as a deprecated wrapper.
mdid() / mdid_gt() — Mean Difference in Differences estimator for
staggered treatment adoption (Callaway and Li 2019). Replaces MDiD(),
which is retained as a deprecated wrapper.
ddid() / ddid_gt() — Distributional Difference in Differences estimator
for staggered treatment adoption (Callaway and Li 2019). Replaces ddid2(),
which is retained as a deprecated wrapper.
panel_qtt() / panel_qtt_gt() — Panel QTT estimator using copula transfer
across pre-treatment periods (Callaway and Li 2019), with staggered treatment
adoption support. The pre_copula argument controls whether a rolling
("long", default) or fixed ("short") base period is used to transfer the
copula. Replaces panel.qtet(), which is retained as a deprecated wrapper.
lou_qte() — Lagged-outcome unconfoundedness QTT estimator for staggered
treatment adoption. Uses the lagged outcome as a control variable to identify
the QTT. New; no prior equivalent in the package.
The following functions emit a runtime deprecation warning via .Deprecated()
and will be removed in v2.1 (target: 2026-08). Each points to its modern
replacement in the warning message.
| Deprecated | Replacement |
|---|---|
| ci.qte() | unc_qte(target = "qte") |
| ci.qtet() | unc_qte(target = "qtt") |
| CiC() | cic() |
| QDiD() | qdid() |
| MDiD() | mdid() |
| ddid2() | ddid() |
| panel.qtet() | panel_qtt() |
computeDiffSE() — was dead code; never called anywhere in the package.
Design notes for a future QTT-vs-ATT test are in dev/NOTES.md.
DR(), spatt(), bounds() — removed in earlier 1.5.x development work.
qtes2mat(), diffQ() — formatting helpers tied to the legacy QTE class
with no internal callers.
Full testthat test suite added (83 fast tests; 10 slow bootstrap tests
skipped by default, enabled via R_SLOW_TESTS=true). The package previously
had no tests.
All new estimators are backed by ptetools::pte(). The attgt_fun hook
pattern makes it straightforward to add new identification strategies without
duplicating bootstrap or aggregation code.
Estimators now pass an explicit aggregation_fun to ptetools::pte(),
replacing the earlier implicit dispatch based on gt_type.
ptetools added to Imports (was missing from DESCRIPTION despite being
used).
Hmisc and texreg removed from Imports (were unused after earlier
cleanup).
License updated from GPL-2 to GPL-3.
cic2() for Change in Changes with multiple periods and variation in
treatment timing, using ptetools as a backend. This function was
experimental; it has been superseded by cic() in v2.0.0.alp argument rather than being stuck at alp = 0.05.ggqte() for pointwise
confidence intervals without re-estimating.panel.qtet(), QDiD(),
and CiC().ddid2() to compute quantile treatment effects under a Difference in
Differences assumption following Callaway and Li (2016).xformla argument)
rather than passing variable names directly.spatt().did package.