Instrumental Variables
도구변수 instrumental variables (IV)
John Snow’s 연구: 1850년 영국 런던 …
IV estimator란?
2단계 최소좌승법 (Two Stage Least Squares)
약한 도구변수 (Weak Instruments)
만약 개인이 처치를 받을지 여부를 통제할 수 있다면, 선택 편향(selection bias)이 발생할 수 있음.
RCT는 무작위 할당을 통해 자가 선택(self-selection) 문제를 해결함.
따라서 실험 데이터가 있다면 좋은 해결책이 존재함.
그렇다면 비실험 데이터(non-experimental data)는 어떻게 분석해야 할까?
누락된 변수 편향(omitted variable bias)에 대해 논의한 바 있음.
오차항 \(u\)에 포함된 변수 \(x_2\)와 설명 변수 \(x_1\) 사이에 상관관계가 존재한다면 어떻게 될까?
우리는 \(x_1\)의 효과와 \(x_2\)의 효과를 분리할 수 없기 때문에 편향된 추정치를 얻게 됨.
이러한 편향이 너무 심하면 효과의 방향(부호)조차 잘못 추정할 수 있음.
존 스노우(John Snow)는 1850년경 런던에서 활동한 의사로, 그 당시 도시에서는 콜레라가 여러 차례 창궐하였음.
당시 질병의 전파 방식에 대한 논쟁이 있었음: 공기를 통해 전염되는가, 아니면 물을 통해 전염되는가?

세균이 질병을 유발할 수 있다는 사실이 알려지지 않음.
현미경은 존재했지만, 해상도가 낮아 병원균을 명확히 볼 수 없었음.
대부분의 인간 병원균은 육안으로 관찰할 수 없음.
이른바 ‘감염 이론’(즉, 세균에 의한 감염)이 일부 지지를 받았으나,
당시의 지배적인 이론은 질병이 미아스마에 의해 발생한다는 것이었음.
스노우는 방대한 데이터를 수집하였음.
1854년 발생한 콜레라 유행 시 사망자의 위치를 지도에 표시하였음.
이 사건이 바로 악명 높은 브로드스트리트 펌프(Broadstreet Pump) 사건임.

cholera 패키지cholera 패키지의 기능스노우는 브로드 스트리트 펌프(Broad Street Pump)가 원인이라고 지목함.
그는 펌프 손잡이를 제거할 것을 요청하였음.
하지만, 그는 이 조치가 유행병의 종식을 가져왔다는 점에 회의적이었음.
런던의 상수도 공급원은 템스강(River Thames)이었음.
각 상수도 회사는 다른 취수 지점(intake points)을 가졌음.
사우스워크(Southwark) 및 복스홀(Vauxhall) 수자원 회사는 대형 하수 배출구 아래에서 취수를 하였음.
램버스(Lambeth) 수자원 회사는 더 깨끗한 상류에서 취수를 하였음.
| area | numhouses | deaths | death1000 |
|---|---|---|---|
| Southwark and Vauxhall | 40046 | 1263 | 315 |
| Lambeth | 26107 | 98 | 37 |
| Rest of London | 256423 | 1422 | 59 |
만약 사우스워크 및 복스홀 수자원 회사가 취수 지점을 상류로 옮겨 램버스 수자원 회사와 같은 곳에서 물을 공급받았다면, 약 1,000명의 목숨을 구할 수 있었을 것이다.
개인 \(i\)가 콜레라로 사망하면 \(c_i = 1\), 그렇지 않으면 \(c_i = 0\)로 정의함.
\(w_i = 1\)은 \(i\)의 식수가 오염되었음을 의미하며, \(w_i = 0\)은 깨끗한 물을 의미함.
당시 기술로는 작은 미생물을 감지할 수 없었음.
\(u_i\)는 개인 \(i\)의 사망 확률에 영향을 미치는 관측되지 않는 요인(예: 가난, 거주 위치, 공기질, 유전적 특성 등)을 포함함.
우리는 이를 다음과 같이 수식화할 수 있음:
\[ c_i = \alpha + \delta w_i + u_i \]
스노우는 자신의 데이터를 사용하여 깨끗한 물을 마시는 것과 콜레라 발생률 간의 상관관계를 평가할 수도 있었음.
즉, \(Cor(c_i, w_i)\)를 측정할 수 있음.
만약 \(Cor(c_i, w_i) \approx 0.5\)라면, 이는 감염 이론을 증명하는가?
경제학자 앵거스 디턴(Angus Deaton)은 다음과 같이 지적함:
“오염된 물을 마신 사람들은 가난할 가능성이 더 높고, 다양한 방식으로 오염된 환경에 살고 있었으며, 당시 콜레라의 원인으로 여겨졌던 ’유독한 미아스마’에 더 많이 노출되었음.”
☹️ 단순한 상관관계로는 충분하지 않음!
깨끗한 물을 마시는 사람과 오염된 물을 마시는 사람을 단순 비교하는 것은 의미가 없음.
왜냐하면 모든 조건이 동일하지 않기 때문(\(all\ else\ is\ not\ equal\)). 깨끗한 물을 마시는 것과 가난, 열악한 거주 환경, 나쁜 공기질 등이 밀접한 관련이 있음.
이는 OLS 추정을 위한 필수적인 직교성(orthogonality) 가정을 위반함:
\[E[u_i | w_i] \neq 0\]
또 다른 표현으로, \(Cov(w_i, u_i) \neq 0\) 즉, \(w_i\)는 내생적(endogenous) 변수임.
즉, \(u_i\)에 포함된 요소들이 \(w_i\)와 \(c_i\) 모두에 영향을 미침.
단순한 모델을 다시 떠올려 보자:
\[c_i = \alpha + \delta w_i + u_i\]
이제 \(w\)의 두 가지 값에 따라 기대값을 계산하면,
\[\begin{align} E[c_i | w_i = 1] &= \alpha + \delta + E[u_i | w_i = 1] \\ E[c_i | w_i = 0] &= \alpha + \phantom{\delta} + E[u_i | w_i = 0] \end{align}\]
이 두 식을 빼면,
\[\begin{equation} E[c_i | w_i = 1] - E[c_i | w_i = 0] = \delta + \left\{ E[u_i | w_i = 1] - E[u_i | w_i = 0]\right\} \end{equation}\]
마지막 항 ( { E[u_i | w_i = 1] - E[u_i | w_i = 0]} ) 은 0이 아님 (디턴이 말한 것처럼!).
즉, 회귀 분석을 통한 \(\delta\) 추정치는 편향됨(biased).
“… 물 공급이 아주 복잡하게 섞여있다. 각 회사의 수도관은 모든 거리와 거의 모든 골목길과 후미진 곳까지 이어진다. …
이 실험은 매우 거대한 규모에서 진행되었다. 무려 30만 명이 넘는 사람들이 성별, 연령, 직업, 사회적 계층과 상관없이 두 개의 그룹으로 나뉘었다.
한 그룹은 런던의 하수를 포함하여 콜레라 환자들로부터 나온 모든 오염물을 포함할 가능성이 있는 물을 공급받았으며,
다른 그룹은 그런 오염물로부터 완전히 자유로운 물을 공급받았다.”
더 형식적으로, 도구변수를 다음과 같이 정의할 수 있음:
\[\begin{align*} z_i &= \begin{cases} 1 & \text{if 물 공급자가 Lambeth일 경우} \\ 0 & \text{if 물 공급자가 Southwark 또는 Vauxhall일 경우} \\ \end{cases} \\ \end{align*}\]
\(z_i\)는 식수의 순도 \(w_i\)와 높은 상관관계를 가짐.
하지만, \(z_i\)는 우리가 이전에 우려했던 \(u_i\) 내의 다른 모든 요인들과는 상관관계가 없어 보임.
이제 단순한 IV 추정량을 정의할 준비가 되었음.
기존과 마찬가지로, \(z\)의 값을 기준으로 조건부 기대값을 계산해보자:
\[\begin{align} E[c_i | z_i = 1] &= \alpha + \delta E[w_i | z_i = 1] + E[u_i | z_i = 1] \\ E[c_i | z_i = 0] &= \alpha + \delta E[w_i | z_i = 0] + E[u_i | z_i = 0] \end{align}\]
이 두 식을 빼면:
\[\begin{align} E[c_i | z_i = 1] - E[c_i | z_i = 0] &= \delta \left\{ E[w_i | z_i = 1] - E[w_i | z_i = 0]\right\} \\ &+ \underbrace{\left\{ E[u_i | z_i = 1] - E[u_i | z_i = 0] \right\}}_{=0 \text{ (독립성 가정에 의해)}} \end{align}\]
\[\begin{equation} \delta = \frac{E[c_i | z_i = 1] - E[c_i | z_i = 0]}{E[w_i | z_i = 1] - E[w_i | z_i = 0]} \tag{eq:IV} \end{equation}\]
즉, IV 추정량은 결과 변수(\(c\))의 변화량을 도구변수(\(z\))가 유발하는 설명 변수(\(w\))의 변화량으로 나눈 값임.
\(x \mapsto y\)는 \(x\)가 \(y\)의 추정치임을 의미한다고 하자:
이 경우 추정량은 다음과 같음:
\[\begin{equation} \hat{\delta} = \frac{\overline{c}_1 - \overline{c}_0}{\overline{w}_1 - \overline{w}_0} \end{equation}\]
위의 모든 변수 \(c, w, z\)가 이진(binary) 변수인 경우, 이 추정량은 월드(Wald) 추정량이라 불림.
도구변수(IV)는 관찰 데이터만 있는 상황에서 인과 관계를 식별할 수 있는 강력한 도구임. 특히, 조건부 평균 가정(\(E[u_i | x_i] = 0\))이 위배될 가능성이 있는 경우, 즉, \(x\)가 내생적(endogenous)일 때, 이를 해결할 수 있음.
IV \(z\)의 핵심 조건은 다음과 같음:
Rayshaderraytracing할 수 있음.Rayshaderlibrary(ggplot2)
library(rayshader)
#Data from Social Security administration
death = read_csv("https://www.tylermw.com/data/death.csv", skip = 1)
meltdeath = reshape2::melt(death, id.vars = "Year")
meltdeath$age = as.numeric(meltdeath$variable)
# make a ggplot
deathgg = ggplot(meltdeath) +
geom_raster(aes(x=Year,y=age,fill=value)) +
scale_x_continuous("Year",expand=c(0,0),breaks=seq(1900,2010,10)) +
scale_y_continuous("Age",expand=c(0,0),breaks=seq(0,100,10),limits=c(0,100)) +
scale_fill_viridis("Death\nProbability\nPer Year",
trans = "log10",breaks=c(1,0.1,0.01,0.001,0.0001),
labels = c("1","1/10","1/100","1/1000","1/10000")) +
ggtitle("Death Probability vs Age and Year for the USA") +
labs(caption = "Data Source: US Dept. of Social Security")
# give it to rayshader
plot_gg(deathgg, multicore=TRUE,height=5,width=6,scale=500)학교 교육이 수입에 미치는 영향
\[ \log Y_i = \alpha + \rho S_i + \beta_1 X_i + \beta_2 X_i^2 + e_i \]
\[ \log Y_i = \alpha + \rho S_i + \beta_1 X_i + \beta_2 X_i^2 + e_i \]
능력 편향(Ability Bias)
앵그리스트와 크루거(1991): 출생일은 무작위일 것이다!
16세 생일에 학교를 중퇴하면 몇 일 동안 학교에 다니는가?
AK91은 널리 사용되는 IV 추정 방법인 2단계 최소자승법(2SLS)을 소개함.
\[ \text{1단계: } s_i = \alpha_0 + \alpha_1 z_i + \eta_i \] \[ \text{2단계: } y_i = \beta_0 + \beta_1 \hat{s}_i + u_i \]
조건:
데이터를 불러오고 요약 정보 확인
| Unique | Missing Pct. | Mean | SD | Min | Median | Max | Histogram | |
|---|---|---|---|---|---|---|---|---|
| lnw | 26732 | 0 | 5.9 | 0.7 | -2.3 | 6.0 | 10.5 | ![]() |
| s | 21 | 0 | 12.8 | 3.3 | 0.0 | 12.0 | 20.0 | ![]() |
| yob | 10 | 0 | 1934.6 | 2.9 | 1930.0 | 1935.0 | 1939.0 | ![]() |
| qob | 4 | 0 | 2.5 | 1.1 | 1.0 | 3.0 | 4.0 | ![]() |
| sob | 51 | 0 | 30.7 | 14.2 | 1.0 | 34.0 | 56.0 | ![]() |
| age | 40 | 0 | 45.0 | 2.9 | 40.2 | 45.0 | 50.0 | ![]() |
q4 더미 변수 생성 (4분기에 태어났다면 TRUE)yob) 및 출생 분기(qob)를 범주형 변수로 변환출생 분기에 따른 교육 수준 변화를 시각화함
ggplot(ak91_age, aes(x = yob + (qob - 1) / 4, y = s )) +
geom_line() +
geom_label(mapping = aes(label = qob, color = q4)) +
guides(label = FALSE, color = FALSE) +
scale_x_continuous("Year of birth", breaks = 1930:1940) +
scale_y_continuous("Years of Education", breaks = seq(12.2, 13.2, by = 0.2),
limits = c(12.2, 13.2)) +
theme_bw()출생 분기별 임금 변화를 살펴보자.
library(estimatr)
# 모델 리스트 생성
mod <- list()
# 표준 (편향된) OLS
mod$ols <- lm(lnw ~ s, data = ak91)
# IV: 출생 분기가 4분기인가?
# 2단계 방식으로 IV 수행
mod[["1. stage"]] <- lm(s ~ q4, data = ak91)
ak91$shat <- predict(mod[["1. stage"]])
mod[["2. stage"]] <- lm(lnw ~ shat, data = ak91)
# 2SLS 실행
# IV를 한 번에 수행
# 공식: y ~ x | z
mod$`2SLS` <- iv_robust(lnw ~ s | q4,
data = ak91,
diagnostics = TRUE)| ols | 1. stage | 2. stage | 2SLS | |
|---|---|---|---|---|
| (Intercept) | 4.995*** | 12.747*** | 4.955*** | 4.955*** |
| (0.004) | (0.007) | (0.381) | (0.358) | |
| s | 0.071*** | 0.074** | ||
| (0.000) | (0.028) | |||
| q4 | 0.092*** | |||
| (0.013) | ||||
| shat | 0.074* | |||
| (0.030) | ||||
| R2 | 0.117 | 0.000 | 0.000 | 0.117 |
| RMSE | 0.64 | 3.28 | 0.68 | 0.64 |
| 1. Stage F: | 48.9904279659094 | |||
| + p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001 | ||||
q4는 통계적으로 유의하나 효과는 작음 (4분기에 태어난 경우 교육 연수 0.092 증가). \(R^2\)는 0%지만, F-통계량은 큼.2SLS와 동일하지만 표준 오차가 다름 (2단계 결과의 표준 오차는 잘못됨).제한된 모델과 제한되지 않은 모델을 비교하는 데 유용함.
여기서는 도구 변수가 공동으로 유의미한지 확인하는 것이 핵심.
IV가 거의 예측력을 가지지 못하면, F-통계량이 낮아지고 귀무가설을 기각할 수 없음. 😞
교육 수준에서 명확한 시간적 경향이 관찰됨.
임금도 경기 변동의 영향을 받을 가능성이 있음.
연도 효과를 통제해야 함.
여러 개의 IV를 사용할 수도 있음.
# we keep adding to our `mod` list:
mod$ols_yr <- update(mod$ols, . ~ . + yob_fct) # previous OLS model
# add exogenous vars on both sides of the `|` !
mod[["2SLS_yr"]] <- estimatr::iv_robust(lnw ~ s + yob_fct | q4 + yob_fct, data = ak91, diagnostics = TRUE )
# use all quarters as IVs
mod[["2SLS_all"]] <- estimatr::iv_robust(lnw ~ s + yob_fct | qob_fct + yob_fct, data = ak91, diagnostics = TRUE )| ols | 1. stage | 2. stage | 2SLS | |
|---|---|---|---|---|
| (Intercept) | 4.995*** | 12.747*** | 4.955*** | 4.955*** |
| (0.004) | (0.007) | (0.381) | (0.358) | |
| s | 0.071*** | 0.074** | ||
| (0.000) | (0.028) | |||
| q4 | 0.092*** | |||
| (0.013) | ||||
| shat | 0.074* | |||
| (0.030) | ||||
| R2 | 0.117 | 0.000 | 0.000 | 0.117 |
| RMSE | 0.64 | 3.28 | 0.68 | 0.64 |
| 1. Stage F: | 48.9904279659094 | |||
| + p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001 | ||||
| ols | 2SLS | ols_yr | 2SLS_yr | 2SLS_all | |
|---|---|---|---|---|---|
| (Intercept) | 5.00*** | 4.96*** | 5.02*** | 4.97*** | 4.59*** |
| (0.00) | (0.36) | (0.01) | (0.35) | (0.25) | |
| s | 0.07*** | 0.07** | 0.07*** | 0.08** | 0.11*** |
| (0.00) | (0.03) | (0.00) | (0.03) | (0.02) | |
| R2 | 0.117 | 0.117 | 0.118 | 0.117 | 0.091 |
| RMSE | 0.64 | 0.64 | 0.64 | 0.64 | 0.65 |
| Instruments | none | Q4 | none | Q4 | All Quarters |
| Year of birth | no | no | yes | yes | yes |
| + p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001 | |||||
연도 통제 추가… - OLS 추정치는 거의 변화 없음 - 2SLS 추정치는 소폭 증가
모든 분기를 IV로 사용… - 2SLS 추정치의 정밀성이 크게 향상됨 - 추정된 계수는 이제 10.5%!
선형 모형으로 돌아가 보자:
\[ y = \beta_0 + \beta_1 x + u \]
여기서 \(Cov(x,u) \neq 0\) 일 경우, \(x\)는 내생적 변수이다.
IV의 조건
IV의 조건
- 1단계 조건(관련성): \(Cov(z,x) \neq 0\)
- IV 외생성 조건: \(Cov(z,u) = 0\)
\[\begin{align} Cov(z,y) &= Cov(z, \beta_0 + \beta_1 x + u) \\ &= \beta_1 Cov(z,x) + Cov(z,u) \end{align}\]
\[ Cov(z,y) = \beta_1 Cov(z,x) \]
\[ \beta_1 = \frac{Cov(z,y)}{Cov(z,x)}. \]
표본 공식을 적용하면 다음과 같다:
\[\hat{\beta}_1 = \frac{\sum_{i=1}^n (z_i - \bar{z})(y_i - \bar{y})}{\sum_{i=1}^n (z_i - \bar{z})(x_i - \bar{x})}\]
\[ \text{plim}(\hat{\beta}_1) = \beta_1 \]
이 경우, 일관성을 가진 추정량(consistent estimator)이라고 한다.
\(E(u^2|z) = \sigma^2\) 가정 하에:
\[Var(\hat{\beta}_{1,IV}) = \frac{\sigma^2}{n \sigma_x^2 \rho_{x,z}^2}\]
두 가지 사실을 쉽게 관찰 할 수 있다.
\(\rho_{x,z}\)를 \(R_{x,z}^2\)로 바꾸면:
\[Var(\hat{\beta}_{1,IV}) = \frac{\sigma^2}{n \sigma_x^2 R_{x,z}^2}\]
따라서 외생변수 x가 있으면 굳이 z를 통해 IV 추정을 할 필요가 없다.
\[ \log wage = \beta_0 + \beta_1 educ + u \]
OLS와 IV(부친 학력 사용) 비교:
| OLS | First Stage | IV | |
|---|---|---|---|
| (Intercept) | -0.185 | 10.237 | 0.441 |
| (0.185) | (0.276) | (0.467) | |
| educ | 0.109 | 0.059 | |
| (0.014) | (0.037) | ||
| fatheduc | 0.269 | ||
| (0.029) | |||
| Num.Obs. | 428 | 428 | 428 |
| R2 | 0.118 | 0.173 | 0.093 |
| R2 Adj. | 0.116 | 0.171 | 0.091 |
| AIC | 888.5 | 1846.0 | 900.2 |
| BIC | 900.7 | 1858.2 | 912.4 |
| Log.Lik. | -441.260 | -920.025 | |
| F | 56.929 | 88.841 | |
| RMSE | 0.68 | 2.08 | 0.69 |
IV 추정치는 consistent하다
약한 IV의 경우 일치성이 보장되지 않음:
\[ \text{plim}(\hat{\beta}_{1,IV}) = \beta_1 + \frac{Cor(z,u)}{Cor(z,x)} \cdot \frac{\sigma_u}{\sigma_x} \]
\[ \log(bwght) = \beta_0 + \beta_1 packs + u \]
우리는 흡연 행동이 건강 관련 변수들과 상관관계를 가질 수 있으며, 이러한 변수들이 \(u\)에 포함되어 출생 체중에 영향을 미칠 가능성이 있다고 우려한다. 따라서 적절한 도구 변수를 찾아야 한다.
담배 가격(cigprice)을 IV로 사용한다고 가정하자. 이는 담배 가격이 \(u\)에 포함된 요인들과 무상관하다는 가정하에 가능하다. 먼저 cigprice가 packs에 미치는 영향을 1단계 회귀분석을 통해 확인한 후, 2단계 최소자승법(2SLS) 추정 결과를 살펴보자.
| First Stage | IV | |
|---|---|---|
| (Intercept) | 0.067 | 4.448 |
| (0.103) | (0.940) | |
| cigprice | 0.000 | |
| (0.001) | ||
| packs | 2.989 | |
| (8.996) | ||
| R2 | 0.000 | -23.230 |
| 1. Stage F: | 0.120905223674891 |
첫 번째 열: 매우 약한 첫 번째 단계. cigprice가 packs에 미치는 영향이 거의 없다!
\(R^2\) 값이 0에 가까움.
그렇다면 이 IV를 그대로 사용하면 어떻게 될까?
두 번째 열: packs가 출생 체중에 매우 크고, 심지어 양의 영향을 미치는 것으로 나타남. 🤔
하지만 표준 오차가 매우 큼.
\(R^2\) 값이 -23?!
첫 번째 단계의 F-통계량: 0.121. 이는 p-값이 0.728 임을 의미하며, 귀무가설(H0): 첫 번째 단계의 효과 없음을 전혀 기각할 수 없음.
결론: 잘못된 접근 방식 ❌
✅ 데이터를 어떻게 다룰까?: 읽기(Read), 정리(Tidy), 시각화(Visualize)…
✅ 변수간 관계를 어떻게 요약할까? 단순 / 다중 선형 회귀…비선형회귀, 교차변수…
✅ 인과 관계(Causality)란 무엇인가?
✅ 전체 모집단을 관측하지 못하면 어떻게 할까? Sampling!
✅ 우리의 연구 결과가 단순한 무작위(Randomness) 때문일 수도 있을까? 신뢰구간과 가설검정. 통계적 추론
🚧 실제로 외생성을 어떻게 찾아낼 수 있을까?: 이중 차분, 회귀 불연속 설계, 도구 변수
THE END!