Always awake,

도구 변수(IV) 예제 본문

인과추론(Causal Inference)

도구 변수(IV) 예제

호재 P.B 2021. 8. 26. 01:48

"본 포스팅은 도구 변수(IV, Instrumental Variable)을 활용한 인과 추론 예제에 관한 내용입니다"

 

도구 변수 관련 내용은 아래 링크를 참고해주시면 감사하겠습니다.

 

도구 변수(IV)

본 포스팅은 도구변수에 대해 공부한 내용을 정리한 글입니다 :) 참고 서적 : Joshua D. Angrist, Jorn-Steffen Pischke. (2018). 고수들의 계량경제학. 시그마프레스. p.98 ~ p.144 들어가며 일전에 causal diag..

everyday-tech.tistory.com

 

데이터 생성

아래와 같은 형태로 예제 데이터를 생성합니다.

  • $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