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

Uploaded Python 3

File details

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

File metadata

  • Download URL: etwfe-0.1.2.tar.gz
  • Upload date:
  • Size: 14.4 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.2.tar.gz
Algorithm Hash digest
SHA256 ba245f3973524981f3067df5f8b941079e24254fcd1e305a749125460519248e
MD5 b6732eacfd09f4d92cb3d96f875af104
BLAKE2b-256 ae0e6614bd1a4213bbf0209dba264558b2c09f73e4672a91eb0658b66e986559

See more details on using hashes here.

File details

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

File metadata

  • Download URL: etwfe-0.1.2-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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 5feabb56ee982b04043e7df1fed0c96f8713ba5d8584d95d7aba2db8bedd53ad
MD5 5b5c35c15424830780a8d31738bd74ca
BLAKE2b-256 a18eb814348b7712b7a44daad5dcaeed17f18f9a81baca41898b6303102b00bf

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