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.4.tar.gz (14.5 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.4-py3-none-any.whl (13.7 kB view details)

Uploaded Python 3

File details

Details for the file etwfe-0.1.4.tar.gz.

File metadata

  • Download URL: etwfe-0.1.4.tar.gz
  • Upload date:
  • Size: 14.5 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.4.tar.gz
Algorithm Hash digest
SHA256 c4011e5c4669ed6e09253711beaf924218bca82c08917c73c93758ab6d716e76
MD5 cb8b79ec6cbf2205437886bb08d15ce0
BLAKE2b-256 18a49fbfb6f776a6fddb01c2012075ca529cd1dcd07015a576b56982895f225a

See more details on using hashes here.

File details

Details for the file etwfe-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: etwfe-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 13.7 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.4-py3-none-any.whl
Algorithm Hash digest
SHA256 5aae31d0963ee9aad0c4ad277909dfa664f69cea3c4353e7418bc4c4fd143cb6
MD5 31da0b0223812dfd98144e02fceef112
BLAKE2b-256 db241f452284a491c737366adbdda11f33ff6cb4c718e33b00641f9d544093b6

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