Introduction to fixes

Yosuke Abe

July 07, 2025

Introduction

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.

Installation

Install the released version from CRAN:

install.packages("fixes")

Or with pak (recommended for fast install):

pak::pak("fixes")

To install the latest development version from GitHub:

pak::pak("yo5uke/fixes")

or

devtools::install_github("yo5uke/fixes")

Minimal Example

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)

Visualizing Event Study Results

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)

Handling Irregular Time Data

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.

Example using 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.

Package Highlights

Conclusion

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:

?run_es
?plot_es

Happy analyzing!🥂