An event-time audit aligns periods relative to first treatment and reports which untreated comparisons exist for each lead and lag.
Event-time pre-trends and support for a staggered rollout
Anchor each cohort before treatment
For month-four adopters, use month three as a pre-treatment reference. Compare their change from month three to months one and two against branches untreated through the inspected month. A lead at month two is not an effect of triage; it is a diagnostic contrast. In the fixture, treated and comparison branches have matching two-point pre-period changes, so both lead contrasts are zero. That arithmetic does not prove that the next untreated trend would also match.
Keep comparison eligibility tied to time
A branch adopting in month six can be untreated in month five but not in month seven. Reusing its month-seven observed outcome as an untreated counterfactual contaminates the event-time plot. The code uses never-treated branches for a small transparent fixture; a fuller estimator can use not-yet-treated branches while they remain eligible. Show the number of treated and comparison units beside every plotted point. Cohort-time estimation defines the post-period contrast.
A quiet lead is weak evidence when noise is large
An insignificant pre-period test can arise because there are few branches, noisy rates or short history. Do not interpret a wide interval around zero as proof of parallel trends. Report the effect size that pre-period data could reasonably rule out and examine operational reasons that trends might diverge. Conversely, selecting only cohorts with visually flat pre-trends after inspecting the data changes the study population and can bias later estimates.
Avoid mechanical event-study regression
With staggered rollout and different cohort effects, a conventional two-way fixed-effects lead-lag regression can produce apparent pre-period movements influenced by effects in other cohorts. This lesson computes explicit cohort-level contrasts instead. A production event-study estimator must state its comparison set, reference period, weighting and uncertainty method. A lead can also reflect anticipation when branches train staff before formal launch; keep training dates in the rollout log.
Recognize changing support
Long lags are often observed only for early adopters, so a month-six event-time point may describe a different mix of branches than a month-one point. Do not read the shape as a single branch trajectory unless the cohort composition is held fixed or shown. Spillover checks can shrink the eligible control set further. If none remain, mark the lag unsupported rather than extrapolating.
Implementation
def event_time_contrasts(panel, treated_branches, control_branches,
adoption_month, reference_month, months):
if reference_month >= adoption_month or not treated_branches or not control_branches:
raise ValueError("invalid event-time design")
def group_mean(branches, month):
return sum(panel[(branch, month)] for branch in branches) / len(branches)
baseline_gap = (group_mean(treated_branches, reference_month) -
group_mean(control_branches, reference_month))
return {month - adoption_month:
(group_mean(treated_branches, month) -
group_mean(control_branches, month)) - baseline_gap
for month in months}
rates = {("North", 1): .50, ("North", 2): .48,
("North", 3): .46, ("North", 4): .41,
("West", 1): .44, ("West", 2): .42,
("West", 3): .40, ("West", 4): .38}
contrasts = event_time_contrasts(rates, ["North"], ["West"],
adoption_month=4, reference_month=3,
months=[1, 2, 4])
assert all(abs(contrasts[lead]) < 1e-12 for lead in (-3, -2))
assert abs(contrasts[0] - (-.03)) < 1e-12Performance and operating cost
With K requested months and T treated plus C comparison branches, direct lookups cost O(K × (T + C)) time and O(K) output space. A larger study should cache cohort-period means and attach uncertainty plus support counts to every contrast.
Common Mistakes
- Do not call a nonsignificant lead proof of parallel trends.
- Do not let already-treated branches become untreated controls at later lags.
- Do not hide the loss of comparison support at long event times.
Read next
- Branch-month panels and the rollout clock
- Cohort-time difference-in-differences for staggered adoption
- Spillover-aware comparison pools for branch rollouts
- Branch-cluster bootstrap for a rollout contrast
- Project: audit a staggered support-branch rollout
Continue the workflow: Seasonality and residual dependence in interrupted series.
