---
name: brycewang-stanford/event-study
source: https://app.decimal.ai/s/brycewang-stanford-event-study@1/SKILL.md
source_sha256: 877c48ee8a13
---

# Event Study Skill

This skill covers everything needed to conduct event studies in R - from the traditional
two-way fixed effects (TWFE) approach through modern robust estimators that handle
staggered treatment timing and heterogeneous treatment effects.

## When to Use This Skill

Use this skill when the user wants to:
- Create event study plots (coefficient plots around a treatment event)
- Test for parallel pre-trends in a difference-in-differences design
- Estimate dynamic treatment effects
- Work with staggered treatment adoption (units treated at different times)
- Implement any of the modern DiD estimators (Callaway & Sant'Anna, Sun & Abraham, etc.)
- Diagnose problems with TWFE under treatment effect heterogeneity

## Quick Decision Tree

Before writing any code, determine the user's situation:

1. **Is treatment timing the same for all treated units?**
   - Yes → Traditional TWFE event study is fine. See `traditional-event-study.md`
   - No (staggered) → Go to step 2.

2. **Is there reason to expect heterogeneous treatment effects across cohorts or over time?**
   - No strong reason → Traditional TWFE may still be OK, but consider robust alternatives.
   - Yes or unsure → Use a robust estimator. See `modern-extensions.md`

3. **What is the user's goal?**
   - Quick visualization of pre-trends → Traditional approach, fast and familiar.
   - Publication-quality estimation → Recommend a robust estimator + traditional as comparison.
   - Diagnostic check → Bacon decomposition to understand TWFE weights.

## Core Concepts (Brief)

An event study plot displays estimated coefficients for leads (pre-treatment periods) and lags
(post-treatment periods) relative to a baseline period (typically one period before treatment).
The key elements are:

- **Relative time**: Time reindexed so that treatment occurs at period 0 for each unit.
- **Baseline/reference period**: Usually t = -1 (omitted from regression, normalized to zero).
- **Pre-trend coefficients**: Periods before treatment. If these are close to zero, it supports
  the parallel trends assumption.
- **Post-treatment coefficients**: These capture the dynamic treatment effect over time.

The parallel trends assumption states that, absent treatment, treated and control units would
have followed the same trajectory. Pre-trend coefficients near zero are necessary (but not
sufficient) evidence for this.

## Workflow

For any event study request, follow this general workflow:

1. **Understand the data**: Identify the panel structure (unit ID, time variable, treatment
   indicator, outcome). Ask the user if not clear.
2. **Determine treatment timing**: Is it uniform or staggered?
3. **Choose the estimator**: Use the decision tree above.
4. **Estimate the model**: Follow the relevant reference file.
5. **Create the plot**: Always produce a clean, publication-ready event study plot.
6. **Interpret results**: Discuss pre-trends, post-treatment dynamics, and any concerns.

## Reference Files

Read these as needed based on the user's situation:

- `traditional-event-study.md` - Traditional TWFE event study with `fixest`.
  Read this for any event study request. It covers the baseline approach, plotting,
  and the assumptions behind it.

- `modern-extensions.md` - Modern robust estimators for staggered designs.
  Read this when treatment timing varies across units or when the user asks about
  heterogeneous treatment effects, or any of the newer DiD methods.

- `diagnostics-and-testing.md` - Pre-trend testing, placebo checks,
  Bacon decomposition, sensitivity analysis. Read this when the user wants to
  validate their design or when you spot potential issues.

## Key R Packages

| Package | Purpose | When to use |
|---------|---------|-------------|
| `fixest` | TWFE event studies, Sun & Abraham | Default starting point |
| `did` | Callaway & Sant'Anna estimator | Staggered treatment, heterogeneous effects |
| `did2s` | Gardner (2022) two-stage DiD | Staggered treatment, clean decomposition |
| `DIDmultiplegt` | de Chaisemartin & D'Haultfoeuille | Staggered, robust to heterogeneity |
| `bacondecomp` | Bacon decomposition | Diagnosing TWFE problems |
| `HonestDiD` | Sensitivity analysis for pre-trends | Robustness checks on parallel trends |
| `ggplot2` | Plotting | Always |
| `modelsummary` | Regression tables | When user needs tables |

## Plotting Standards

All event study plots should follow these defaults (user can override):

- Use `ggplot2` with `theme_minimal()` or a clean custom theme
- Include a vertical dashed line at t = 0 (treatment onset)
- Include a horizontal dashed line at y = 0 (null effect)
- **IMPORTANT: Use discrete point estimates with vertical error bars (`geom_point` + `geom_errorbar`),
  NOT connected lines with shaded ribbons (`geom_line` + `geom_ribbon`).** Each period `t` should
  show an individual point with its own error bar. This is the standard format in economics journals.
- Show 95% confidence intervals as error bars (vertical lines at each point)
- Label axes clearly: "Periods Relative to Treatment" (x) and the outcome name (y)
- Normalize the reference period coefficient to 0 explicitly
- Use colorblind-friendly palettes when comparing multiple groups
- If comparing estimators, use facets or distinct colors/shapes with a legend

## Common Pitfalls to Watch For

- **Forgetting to set the reference period**: Always drop one pre-treatment period.
- **Binning endpoint periods**: With limited pre/post periods, bin the endpoints
  (e.g., "-5+" and "5+") to avoid small-sample noise.
- **Not-yet-treated as controls**: In staggered settings, TWFE uses not-yet-treated
  units as controls, which can introduce bias if treatment effects are heterogeneous.
- **Interpreting pre-trends as proof of parallel trends**: Pre-trends being zero is
  necessary but not sufficient. Absence of evidence is not evidence of absence.
- **Unbalanced panels**: Missing observations can distort event study estimates,
  especially at the endpoints.