Event Studies and Parallel Trends
An event study arranges outcomes by time relative to treatment. It can show anticipation, dynamic responses, and pre-treatment discrepancies, but its coefficients inherit a DiD design. A visually flat or statistically non-significant pre-period does not certify the missing post-treatment counterfactual.
Prerequisites
Complete Difference-in-Differences. Understand why treatment timing and the choice of comparison group define the estimand.
Learning goals
- interpret lead and lag contrasts relative to an omitted pre-period.
- separate dynamic causal effects from composition, anticipation, and estimator contamination.
- pre-specify falsification checks and honest sensitivity to deviations from parallel trends.
Design and estimands
Suppose campuses adopt Study Sprint in different terms. Estimate cohort-by-relative-time ATT values using never-treated or not-yet-treated campuses as controls, then aggregate with transparent weights. Each lag answers an effect-at-duration question for cohorts observed at that duration; changing cohort composition can make the plotted path differ from one cohort's dynamics.
Assumptions include cohort-specific parallel trends, no anticipation within the declared lead window, stable treatment definitions and measurement, no spillovers, valid comparison groups, and dependence-aware uncertainty. If adoption reacts to recent outcome shocks, the relative-time pattern may reflect selection into timing.
Worked path and counterexample
The deterministic simulation computes treated-minus-control gaps relative to period -1. A clean fixture has zero leads and positive lags. A counterexample has a four-point pre-period movement before treatment.
times = [-3, -2, -1, 0, 1]
treated = [40, 45, 50, 61, 68]
control = [42, 47, 52, 56, 60]
gaps = [a - b for a, b in zip(treated, control)]
baseline = gaps[times.index(-1)]
effects = [gap - baseline for gap in gaps]
failure_gaps = [-4, -2, 0, 5, 8]
failure_leads = [gap - failure_gaps[times.index(-1)] for gap in failure_gaps[:2]]
print("relative-time effects=" + ", ".join(f"{t}:{e:.1f}" for t, e in zip(times, effects)))
print(f"largest clean pre-period deviation={max(abs(e) for e in effects[:2]):.1f}")
print(f"failure pre-period deviations={failure_leads}")
print("failure verdict=do not interpret lags causally without redesign")
The clean arithmetic is consistent with, but does not establish, parallel trends. The failure fixture contradicts it before exposure. Sparse pre-periods or noisy outcomes may have little power to reveal an equally consequential deviation.
Diagnostics and falsification
Plot unadjusted levels, sample counts, composition, and relative-time estimates with simultaneous rather than only pointwise uncertainty when the whole path is interpreted. Inspect calendar-time shocks, cohort-specific results, alternative control groups, pseudo-event dates, and negative-control outcomes. State the omitted period and never hide distant leads that look unfavorable.
Define the anticipation window from institutional knowledge before looking at estimates. Exclude affected pre-periods from controls and rename time zero if behavior changes on announcement. Probe sensitivity to bounded trend deviations; do not use “pre-trends were insignificant” as the sole defense.
In staggered settings, conventional two-way fixed-effects leads and lags can mix effects from other relative periods when treatment effects vary. Apparent pre-trends can even arise from that contamination. Use estimators designed for cohort-time effects and show how aggregation weights cohorts and durations.
Failure modes
- Campuses accelerate before launch after an announcement.
- Adoption timing responds to a temporary outcome dip.
- Later lags contain only early-adopting campuses.
- Already-treated campuses act as controls for later adopters.
- Standard errors ignore the campus assignment and serial correlation.
Common mistakes
- Reading each lead p-value as an independent identification test.
- interpreting a lag path as one population when cohort support changes.
- choosing the anticipation window after seeing the plot.
- omitting raw levels, counts, or unfavorable endpoints.
- assuming more fixed effects repair an invalid comparison.
Practice
For three adoption cohorts, list which controls are eligible at each time. Mark the announcement date, implementation date, omitted reference period, and last duration with common cohort support.
Next steps
Regression Discontinuity changes the assignment logic from trends over time to a threshold in a running variable.
Primary sources
Checked 2026-10-15: Sun and Abraham, heterogeneous event-study effects, Callaway and Sant'Anna, cohort-time effects, and Roth, pre-trend power and distortions.