๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
1๏ธโƒฃ AI•DS/๐ŸฅŽ Casual inference

[The Brave and True] 8. Instrumental variables

by isdawell 2023. 7. 3.
728x90

 

 

๐Ÿ‘€ ์ธ๊ณผ์ถ”๋ก  ๊ฐœ์ธ ๊ณต๋ถ€์šฉ ํฌ์ŠคํŠธ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ถœ์ฒ˜๋Š” ์ฒจ๋ถ€ํ•œ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!

 

 

 

 

๐Ÿ“œ ์ •๋ฆฌ 

 

๋„๊ตฌ๋ณ€์ˆ˜

•   Treatment ๋ณ€์ˆ˜์™€ ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ์œผ๋ฉด์„œ, Treatment ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ฒฐ๊ณผ๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ฒƒ 
•   2SLS ๋ฅผ ์‚ฌ์šฉํ•ด ์ธ๊ณผํšจ๊ณผ๋ฅผ ์ถ”์ • 
•   ์•ฝํ•œ ๋„๊ตฌ๋ณ€์ˆ˜๋ผ๋ฉด ์ถ”์ •์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.
•   2SLS ๋Š” ์ผ๊ด€์„ฑ์ด ์žˆ๊ธด ํ•˜์ง€๋งŒ, ์—ฌ์ „ํžˆ ์ธ๊ณผํšจ๊ณผ๋ฅผ ์ถ”์ •ํ•˜๋Š”๋ฐ ์žˆ์–ด์„  ํŽธํ–ฅ๋œ ๋ฐฉ๋ฒ•์ด๋‹ค. 

 

 

 

 

 

 

โ‘    Going Around Omitted variable bias 


 

โ—ฏ   Instrumental variables 

 

•  OVB(Omitted Variable Bias) ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ์ƒ๋žต๋œ ๋ณ€์ˆ˜๋ฅผ ๋ชจ๋ธ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ๋žต๋œ ๋ณ€์ˆ˜๋ฅผ ํ•ญ์ƒ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค. 

 

•  ๋„๊ตฌ๋ณ€์ˆ˜์˜ ์•„์ด๋””์–ด๋Š” ์ฒ˜์น˜๋ณ€์ˆ˜๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋ฉฐ, ๋„๊ตฌ๋ณ€์ˆ˜ Z๋Š” ์ฒ˜์น˜๋ฅผ ํ†ตํ•œ ๊ฒฐ๊ณผ Y์—๋งŒ ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ๋„๊ตฌ๋ณ€์ˆ˜๋Š” Y์™€๋Š” ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ T ์™€์˜ ์ƒ๊ด€๊ด€๊ณ„๋Š” ์„ฑ๋ฆฝํ•ด์•ผ ํ•œ๋‹ค = Exclusion Restriction 

โ†ช Cov(Z,u) = 0 , u ๋Š” ์˜ค์ฐจํŒก 

 

 

 

๊ต์œก์ด ์ž„๊ธˆ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ

 

 

•   2SLS

 

๋ถ„์ž์™€ ๋ถ„๋ชจ๋Š” ๋ชจ๋‘ ํšŒ๊ท€๊ณ„์ˆ˜!

 

 

•  Reduced form : Z ์— ๋Œ€ํ•œ Y์˜ ํšŒ๊ท€๋ถ„์„ ๊ฒฐ๊ณผ = Y์— ๋Œ€ํ•œ Z์˜ ์˜ํ–ฅ (Z๊ฐ€ T๋ฅผ ํ†ตํ•ด Y์— ๋ฏธ์น˜๋Š” ํšจ๊ณผ)

•  1st stage coefficient : Z์— ๋Œ€ํ•œ T์˜ ํšŒ๊ท€์‹ = T์— ๋Œ€ํ•œ Z์˜ ์˜ํ–ฅ 

 

๋„ํ•จ์ˆ˜๋กœ ํ‘œํ˜„

 

 

 

 

 

 

 

 

 

 

โ‘ก   Quarter of Birth and the Effect of Education on Wage 


 

โ—ฏ  ์ž„๊ธˆ-๊ต์œก-์ถœ์ƒ4๋ถ„๊ธฐ 

 

•   ๊ต์œก์ด ์ž„๊ธˆ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ถ”์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ๋žŒ์˜ ์ถœ์ƒ 4๋ถ„๊ธฐ๋ฅผ ๋„๊ตฌ๋ณ€์ˆ˜ Z๋กœ ์‚ฌ์šฉํ•œ๋‹ค. 

 

•   ๋ฏธ๊ตญ์˜ ๋‚˜์ด๋ฒ•์— ์˜ํ•˜๋ฉด 4๋ถ„๊ธฐ์— ํƒœ์–ด๋‚œ ์‚ฌ๋žŒ๋“ค์€ ํ‰๊ท ์ ์œผ๋กœ ์—ฐ์ดˆ์— ํƒœ์–ด๋‚œ ์‚ฌ๋žŒ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ต์œก์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค. 

 

 

•   ์ถœ์ƒ๋ถ„๊ธฐ(qob) ๋Š” ability (๋Šฅ๋ ฅ - Confounder) ์š”์†Œ์™€ ๋ฌด๊ด€ํ•˜์—ฌ ๊ต์œก์ด ์ž„๊ธˆ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๊ต๋ž€์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ฐ›์•„๋“ค์ธ๋‹ค๋ฉด, ์ถœ์ƒ๋ถ„๊ธฐ๋ฅผ ๋„๊ตฌ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ถœ์ƒ๋ถ„๊ธฐ๊ฐ€ ๊ต์œก์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ ์™ธ์—๋Š” ์ž„๊ธˆ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค. 

 

 

 

 

 

•   ํ™œ์šฉํ•  ๋ฐ์ดํ„ฐ์…‹ ํ˜•ํƒœ 

 

 

โ†ช  log_wage : ๋กœ๊ทธ ์ž„๊ธˆ (Y)

โ†ช  years_of_schooling : ๊ต์œก ๊ธฐ๊ฐ„ (T) 

โ†ช  year_of_birth : ์ถœ์ƒ์—ฐ๋„

โ†ช  quarter_of_birth : ์ถœ์ƒ๋ถ„๊ธฐ (IV) 

โ†ช  state_of_birth : ์ถœ์ƒ์ƒํƒœ 

 

 

 

 

โ‘ข   The 1st Stage 


 

 

 

โ—ฏ  ๋„๊ตฌ๋ณ€์ˆ˜ ๊ฐ€์ • - ์œ ํšจ์„ฑ ๊ฒ€์ฆ 

 

โ‘ด  Cov(Z,T) ≠ 0 : ๋„๊ตฌ๋ณ€์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ ์ฒ˜์น˜๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋ฅผ ์ถฉ์กฑ 

โ‘ต  Y ⊥ Z | T : Exclusion Restriction : ๋„๊ตฌ๋ณ€์ˆ˜ Z๊ฐ€ ์ฒ˜์น˜ T๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ฒฐ๊ณผ Y ์— ์˜ํ–ฅ์„ ์ค€๋‹ค๋Š” ๊ฐ€์ • 

 

 

 

โ—ฏ  ์ฒซ๋ฒˆ์งธ ๊ฐ€์ •์— ๋Œ€ํ•œ ๊ฒ€์ฆ : ๋ฐ์ดํ„ฐ์—์„œ Cov(Z,T) ๋ฅผ ๊ณ„์‚ฐํ•ด 0์ด ์•„๋‹˜์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

โ†ช  ์ถœ์ƒ๋ถ„๊ธฐ๊ฐ€ ๋„๊ตฌ๋ณ€์ˆ˜๋กœ ๊ธฐ๋Šฅํ•˜๋ ค๋ฉด ์˜ฌํ•ด 4๋ถ„๊ธฐ์— ํƒœ์–ด๋‚œ ์‚ฌ๋žŒ๋“ค์ด 1๋ถ„๊ธฐ์— ํƒœ์–ด๋‚œ ์‚ฌ๋žŒ๋“ค๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ๋งŽ์€ ๊ต์œก ์‹œ๊ฐ„์„ ๋ฐ›์•˜๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณธ๋‹ค. 

 

 

์œ„์˜ ๊ทธ๋ž˜ํ”„์—์„œ 1๋ถ„๊ธฐ์— ํƒœ์–ด๋‚œ ์‚ฌ๋žŒ๋“ค์ด 4๋ถ„๊ธฐ์— ํƒœ์–ด๋‚œ ์‚ฌ๋žŒ๋“ค๋ณด๋‹ค ๊ฑฐ์˜ ํ•ญ์ƒ ๋” ์ ์€ ๊ต์œก์„ ๋ฐ›๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ 1๋‹จ๊ณ„๋ฅผ ์„ ํ˜•ํšŒ๊ท€๋กœ๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

import statsmodels.formula.api as smf

first_stage = smf.ols("years_of_schooling ~ C(year_of_birth) + C(state_of_birth) + q4", data=factor_data).fit()

print("q4 parameter estimate:, ", first_stage.params["q4"])
print("q4 p-value:, ", first_stage.pvalues["q4"])

 

๋„๊ตฌ๋ณ€์ˆ˜ (q4) ํšŒ๊ท€๋ฅผ ์‹คํ–‰ํ•ด๋ณธ ๊ฒฐ๊ณผ๋Š” ์œ„์™€ ๊ฐ™๋‹ค.  4๋ถ„๊ธฐ์— ํƒœ์–ด๋‚œ ์‚ฌ๋žŒ๋“ค์€ ๋‹ค๋ฅธ ๋ถ„๊ธฐ์— ํƒœ์–ด๋‚œ ์‚ฌ๋žŒ๋“ค๋ณด๋‹ค ํ‰๊ท ์ ์œผ๋กœ 0.1๋…„ ๋” ๋งŽ์€ ๊ต์œก์„ ๋ฐ›์€ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. P-value ๋Š” 0์— ๊ฐ€๊น๋‹ค. ์ฆ‰, ์ถœ์ƒ๋ถ„๊ธฐ๊ฐ€ ํ•™๊ต ๊ต์œก ์‹œ๊ฐ„์— ์‹ค์ œ๋กœ ์œ ์˜๋ฏธํ•˜๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. Cov(Z,T) ≠ 0

 

 

 

 

 

โ‘ฃ   The Reduced Form โœ…


 

•  ๋‘ ๋ฒˆ์งธ ๋„๊ตฌ๋ณ€์ˆ˜ ๊ฐ€์ •์€ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค. ์ฐฌ์„ฑํ•˜๋Š” ์ฃผ์žฅ๋งŒ ํ•  ์ˆ˜ ์žˆ์„ ๋ฟ์ด๋‹ค. ์ฆ‰, ์‚ฌ๋žŒ๋“ค์ด ํƒœ์–ด๋‚˜๋Š” ์‹œ๊ฐ„์€ ๊ต์œก์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ ์™ธ์—, ๊ฐœ์ธ์ ์ธ ๋Šฅ๋ ฅ์ด๋‚˜ ์ˆ˜์ž…์— ์ฐจ์ด๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์ถœ์ƒ ๋ถ„๊ธฐ๊ฐ€ ์ˆ˜์ž…์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ๋ฌด์ž‘์œ„๋กœ ํ• ๋‹น๋œ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

 

•  ์ถœ์ƒ๋ถ„๊ธฐ์— ๋”ฐ๋ฅธ ์ž„๊ธˆ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆฌ๋ฉด ์œ„์™€ ๊ฐ™๋‹ค. ๊ณ„์ ˆ์„ฑ์„ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์—ฐ์ดˆ์— ํƒœ์–ด๋‚œ ์‚ฌ๋žŒ๋“ค๋ณด๋‹ค ๊ทธ ํ•ด ๋Šฆ๊ฒŒ ํƒœ์–ด๋‚œ ์‚ฌ๋žŒ๋“ค์˜ ์†Œ๋“์ด ์•ฝ๊ฐ„ ๋” ๋†’๋‹ค. ์ด๋ฅผ ํ™•์ธํ•ด๋ณด๊ธฐ ์œ„ํ•ด ์ž„๊ธˆ ๋กœ๊ทธ ๊ฐ’์— ๋Œ€ํ•œ ๋„๊ตฌ๋ณ€์ˆ˜์ธ q4๋ฅผ ๋‹ค์‹œ ํšŒ๊ท€ ๋ถ„์„์„ ์ง„ํ–‰ํ•œ๋‹ค. 

 

reduced_form = smf.ols("log_wage ~ C(year_of_birth) + C(state_of_birth) + q4", data=factor_data).fit()

print("q4 parameter estimate:, ", reduced_form.params["q4"])
print("q4 p-value:, ", reduced_form.pvalues["q4"])

 

 

์˜ฌํ•ด 4๋ถ„๊ธฐ์— ํƒœ์–ด๋‚œ ์‚ฌ๋žŒ๋“ค์€ ํ‰๊ท ์ ์œผ๋กœ ์ž„๊ธˆ์ด ๋ฌด๋ ค 0.8% ๋” ๋†’๋‹ค. P-value ๋„ ๋งค์šฐ ์œ ์˜ํ•œ ์ˆ˜์น˜์ด๋‹ค. 

 

 

 

 

 

โ‘ค   Instrumental variables by hand 


 

โ—ฏ  ATE_IV 

 

reduced_form.params["q4"] / first_stage.params["q4"]

 

 

•  ๋งค ํ•™๋…„๋งˆ๋‹ค ์ž„๊ธˆ์ด 8% ์ธ์ƒ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ

 

 

 

 

โ—ฏ  ๋„๊ตฌ๋ณ€์ˆ˜ ์ถ”์ •์น˜๋ฅผ ์–ป๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• 

 

•  2SLS  

 

 

iv_by_hand = smf.ols("log_wage ~ C(year_of_birth) + C(state_of_birth) + years_of_schooling_fitted",
                     data=factor_data.assign(years_of_schooling_fitted=first_stage.fittedvalues)).fit()

iv_by_hand.params["years_of_schooling_fitted"]
0.08530286490889338

 

 

ํŒŒ์ด์ฌ์˜ 2SLS ๋กœ ์„ ํ˜•ํšŒ๊ท€ ๋ชจ๋ธ์„ ๋Œ๋ ค๋„ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค. 

 

from linearmodels.iv import IV2SLS


def parse(model, exog="years_of_schooling"):
    param = model.params[exog]
    se = model.std_errors[exog]
    p_val = model.pvalues[exog]
    print(f"Parameter: {param}")
    print(f"SE: {se}")
    print(f"95 CI: {(-1.96*se,1.96*se) + param}")
    print(f"P-value: {p_val}")
    
formula = 'log_wage ~ 1 + C(year_of_birth) + C(state_of_birth) + [years_of_schooling ~ q4]'
iv2sls = IV2SLS.from_formula(formula, factor_data).fit()
parse(iv2sls)

 

 

1๋…„๊ฐ„์˜ ์ถ”๊ฐ€ ๊ต์œก์œผ๋กœ ํ‰๊ท  8.5%์˜ ์ž„๊ธˆ ์ธ์ƒ์ด ๊ธฐ๋Œ€๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

โ‘ฅ   Multiple instruments 


 

•   ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋„๊ตฌ๋ณ€์ˆ˜(IV)๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. 

•   ํƒœ์–ด๋‚œ ๋ชจ๋“  ๋ถ„๊ธฐ๋ฅผ ์ˆ˜๋…„ ๊ฐ„์˜ ํ•™๊ต ๊ต์œก์˜ ๋„๊ตฌ๋ณ€์ˆ˜๋กœ ํ™œ์šฉํ•ด๋ณด๋Š” ์˜ˆ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

 

formula = 'log_wage ~ 1 + C(year_of_birth) + C(state_of_birth) + [years_of_schooling ~ q1+q2+q3]'
iv_many_zs = IV2SLS.from_formula(formula, factor_data).fit()
parse(iv_many_zs)

 

•   3๊ฐœ์˜ ๋”๋ฏธ๋“ค์„ ๋ชจ๋‘ ํฌํ•จํ•˜์—ฌ, ํ˜„์žฌ ์˜ˆ์ƒ ๊ต์œก ์ˆ˜์ต๋ฅ ์€ 0.1๋กœ, ์ฆ‰  ์ถ”๊ฐ€ ๊ต์œก์„ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ํ‰๊ท  10%์˜ ์ˆ˜์ต ์ฆ๊ฐ€๋ฅผ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. 

 

 

 

 

 

โ‘ฆ   Weakness of Instruments 


 

•   ๋„๊ตฌ ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์œ ๋…ํ•ด์•ผ ํ•˜๋Š” ์ ์€ ๊ฐ„์ ‘์ ์œผ๋กœ ATE ๋ฅผ ์ถ”์ •ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

 

 

•   ๋„๊ตฌ๋ณ€์ˆ˜ IV ๊ฐ€ ์ฒ˜์น˜ T์™€ ์•„์ฃผ ์ ์€ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ๋„๊ตฌ๋ณ€์ˆ˜๋กœ๋ถ€ํ„ฐ ์ฒ˜์น˜์— ๋Œ€ํ•ด ๋งŽ์€ ์„ค๋ช…์„ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. T์™€ Z์˜ ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ๋งค์šฐ ์•ฝํ•  ๋•Œ, ATE ์˜ ์ธก์ •์น˜๋Š” ๋งค์šฐ ํฌ๊ฒŒ ํฉ๋ฟŒ๋Ÿฌ์ ธ ์žˆ๋‹ค. ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ๋‚ฎ์„ ๋•Œ SE ๊ฐ’ ๋˜ํ•œ ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

 

 

728x90

๋Œ“๊ธ€