Economics · 2020

Reproducibility report: Difference-in-Differences with multiple time periods

Reproduced

4 of 4 headline claims held

late registrationlegacyunregistered extraction
The full answer and its qualifiers

Does Callaway and Sant'Anna's DiD (Callaway and Sant'Anna, 2020) reproduce? Yes, on its headline claims: when OpenRepro re-ran the authors' code, 4 of 4 headline claims held within tolerances registered before results were recorded; some claims were registered after command output had been observed; legacy attempt: the plan was never sealed; claims were frozen only by their first result; at least one value was read from an excerpt the agent chose after seeing the output, not by a rule fixed before it (checked 19 Oct 2026).

  • Some claims were registered after command output had been observed.
  • Legacy attempt: the plan was never sealed; claims were frozen only by their first result.
  • At least one value was read from an excerpt the agent chose after seeing the output, not by a rule fixed before it.

Does Callaway and Sant'Anna's DiD (Callaway and Sant'Anna, 2020) reproduce? Yes, on its headline claims: when OpenRepro re-ran the authors' code, 4 of 4 headline claims held within tolerances registered before results were recorded (checked 19 Oct 2026).

Checked
Released
Assurance
Legacy
Assistants
Ask via MCP

Does Callaway and Sant'Anna's DiD reproduce?

Yes, on its headline claims. 4 of 4 headline claims held within tolerances registered before results were recorded.

Read the answer with its qualifiers:

  • Some claims were registered after command output had been observed.
  • Legacy attempt: the plan was never sealed; claims were frozen only by their first result.
  • At least one value was read from an excerpt the agent chose after seeing the output, not by a rule fixed before it.

Looking for a replication of Callaway and Sant'Anna's DiD? This report is a computational reproduction: the authors' own published code was re-run and its results compared with the numbers in the paper. It does not set out to test the findings on new data, and it is not peer reviewed. What an attempt checks.

How far the re-run landed from the published number, in tolerances7 claims re-run, 4 headline
  1. Callaway and Sant'Anna's DiD: every claim checked7 claims: 7 held.
  • Held (large: headline claim; small: other claim)
The data behind this chart
ClaimPublishedObservedAccepted ifDeviation ÷ toleranceResult
Under conditional parallel trends with the doubly robust estimator, the simple weighted average of post-treatment ATT(g,t) is -0.033. (headline)-0.033-0.033117within ±0.0005-0.23Held
The clustered multiplier-bootstrap standard error of the conditional DR simple weighted average is 0.007.0.0070.006506within ±0.00155-0.32Held
Data identity check: treated counties have mean 2000 population of 94.32 thousand in the main dataset.94.3294.3213within ±0.005+0.26Held
Under unconditional parallel trends, the group-time ATT for the 2004 group (Illinois) in 2007 is -0.136. (headline)-0.136-0.135614within ±0.0005+0.77Held
Under unconditional parallel trends, the event-study single parameter (average of e=0..3 dynamic effects) is -0.090. (headline)-0.09-0.08981within ±0.0005+0.38Held
Under unconditional parallel trends with never-treated controls, the simple (group-size weighted) average of post-treatment ATT(g,t) is -0.052 log points of teen employment. (headline)-0.052-0.051581within ±0.0005+0.84Held
The clustered multiplier-bootstrap standard error of the unconditional simple weighted average is 0.006.0.0060.006595within ±0.0014+0.43Held

What the attempt found

The minimum-wage application (Section 5, Tables 2-3) was rerun with the did package at commit 5e32efd (the last commit before arXiv v4), R 4.0.3 and 2020-12-01 CRAN dependencies, on the 2284-county 2001-2007 panel that co-author Sant'Anna publishes in the CS_RR repository (the bundled mpdta is only a 500-county subset). All 7 pre-registered claims landed within tolerance: the unconditional simple average (-0.051581 vs -0.052), event-study average (-0.089810 vs -0.090), ATT(2004,2007) (-0.135614 vs -0.136), the conditional doubly robust simple average (-0.033117 vs -0.033), both bootstrap SEs, and the Table 2 treated population mean. A post-hoc, unscored comparison found that Table 3's calendar-time rows mix two weightings: Panel (a) matches the paper's eq. (3.8) group weights, while Panel (b) matches the unweighted mean the 2020 package computed.

Assurance

Level
Legacy (what the levels mean)
Plan
Not sealed (legacy): claims were registered before results were recorded, which does not show that no output had been seen
Evidence
Legacy matching: each observed value was matched against the text of the logged output it cites
Execution manifest
No: not recorded for every cited run, or incomplete (no Git checkout, a driver file that could not be hashed)
Report re-derived from the log
Passed: the engine re-derived the report from the log
Engine version
0.2.1
Predates
plan seal, evidence binding, execution manifest, paper text hash, scored job flag, retry reasons, extraction rule

Headline claims

These decide the outcome. Each row gives the published value, the value from the re-run and the accepted-if rule registered before results were recorded. Each row has its own ¶ link.

ClaimPublishedObservedAccepted ifResult
Under conditional parallel trends with the doubly robust estimator, the simple weighted average of post-treatment ATT(g,t) is -0.033.Table 3 Panel (b), p. 30 · registered at event 23 · quote verified on p. 30 · equivalence check-0.033log points-0.033117within ±0.0005Held
Under unconditional parallel trends, the group-time ATT for the 2004 group (Illinois) in 2007 is -0.136.Section 5.1, p. 28 (also Table 3 Panel (a) Event Study e=3, p. 30) · registered at event 26 · quote verified on p. 28 · equivalence check-0.136log points-0.135614within ±0.0005Held
Under unconditional parallel trends, the event-study single parameter (average of e=0..3 dynamic effects) is -0.090.Table 3 Panel (a), row 'Event Study', Single Parameters column, p. 30 · registered at event 27 · quote verified on p. 30 · equivalence check-0.09log points-0.08981within ±0.0005Held
Under unconditional parallel trends with never-treated controls, the simple (group-size weighted) average of post-treatment ATT(g,t) is -0.052 log points of teen employment.Section 5.1 p. 28; Table 3 Panel (a) 'Simple Weighted Average', p. 30 · registered at event 28 · quote verified on p. 28 · equivalence check-0.052log points-0.051581within ±0.0005Held

Other claims checked

3 claims: 3 held

Reported alongside the headline claims; they do not change the outcome.

ClaimPublishedObservedAccepted ifResult
The clustered multiplier-bootstrap standard error of the conditional DR simple weighted average is 0.007.Table 3 Panel (b), p. 30 · registered at event 24 · quote verified on p. 30 · equivalence check0.007log points0.006506within ±0.00155Held
Data identity check: treated counties have mean 2000 population of 94.32 thousand in the main dataset.Table 2, p. 28 · registered at event 25 · quote verified on p. 28 · equivalence check94.32thousands94.3213within ±0.005Held
The clustered multiplier-bootstrap standard error of the unconditional simple weighted average is 0.006.Table 3 Panel (a), p. 30 · registered at event 29 · quote verified on p. 30 · equivalence check0.006log points0.006595within ±0.0014Held

Deviations from the paper's setup

5 recorded: 2 minor, 3 none
  • minorApplication data taken from data/min_wage_CS.rds in github.com/pedrohcgs/CS_RR (co-author repository, file added 2022-01-02), not from a replication package dated with the paper.
  • noneEnvironment: R 4.0.3 (Posit build) on x86_64 Debian 13 with GCC 14 and R reference BLAS, on a 4-vCPU DigitalOcean droplet; packages compiled from source with build flags only (/env/Makevars.gcc14: -include cstddef -include cstdint for C++, -Wno-error for three C diagnostics). No source file of did or any dependency was changed.
  • nonetestthat 3.0.4 and isoband 0.2.5 came from the P3M snapshot of 2021-08-01; every other dependency came from the 2020-12-01 snapshot.
  • minorBootstrap standard errors use our own seed (20201201) with the package default 1000 multiplier draws; the paper's seed is not reported.
  • noneThe TWFE row of Table 3 and the Supplementary Appendix results (not-yet-treated controls, anticipation) were not attempted.

The run

Wall time
29 min, 19 October 2026 to 19 October 2026
Job compute
17 min 51 s across 2 jobs
Container image
repro-sandbox:0.2 sha256:23ad4ea1cf8d…
Sandbox
3.5 CPUs, 6 GB, no GPU
Run by
Claude (claude-opus-5-5), an AI agent made by Anthropic, in a Claude Code session
Attempt
arxiv-1803-09015-20261019T161404Z
Log
59 events, head 48f31184

Evidence

log seal, 59 hash-chained events

The full evidence report has the exact paper quotes, the method behind every number, the reason for each tolerance, notes made during the attempt and the environment it ran in. The raw report.json is the unmodified data this page is built from.

Log seal · 59 hash-chained events

48f311848a704e6fdadc0137322dca91d96cfc105c4e13706dc6e39dbaa4c0d7

The head hash of the attempt's append-only log. The engine generated this report from that log. The verifier checks the log and its artifacts against this hash, and that the report names it. It does not check the report's contents. Download the evidence bundle (the log, every artifact and the report; SHA-256 000a0f63f36a4772…) and check it with the verifier, which needs only Python.

Reviewed mentions in the evidence bundles. The leak check refuses any mention of a paper that is not yet released. Each mention below was read, found to carry no result of that paper, and approved for this exact bundle (term, file and count):

  • arxiv-1803-09015-20261019T161404Z.tar.gz: This bundle mentions grf in arxiv-1803-09015-20261019T161404Z/artifacts/00009-stdout.txt: The output of a setup search for the authors' replication materials: a list of one author's public GitHub repositories, one of which is a repository with that name (created 2023-10-23). It is a repository name only and states no result of that paper.
  • arxiv-1803-09015-20261019T161404Z.tar.gz: This bundle mentions Generalized random forests in arxiv-1803-09015-20261019T161404Z/artifacts/00009-stdout.txt: The same repository list: that repository's one-line description is that paper's title. It states no result of that paper.

Released 3 November 2026 · Right of reply: notice sent 19 October 2026, because the report flags a possible weighting inconsistency in Table 3 (one of two addresses bounced). No reply received.

Share image (1200×630), drawn from this report.

How to cite this report

OpenRepro (2026). Reproducibility report: Difference-in-Differences with multiple time periods. Reproduced; 4 of 4 headline claims held (some claims were registered after command output had been observed; legacy attempt: the plan was never sealed; claims were frozen only by their first result; at least one value was read from an excerpt the agent chose after seeing the output, not by a rule fixed before it). Attempt arxiv-1803-09015-20261019T161404Z, log head 48f311848a704e6f, checked 19 Oct 2026. https://openrepro.org/papers/1803.09015/

APA style

OpenRepro. (2026). Reproducibility report: Difference-in-Differences with multiple time periods (Attempt arxiv-1803-09015-20261019T161404Z; log head 48f311848a704e6f). https://openrepro.org/papers/1803.09015/

BibTeX
@techreport{openrepro-1803.09015,
  author      = {{OpenRepro}},
  title       = {Reproducibility report: Difference-in-Differences with multiple time periods},
  institution = {OpenRepro},
  year        = {2026},
  url         = {https://openrepro.org/papers/1803.09015/},
  note        = {Attempt arxiv-1803-09015-20261019T161404Z; log head 48f311848a704e6f; checked 19 Oct 2026}
}

To cite the whole ledger, use CITATION.cff on the data page.

References

1 paper
  1. Brantly Callaway, Pedro H. C. Sant'Anna (2020). Difference-in-Differences with multiple time periods. Journal of Econometrics. arXiv 1803.09015 · doi:10.1016/j.jeconom.2020.12.001

Badge

OpenRepro: Reproduced. 4 of 4 headline claims held; some claims were registered after command output had been observed; legacy attempt: the plan was never sealed; claims were frozen only by their first result; at least one value was read from an excerpt the agent chose after seeing the output, not by a rule fixed before it.

Authors and maintainers may embed this badge; it always reflects the current report, and a correction updates it.

Copy the badge as Markdown or HTML

Markdown

[![OpenRepro: Reproduced. 4 of 4 headline claims held; some claims were registered after command output had been observed; legacy attempt: the plan was never sealed; claims were frozen only by their first result; at least one value was read from an excerpt the agent chose after seeing the output, not by a rule fixed before it.](https://openrepro.org/badge/1803.09015.svg)](https://openrepro.org/papers/1803.09015/)

HTML

<a href="https://openrepro.org/papers/1803.09015/"><img src="https://openrepro.org/badge/1803.09015.svg" alt="OpenRepro: Reproduced. 4 of 4 headline claims held; some claims were registered after command output had been observed; legacy attempt: the plan was never sealed; claims were frozen only by their first result; at least one value was read from an excerpt the agent chose after seeing the output, not by a rule fixed before it." width="517" height="20"></a>

Right of reply, and reporting an error

Authors of any paper on this site may submit a response for publication. Replies are published with the author's permission, in full or in the parts they choose, and any omission is marked. The published text preserves their wording apart from disclosed edits: whitespace is normalized, omitted passages are marked, and any removal of signature email addresses and adjoining separators is disclosed. Write to hello@openrepro.org.

Anyone, not only an author, can report an error in an attempt to the same address. The same address takes suggestions of papers to check and questions about the method.