Tae Hyun Kim (Lowell)

Instrumental Variables

Definition

**도구변수(Instrumental Variables, IV)**는 내생성 문제를 해결하기 위해 사용하는 외생적 변수입니다.

유효한 도구변수 ZZ의 조건:

  1. 관련성(Relevance): Cov(Z,X)0Cov(Z, X) \neq 0 — 도구가 내생 변수에 영향
  2. 배제 제한(Exclusion Restriction): Cov(Z,u)=0Cov(Z, u) = 0 — 도구가 결과에 직접 영향 없음

XZ(only through X)YX \leftarrow Z \rightarrow \text{(only through } X \text{)} \rightarrow Y

Intuitive Understanding

가격 내생성 문제에서 우리는 “수요와 무관한 가격 변동”을 찾아야 합니다.

도구변수는 마치 “자연 실험”처럼 작동합니다. 비용 충격(예: 원자재 가격 상승)은 가격에는 영향을 미치지만, 소비자의 지불 의사에는 직접 영향을 미치지 않습니다.

Key Properties

2SLS (Two-Stage Least Squares)

1단계: 내생 변수를 도구변수에 회귀 X=π0+π1Z+vX = \pi_0 + \pi_1 Z + v

2단계: 결과를 예측된 내생 변수에 회귀 Y=β0+β1X^+uY = \beta_0 + \beta_1 \hat{X} + u

약한 도구변수 문제

1단계 F-통계량이 낮으면 약한 도구변수(Weak Instrument) 문제:

  • 편향: OLS보다 심할 수 있음
  • 신뢰 구간 왜곡

Stock-Yogo 규칙: F-통계량 > 10이면 안전

프라이싱에서의 유효한 도구변수

도구변수 유형예시타당성
비용 이동 변수원자재 가격, 환율, 운송비비용은 가격에 영향, 소비자 WTP에 직접 영향 없음
Hausman IV다른 시장의 동일 제품 가격비용 충격은 공통, 수요 충격은 지역적
경쟁 구조경쟁자 수, BLP IV경쟁이 가격에 영향

Example

Python 구현

from linearmodels.iv import IV2SLS
import numpy as np

# 데이터
# Y: 로그 수량, X: 로그 가격 (내생적), Z: 비용 충격 (도구변수)

iv_model = IV2SLS(
    dependent=np.log(data['quantity']),
    exog=data<span class="wikilink-dead" title="비공개 노트">'const', 'quality'</span>,  # 외생 통제 변수
    endog=np.log(data['price']),       # 내생 변수
    instruments=data<span class="wikilink-dead" title="비공개 노트">'cost_shock', 'competitor_price'</span>  # 도구변수
)

iv_results = iv_model.fit(cov_type='robust')

print(f"IV 탄력성: {iv_results.params['log_price']:.3f}")
print(f"표준오차: {iv_results.std_errors['log_price']:.3f}")
print(f"1단계 F-통계량: {iv_results.first_stage.diagnostics['f.stat'].stat:.2f}")

BLP 도구변수

Berry-Levinsohn-Pakes (1995)가 제안한 도구변수:

# 같은 시장 내 다른 제품의 특성 합
def create_blp_iv(data, characteristics, market_col='market', product_col='product'):
    """BLP 스타일 도구변수 생성"""
    ivs = []
    for char in characteristics:
        # 같은 시장 내 다른 제품의 특성 합
        market_sums = data.groupby(market_col)[char].transform('sum')
        iv = market_sums - data[char]
        ivs.append(iv)
    return pd.DataFrame(ivs).T

blp_ivs = create_blp_iv(data, ['horsepower', 'weight', 'mpg'])

도구변수 진단

# 약한 도구변수 검정
from scipy import stats

# 1단계 회귀
first_stage = sm.OLS(data['log_price'], data[['const'] + instruments]).fit()
f_stat = first_stage.fvalue

print(f"1단계 F-통계량: {f_stat:.2f}")
if f_stat < 10:
    print("경고: 약한 도구변수 가능성")
else:
    print("도구변수 강도 적절")

# 과대식별 검정 (J-test) - 도구변수가 2개 이상일 때
# H0: 모든 도구변수가 유효
sargan_stat = iv_results.sargan.stat
sargan_pval = iv_results.sargan.pval
print(f"Sargan 검정: stat={sargan_stat:.2f}, p={sargan_pval:.3f}")

References

  • Angrist, J. D., & Pischke, J. S. (2008). Mostly Harmless Econometrics.
  • Stock, J. H., & Yogo, M. (2005). “Testing for Weak Instruments in Linear IV Regression.”
  • Berry, S., Levinsohn, J., & Pakes, A. (1995). “Automobile Prices in Market Equilibrium.”
  • Comprehensive Personalized Pricing Guide, Part II, §6

연결 그래프