Why Stack the Data by Adoption Cohort?
With staggered adoption, different groups begin treatment in different calendar periods. A single pooled comparison can mix together cohorts, calendar times, and treatment histories. Stacked difference-in-differences makes the comparisons more explicit: for each adoption cohort, construct a separate analysis sample containing that cohort and units that are untreated throughout its chosen event window.
Each cohort-specific stack is a local comparison, not a new experiment. Its causal interpretation still depends on assumptions about untreated outcomes, including parallel trends. Stacking organizes the comparisons; it does not by itself make an ineligible control group valid, remove bias from anticipation, or determine which weighted average of cohort effects is scientifically relevant.
Set the Event Window and Define Eligible Controls
Choose an event-time window from \(k_{\min}\) to \(k_{\max}\), including a pre-treatment baseline event time \(k_0\), often \(-1\). Event time \(k\) is relative to the cohort’s adoption date: for cohort \(g\), event time \(k\) corresponds to calendar period \(t=g+k\). In particular, the calendar period for the baseline is \(t_0=g+k_0\). Keeping \(k_0\) and \(t_0\) distinct prevents an event-time index from being mistakenly used as a calendar-time index.
A fixed control set for the cohort’s whole window can consist of never-treated units and units whose adoption date is later than the last calendar period in that window. Thus, for a finite adoption date, eligibility requires \(G_i>g+k_{\max}\). This rule ensures the control units are untreated in every period used in that stack, not just in the baseline period. Using one fixed set makes comparisons across event times easier to interpret. If control eligibility instead changes from period to period, the comparisons may involve different control populations.
The treated units in the stack are those with \(G_i=g\). The same unit-period record may appear in several stacks when that unit is an eligible control for several cohorts. Store the original unit identifier and a separate stack identifier so this reuse is visible. Also check that the data cover every calendar period required by the selected event window.
Specify \(k_{\min}\), \(k_{\max}\), and a baseline event time \(k_0\) within the window. Translate each event time using \(t=g+k\).
Include cohort \(g\) and units untreated through calendar period \(g+k_{\max}\). Retain the original unit identifier even when a unit is copied across stacks.
Compare the treated cohort’s change from calendar period \(t_0\) with the eligible controls’ change over the same calendar periods.
Combine cohort-specific effects using explicit, nonnegative weights that sum to one over the cohorts supported at that event time.
Worked Example: Building One Cohort Stack
Suppose a hypothetical panel has a treated cohort with adoption date \(g=3\). Choose the event window \(k=-1,0,1\), with baseline \(k_0=-1\). The calendar periods are \(t=2,3,4\), and the baseline calendar period is \(t_0=g+k_0=3-1=2\). The comparison at \(k=1\) is therefore between calendar periods 2 and 4, not between calendar periods \(-1\) and 1.
Suppose the treated cohort has 100 units, and its mean outcomes in periods 2, 3, and 4 are 50, 54, and 60. The proposed controls have mean outcomes 40, 42, and 45 in those periods. Assume these controls are never treated or are not treated until after period 4. They are eligible for the full window. Units adopting in period 4 or earlier are not eligible under the fixed-window rule, because they would be treated by the end of the stack.
At event time \(k=1\), the treated cohort’s change from baseline is \(60-50=10\) outcome units. The controls’ change over the same calendar periods is \(45-40=5\) outcome units. The difference-in-differences estimate is
At \(k=0\), the corresponding calculation is \((54-50)-(42-40)=4-2=2\) outcome units. These are cohort-specific comparisons. Their causal interpretation requires the assumptions described below; constructing the stack alone does not establish them.
What a Stack Estimates
Let \(Y_{it}(0)\) be unit \(i\)’s outcome in period \(t\) without treatment, and let \(Y_{it}(1)\) be its outcome under treatment. For a cohort first treated in period \(g\), the cohort-time average treatment effect on the treated is
For a post-treatment period \(t\), compare the cohort’s mean outcome change since baseline \(t_0\) with the eligible controls’ mean change over the same calendar periods. In population notation, that contrast is
where \(C_g\) denotes the eligible control set for stack \(g\). The following justification shows why this contrast can identify \(ATT(g,t)\).
To see the identification result, write the treated cohort’s observed change as the change in its untreated potential outcome plus its treatment effect at \(t\). Its treatment effect at baseline is zero under the no-anticipation condition. The controls’ observed change equals their untreated potential-outcome change because they remain untreated. Subtracting the control change from the treated change cancels the untreated change in expectation by parallel trends. The remaining term is the average treatment effect for cohort \(g\) at \(t\):
This is the two-period difference-in-differences logic applied within one cohort stack. For an event time before adoption, the same contrast is a comparison of untreated outcomes, not a post-treatment ATT. Under no anticipation and the stated parallel-trends condition, its population value is zero; an estimated nonzero lead can signal a problem, but its interpretation also depends on sampling uncertainty and the plausibility of the assumptions.
Estimating a Cohort Profile and Aggregating Effects
A direct approach estimates a difference-in-differences contrast separately for each cohort and event time. A regression implementation can use stack-specific unit and calendar-time effects, along with indicators for the treated cohort at each event time other than the omitted baseline. In a separate stack, the dynamic specification can be written as
Here \(Y_{it}^{(g)}\) is the outcome in stack \(g\), \(\alpha_i^{(g)}\) and \(\lambda_t^{(g)}\) are stack-specific unit and calendar-time effects, and the omitted event time is the baseline \(k_0\). In a saturated comparison with the same eligible controls at each event time, the cohort-by-event-time interaction represents the change for the treated cohort relative to the controls, measured against the baseline. In particular, for a post-treatment \(k\), \(\theta_{gk}\) targets \(ATT(g,g+k)\) under the identification assumptions. The regression is a way to calculate the contrasts, not an additional identification assumption.
A cohort-specific event-time effect is not automatically the overall effect at that event time. Let \(\mathcal{G}_k\) be the cohorts with valid data and eligible controls at event time \(k\). An explicitly defined aggregate is
For example, weights proportional to the number of treated units in each supported cohort target an average across those treated units, subject to the chosen support. Equal cohort weights instead target the average of the cohort effects, giving each cohort the same weight regardless of size. State the weighting rule and which cohorts contribute. If different event times have different supported cohorts, the profile can change both because effects change and because the composition changes.
Worked Example: Aggregating Two Cohorts at One Event Time
Consider a hypothetical panel with two adoption cohorts and a common event time \(k=1\). For cohort \(g=3\), take baseline period \(t_0=2\) and event period \(t=4\). The treated cohort’s mean outcome rises from 50 to 59, while eligible controls’ mean rises from 40 to 45. Thus,
For cohort \(g=5\), take baseline period \(t_0=4\) and event period \(t=6\). The treated cohort’s mean outcome rises from 70 to 78, while its eligible controls’ mean rises from 60 to 66. Therefore,
Suppose the target is the treated-unit-weighted average and the two cohorts contain 100 and 50 treated units. The weights are \(100/150\) and \(50/150\), respectively. The aggregate is
This is a treated-unit-weighted average of the two estimated cohort effects at event time 1. Equal cohort weighting would instead give \((4+2)/2=3\) outcome units. Neither weighting rule is universally correct; they answer different aggregation questions.
Weighting and Reused Controls
Stack-specific effects and aggregate effects should be kept distinct. If a pooled regression reports one coefficient across stacks, its implicit weighting need not match a treated-unit-weighted or equal-cohort target. Regression weights can depend on the model specification, sample sizes, variation, and how coefficients are constrained across stacks. A coefficient from a pooled regression is not automatically the desired average merely because the data were stacked.
Reusing controls is often necessary: one never-treated unit may be a valid control for several adoption cohorts. This creates multiple stack records for that original unit. Reuse is not by itself a source of bias in each separately defined cohort comparison. But it does mean that the stacked rows are not all distinct units, and a pooled analysis can give reused controls substantial influence. Any weighting scheme should be defined in terms of the original target population and cohort effects, not inferred from the count of copied rows.
For example, if 80 never-treated units appear in each of two stacks, the stacked file contains 160 control stack-members but only 80 distinct control units. Those records belong to different cohort-specific comparisons. Treating them as 160 distinct controls for interpretation or uncertainty calculations would misrepresent the data structure. More generally, the same unit may appear in multiple stacks and its outcomes may be correlated across those appearances.
Worked Example: Detecting an Aggregation Mismatch
Suppose the two hypothetical cohort effects from the previous example are 4 and 2 outcome units, with 100 and 50 treated units. A stated treated-unit-weighted target is \(10/3\approx3.333\) outcome units. If an analyst instead gives each cohort estimate equal weight, the result is
The value 3 is not an arithmetic error; it answers the equal-cohort-weighted question. It is an error to report it as the treated-unit-weighted estimate. Now suppose 80 controls are included in both cohort stacks. Counting the two copies as 160 distinct controls does not turn the equal-cohort average into the treated-unit-weighted average, nor does it create 80 new units. The remedy is to state and implement the target weights explicitly, while preserving each unit’s original identity in the stacked data.
Common Mistakes
- Mixing event time with calendar time. If \(k_0=-1\), the baseline calendar period is \(t_0=g-1\), not calendar period \(-1\). Translate with \(t=g+k\) before using outcomes indexed by calendar time.
- Allowing controls to become treated inside the window. A unit untreated at baseline but treated before the end of the chosen window is not an untreated control for that full stack under the fixed-window design.
- Assuming stacking guarantees identification. The cohort-specific contrast still requires a credible parallel-trends condition and no anticipation at baseline, among other design requirements.
- Letting the pooled coefficient define the target silently. A regression’s implicit weights may differ from the stated scientific target. Specify the cohort set and aggregation weights.
- Counting copied control records as new units. A control appearing in multiple stacks remains the same unit. Stacking duplicates records for comparisons; it does not duplicate the underlying individuals.
Check Your Understanding
Answer each question by identifying the relevant stack, calendar period, or target explicitly.
- A cohort adopts in period \(g=6\), and the baseline event time is \(k_0=-1\). What is the baseline calendar period \(t_0\)?
- A stack for cohort \(g=4\) uses event times from \(-1\) through \(2\). Which finite adoption dates fail the rule that controls remain untreated through the end of the window?
- State the parallel-trends condition that lets a cohort’s untreated outcome change be represented by its eligible controls’ change.
- Two cohort effects are 6 and 3 outcome units, with 40 and 20 treated units. Calculate their treated-unit-weighted average and their equal-cohort-weighted average.
- A never-treated unit appears in four cohort stacks. How many distinct original units does that represent, and what information should be retained in the stacked data?