Skip to main content

Extended Two-Way Fixed Effects estimator (Wooldridge 2021, 2023) for Python

Project description

ETWFE: Extended Two-Way Fixed Effects

PyPI version CI Python 3.9+

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)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

etwfe-0.1.1-py3-none-any.whl (13.2 kB view details)

Uploaded Python 3

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

Hashes for etwfe-0.1.1.tar.gz
Algorithm Hash digest
SHA256 aad2fc2d5955abf93e54cda3543e9f00584e905bee6cb2fba617e024714a0dbb
MD5 131dfa55d7c0fc8fc8ca23fa2fbe9b06
BLAKE2b-256 61d7c0995a04aafbaa570ac19bba79dd69360cea8f2ae72e7f9abf3b06147b5e

See more details on using hashes here.

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

Hashes for etwfe-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4698fa33ec26234ea2f371c59eb2a4f46df9e0f87c21cda62932dddc49eab623
MD5 f407f6822fcf21a491aa2d4c70797776
BLAKE2b-256 521e3a8a87b5faa7bd3992e6d087210d5f16f762ffd82a98d373b53e09e63c01

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page