Skip to main content

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.