The fixes package provides an easy-to-use toolkit
for creating, estimating, and visualizing event study models using fixed
effects regression. With fixes, you can automatically
generate lead and lag dummy variables, flexibly estimate fixed effects
event study regressions, and visualize the results with
ggplot2
using a single pipeline.
This vignette introduces the core functions of the package through simple examples, including recent updates such as multiple confidence interval support and improved plotting options.
Install the released version from CRAN:
Or with pak (recommended for fast install):
To install the latest development version from GitHub:
or
Below is a basic example simulating a panel dataset, running an event study, and visualizing the results.
library(fixes)
library(dplyr)
library(tibble)
set.seed(2)
n_firms <- 1000
n_states <- 50
T <- 36
firm_id <- 1:n_firms
state_id <- sample(n_states, size = n_firms, replace = TRUE)
year <- 1980:2015
fe_firm <- rnorm(n_firms, mean = 0, sd = .5)
fe_year <- rnorm(T, mean = 0, sd = .5)
error <- rnorm(n_firms * T, mean = 0, sd = .5)
treated_1998 <- sample(c(1, 0), size = n_firms,
replace = TRUE, prob = c(1/2, 1/2))
df <- tibble(
firm_id = rep(firm_id, each = T),
state_id = rep(state_id, each = T),
year = rep(year, times = n_firms),
fe_firm = rep(fe_firm, each = T),
fe_year = rep(fe_year, times = n_firms),
error = error,
is_treated = rep(treated_1998, each = T),
after_treat = if_else(is_treated == 1 & year >= 1998, 1, 0),
x1 = runif(n_firms * T),
x2 = rnorm(n_firms * T),
y = case_when(
after_treat == 1 ~
rnorm(n_firms * T, mean = .3, sd = .2) * (year - 1997) + fe_firm + fe_year + error,
TRUE ~ fe_firm + fe_year + error
)
)
# Run the event study (now supports multiple confidence levels)
event_study <- run_es(
data = df,
outcome = y,
treatment = is_treated,
time = year,
timing = 1998,
lead_range = 18,
lag_range = 17,
covariates = ~ x1 + x2,
fe = ~ firm_id + year,
cluster = ~ state_id,
baseline = -1,
interval = 1,
conf.level = c(0.90, 0.95, 0.99) # Multiple CIs now supported!
)
# View results
head(event_study)
The fixes package provides plot_es()
for flexible visualization. You can easily switch between ribbon-style
or error bar CIs, select the displayed CI level, and customize
appearance.
# Basic plot (default: ribbon, 95% CI)
p1 <- plot_es(event_study)
print(p1)
# Plot with error bars and 99% CI
p2 <- plot_es(event_study, type = "errorbar", ci_level = 0.99)
print(p2)
# Use a minimal theme and highlight the event period
p3 <- plot_es(event_study, type = "ribbon", vline_val = 0, theme_style = "minimal")
print(p3)
# Customize further with ggplot2
library(ggplot2)
p4 <- plot_es(event_study, type = "errorbar", ci_level = 0.9, theme_style = "classic") +
scale_x_continuous(breaks = seq(-10, 10, by = 2)) +
ggtitle("Event Study with 90% CI and Classic Theme")
print(p4)
If your panel data uses irregular time variables (e.g., Dates), or
has gaps, set time_transform = TRUE
and provide a
unit
variable. This will replace the time variable with a
consecutive sequence within each unit, ensuring leads/lags are
calculated correctly.
Date
and time_transform
df_alt <- df |>
mutate(date = as.Date(paste0(year, "-01-01")))
event_study_alt <- run_es(
data = df_alt,
outcome = y,
treatment = is_treated,
time = date,
timing = 19, # 19th time point per unit (not the actual year!)
lead_range = 3,
lag_range = 3,
fe = ~ firm_id + year,
cluster = ~ state_id,
baseline = -1,
time_transform = TRUE,
unit = firm_id
)
head(event_study_alt)
Note: When time_transform = TRUE
, use
the index (1, 2, 3, …) for timing
rather than the actual
value (e.g., “1998-01-01”), and always specify unit
.
run_es()
:
time_transform
.plot_es()
:
The fixes package streamlines event study estimation and visualization for panel data researchers. With a minimal API, multiple CI support, and robust visualization, it accelerates the workflow for dynamic treatment effect analysis.
For further details and full argument documentation, see:
Happy analyzing!🥂