2# Two-Way Fixed Effects (TWFE) 완전 가이드

작성일: 2025년 12월
주제: 패널 데이터 분석의 핵심 방법론
난이도: 중급-고급


목차

  1. 기본 개념
  2. 수학적 표현
  3. 고정효과의 의미
  4. TWFE 작동 원리
  5. 장점
  6. 한계점
  7. F1 DFV 분석 적용 사례
  8. 구현 방법
  9. 대안적 방법론
  10. 실무 권장사항

1. 기본 개념

1.1 정의

Two-way Fixed Effects (TWFE, 양방향 고정효과)는 패널 데이터 분석에서 관측되지 않는 이질성(unobserved heterogeneity)을 통제하기 위한 방법론입니다.

1.2 "Two-way"의 의미

  1. Entity Fixed Effects (개체 고정효과): 팀, 기업, 개인 등의 고정효과 ($\gamma_i$)
  2. Time Fixed Effects (시간 고정효과): 연도, 분기 등의 고정효과 ($\delta_t$)

1.3 왜 필요한가?

문제점:
$$Y = \beta_1 \cdot X + \varepsilon$$

해결책:
$$Y = \beta_1 \cdot X + \gamma_i + \delta_t + \varepsilon$$


2. 수학적 표현

2.1 기본 모형

$$Y_{it} = \beta_0 + \beta_1 \cdot X_{it} + \gamma_i + \delta_t + \varepsilon_{it}$$

변수 설명:

변수 의미 예시 (F1 분석)
$Y_{it}$ 종속변수 팀 i의 t년도 PointsShare
$X_{it}$ 독립변수 팀 i의 t년도 DFV 사용 여부
$\gamma_i$ 개체 고정효과 팀 i의 시간불변 특성
$\delta_t$ 시간 고정효과 t년도의 공통 환경
$\varepsilon_{it}$ 오차항 설명되지 않는 랜덤 변동
$\beta_1$ 인과효과 DFV 도입의 효과

2.2 F1 DFV 분석 적용

$$\text{PointsShare}{it} = \beta_0 + \beta_1 \cdot \text{DFV_Adopt}{it} + \gamma_i + \delta_t + \varepsilon_{it}$$

구체적 예시 (3개 팀, 3년):

$$\begin{align}
\text{PointsShare}{\text{Ferrari},1967} &= \beta_0 + \beta_1 \cdot \text{DFV}{\text{Ferrari},1967} + \gamma_{\text{Ferrari}} + \delta_{1967} + \varepsilon_{\text{Ferrari},1967} \
\text{PointsShare}{\text{Ferrari},1968} &= \beta_0 + \beta_1 \cdot \text{DFV}{\text{Ferrari},1968} + \gamma_{\text{Ferrari}} + \delta_{1968} + \varepsilon_{\text{Ferrari},1968} \
\text{PointsShare}{\text{Lotus},1967} &= \beta_0 + \beta_1 \cdot \text{DFV}{\text{Lotus},1967} + \gamma_{\text{Lotus}} + \delta_{1967} + \varepsilon_{\text{Lotus},1967} \
&\vdots
\end{align}$$


3. 고정효과의 의미

3.1 팀 고정효과 (γᵢ)

통제하는 것

"팀별로 다르지만 시간에 따라 변하지 않는 모든 특성"

F1 DFV 분석 예시

팀 특성 설명
브랜드 가치 Ferrari의 명성과 역사
조직 문화 Lotus의 혁신적 엔지니어링 접근
지리적 위치 영국 vs 이탈리아 (인프라, 인재풀)
창립자 철학 Enzo Ferrari vs Colin Chapman
팀 DNA 보수적 vs 공격적 전략

수학적 의미

$$\begin{align}
\gamma_{\text{Ferrari}} &= \text{Ferrari의 평균적인 성과 수준} \
\gamma_{\text{Lotus}} &= \text{Lotus의 평균적인 성과 수준} \
\gamma_{\text{Lotus}} - \gamma_{\text{Ferrari}} &= \text{두 팀의 시간불변 성과 격차}
\end{align}$$

3.2 연도 고정효과 ($\delta_t$)

통제하는 것

"연도별로 다르지만 모든 팀에 공통적으로 영향을 미치는 요인"

F1 DFV 분석 예시

연도 공통 환경 변화
1967 3.0L 엔진 규정 도입
1968 윙(wing) 공력 장치 허용
1970 포인트 체계 변경
1973 오일 쇼크 → 경제 환경 악화
1975 안전 규정 강화

추가 통제 요소

수학적 의미

$$\begin{align}
\delta_{1967} &= \text{1967년의 평균 성과 환경} \
\delta_{1968} &= \text{1968년의 평균 성과 환경} \
\delta_{1968} - \delta_{1967} &= \text{1967년과 1968년 사이의 전반적 환경 변화}
\end{align}$$


4. TWFE 작동 원리

4.1 Dummy Variable 방식 (실제 구현)

Python/R 코드

# Python (Statsmodels)
model = smf.ols('PointsShare ~ DFV_Adopt + C(Constructor) + C(Year)',
                data=panel).fit()
# R (fixest)
model <- feols(PointsShare ~ DFV_Adopt | Constructor + Year,
               data=panel)

확장된 회귀식

$$\begin{align}
\text{PointsShare}{it} = &\beta_0 + \beta_1 \cdot \text{DFV_Adopt}{it} \
&+ \gamma_2 \cdot \mathbb{1}(\text{팀}=\text{Lotus}) + \gamma_3 \cdot \mathbb{1}(\text{팀}=\text{McLaren}) + \cdots + \gamma_n \cdot \mathbb{1}(\text{팀}=\text{Team}n) \
&+ \delta_2 \cdot \mathbb{1}(\text{연도}=1968) + \delta_3 \cdot \mathbb{1}(\text{연도}=1969) + \cdots + \delta_T \cdot \mathbb{1}(\text{연도}=\text{Year}_T) \
&+ \varepsilon
{it}
\end{align}$$

Indicator 함수:
- $\mathbb{1}(\text{팀}=\text{Lotus}) = 1$ if 팀이 Lotus, else 0
- $\mathbb{1}(\text{연도}=1968) = 1$ if 연도가 1968, else 0

참조 범주 (Reference Category)

해석:
$$\begin{align}
\gamma_2 &= \text{Lotus와 Ferrari의 평균 성과 차이} \
\delta_2 &= \text{1968년과 1958년의 평균 성과 차이}
\end{align}$$

4.2 Within Transformation (수학적 이해)

Step 1: 그룹별 평균 계산

$$\begin{align}
\overline{\text{PointsShare}}i &= \frac{1}{T} \sum{t} \text{PointsShare}{it} \quad \text{(팀 i의 전체 기간 평균)} \
\overline{X}_i &= \frac{1}{T} \sum
{t} X_{it} \quad \text{(팀 i의 X 평균)}
\end{align}$$

Step 2: Demeaning (평균 차감)

$$\text{PointsShare}{it} - \overline{\text{PointsShare}}_i = \beta_1 \cdot (X{it} - \overline{X}i) + (\delta_t - \overline{\delta}) + \varepsilon{it}$$

효과

4.3 시각적 이해

Before TWFE (Raw Data)

Ferrari: Year  1967  1968  1969  1970
         Points  10    15    20    25    평균 = 17.5

Lotus:   Year  1967  1968  1969  1970
         Points  30    35    40    45    평균 = 37.5

관측:
- Lotus가 Ferrari보다 평균 20점 더 높음
- 이 차이는 팀 역량 차이인가, DFV 효과인가?

After Demeaning (TWFE)

Ferrari: Demeaned  -7.5  -2.5   2.5   7.5   평균 = 0
Lotus:   Demeaned  -7.5  -2.5   2.5   7.5   평균 = 0

변환 효과:
- 팀 간 수준 차이(20점) 제거
- 각 팀 내에서의 변화 패턴만 남음
- 두 팀의 시간 추세가 동일하면 효과 식별 불가


5. TWFE의 장점

5.1 Omitted Variable Bias 완화

Pooled OLS의 문제

$$\text{PointsShare} = \beta_1 \cdot \text{DFV_Adopt} + \varepsilon$$

문제:
- 팀 역량, 예산, 드라이버 실력 등 누락
- 강한 팀 → DFV 도입 확률 높음 + 원래 성과 좋음
- $\beta_1$이 과대추정됨 (upward bias)

결과:
$$E[\hat{\beta}_1] \neq \beta_1 \quad \text{(편향된 추정치)}$$

TWFE의 해결

$$\text{PointsShare} = \beta_1 \cdot \text{DFV_Adopt} + \gamma_i + \delta_t + \varepsilon$$

효과:
- $\gamma_i$가 팀 역량, 예산, 조직 문화 등을 자동 통제
- $\delta_t$가 연도별 규정 변화, 경제 환경 등을 자동 통제
- $\beta_1$이 불편 추정치에 근접

결과:
$$E[\hat{\beta}_1] \approx \beta_1 \quad \text{(일치 추정치, 강한 가정 하)}$$

5.2 인과 추론의 타당성 향상

Identification Strategy

목표:
$$\beta_1 = \text{DFV 도입의 순수한 인과효과}$$

필요 가정: Parallel Trends (평행 추세)

만약 DFV를 도입하지 않았다면, 모든 팀의 성과 추세가 평행했을 것

TWFE가 통제하는 것

  1. 시간불변 교란요인 ($\gamma_i$)
  2. 팀 역량, 브랜드, 위치 등

  3. 공통 시간 효과 ($\delta_t$)

  4. 규정 변화, 경제 환경, 기술 진보

  5. 남은 변동으로 효과 식별

  6. Within-team variation over time
  7. 각 팀이 자신의 control group

5.3 실용성

장점:

  1. 구현 간단
    python # 더미 변수 추가만으로 구현 model = ols('Y ~ X + C(entity) + C(time)', data).fit()

  2. 표준 소프트웨어 사용 가능

  3. Python: statsmodels, linearmodels
  4. R: lm(), plm(), fixest
  5. Stata: xtreg, reghdfe

  6. 해석 직관적
    "팀별, 연도별 특성을 통제한 후, DFV 도입이 성과를 β₁만큼 변화시킴"


6. TWFE의 한계점

6.1 느린 변화 변수의 식별 문제 ⚠️

문제 상황

$$\text{DFV_Persist}_{it} = \text{누적 DFV 사용 연수}$$

Ferrari:  0  0  0  0  1  2  3  4  5  6  (1970 도입)
Lotus:    0  1  2  3  4  5  6  7  8  9  (1967 도입)

특징:
- 시간에 따라 천천히 증가
- 팀 내 변동이 있지만 매우 작음
- 대부분의 변동이 팀 간 차이에서 발생

TWFE의 문제

Step 1: 평균 계산
$$\begin{align}
\overline{\text{DFV_Persist}}{\text{Ferrari}} &= 2.1 \
\overline{\text{DFV_Persist}}
{\text{Lotus}} &= 4.5
\end{align}$$

Step 2: Demeaning

Ferrari: -2.1, -2.1, -2.1, -2.1, -1.1, -0.1, 0.9, 1.9, 2.9, 3.9
Lotus:   -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5

문제:
- $\gamma_i$가 대부분의 변동(between variation)을 흡수
- 남은 within variation이 매우 작음
- DFV_Persist의 효과를 과소추정

결과

$$\begin{align}
\text{Version 1 (Pooled OLS):} \quad \beta &= 4.90^{***} \quad (p < 0.01) \
\text{Version 2 (TWFE):} \quad \beta &= 0.01 \quad (p = 0.45)
\end{align}$$

이유: TWFE가 학습 효과의 대부분을 팀 FE로 흡수

6.2 Treatment Effect Heterogeneity

문제

가정:
$$\text{TWFE assumes: } \beta_1 = \text{모든 } i, t \text{에 대해 동일}$$

현실:
$$\beta_{1,it} = \text{팀 } i, \text{ 시점 } t \text{에 따라 다를 수 있음}$$

예시:
- Early adopter (Lotus): $\beta_1 = 10$
- Late adopter (Ferrari): $\beta_1 = 3$
- 1967년 효과: $\beta_1 = 8$
- 1975년 효과: $\beta_1 = 2$

최근 연구 결과

Goodman-Bacon (2021):
- TWFE는 heterogeneous treatment effects 하에서 편향
- "Forbidden comparisons" 문제
- Already-treated vs newly-treated 비교가 문제

Sun & Abraham (2021):
- Event study with heterogeneous effects
- Interaction-weighted estimator 제안

결론:
- Treatment timing이 다른 경우 (staggered adoption)
- TWFE 계수의 해석이 복잡해짐

6.3 자유도 소모

문제

F1 DFV 분석 예시:

표본 크기: 95 관측치
팀 수: 23개 → 22개 더미 변수
연도 수: 18개 → 17개 더미 변수
총 파라미터: 1 (절편) + 1 (DFV) + 22 + 17 = 41개

실질 자유도: 95 - 41 = 54

결과:
- 표준오차 증가 → 신뢰구간 확대
- 검정력(power) 감소 → 효과 감지 어려움
- 과적합(overfitting) 위험 → 표본외 예측력 저하

비유:

95명의 학생 성적을 설명하는데,
41개의 설명변수 사용
 남은 정보가 54개에 불과

6.4 시간불변 변수와의 완전 공선성

문제

$$\text{INTEGRATED}_i = \text{팀 } i \text{가 통합형인지 여부}$$

Ferrari:  항상 1 (1950-1975 모두 1)
Lotus:    항상 0 (1950-1975 모두 0)

TWFE 모형:
$$Y = \beta_1 \cdot \text{DFV} + \beta_2 \cdot \text{INTEGRATED} + \gamma_i + \delta_t + \varepsilon$$

문제:
- INTEGRATED = 팀 더미의 선형결합
- 완전 공선성(perfect multicollinearity)
- $\beta_2$ 추정 불가능

결과:

Version 2 분석에서 H2 검증 실패
"INTEGRATED × DFV" 상호작용도 추정 어려움

해결책

  1. Random Effects 사용

RE allows time-invariant variables

  1. 상호작용만 추정
    $$Y = \beta_1 \cdot \text{DFV} + \beta_3 \cdot (\text{DFV} \times \text{INTEGRATED}) + \gamma_i + \delta_t + \varepsilon$$

  2. Between estimator

팀 평균값으로 회귀 (cross-sectional)


7. F1 DFV 분석에서의 TWFE 적용

7.1 Version 1 vs Version 2 비교

Version 1: Simple Regression

모형:

# Pooled OLS / Simple FE
POINTS ~ DFV_PERSISTENCE + Year_norm

결과:
$$\begin{align}
\beta &= 4.900^{***} \
p &= 0.0034 \
R^2 &= 0.220
\end{align}$$

해석:
- DFV 1년 추가 사용 → 4.9 points 증가
- 매우 유의미한 학습 효과

Version 2: TWFE

모형:

# Two-way Fixed Effects
PointsShare ~ DFV_Persist + C(Constructor) + C(Year)

결과:
$$\begin{align}
\beta &= 0.010 \
p &= 0.449 \text{ (비유의)} \
R^2 &= 0.701
\end{align}$$

해석:
- DFV 지속성 효과가 사라짐
- $R^2$는 높아졌으나 관심 변수 비유의

7.2 왜 결과가 극명하게 다른가?

원인 1: 종속변수 차이

Version 1: POINTS (0 ~ 100+)
- 높은 변동성
- 효과 크기 감지 용이

Version 2: PointsShare (0 ~ 1)
- 낮은 변동성
- 효과 크기 축소

예시:

Ferrari: POINTS = 30  PointsShare = 0.15
Lotus:   POINTS = 60  PointsShare = 0.30

차이: 30 points vs 0.15 share

원인 2: 고정효과의 영향

V1: 일부 모델만 FE

대부분 between variation 사용
   차이 포착

V2: 모든 모델 TWFE

오직 within variation만 사용
   차이 제거

흡수되는 변동:

변동 설명 TWFE 처리
Between (팀 간) Lotus(강함) vs 약한 팀 제거됨
Between (연도 간) 1967 vs 1975 제거됨
Within (팀 내 시간) 각 팀의 연도별 변화 사용됨

원인 3: DFV_Persist의 특성

DFV_Persist = 천천히 증가하는 변수
→ 대부분의 변동이 between
→ TWFE가 이를 γᵢ로 흡수
→ 효과 과소추정

시각화:

Total Variation in DFV_Persist:
- Between teams: 80%  (Lotus 평균=5 vs Ferrari 평균=2)
- Within teams:   20%  (각 팀 내 연도별 변화)

TWFE는 20%의 변동만 사용!

7.3 구체적 수치 비교

데이터 분해

Lotus (1967-1975):

Year:         1967  1968  1969  1970  1971  1972  1973  1974  1975
DFV_Persist:    1     2     3     4     5     6     7     8     9
Points:        40    50    60    65    70    75    80    82    85

평균: DFV_Persist = 5, Points = 67.4

McLaren (1968-1975):

Year:         1968  1969  1970  1971  1972  1973  1974  1975
DFV_Persist:    1     2     3     4     5     6     7     8
Points:        30    40    50    55    60    65    68    70

평균: DFV_Persist = 4.5, Points = 54.75

Pooled OLS (V1)

사용 변동:

Between variation:
- Lotus 평균 67.4 vs McLaren 평균 54.75 = 12.65 차이
- DFV_Persist 평균 5 vs 4.5 = 0.5 차이
- 기울기  12.65 / 0.5  25 ( 효과!)

결과: β ≈ 4.9*** (유의함)

TWFE (V2)

사용 변동:

Within Lotus:
- DFV_Persist: 1→9 변화 시 Points: 40→85 변화
- Demeaned 후: 작은 변동

Within McLaren:
- DFV_Persist: 1→8 변화 시 Points: 30→70 변화
- Demeaned 후: 작은 변동

두 패턴이 유사하면 효과 식별 어려움

결과: β ≈ 0.01 (비유의)


8. TWFE 구현

8.1 Python (Statsmodels)

기본 구현

import pandas as pd
import statsmodels.formula.api as smf

# 데이터 로드
panel = pd.read_csv('panel_data.csv')

# Two-way FE
model = smf.ols('PointsShare ~ DFV_Adopt + C(Constructor) + C(Year)',
                data=panel).fit()

# 결과 출력
print(model.summary())

결과 해석

# 계수 추출
beta_dfv = model.params['DFV_Adopt']
se_dfv = model.bse['DFV_Adopt']
pval_dfv = model.pvalues['DFV_Adopt']

print(f"DFV Effect: {beta_dfv:.4f}")
print(f"Std Error: {se_dfv:.4f}")
print(f"P-value: {pval_dfv:.4f}")

8.2 Python (Linearmodels) - 권장

from linearmodels.panel import PanelOLS

# 패널 데이터 구조로 변환
panel_indexed = panel.set_index(['Constructor', 'Year'])

# TWFE with clustered SE
model = PanelOLS(panel_indexed['PointsShare'],
                 panel_indexed[['DFV_Adopt']],
                 entity_effects=True,
                 time_effects=True).fit(cov_type='clustered',
                                       cluster_entity=True)

print(model.summary)

장점:
- 클러스터링 표준오차 자동 지원
- 고정효과 처리 최적화
- 패널 데이터 전용 설계

8.3 R (fixest) - 강력 추천

library(fixest)

# Two-way FE with clustered SE
model <- feols(PointsShare ~ DFV_Adopt | Constructor + Year,
               data = panel,
               cluster = ~Constructor)

# 결과 출력
summary(model)

# 고정효과 추출
fixef(model)

# 시각화
coefplot(model)

장점:
- 매우 빠른 속도 (대규모 데이터)
- 고정효과 자동 처리 (더미 생성 불필요)
- 다양한 표준오차 옵션
- 결과 시각화 내장

8.4 R (plm)

library(plm)

# 패널 데이터 선언
pdata <- pdata.frame(panel, index = c("Constructor", "Year"))

# Two-way FE
model <- plm(PointsShare ~ DFV_Adopt,
             data = pdata,
             model = "within",
             effect = "twoways")

# Clustered SE
library(lmtest)
library(sandwich)
coeftest(model, vcov = vcovHC(model, cluster = "group"))

8.5 Stata

* 패널 데이터 선언
xtset Constructor Year

* Two-way FE with clustered SE
xtreg PointsShare DFV_Adopt i.Year, fe vce(cluster Constructor)

* 또는 reghdfe (고차원 FE)
reghdfe PointsShare DFV_Adopt, absorb(Constructor Year) vce(cluster Constructor)

9. 대안적 방법론

9.1 Random Effects (RE)

모형

$$Y_{it} = \beta_0 + \beta_1 \cdot X_{it} + u_i + \varepsilon_{it}$$

가정:
$$\begin{align}
u_i &\sim N(0, \sigma^2_u) \quad \text{(팀 효과가 랜덤)} \
\text{Cov}(u_i, X_{it}) &= 0 \quad \text{(독립성 가정)}
\end{align}$$

장점

  1. 시간불변 변수 추정 가능
    python # INTEGRATED 같은 변수도 추정 가능 model = smf.mixedlm('Y ~ X + INTEGRATED', groups='Constructor')

  2. 더 효율적 (smaller SE)

  3. Between + Within variation 모두 사용
  4. 표준오차 감소

단점

  1. 강한 가정 필요
    $$\text{Cov}(u_i, X) = 0$$
    → 현실적으로 만족하기 어려움

  2. 편향 위험

  3. 가정 위배 시 일치성 상실

Hausman Test

from statsmodels.stats.hausman import Hausman

# FE vs RE 선택
fe_model = PanelOLS(..., entity_effects=True).fit()
re_model = RandomEffects(...).fit()

h_test = Hausman(fe_model.params, re_model.params, ...)
print(h_test.summary())

해석:
- p < 0.05: FE 사용 (RE 가정 기각)
- p > 0.05: RE 사용 가능

9.2 First Differences (FD)

모형

$$\Delta Y_{it} = Y_{it} - Y_{i,t-1} = \beta_1 \cdot \Delta X_{it} + \Delta \delta_t + \Delta \varepsilon_{it}$$

장점

  1. $\gamma_i$ 자동 제거
    $$\gamma_i - \gamma_i = 0$$

  2. 단기 효과 포착

  3. 변화의 즉각적 영향

단점

  1. 장기 누적 효과 파악 어려움

학습 효과 같은 누적 과정 분석 부적합

  1. 노이즈 증가
    $$\text{Var}(\Delta \varepsilon) = 2 \cdot \text{Var}(\varepsilon)$$
    → 표준오차 증가

9.3 Event Study / Dynamic DiD

모형

$$Y_{it} = \sum_{k} \beta_k \cdot \mathbb{1}(t = t^*i + k) + \gamma_i + \delta_t + \varepsilon{it}$$

장점

  1. 동태적 효과 파악

도입 전: $\beta_{-3}, \beta_{-2}, \beta_{-1}$ → 사전 추세 검정

도입 후: $\beta_0, \beta_1, \beta_2, \ldots$ → 효과의 시간 경로

  1. Parallel trends 검정
    $$H_0: \beta_{-3} = \beta_{-2} = \beta_{-1} = 0$$

  2. Heterogeneous effects 허용

  3. 시점별로 다른 효과

구현 (R fixest)

library(fixest)

# Event study
model <- feols(PointsShare ~ i(event_time, ref=-1) | Constructor + Year,
               data = panel,
               cluster = ~Constructor)

# 시각화
iplot(model)

9.4 Stacked DiD (최신 방법론)

배경

문제: Treatment timing이 다른 경우 (DFV 도입 연도가 팀마다 다름)
- Lotus: 1967년
- McLaren: 1968년
- Ferrari: 1970년 (가정)

TWFE의 문제:
- Already-treated vs newly-treated 비교
- "Forbidden comparisons"

해결책: Stacking

각 treatment 시점별로 별도의 dataset 생성
→ 각각 DiD 추정
→ 결과 통합

구현 (Callaway & Sant'Anna)

library(did)

# Stacked DiD
model <- att_gt(yname = "PointsShare",
                tname = "Year",
                idname = "Constructor",
                gname = "FIRST_DFV_YEAR",
                data = panel)

# 평균 효과
agg_effects <- aggte(model, type = "group")
summary(agg_effects)

10. 실무 권장사항

10.1 언제 TWFE를 사용할까?

✅ 적합한 경우

  1. 패널 데이터 구조

$i \times t$ 형태 (entity × time)

예: 팀-연도, 기업-분기, 개인-월

  1. 관심 변수가 시간가변적

DFV_Adopt: $0 \to 1$로 변화

시간에 따라 변하지 않으면 식별 불가

  1. 시간불변 교란요인 우려

팀 역량, 브랜드 가치 등

  1. 충분한 표본 크기

최소 권장:
- $i$ (entities) > 20
- $t$ (time periods) > 5
- $i \times t > 100$

❌ 부적합한 경우

  1. 느리게 변하는 변수

DFV_Persist, 누적 경험 등

→ Pooled OLS 또는 RE 고려

  1. 표본 크기 매우 작음

$i < 10, t < 3$

→ 자유도 부족

  1. Treatment effect 매우 이질적
    팀/시점별 효과 차이 큼 → Event study, Stacked DiD

  2. 시간불변 변수가 핵심
    INTEGRATED 효과 추정 필요 → Random Effects

10.2 보고 시 체크리스트

✓ 필수 사항

1. 모형 명세 명확히

"We estimate a two-way fixed effects model
 with team and year fixed effects."

2. 표준오차 클러스터링

"Standard errors are clustered at the team level
 to account for serial correlation."

3. 결과 테이블

| Variable      | (1) Pooled | (2) FE  | (3) TWFE |
|---------------|------------|---------|----------|
| DFV_Adopt     | 0.05**     | 0.03*   | 0.02     |
|               | (0.02)     | (0.02)  | (0.03)   |
| Team FE       | No         | Yes     | Yes      |
| Year FE       | No         | No      | Yes      |
| R-squared     | 0.15       | 0.45    | 0.70     |
| N             | 95         | 95      | 95       |

4. 강건성 검증
- [ ] Pooled OLS와 비교
- [ ] Random Effects와 비교 (Hausman test)
- [ ] Event study로 parallel trends 검정
- [ ] 다양한 표준오차 (robust, clustered)

5. 결과 해석

"The coefficient of 0.02 represents the within-team
 effect of DFV adoption over time, controlling for
 time-invariant team characteristics and common
 year shocks."

10.3 F1 DFV 분석 권장

가설별 적합 방법론

가설 권장 방법 이유
H1' (채택 효과) TWFE ✓ DFV_Adopt은 시간가변, TWFE 적합
H2' (학습 효과) Pooled/RE ✓ DFV_Persist는 느린 변화, TWFE 부적합
H3' (역량 증폭) RE + Interaction INTEGRATED는 시간불변, RE 필요

권장 분석 절차

1단계: 탐색적 분석

# Pooled OLS
model1 = ols('Y ~ X + Year', data).fit()

2단계: 기본 TWFE

# Two-way FE
model2 = ols('Y ~ X + C(Team) + C(Year)', data).fit()

3단계: 강건성 검증

# Event study
feols(Y ~ i(event_time, ref=-1) | Team + Year, data)

# Stacked DiD
att_gt(yname="Y", gname="treatment_year", ...)

4단계: 결과 비교

표 작성: Pooled vs FE vs TWFE vs Event Study
→ 결과의 패턴 파악
→ 가장 credible한 추정치 선택

10.4 일반적 권장사항

연구 설계 단계

  1. 사전 등록 (Pre-registration)
    ```
  2. 주요 모형 명세 미리 결정
  3. Data fishing 방지
    ```

  4. Parallel trends 검정
    ```

  5. Event study plot으로 시각화
  6. 사전 추세가 평행한지 확인
    ```

  7. Power 계산
    ```

  8. 최소 감지 가능 효과 크기 계산
  9. 표본 크기 충분성 판단
    ```

분석 단계

  1. Multiple specifications
    ```
  2. 다양한 모형 시도
  3. Sensitivity analysis
    ```

  4. Subgroup analysis
    ```

  5. Early vs Late adopters
  6. Strong vs Weak teams
    ```

  7. Robustness checks
    ```

  8. 다른 DV 사용
  9. 다른 표본 기간
  10. 다른 treatment 정의
    ```

보고 단계

  1. 투명성
    ```
  2. 모든 모형 결과 보고
  3. Appendix에 추가 분석
    ```

  4. 한계점 논의
    ```

  5. TWFE의 가정과 한계
  6. 대안 해석 가능성
    ```

  7. Replication 가능성
    ```

  8. 코드 공개 (GitHub)
  9. 데이터 공개 (가능한 경우)
    ```

요약 및 결론

TWFE는...

✅ 강력한 도구

⚠️ 주의 필요

💡 핵심 교훈 (F1 DFV 분석)

Version 1 vs Version 2의 극명한 차이:
$$\begin{align}
\text{V1 (Pooled):} \quad \beta &= 4.90^{***} \quad \text{(학습 효과 강함)} \
\text{V2 (TWFE):} \quad \beta &= 0.01 \quad \text{(학습 효과 사라짐)}
\end{align}$$

교훈:
1. 방법론이 결과를 결정할 수 있음
2. 더 엄격한 방법 $\neq$ 항상 더 나은 방법
3. 변수 특성에 맞는 방법론 선택 필수
4. Multiple approaches로 강건성 확인

마지막 조언

"TWFE는 만능 해결책이 아닙니다.
연구 질문, 데이터 구조, 변수 특성을 고려하여
가장 적합한 방법론을 선택하세요.
그리고 언제나 결과의 강건성을 다각도로 검증하세요."


참고문헌

핵심 논문

  1. Angrist, J. D., & Pischke, J. S. (2009). Mostly Harmless Econometrics. Princeton University Press.
  2. Chapter 5: Fixed Effects and Panel Data

  3. Goodman-Bacon, A. (2021). "Difference-in-differences with variation in treatment timing." Journal of Econometrics, 225(2), 254-277.

  4. TWFE의 문제점 분석

  5. Sun, L., & Abraham, S. (2021). "Estimating dynamic treatment effects in event studies with heterogeneous treatment effects." Journal of Econometrics, 225(2), 175-199.

  6. Event study의 개선 방법

  7. Callaway, B., & Sant'Anna, P. H. (2021). "Difference-in-differences with multiple time periods." Journal of Econometrics, 225(2), 200-230.

  8. Stacked DiD 방법론

R 패키지 문서

Python 패키지 문서


문서 끝
작성: Claude (Anthropic)
최종 수정: 2025년 12월