R Econometrics
Purpose
This skill helps economists run rigorous econometric analyses in R, including Instrumental Variables (IV), Difference-in-Differences (DiD), and Regression Discontinuity Design (RDD). It generates publication-ready code with proper diagnostics and robust standard errors.
When to Use
- Running causal inference analyses
- Estimating treatment effects with panel data
- Creating publication-ready regression tables
- Implementing modern econometric methods (two-way fixed effects, event studies)
Instructions
Step 1: Understand the Research Design
Before generating code, ask the user:
- What is your identification strategy? (IV, DiD, RDD, or simple regression)
- What is the unit of observation? (individual, firm, country-year, etc.)
- What fixed effects do you need? (entity, time, two-way)
- How should standard errors be clustered?
Step 2: Generate Analysis Code
Based on the research design, generate R code that:
- Uses the
fixest package - Modern, fast, and feature-rich for panel data
- Includes proper diagnostics:
- For IV: First-stage F-statistics, weak instrument tests
- For DiD: Parallel trends visualization, event study plots
- For RDD: Bandwidth selection, density tests
- Uses robust/clustered standard errors appropriate for the data structure
- Creates publication-ready output using
modelsummary or etable
Step 3: Structure the Output
Always include:
# 1. Setup and packages
# 2. Data loading and preparation
# 3. Descriptive statistics
# 4. Main specification
# 5. Robustness checks
# 6. Visualization
# 7. Export results
Step 4: Add Documentation
Include comments explaining:
- Why each specification choice was made
- Interpretation of key coefficients
- Limitations and assumptions
Example Prompts
- "Run a DiD analysis with state and year fixed effects, clustering at the state level"
- "Estimate the effect of X on Y using Z as an instrument"
- "Create an event study plot showing treatment effects by year"
- "Run a sharp RDD with optimal bandwidth selection"
Example Output
# ============================================
# Difference-in-Differences Analysis
# ============================================
# Setup
library(tidyverse)
library(fixest)
library(modelsummary)
# Load data
df <- read_csv("data.csv")
# Prepare treatment variable
df <- df %>%
mutate(
post = year >= treatment_year,
treated = state %in% treatment_states,
treat_post = treated * post
)
# ----------------------------------------
# Main DiD Specification
# ----------------------------------------
# Two-way fixed effects
did_model <- feols(
outcome ~ treat_post | state + year,
data = df,
cluster = ~state
)
# View results
summary(did_model)
# ----------------------------------------
# Event Study
# ----------------------------------------
# Create relative time variable
df <- df %>%
mutate(rel_time = year - treatment_year)
# Event study regression
event_study <- feols(
outcome ~ i(rel_time, treated, ref = -1) | state + year,
data = df,
cluster = ~state
)
# Plot coefficients
iplot(event_study,
main = "Event Study: Effect on Outcome",
xlab = "Years Relative to Treatment")
# ----------------------------------------
# Robustness: Alternative Specifications
# ----------------------------------------
# Different clustering
did_robust <- feols(
outcome ~ treat_post | state + year,
data = df,
cluster = ~state + year # Two-way clustering
)
# ----------------------------------------
# Export Results
# ----------------------------------------
modelsummary(
list("Main" = did_model, "Two-way Cluster" = did_robust),
stars = c('*' = 0.1, '**' = 0.05, '***' = 0.01),
output = "results/did_table.tex"
)
Requirements
Software
Packages
fixest - Fast fixed effects estimation
modelsummary - Publication-ready tables
tidyverse - Data manipulation
ggplot2 - Visualization
Install with:
install.packages(c("fixest", "modelsummary", "tidyverse"))
Best Practices
- Always cluster standard errors at the level of treatment assignment
- Run pre-trend tests for DiD designs
- Report first-stage F-statistics for IV (should be > 10)
- Use
feols over lm for panel data (faster and more features)
- Document all specification choices in your code comments
Common Pitfalls
- ❌ Not clustering standard errors at the right level
- ❌ Ignoring weak instruments in IV estimation
- ❌ Using TWFE with staggered treatment timing (use
did or sunab() instead)
- ❌ Not reporting robustness checks
References
Changelog
v1.0.0
- Initial release with IV, DiD, RDD support
1---2name: r-econometrics3description: Run IV, DiD, and RDD analyses in R with proper diagnostics4---56# R Econometrics78## Purpose910This skill helps economists run rigorous econometric analyses in R, including Instrumental Variables (IV), Difference-in-Differences (DiD), and Regression Discontinuity Design (RDD). It generates publication-ready code with proper diagnostics and robust standard errors.1112## When to Use1314- Running causal inference analyses15- Estimating treatment effects with panel data16- Creating publication-ready regression tables17- Implementing modern econometric methods (two-way fixed effects, event studies)1819## Instructions2021### Step 1: Understand the Research Design2223Before generating code, ask the user:241. What is your identification strategy? (IV, DiD, RDD, or simple regression)252. What is the unit of observation? (individual, firm, country-year, etc.)263. What fixed effects do you need? (entity, time, two-way)274. How should standard errors be clustered?2829### Step 2: Generate Analysis Code3031Based on the research design, generate R code that:32331. **Uses the `fixest` package** - Modern, fast, and feature-rich for panel data342. **Includes proper diagnostics:**35 - For IV: First-stage F-statistics, weak instrument tests36 - For DiD: Parallel trends visualization, event study plots37 - For RDD: Bandwidth selection, density tests383. **Uses robust/clustered standard errors** appropriate for the data structure394. **Creates publication-ready output** using `modelsummary` or `etable`4041### Step 3: Structure the Output4243Always include:44```r45# 1. Setup and packages46# 2. Data loading and preparation47# 3. Descriptive statistics48# 4. Main specification49# 5. Robustness checks50# 6. Visualization51# 7. Export results52```5354### Step 4: Add Documentation5556Include comments explaining:57- Why each specification choice was made58- Interpretation of key coefficients59- Limitations and assumptions6061## Example Prompts6263- "Run a DiD analysis with state and year fixed effects, clustering at the state level"64- "Estimate the effect of X on Y using Z as an instrument"65- "Create an event study plot showing treatment effects by year"66- "Run a sharp RDD with optimal bandwidth selection"6768## Example Output6970```r71# ============================================72# Difference-in-Differences Analysis73# ============================================7475# Setup76library(tidyverse)77library(fixest)78library(modelsummary)7980# Load data81df <- read_csv("data.csv")8283# Prepare treatment variable84df <- df %>%85 mutate(86 post = year >= treatment_year,87 treated = state %in% treatment_states,88 treat_post = treated * post89 )9091# ----------------------------------------92# Main DiD Specification93# ----------------------------------------9495# Two-way fixed effects96did_model <- feols(97 outcome ~ treat_post | state + year,98 data = df,99 cluster = ~state100)101102# View results103summary(did_model)104105# ----------------------------------------106# Event Study107# ----------------------------------------108109# Create relative time variable110df <- df %>%111 mutate(rel_time = year - treatment_year)112113# Event study regression114event_study <- feols(115 outcome ~ i(rel_time, treated, ref = -1) | state + year,116 data = df,117 cluster = ~state118)119120# Plot coefficients121iplot(event_study, 122 main = "Event Study: Effect on Outcome",123 xlab = "Years Relative to Treatment")124125# ----------------------------------------126# Robustness: Alternative Specifications127# ----------------------------------------128129# Different clustering130did_robust <- feols(131 outcome ~ treat_post | state + year,132 data = df,133 cluster = ~state + year # Two-way clustering134)135136# ----------------------------------------137# Export Results138# ----------------------------------------139140modelsummary(141 list("Main" = did_model, "Two-way Cluster" = did_robust),142 stars = c('*' = 0.1, '**' = 0.05, '***' = 0.01),143 output = "results/did_table.tex"144)145```146147## Requirements148149### Software150- R 4.0+151152### Packages153- `fixest` - Fast fixed effects estimation154- `modelsummary` - Publication-ready tables155- `tidyverse` - Data manipulation156- `ggplot2` - Visualization157158Install with:159```r160install.packages(c("fixest", "modelsummary", "tidyverse"))161```162163## Best Practices1641651. **Always cluster standard errors** at the level of treatment assignment1662. **Run pre-trend tests** for DiD designs1673. **Report first-stage F-statistics** for IV (should be > 10)1684. **Use `feols` over `lm`** for panel data (faster and more features)1695. **Document all specification choices** in your code comments170171## Common Pitfalls172173- ❌ Not clustering standard errors at the right level174- ❌ Ignoring weak instruments in IV estimation175- ❌ Using TWFE with staggered treatment timing (use `did` or `sunab()` instead)176- ❌ Not reporting robustness checks177178## References179180- [fixest documentation](https://lrberge.github.io/fixest/)181- [Cunningham (2021) Causal Inference: The Mixtape](https://mixtape.scunning.com/)182- [Angrist & Pischke (2009) Mostly Harmless Econometrics](https://www.mostlyharmlesseconometrics.com/)183184## Changelog185186### v1.0.0187- Initial release with IV, DiD, RDD support