일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 최소제곱법
- simple linear regression
- 교란변수
- 회귀불연속설계
- LU분해
- 잔차의 성질
- 인과추론
- HTML
- Instrumental Variable
- 머신러닝
- least square estimation
- 네이버 뉴스
- 크롤링
- rct
- 사영
- confounder
- 단순선형회귀
- Sharp RD
- 교란 변수
- OVB
- 인과 추론
- Python
- residuals
- 예제
- causal inference
- 선형대수
- 통계
- 누락편의
- backdoor adjustment
- Omitted Variable Bias
- Today
- Total
Always awake,
도구 변수(IV) 예제 본문
"본 포스팅은 도구 변수(IV, Instrumental Variable)을 활용한 인과 추론 예제에 관한 내용입니다"
도구 변수 관련 내용은 아래 링크를 참고해주시면 감사하겠습니다.
데이터 생성
아래와 같은 형태로 예제 데이터를 생성합니다.
- $T$ : 원인 변수
- $Y$ : 결과 변수
- $W$ : (관측하지 못한) 교란 변수
- $Z$ : 도구 변수
추정해야할 인과 효과는 $T$가 $Y$에 미치는 영향인 $7$입니다
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.formula.api as sm
np.random.seed(777) # 동일한 결과를 위해 시드 설정
num = 500 # 데이터 수
W = np.random.normal(size = num) # 교란 변수
Z = np.random.normal(size = num) # 도구 변수
# T는 W와 Z의 영향을 받습니다.
T = 5.0*W + 4.0*Z + np.random.normal(size = num) # 원인 변수
# Y는 X와 W의 영향을 받습니다.
Y = 10.0*W + 7.0*T + np.random.normal(size = num) # 결과 변수
data = pd.DataFrame({'T' : T, 'W' : W, 'Y' : Y})
단순 비교
교란 요인 $W$를 통제하지 않은 상태에서 단순히 $T$와 $Y$의 관계를 비교하는 경우 정확한 인과 효과를 추정하지 못합니다
(추정값이 $8.1173$로 실제 인과 효과인 $7$과 매우 다름)
# 단순 비교
sod_model = sm.ols('Y ~ T', data).fit()
# 교란 변수를 누락하였기에 인과 효과가 잘못 추정됨
sod_model.summary().tables[1]
교란 요인 $W$의 영향을 제거한 후 $T$가 $Y$에 미치는 인과 효과를 추정하기 위해서는 교란 요인을 통제한 모델($Y ~ T + W$)에서의 $T$의 회귀 계수를 확인하면 됩니다.
하지만 교란 요인 $W$는 관찰되지 못한 상태이므로 교란 요인을 통제하는 방법으로 인과 효과를 추정할 수 없습니다.
이 때, 도구 변수를 활용하면 인과 효과를 추정할 수 있습니다.
도구 변수를 활용한 추정
도구 변수 $Z$는 교란 변수 $W$와 상관성이 없고, 원인 변수 $T$와 상관성이 매우 높기 때문에 이를 활용하여 인과 효과를 추정합니다.
절차는 다음과 같습니다.
- first stage model : $Z$가 $T$에 미치는 영향을 추정 ($\phi$)
- reduced model : $Z$가 $Y$에 미치는 영향을 추정 ($\rho$)
→ $T$가 $Y$에 미치는 인과 효과 : $\large{\frac{\rho}{\phi}}$
데이터를 통해 확인해보겠습니다
도구 변수를 사용한 인과 효과 추정
# first stage model(Z -> T)
stage1_model = sm.ols('T ~ Z', data).fit()
# reduced model(Z -> Y)
reduced_model = sm.ols('Y ~ Z', data).fit()
first stage model
# first stage model
stage1_model.summary().tables[1]
$\phi = 4.0436$
reduced model
# reduced model
reduced_model.summary().tables[1]
$\rho = 28.3041$
즉, 인과 효과 = $\large{\frac{\rho}{\phi}}$ = $28.3041/4.0436 = 6.9997$ 로 실제 인과 효과인 $7$을 잘 추정한 것을 알 수 있습니다.
도구 변수를 활용한 추정(2SLS)
위에서 알려드린 방법은 인과 효과의 평균 값만 확인한 것입니다.
따라서 인과 효과의 유의성, 신뢰구간을 확인하기 위해 first stage model에서 $\hat{T}$(예측된 $T$)을 $Y$에 회귀시키는 2SLS(Two Stage Least Square)를 사용합니다.
인과 효과는 위에서 계산한 값($6.9997$)과 동일합니다
# first stage
t_hat = stage1_model.predict()
data['T_hat'] = t_hat
# second stage
stage2_model = sm.ols('Y ~ T_hat', data).fit()
# first stage model
stage2_model.summary().tables[1]
2SLS를 이용하여 추정한 인과 효과는 $6.9997$이며,
p-value가 매우 작으므로 인과 효과가 유의하다고 판단할 수 있습니다!
참고로, 위에서 계산한 추정값과 동일합니다
마치며
인과 추론 시 교란 변수를 누락 문제를 해결하기 위한 방법으로 도구 변수(IV)에 대해 설명하였으며
실제 계산 방법을 예제를 통해 알아보았습니다.
피드백은 댓글로 남겨주시면 감사하겠습니다!
▼ 글이 도움이 되셨다면 아래 클릭 한번 부탁드립니다 :) ▼
'인과추론(Causal Inference)' 카테고리의 다른 글
불연속회귀설계(RDD) (0) | 2021.10.04 |
---|---|
이중차분법(DID) (0) | 2021.10.02 |
도구 변수(IV) (2) | 2021.07.20 |
누락 편의(OVB) 예제 (3) | 2021.07.20 |
누락 편의(OVB) (0) | 2021.07.17 |