Extended Two-Way Fixed Effects estimator (Wooldridge 2021, 2023) for Python
Project description
ETWFE: Extended Two-Way Fixed Effects
A Python implementation of the Extended Two-Way Fixed Effects (ETWFE) estimator from Wooldridge (2021, 2023) for difference-in-differences estimation with heterogeneous treatment effects.
Installation
pip install etwfe
For development:
pip install etwfe[dev,full]
Quick Start
import pandas as pd
from etwfe import etwfe
# Load your panel data
df = pd.read_csv("your_data.csv")
# Fit ETWFE model
model = etwfe(
fml="outcome ~ 0", # outcome variable (no controls)
tvar="year", # time period variable
gvar="first_treat_year", # treatment cohort variable
data=df,
ivar="unit_id" # unit identifier for FE
)
# View summary
model.summary()
# Compute marginal effects
att = model.emfx(type="simple") # Overall ATT
event = model.emfx(type="event") # Event study
cohort = model.emfx(type="group") # By treatment cohort
calendar = model.emfx(type="calendar") # By calendar time
# Plot event study
model.plot(type="event")
Features
- Wooldridge (2021, 2023) ETWFE methodology: Properly handles heterogeneous treatment effects in staggered DiD settings
- Multiple control group options: "notyet" (not-yet-treated) or "never" (never-treated)
- GLM support: Poisson, logit, probit, and Gaussian families
- Heterogeneous effects: Support for treatment effect heterogeneity via
xvar - Flexible fixed effects: Unit and time fixed effects
- Standard errors: Heteroskedasticity-robust and clustered standard errors via pyfixest
- Marginal effects: Simple ATT, event study, cohort-specific, and calendar-time effects
- Visualization: Built-in plotting for event studies
API Reference
ETWFE Class
from etwfe import ETWFE
model = ETWFE(
fml="y ~ x1 + x2", # Formula: outcome ~ controls
tvar="year", # Time variable
gvar="first_treat", # Treatment cohort variable
data=df,
ivar="id", # Unit ID (optional, for unit FE)
xvar="group", # Heterogeneity variable (optional)
tref=2000, # Reference time period (optional)
gref=9999, # Reference cohort (optional)
cgroup="notyet", # Control group: "notyet" or "never"
family=None, # GLM family: None, "poisson", "logit", "probit"
vcov="hetero", # Variance-covariance estimator
)
model.fit()
Convenience Function
from etwfe import etwfe
# Creates and fits in one step
model = etwfe("y ~ 0", tvar="year", gvar="first_treat", data=df)
Marginal Effects
# Simple overall ATT
model.emfx(type="simple")
# Event study (by event time)
model.emfx(type="event")
# By treatment cohort
model.emfx(type="group")
# By calendar time
model.emfx(type="calendar")
# Options
model.emfx(
type="event",
by_xvar=True, # Separate effects by xvar
compress=True, # Compress data for speed
predict="response", # "response" or "link" for GLM
post_only=True, # Post-treatment only
vcov=False, # Skip SE computation
window=5, # Event window [-5, +5]
)
Plotting
# Event study plot
model.plot(type="event")
# Cohort effects
model.plot(type="group")
# Calendar time effects
model.plot(type="calendar")
Requirements
- Python >= 3.9
- numpy >= 1.21.0
- pandas >= 1.3.0
- matplotlib >= 3.4.0
- pyfixest >= 0.18.0
Optional:
- patsy >= 0.5.3 (for model matrix construction)
- scipy >= 1.7.0 (for probit link function)
References
- Wooldridge, J. M. (2021). "Two-Way Fixed Effects, the Two-Way Mundlak Regression, and Difference-in-Differences Estimators." Working Paper.
- Wooldridge, J. M. (2023). "Simple Approaches to Nonlinear Difference-in-Differences with Panel Data." The Econometrics Journal.
License
MIT License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
etwfe-0.1.1.tar.gz
(14.0 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
etwfe-0.1.1-py3-none-any.whl
(13.2 kB
view details)
File details
Details for the file etwfe-0.1.1.tar.gz.
File metadata
- Download URL: etwfe-0.1.1.tar.gz
- Upload date:
- Size: 14.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aad2fc2d5955abf93e54cda3543e9f00584e905bee6cb2fba617e024714a0dbb
|
|
| MD5 |
131dfa55d7c0fc8fc8ca23fa2fbe9b06
|
|
| BLAKE2b-256 |
61d7c0995a04aafbaa570ac19bba79dd69360cea8f2ae72e7f9abf3b06147b5e
|
File details
Details for the file etwfe-0.1.1-py3-none-any.whl.
File metadata
- Download URL: etwfe-0.1.1-py3-none-any.whl
- Upload date:
- Size: 13.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4698fa33ec26234ea2f371c59eb2a4f46df9e0f87c21cda62932dddc49eab623
|
|
| MD5 |
f407f6822fcf21a491aa2d4c70797776
|
|
| BLAKE2b-256 |
521e3a8a87b5faa7bd3992e6d087210d5f16f762ffd82a98d373b53e09e63c01
|