DID - 2. DID의 일반화 - TWFE 모델 (2)

지난 글에서는 TWFE 모델의 기본 개념과 unit fixed effects와 time fixed effects가 교란 요인을 어떻게 통제하는지 살펴봤다. 이번 글에서는 Fixed effects 모델을 추정하는 방식 중 LSDV와 Within Estimator의 원리를 이해하고 이를 TWFE로 확장해본다. 또한 샘플 데이터를 활용해 각 방식으로 인과효과를 추정하는 과정을 코드와 함께 구체적으로 살펴보자.

Estimation
Fixed Effects Model

$ Y_{it}=\beta_i+\beta_1X_{it}+\epsilon_{it} $

Two-Way Fixed Effects model (TWFE)
\[Y_{it}=\beta_i+\beta_t+\beta_1X_{it}+\epsilon_{it}\]
샘플 데이터로 살펴보기

샘플 데이터로 2가지 추정 방식을 수행하고 그 결과를 비교해보자. 데이터는 이전 글에서 사용했던 샘플을 일부 가공하였다.

customer_id day push_notification purchase_amt dummy1 dummy2 dummy3 dummy4 time1 time2 time3
1202510140501000100
1202510151701000010
1202510161701000001
2202510140100100100
2202510151300100010
2202510161500100001
3202510140300010100
3202510150200010010
3202510160100010001
4202510140600001100
4202510150400001010
4202510160600001001


LSDV
import pandas as pd
import statsmodels.api as sm
import numpy as np

df = pd.read_csv('fixed_effects_exercise.csv')

# linear regression
col_x = ['push_notification', 'dummy1', 'dummy2', 'dummy3', 'time1', 'time2', 'time3']
col_y = 'purchase_amt'

X = df[col_x].to_numpy()
y = df[col_y].to_numpy()

X_const = sm.add_constant(X)
df_fit = sm.OLS(y, X_const).fit()

print(df_fit.summary())
LSDV 출력 결과
그림 1. LSDV 출력 결과


Within Estimator
import linearmodels as lm
import pandas as pd

df = pd.read_csv('fixed_effects_exercise.csv')
df = df.set_index(['customer_id', 'day'])

mod = lm.PanelOLS.from_formula('''purchase_amt ~ push_notification + EntityEffects + TimeEffects''', df)
twfe = mod.fit()
print(twfe)
Within Estimator 출력 결과
그림 2. Within Estimator 출력 결과