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.0.tar.gz (13.1 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.0-py3-none-any.whl (12.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: etwfe-0.1.0.tar.gz
  • Upload date:
  • Size: 13.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for etwfe-0.1.0.tar.gz
Algorithm Hash digest
SHA256 737545bf2832edc8aab2c8dd795a1c137f9bc4a91784d955031d31e5b232abf0
MD5 42b951ef2350257c80ad59f4bec8766e
BLAKE2b-256 92ed85fbd7ed2c0291536d6b7b879434e3161b3da2f15cb0882cdc3374eaa805

See more details on using hashes here.

Provenance

The following attestation bundles were made for etwfe-0.1.0.tar.gz:

Publisher: publish.yml on armandkapllani/etwfe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: etwfe-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 12.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for etwfe-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 cbf2203478b3e07ad913eb65102e2edf12cb05fd04d0a6a5edeca28eb3628acd
MD5 7c2a8aeb98561d7ab922f4544c1d6818
BLAKE2b-256 5e523308242ebe9f40e91a0e8aa8cb306ebbe85ccb6dc1322fbc64fec3d82797

See more details on using hashes here.

Provenance

The following attestation bundles were made for etwfe-0.1.0-py3-none-any.whl:

Publisher: publish.yml on armandkapllani/etwfe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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