Skip to content

Commit ce5972c

Browse files
igerberclaude
andcommitted
docs: address AI review round 1 on CiC/QDiD paper reviews
- Separate the ecic (staggered event-study CiC, Section 6 lineage) and Ciaccio (copula-based staggered distributional DiD) threads in the Athey-Imbens review's Section 6 deferral notes (Finding 1) - Flag Ciaccio p. 22 IPW display's sum_{i in r} + C-indicator inconsistency; give the implementable Hajek-normalized never-treated form inline and as Gaps item 17 (Finding 2) - Verify AI 2006 footnote 31 against journal p. 463: the paper itself prints half-range (y_upper - y_lower)/2 while calling it the support midpoint; flag as suspected typo, instruct true-midpoint split (Finding 3) - Verify MS 2015 Lemma 3 against p. 14: the paper prints the negative h_2 sign (and cites G^{-1} inversion in a proof that inverts F); flag as suspected copy-paste typo from Lemma 2 with re-derive instruction (Finding 4) - Update ROADMAP Ciaccio row to reviewed-deferred status so it matches the review doc's claim (Finding 5) - Fix inline-code backticks on the F_hat^{-1}(0) convention (Finding 6) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011hismLBFcUbUzvDRq8ruWb
1 parent e541022 commit ce5972c

4 files changed

Lines changed: 12 additions & 7 deletions

File tree

ROADMAP.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ Research-informed candidates. Each has a rationale, a tractability note, and a c
3232
### Methodology extensions
3333

3434
- **Nonparametric / flexible outcome regression for `EfficientDiD` DR covariate path** (Chen, Sant'Anna & Xie, arXiv:2506.17729, 2025, Section 4). The shipped staggered `EfficientDiD` uses a linear OLS outcome regression in its doubly-robust covariate path; that preserves DR consistency but does not generically attain the semiparametric efficiency bound unless the conditional mean is linear in the covariates. Replacing the OLS outcome regression with sieve / kernel / ML nuisance estimation (as the paper's Section 4 allows) would close the efficiency gap on the covariate path. Tractability: medium; the hook points are in `diff_diff/efficient_did_covariates.py`. **Commit when**: a paper-review synthesis is written, with an implementation plan for the nonparametric OR that preserves the existing DR consistency guarantees and survey-weighted variance surface.
35-
- **Distributional DiD for staggered timing** (Ciaccio, arXiv:2408.01208, 2024). New estimator extending Callaway-Li QTT to staggered adoption. `CallawaySantAnna` currently gives mean ATT only; this unlocks quantile effects. Tractability: medium. **Commit when**: a health-econ or public-health user reports need for quantile effects in a repeated-cross-section design.
35+
- **Distributional DiD for staggered timing** (Ciaccio, arXiv:2408.01208, 2024). New estimator extending Callaway-Li QTT to staggered adoption. `CallawaySantAnna` currently gives mean ATT only; this unlocks quantile effects. Tractability: medium. **Reviewed 2026-07** (`docs/methodology/papers/ciaccio-2024-review.md`); implementation deferred pending demand. **Commit when**: a health-econ or public-health user reports need for quantile effects in a repeated-cross-section design.
3636
- **Local Projections DiD** (Dube, Girardi, Jordà & Taylor, JAE 2025). New estimator with flexible impulse-response and robustness to dynamic misspecification; natural for anticipation-prone settings. Tractability: well-scoped. **Commit when**: a methodology review confirms the dynamic variant's variance derivation fits our SE helpers.
3737
- **Few-treated-units inference option** (Alvarez, Ferman & Wüthrich, arXiv:2504.19841, 2025). `inference=` option covering t(G-1) corrections, randomization inference, and Ferman-Pinto-style permutation tests. Current SE paths assume large-G asymptotics. Tractability: medium. **Commit when**: a user reports sparse-treatment pain.
3838
- **Riesz-representation sensitivity** (Bach et al., arXiv:2510.09064, 2025). Confounder-based sensitivity bound complementing HonestDiD's trend-based bound. Tractability: medium. **Commit when**: HonestDiD users ask for confounder bounds.

docs/methodology/papers/athey-imbens-2006-review.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ Equation (20) is k^CIC with the roles of groups 0 and 1 reversed; implement by e
167167
```
168168

169169
p captures estimation error from F_hat_Y,00, q from F_hat_Y,01^{-1}, r sampling variation of the transformed Y_10 draws, s the Y_11 mean. Asymptotically linear representation (p. 463): `tau_hat = tau + (1/N_00) sum p(Y_00,i) + (1/N_01) sum q(Y_01,i) + (1/N_10) sum r(Y_10,i) + (1/N_11) sum s(Y_11,i) + o_p(N^{-1/2})`.
170-
- Variance estimation (Theorem 5.2, pp. 463-464): plug in empirical CDFs/inverses and ANY uniformly consistent nonparametric density estimator (uniform consistency must include the boundary, footnote 31); `p_hat(y) = (1/N_10) sum_j P_hat(y, Y_10,j)`, `q_hat(y) = (1/N_10) sum_j Q_hat(y, Y_10,j)`, then `V_hat^p = (1/N_00) sum_i p_hat(Y_00,i)^2` (and analogously q, r, s), `alpha_hat_gt = N_gt/N`; all converge in probability to their targets. Footnote 31's concrete density estimator: one-sided difference quotient of the EDF with bandwidth `N^{-1/3}`, forward difference on the lower half of the support and backward on the upper half (split at the support midpoint `Y_tilde_gt = (y_upper_gt - y_lower_gt)/2`), guaranteeing boundary-uniform consistency:
170+
- Variance estimation (Theorem 5.2, pp. 463-464): plug in empirical CDFs/inverses and ANY uniformly consistent nonparametric density estimator (uniform consistency must include the boundary, footnote 31); `p_hat(y) = (1/N_10) sum_j P_hat(y, Y_10,j)`, `q_hat(y) = (1/N_10) sum_j Q_hat(y, Y_10,j)`, then `V_hat^p = (1/N_00) sum_i p_hat(Y_00,i)^2` (and analogously q, r, s), `alpha_hat_gt = N_gt/N`; all converge in probability to their targets. Footnote 31's (p. 463) concrete density estimator: one-sided difference quotient of the EDF with bandwidth `N^{-1/3}`, forward difference below the split point `Y_tilde_gt` and backward above it, guaranteeing boundary-uniform consistency. As printed the footnote calls `Y_tilde_gt` "the midpoint of the support" but defines `Y_tilde_gt = (y_upper_gt - y_lower_gt)/2`, which is the half-range, not the midpoint `(y_upper_gt + y_lower_gt)/2` - see the suspected-typos block in Gaps and Uncertainties; an implementation should split at the true midpoint:
171171

172172
```
173173
f_hat_Y,gt(y) = ( F_hat_Y,gt(y + N^{-1/3}) - F_hat_Y,gt(y) ) / N^{-1/3} if y <= Y_tilde_gt
@@ -208,7 +208,7 @@ C^pq = E[p(Y_00)*q(Y_01)], C^rs = E[r(Y_10)*s(Y_11)] = Cov( k(Y_10), Y_11 )
208208
*Algorithm (no numbered algorithm in the paper; assembled from eqs. 34-36, Section 5.1, pp. 461-462):*
209209
1. Validate the 2x2 design; split the sample into the four (g,t) cells.
210210
2. Compute the empirical CDFs `F_hat_Y,gt` (eq. 34) for cells (0,0), (0,1), (1,0), and the sample mean of the (1,1) cell.
211-
3. Transform every treated pre-period observation: `y_i -> F_hat_Y,01^{-1}( F_hat_Y,00(Y_10,i) )`, using exactly the eq. (35)/(A.1) inverse (ceiling order statistic `Y_(ceil(Nq))`, `F_hat^{-1}(0) = ` sample minimum).
211+
3. Transform every treated pre-period observation: `y_i -> F_hat_Y,01^{-1}( F_hat_Y,00(Y_10,i) )`, using exactly the eq. (35)/(A.1) inverse (ceiling order statistic `Y_(ceil(Nq))`, with `F_hat^{-1}(0)` = sample minimum).
212212
4. `tau_hat^CIC = mean(Y_11) - mean(transformed Y_10)` (eq. 36).
213213
5. Quantile effects at requested q ∈ (q_lower, q_upper): `tau_hat_q^CIC = F_hat_Y,11^{-1}(q) - F_hat_Y,01^{-1}(F_hat_Y,00(F_hat_Y,10^{-1}(q)))`.
214214
6. Inference: v1 bootstrap (units in panel mode, within-cell in repeated cross-section mode); paper's analytical variance (Theorems 5.1-5.3, 5.5-5.6) deferred.
@@ -319,12 +319,12 @@ Setup: groups `G = {1,...,N_G}`, periods `T = {1,...,N_T}`; `I` = set of treated
319319
tau_hat^CIC_I = (A' V_hat_J^(-) A)^{-1} (A' V_hat_J^(-) kappa_hat_J) [Theorem 6.3: sqrt(N)-normal, variance (A' V_J^(-) A)^{-1}]
320320
```
321321

322-
Aggregation `tau_Lambda = Lambda' tau^CIC_I` (columns of Lambda sum to 1): sample-size weights `Lambda_{g,t} = N_{g,t}/sum N_{g,t}` are the natural default; variance-minimizing weights are appropriate only under constant effects (p. 475). Tests: **Theorem 6.4** overidentification/specification statistic `N (kappa_hat_J - A tau_hat_I)' V_hat_J^(-) (kappa_hat_J - A tau_hat_I) -->d Chi2(rank(V_J) - N_I)` - has power against violations of `U ⊥ T | G`, including additive random group-time effects (p. 476); equality-of-effects statistic `-->d Chi2(N_I - 1)` under `tau_{g,t} = tau` for all treated pairs (GLS-weighted pooled estimate; p. 476). diff-diff defers this section (Ciaccio / `ecic` staggered event-study CiC is the reference for the extension).
322+
Aggregation `tau_Lambda = Lambda' tau^CIC_I` (columns of Lambda sum to 1): sample-size weights `Lambda_{g,t} = N_{g,t}/sum N_{g,t}` are the natural default; variance-minimizing weights are appropriate only under constant effects (p. 475). Tests: **Theorem 6.4** overidentification/specification statistic `N (kappa_hat_J - A tau_hat_I)' V_hat_J^(-) (kappa_hat_J - A tau_hat_I) -->d Chi2(rank(V_J) - N_I)` - has power against violations of `U ⊥ T | G`, including additive random group-time effects (p. 476); equality-of-effects statistic `-->d Chi2(N_I - 1)` under `tau_{g,t} = tau` for all treated pairs (GLS-weighted pooled estimate; p. 476). diff-diff defers this section. Two distinct follow-on threads exist and must not be conflated: the R `ecic` package (Kluser) implements a staggered event-study extension of the CiC transformation itself (the natural descendant of this Section 6 machinery), while Ciaccio's staggered distributional DiD (reviewed separately in `ciaccio-2024-review.md`) is a copula-based Callaway-Li-style QTT method with different identifying assumptions - not an implementation of Section 6.
323323

324324
**Reference implementation(s):**
325325
- R: `qte::CiC()` and `qte::QDiD()` (Callaway's qte package - the project's chosen parity target; bootstrap inference, panel and repeated cross-section support)
326326
- Stata: `cic` (Kranker) - implements the analytical SEs (Theorems 5.1-5.3) and the discrete-outcome bounds
327-
- R: `ecic` (Kluser) - staggered event-study CiC (relevant to the deferred Section 6 extension)
327+
- R: `ecic` (Kluser) - staggered event-study CiC, i.e. the CiC transformation applied per cohort-period (the implementation lineage closest to the deferred Section 6 extension). Not to be conflated with Ciaccio's copula-based staggered distributional DiD, which is a distinct method reviewed separately
328328
- The paper itself points to the Econometrica supplement for the empirical application (Meyer-Viscusi-Durbin (1995) injury-duration data; headline finding: CiC vs standard DiD results can differ in both magnitude and significance, p. 477)
329329

330330
**Requirements checklist:**
@@ -345,7 +345,7 @@ Aggregation `tau_Lambda = Lambda' tau^CIC_I` (columns of Lambda sum to 1): sampl
345345

346346
**Planned diff-diff v1 scope (2026-07-12):**
347347
- Ship: `ChangesInChanges` + `QDiD`, 2x2 design, continuous outcomes, bootstrap inference, panel + repeated cross-section modes.
348-
- Deferred: covariates (Theorems 4.3-4.4 and the Section 5.1 residual route; Melly-Santangelo is the modern reference), discrete-outcome bounds (Section 4 identification / Section 5.2 inference, incl. Imbens-Manski intervals), analytical SEs (Theorems 5.1-5.3, 5.5-5.7; Appendix B covariances), multiple groups/periods (Section 6; Ciaccio / `ecic`).
348+
- Deferred: covariates (Theorems 4.3-4.4 and the Section 5.1 residual route; Melly-Santangelo is the modern reference), discrete-outcome bounds (Section 4 identification / Section 5.2 inference, incl. Imbens-Manski intervals), analytical SEs (Theorems 5.1-5.3, 5.5-5.7; Appendix B covariances), multiple groups/periods (Section 6; `ecic` for the staggered event-study CiC lineage - Ciaccio's copula-based staggered distributional DiD is a distinct method, reviewed separately).
349349
- All deferred material is reviewed in this document so the deferral is documented, not silent.
350350

351351
### Data Structure Requirements
@@ -388,6 +388,7 @@ Aggregation `tau_Lambda = Lambda' tau^CIC_I` (columns of Lambda sum to 1): sampl
388388
- Theorem 5.7, second display (p. 469): the `V_upper^r` term's denominator prints as `alpha_10` where the panel notation elsewhere in the theorem uses `alpha_1`. Likely a typo; an implementation should use `alpha_1`.
389389
- Lemma A.4 (pp. 479-480): the printed oscillation modulus reads `F_hat_Y(y+x) - F_hat_Y(x)` where the standard Stute (1982) modulus has `F_hat_Y(y+x) - F_hat_Y(y)`, matching the population term `F_Y(y+x) - F_Y(y)`. Likely a typesetting slip.
390390
- Appendix B, case 2 (p. 493): printed with explicit argument notation `(Y_{g0,t0})` and a division by `alpha_{g0,t0}`, unlike every other case; the two readings are numerically equivalent (`N*E[mu_hat mu_hat'] = E[infl-fn product]/alpha_gt` for same-cell averages). Treat the per-shared-cell `N*E[mu_hat mu_hat']` pattern as the intended formula.
391+
- Footnote 31 (p. 463): the split point of the one-sided density estimator is described as "the midpoint of the support" but printed as `Y_tilde_gt = (y_upper_gt - y_lower_gt)/2` - the half-range, not the midpoint `(y_upper_gt + y_lower_gt)/2` (the two coincide only when `y_lower_gt = 0`). An implementation of the deferred analytical-SE path should split at the true midpoint; the printed half-range can fall outside the support (e.g. negative-valued outcomes), which would apply the wrong one-sided difference near a boundary.
391392
- Theorem 5.4 proof (p. 492): the final estimation-error term's summand sign is printed inconsistently with the preceding line's decomposition (`k_lower_hat - k_lower` vs `k_lower - k_lower_hat`); immaterial since the term converges to zero (Lemma A.13).
392393
- Equality-of-effects test (p. 476): typeset ambiguity between `A` and `A_I` in the weight matrix `Lambda = (iota' A_I' V_J^(-) A iota)^{-1} iota' A' V_J^(-) A` and in the test statistic's sandwich; the structure (GLS weighting with the generalized inverse) is clear, but consult p. 476 before implementing.
393394

docs/methodology/papers/ciaccio-2024-review.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ F^{p,-1}_{Delta_{[r-rho-1,t]}Y(0)|d_r=1}(delta) =
256256
/ [ (1/n_{r,t}) sum_{i in r} (C/p_r) ( p-hat_r(x_i) / (1 - p-hat_r(x_i)) ) ]
257257
```
258258

259-
(As printed the LHS carries the `p,-1` superscript although the display is the reweighted CDF of Eq. (3), i.e. a Hajek-normalized estimator; inversion then yields the quantile.) `n_{r,t}` = number of units used to compute `QTT-hat_{r,t,rho}(tau)`; `p-hat(X)` is an estimator of the generalized propensity score; the denominator normalizes weights to sum to 1 in finite samples, ensuring `F^p(.)` is a proper distribution function. The propensity score can be estimated parametrically or non-parametrically (both Firpo 2007 and Callaway-Li 2019 show this).
259+
(Two as-printed notation issues here - see Gaps item 17. First, the LHS carries the `p,-1` superscript although the display is the reweighted CDF of Eq. (3), i.e. a Hajek-normalized estimator; inversion then yields the quantile. Second, both sums are written `sum_{i in r}` while numerator and denominator carry the never-treated dummy `C` - over literal cohort-r units every term would be zero. Read `i in r` as the (r,t) estimation subsample - cohort r plus never-treated - with `C_i` selecting the never-treated contributions. The implementable form is a Hajek-normalized CDF over never-treated units with weight `w_i = C_i * p-hat_r(x_i) / (p-hat_r * (1 - p-hat_r(x_i)))`: compute `F-hat^p(delta) = sum_i w_i * 1{DeltaY_i <= delta} / sum_i w_i`, then invert.) `n_{r,t}` = number of units used to compute `QTT-hat_{r,t,rho}(tau)`; `p-hat(X)` is an estimator of the generalized propensity score; the denominator normalizes weights to sum to 1 in finite samples, ensuring `F^p(.)` is a proper distribution function. The propensity score can be estimated parametrically or non-parametrically (both Firpo 2007 and Callaway-Li 2019 show this).
260260

261261
*Case C - fully conditional (Proposition 2) (p. 22):*
262262

@@ -617,3 +617,4 @@ No smoothing parameters exist anywhere in the method.
617617
14. **Wild/subcluster bootstrap is a pointer, not a procedure** (p. 22): the clustered-inference route is described as adapting MacKinnon-Webb (2018) "with minor modifications" with no algorithmic detail; a future implementation would have to derive the QTT adaptation itself.
618618
15. **Extraction coverage.** This review synthesizes three extraction passes (pp. 1-20, pp. 16-35, pp. 31-44; printed page = PDF page) with overlaps on pp. 16-20 and 31-35 reconciled as documented; References (pp. 33-36) were skipped by design. Tables 2-4 numbers above are the selected values transcribed by the extraction, not full tables.
619619
16. **No verified reference implementation** (see Reference implementation(s) above); in particular the R `ecic` package is NOT an implementation of this paper despite the overlapping "staggered distributional DiD" label.
620+
17. **IPW display's sum index vs `C` indicator (p. 22).** The Proposition 1 estimator display prints `sum_{i in r}` in both numerator and denominator while each summand carries the never-treated dummy `C` - a literal cohort-r sum would be identically zero. The intended reading (consistent with the (A.11)-(A.14) proof chain and the `n_{r,t}` definition) is a sum over the (r,t) estimation subsample - cohort r plus never-treated - with `C_i` selecting never-treated units. Implement as a Hajek-normalized CDF over never-treated observations with weight `C_i * p_r(X_i) / (p_r * (1 - p_r(X_i)))`, then invert; do not copy the printed display literally.

docs/methodology/papers/melly-santangelo-2015-review.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,8 @@ phi'_{F,G}(h_1, h_2) = h_1 o G^{-1} - ( f o G^{-1} / g o G^{-1} ) * h_2 o G^{-1}
288288
phi'_{F,G}(h_1, h_2) = -( h_1 / f ) o F^{-1} o G - ( h_2 / (f o F^{-1}) ) o G
289289
```
290290

291+
(as printed - the sign of the `h_2` term is suspect; see the suspected-typos block in Gaps and Uncertainties)
292+
291293
*Ingredient 4 - counterfactual operator (p. 15).* Lemma D.1 of Chernozhukov, Fernandez-Val, and Melly (2013): `phi^C(F, G) = INT F(y, x) dG(x)` is Hadamard-differentiable with derivative map
292294

293295
```
@@ -504,6 +506,7 @@ All quantiles and covariate values must be considered to detect deviations; Kolm
504506
- eq. (8) (p. 12): both right-hand quantile functions are printed with argument `(y)` although the process is indexed by the quantile level; both sides are (generalized) inverses of the integrated CDF estimators.
505507
- p. 8: the intuition sentence below the Proposition 1 proof swaps group labels relative to the displayed identification formula; this review transcribes consistently with the displays.
506508
- eq. (10) (p. 13): the limit process is printed with index `(u, x)` where the display is a process in `(y, x)`, and the scaling prints `sqrt(n*alpha_gt)` where (9) uses `sqrt(n)` - transcribed as printed.
509+
- Lemma 3 (p. 14): the derivative map for `phi^{PP}(F, G) = F^{-1} o G` prints a NEGATIVE sign on the `h_2` term, `- (h_2/(f o F^{-1})) o G`. Standard inverse-map calculus (Van der Vaart-Wellner Lemma 3.9.23(ii) plus the chain rule) gives a POSITIVE `h_2` term: the G-perturbation enters through `(F^{-1})' = 1/(f o F^{-1})` with no sign flip; only the `h_1` term (through inverting F) is negative. The printed proof also cites Hadamard differentiability of "the inverse map G^{-1}" although the PP map inverts F - both oddities are consistent with a copy-paste slip from Lemma 2 (the QQ map, whose proof genuinely inverts G). Re-derive this derivative before any analytical covariance implementation that composes these maps; the bootstrap-based inference path does not depend on it.
507510
- `V^Q_gt` covariance (p. 13): the evaluation point of the second Jacobian is hard to resolve at print resolution; transcribed as `J_gt(u~)^{-1}`, the standard QR-process covariance form.
508511
- p. 20 bootstrap display: typographically dense, with the same missing mesh-weight issue as the p. 12 displays; the structure is the Condition-BW-weighted empirical analog of the QQ/PP composition over the S-point u-grid.
509512
- Sign-convention asymmetry (as printed, identically in both extraction passes): eq. (10) defines `Z^F_gt` with a leading minus (`-f * Z(F(y), x)`) while the Theorem 7 proof defines `Z^F_N` with a plus (`+f * Z^Q_N(F(y), x)`). Immaterial for the limit laws (zero-mean Gaussian processes are sign-symmetric), but confusing if the formulas are transplanted into covariance code - re-derive signs if analytical variances are ever implemented.

0 commit comments

Comments
 (0)