1 정의
이항 처치 \(A\) 와 결과 \(Y\) 에 대해
\[\mathrm{E}[Y^{a=1}] - \mathrm{E}[Y^{a=0}]\]
가 평균 인과 효과이다. \(Y^a\) 는 모든 사람이 처치 \(A=a\) 를 받았을 때의 잠재 결과 평균. 관찰 데이터에서 직접 관찰되지 않으므로 반사실적(counterfactual) 양이다.
이항 처치의 조건부 처치 확률
\[e(L) = \Pr(A=1|L)\]
을 성향 점수라 한다 (Rosenbaum & Rubin 1983). \(L\) 의 차원이 클수록 직접 추정이 어려워 logistic 회귀 같은 모형을 활용한다.
직관 — 잠재 결과의 정체: 한 사람을 두 번 살게 하면 한 번은 처치, 한 번은 비처치 결과를 모두 관찰할 수 있다. 그러나 현실에서는 한 사람당 한 가지 잠재 결과만 관측된다 (“fundamental problem of causal inference”). 평균 인과 효과는 모집단 수준에서 두 평균의 차이를 묻는 양 — 개인 수준의 효과를 묻는 게 아니다.
2 12.1 NHEFS 인과 질문
2.1 데이터 설정
NHEFS (National Health and Nutrition Examination Survey I Epidemiologic Followup Study) 는 1971~75 baseline 과 1982 follow-up 의 두 시점 코호트이다. Hernan 의 Part II 분석은 다음 부분 표본을 사용한다.
| 변수 | 의미 | 형태 |
|---|---|---|
| \(A\) | baseline 흡연자 중 1982 까지 금연 여부 | 이항 (1: 금연, 0: 계속) |
| \(Y\) | 1982 체중 - baseline 체중 (kg) | 연속 |
| \(L\) | 9 개 보정 변수 | 혼합 |
\(L\) 의 9 개 변수는 성별, 나이, 인종, 교육 (5 범주), 흡연량(개비/일), 흡연 기간(년), 일상 신체활동 (3 범주), 여가 운동 (3 범주), baseline 체중 (kg) 이다.
2.2 처치군과 대조군의 baseline 차이
| 특성 | 금연자 (A=1, n=403) | 비금연자 (A=0, n=1163) |
|---|---|---|
| 평균 나이 | 46.2 | 42.8 |
| 남성 % | 54.6 | 46.6 |
| 백인 % | 91.1 | 85.4 |
| 대학 교육 % | 15.4 | 9.9 |
| baseline 체중 (kg) | 72.4 | 70.3 |
| 흡연량 (개비/일) | 18.6 | 21.2 |
| 흡연 기간 (년) | 26.0 | 24.1 |
직관 — 비대칭의 함의: 금연자가 비금연자보다 4 살 많고, 흡연량은 적고 기간은 길고, 더 부유하다(대학 교육 비율). 이런 차이가 결과에 영향을 미친다면 단순 비교는 인과 효과가 아니라 “이미 다른 사람들 사이의 차이”를 측정한 것에 불과하다.
2.3 보정 없는 단순 비교
표본 평균 차이로 보면
\[\widehat{\mathrm{E}}[Y|A=1] - \widehat{\mathrm{E}}[Y|A=0] = 4.5 - 2.0 = 2.5 \text{ kg},\]
95% CI = \((1.7, 3.4)\). 이 숫자는 연관성(association) 이다. 인과량 \(\mathrm{E}[Y^{a=1}] - \mathrm{E}[Y^{a=0}]\) 와 일반적으로 같지 않다.
직관 — 단순 비교가 위험한 구체적 시나리오: 금연자가 평균 4 살 많고, 나이 든 사람일수록 체중 증가폭이 작은 경향이 있다고 하자. 이 경우 금연이라는 효과가 “나이 든 그룹의 작은 체중 증가” 와 섞여 단순 비교 2.5kg 이 진짜 효과보다 작게 추정된다. 보정 후 추정값이 3.4kg 으로 0.9kg 늘어나는 이유가 바로 이것이다.
직관 — 같은 데이터, 두 가지 답: 같은 NHEFS 표본에서 단순 비교는 2.5kg, IP 가중은 3.4kg. 두 추정값 모두 데이터에 충실하지만 묻는 질문이 다르다. 단순 비교는 “관측된 두 그룹의 차이”, IP 가중은 “이 모집단에 가상으로 무작위 배정했을 때의 차이”. 후자가 의사결정에 의미 있는 양이다.
2.4 Fine Point 12.1 — Bad Example 의 인정
Hernan 은 이 데이터의 한계를 명시한다. 처치 \(A\) 가 baseline 에서 follow-up 까지의 행동(금연)을 설명하므로 follow-up 까지 살아남은 사람만 분석에 포함된다 — 일종의 immortal time bias 와 selection bias 위험이 있다. 무작위 실험이라면 baseline 에서 처치를 배정하므로 이 문제가 없다.
직관 — 가용 데이터의 트레이드오프: 완벽한 데이터(금연 여부를 baseline 에 무작위 배정) 가 없으므로 “관찰 가능한 흡연 행동” 을 처치로 정의한다. 이 정의가 인과 분석에 부적절할 수 있음을 인정하면서도 교과서적 사례로 사용한다. 실무에서도 같은 trade-off 가 흔하다 — 이상적 인과 질문 vs 실제로 답할 수 있는 인과 질문 의 거리.
3 12.2 IP 가중치 모델링 추정
3.1 비모수 IPW 가 작동 안 하는 이유
Part I 에서는 \(\Pr(A=1|L)\) 를 셈으로 추정했다 — 각 \(L\) 셀에서 \(A=1\) 인 사람 수를 세어 전체 수로 나눈 비율. NHEFS 의 9 개 변수는 셀 수가 폭발한다.
| 변수 | 범주 수 | 누적 곱 |
|---|---|---|
| 성별 | 2 | 2 |
| 인종 | 2 | 4 |
| 교육 | 5 | 20 |
| 운동 | 3 | 60 |
| 활동 | 3 | 180 |
| 나이 (50 단계 가정) | 50 | 9,000 |
| 흡연량 (50 단계) | 50 | 450,000 |
| 흡연 기간 (50) | 50 | 22,500,000 |
| 체중 (50) | 50 | 1,125,000,000 |
직관 — 1566 명을 11 억 셀에 분산: 각 셀당 평균 0.0000014 명이다. 거의 모든 셀이 비고, 비율을 셀 수 없다. 셀이 많아야 6 단계로 추려도 200 만 셀 — 여전히 1566 명으로는 비모수 추정 불가능. 모형 도입이 선택이 아니라 필수가 된다.
3.2 Logistic 회귀로 propensity score 추정
Hernan 은 다음 logistic 모형을 사용한다.
\[\mathrm{logit}\, \Pr(A=1|L) = \alpha_0 + \alpha_1 \text{sex} + \alpha_2 \text{race} + \alpha_3 \text{age} + \alpha_4 \text{age}^2 + \cdots\]
핵심 모델링 결정:
| 결정 | 내용 | 함의 |
|---|---|---|
| 연속 변수 quadratic 항 추가 | 나이·체중·흡연량·기간 모두 \(A^2\) 항 포함 | 비선형 관계 일부 포착 |
| 상호작용 항 없음 | 변수 간 product term 모두 0 | 단순성 우선, misspecification 위험 |
| 범주 변수 dummy | 교육 5 범주, 운동·활동 3 범주 | 셀별 baseline 차이 허용 |
직관 — quadratic 항의 의미: 나이 효과가 직선이라면 어린 사람과 노인의 효과 변화율이 같다. Quadratic 항은 “효과가 나이대에 따라 달라진다”는 약한 비선형성을 허용한다. Hernan 은 모든 연속 변수에 일관되게 quadratic 항을 추가해 모형의 유연성을 확보한다.
직관 — 상호작용 항 생략의 비용: “고령 + 비만” 이 “고령” 과 “비만” 의 단순 합보다 처치 확률에 더 큰 영향을 줄 수 있다. 상호작용 항 없는 모형은 이 효과를 포착 못 한다 — 그러나 모든 가능한 상호작용을 포함하면 모수 폭발과 동시에 다중공선성 위험. Hernan 의 선택은 “단순함을 잃지 않는 한도에서 충분히 유연하게” 라는 실용적 균형이다.
3.3 추정된 IP 가중치의 분포
- 추정값 \(\widehat{W}^A = 1/\widehat{f}(A|L)\) 의 범위: 1.05 ~ 16.7
- 평균: 2.00 (표본 크기의 두 배 → 가상 모집단 크기 약 3132)
- 분포: 오른쪽 꼬리가 긴 비대칭
직관 — 가중치 16.7 의 의미: 어떤 환자가 자신의 \(L\) 조합에서 받은 처치를 받을 확률이 약 6% 였다는 의미 — 1/16.7 ≈ 0.06. 이런 사람이 “표본에 한 명 있어서 16.7 명처럼 가중되는” 가상 모집단을 만든다. 가중치가 클수록 그 한 사람의 결과가 추정에 큰 영향을 주므로, 이상치 한 명이 추정량을 흔들 위험이 커진다.
직관 — 평균이 2 인 이유: 비안정화 가중치 \(1/f(A|L)\) 의 모집단 기댓값은 항상 2 이다 (\(\mathrm{E}[1/f(A|L)] = \mathrm{E}[\mathrm{E}[1/f(A|L)|L]] = \sum_l 2 \Pr(L=l) = 2\) — 처치 가능 결과가 두 가지라서). 표본 평균 2.00 은 모형이 합리적임을 시사하는 sanity check.
3.4 가중 회귀로 ATE 추정
가상 모집단에서 saturated 선형 모형 \(\mathrm{E}[Y|A] = \theta_0 + \theta_1 A\) 를 weighted least squares 로 적합. 가중치는 추정된 \(\widehat{W}^A\).
\[\widehat{\theta}_1 = 3.4 \text{ kg}, \quad 95\%\text{ CI (robust SE)} = (2.4, 4.5)\]
직관 — 단순 비교 2.5 → IP 가중 3.4 의 차이: 약 0.9kg 의 증가는 9 개 보정 변수가 흡수한 교란의 양이다. 데이터 구조에서는 금연자가 더 나이 많은 인구이고, 나이 든 사람일수록 체중 증가가 작으므로, 보정 시 효과가 더 크게 추정된다.
직관 — robust SE 의 필요성: 일반 OLS 의 표준오차는 IID 가정에 의존. 가중치는 이 가정을 깨므로 표준 SE 가 부정확. Robust (Huber-White) SE 또는 GEE 의 sandwich estimator 가 conservative 신뢰구간을 제공 — 명목보다 약간 넓지만 calibration 을 안전하게 유지.
3.5 Conservative 신뢰구간의 의미
Hernan 의 95% CI 는 robust SE 기반으로 conservative 이다. 즉 명목 95% 보다 더 자주 진짜 모수를 덮는다 (실제 coverage > 95%). 정확한 분산 추정은 다음 세 가지 방식 중 하나로 가능.
- Influence function 기반 분석적 분산: 통계 이론에서 유도. 표준 패키지에 없음.
- Bootstrap: 데이터를 재추출해 추정값의 표본 분포를 직접 추정. 계산 비용.
- Robust SE: GEE 의 sandwich estimator. 가장 흔하지만 conservative.
직관 — 세 방법의 절충: 분석적 SE 가 가장 정확하지만 직접 코드를 짜야 한다. Bootstrap 은 가정이 적고 정확하지만 시간 비용. Robust SE 는 즉시 사용 가능하지만 약간 보수적. 실무에서는 robust SE 가 표준 첫 시도, 결과가 의사결정에 임계적이면 bootstrap 으로 보강.
4 모형 misspecification 의 영향
만약 \(\Pr(A=1|L)\) 의 진짜 형태가 logistic 의 quadratic 다항 모형이 아니면
- 추정된 가중치가 진짜 가중치와 다르다.
- 가상 모집단에서 \(A \perp\!\!\!\perp L\) 이 정확히 성립하지 않는다.
- 가중 회귀의 점추정이 진짜 ATE 와 다르게 수렴 — 일치성 손실.
- 신뢰구간 calibration 도 깨진다.
이 위험을 줄이는 방법: - 더 유연한 함수 형태 (cubic spline, 상호작용 항). - ML 기반 propensity 추정 (Random Forest, gradient boosting). - Doubly robust 추정량으로 결과 모형까지 결합.
직관 — 가중치 진단의 표준 절차: (1) 가중치 분포의 히스토그램 — 극단치 존재 여부. (2) 가중 후 공변량 평균이 처치군·대조군에서 일치하는지 점검 (covariate balance). (3) Effective sample size = \((\sum w)^2 / \sum w^2\) — 큰 가중치 몇 개에 추정이 의존하는지. (4) 다른 모형 specification 으로 sensitivity analysis.
5 응용 분야
- 임상시험의 per-protocol 분석: 비순응 보정에 IPW
- 관찰 코호트의 처치 효과: 의료 기록 데이터의 인과 분석
- 온라인 자연 실험: 정책 변경 전후 비교에 propensity 보정
- 정책 평가: 보조금 프로그램 자기 선택 보정
- 마케팅 인과 분석: 광고 노출의 매출 효과
6 가중치 trimming 의 역할
가중치 분포가 매우 비대칭이거나 극단치가 있으면 추정량이 소수의 큰 가중치 환자들에게 과도하게 의존한다. 이를 줄이는 표준 절차가 trimming 이다.
| 방법 | 절차 | 트레이드오프 |
|---|---|---|
| Truncation | 가중치를 상한·하한에 잘라냄 (예: 99 percentile) | 분산 ↓, 편향 ↑ |
| Stabilization | 분자를 \(f(A)\) 로 변경 | 분산 ↓, 편향 변화 없음 |
| Doubly robust | 결과 모형과 결합 | 한 모형 옳으면 일치 |
| ML propensity | 비선형성 더 정확히 추정 | 정규화 편향 위험 |
직관 — Trimming 의 안전 비용: 99 percentile 에서 truncate 하면 분산이 줄지만 진짜 가중치를 인위적으로 잘라낸 만큼 점추정이 약간 편향된다. 양 끝을 잘라낸 데이터로 평균을 구하는 trimmed mean 과 같은 발상 — robust 하지만 진짜 평균과 약간 다른 양을 추정한다.
7 양의 확률 점검의 실무 절차
- 추정된 propensity 의 히스토그램: 처치군과 대조군의 propensity 분포 overlap 점검. 양 극단(0 또는 1 근처)에서 한쪽 군만 있으면 양의 확률 위반.
- Common support 영역 식별: 두 군이 모두 있는 propensity 범위.
- 그 영역으로 분석 제한: ATT (treated 의 평균 효과) 또는 ATE on common support 추정.
- Sensitivity analysis: 다른 trim 임계값으로 결과 안정성 점검.
직관 — Common support 의 의미: 어떤 환자의 propensity 가 0.95 인데 그 영역에 비처치자가 한 명도 없다면, 그 환자에 대한 반사실(비처치 결과) 은 데이터에서 추론할 수 없다 — 외삽에 의존해야 한다. 이런 환자들을 분석에서 제외하면 추정 대상이 “ATE 전체” 가 아닌 “common support 영역의 ATE” 로 좁아진다.
8 코드 — NHEFS 재현
import pandas as pd
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf
nhefs = pd.read_csv("nhefs.csv").dropna(subset=["wt82_71"]).reset_index(drop=True)
# Step 1: propensity score model — 9 confounders + quadratic
ps_formula = (
"qsmk ~ sex + race + C(education) "
"+ age + I(age**2) "
"+ smokeintensity + I(smokeintensity**2) "
"+ smokeyrs + I(smokeyrs**2) "
"+ C(exercise) + C(active) "
"+ wt71 + I(wt71**2)"
)
ps_model = smf.logit(ps_formula, data=nhefs).fit(disp=False)
nhefs["ps"] = ps_model.predict()
# Step 2: 비안정화 IP 가중치
nhefs["W"] = np.where(
nhefs["qsmk"] == 1,
1 / nhefs["ps"],
1 / (1 - nhefs["ps"]),
)
print(nhefs["W"].describe()) # min ~1.05, max ~16.7, mean ~2.00
# Step 3: 가중 회귀 (saturated linear model)
X = sm.add_constant(nhefs["qsmk"])
gee = sm.WLS(nhefs["wt82_71"], X, weights=nhefs["W"]).fit(
cov_type="HC0" # robust SE
)
print(gee.params) # const ~1.78, qsmk ~3.44
print(gee.conf_int(alpha=0.05)) # (~2.4, ~4.5)
# Step 4: covariate balance check
def std_diff(x, w, treat):
m1, m0 = np.average(x[treat == 1], weights=w[treat == 1]), np.average(x[treat == 0], weights=w[treat == 0])
s = np.sqrt((x[treat == 1].var() + x[treat == 0].var()) / 2)
return (m1 - m0) / s
for col in ["age", "smokeintensity", "smokeyrs", "wt71"]:
before = std_diff(nhefs[col], np.ones(len(nhefs)), nhefs["qsmk"])
after = std_diff(nhefs[col], nhefs["W"], nhefs["qsmk"])
print(f"{col}: before={before:.3f}, after={after:.3f}")가중 후 표준화 평균 차이 (standardized mean difference) 가 0 에 가까워지면 covariate balance 가 회복된 것이다 — 일반적으로 |SMD| < 0.1 이면 양호.
9 ATE, ATT, ATC 의 구분
- ATE (Average Treatment Effect): 모집단 전체의 평균 효과 — \(\mathrm{E}[Y^{a=1} - Y^{a=0}]\)
- ATT (Average Treatment effect on the Treated): 처치 받은 사람들의 평균 효과 — \(\mathrm{E}[Y^{a=1} - Y^{a=0} | A=1]\)
- ATC (Average Treatment effect on the Controls): 비처치 사람들의 평균 효과 — \(\mathrm{E}[Y^{a=1} - Y^{a=0} | A=0]\)
직관 — 세 양이 일반적으로 다른 이유: 처치 받은 사람과 받지 않은 사람의 baseline 분포가 다르면, 평균 효과도 그룹별로 다를 수 있다. 정책 평가에서 ATT 가 중요할 때가 많다 — “이미 정책을 받은 사람들에게 그 정책이 평균적으로 얼마나 효과 있었나?”. ATC 는 “정책 미수혜자 에게 적용했다면 효과가 어땠을까?” 의 외삽적 질문에 답한다.
직관 — 가중치 분자 선택과 추정 대상: \(W^A = 1/f(A|L)\) 의 분자를 1 → \(f(A)\) → \(\Pr(A=1|L)\) 로 바꾸면 추정 대상이 ATE → ATE → ATT 로 변한다. 분자 함수가 가상 모집단의 분포를 결정하므로, 어떤 모집단의 평균 효과를 묻느냐를 분자로 선택할 수 있다.
10 한 줄 요약
NHEFS 9 개 보정 변수에서 비모수 IPW 는 셀 폭발로 무력. Logistic 회귀로 propensity score \(\widehat{e}(L)\) 를 추정하고, \(W^A = 1/\widehat{e}(L)\) 로 가중하면 가상 모집단에서 \(A \perp\!\!\!\perp L\) 이 회복된다. 가중 회귀의 점추정 3.4kg (95% CI 2.4~4.5) 가 단순 비교 2.5kg 보다 큰 이유는 보정 변수가 흡수한 교란이다. Robust SE 가 conservative 신뢰구간을 보장한다.
11 관련 주제
선행 지식
후속 주제
다른 카테고리 연결
- 로지스틱 회귀 — propensity score 모형
- GEE 와 robust SE — 가중 회귀의 분산 추정
12 작업 단계 정리
| Step | 작업 | 산출물 |
|---|---|---|
| 1 | \(L\) 변수 선택 (DAG·도메인 지식) | 보정 변수 명단 |
| 2 | \(L\) 의 함수 형태 결정 (선형·quadratic·spline) | propensity 모형 specification |
| 3 | Logistic 회귀 적합 | \(\widehat{e}(L)\) |
| 4 | Propensity overlap 점검 | 히스토그램, common support |
| 5 | 가중치 계산 (\(W^A\) 또는 \(SW^A\)) | 환자별 가중치 |
| 6 | Covariate balance 점검 | SMD before/after |
| 7 | 가중 회귀로 ATE 추정 | \(\widehat{\theta}_1\) |
| 8 | Robust SE 또는 bootstrap 으로 신뢰구간 | 95% CI |
| 9 | Sensitivity analysis | 다른 모형으로 결과 안정성 점검 |
직관 — 9 단계 중 통계 이론은 6~9 단계뿐: 1~5 단계는 도메인 지식·DAG·진단 도구의 영역. 통계 패키지가 6~9 단계를 자동화하더라도 1~5 단계의 품질이 추정량의 신뢰성을 결정한다. “회귀 한 줄로 인과 효과 추정” 이 위험한 이유는 1~5 단계가 시각화되지 않기 때문이다.
13 흔한 오류 패턴
- Outcome 을 propensity 모형에 포함: \(\Pr(A|L,Y)\) 같은 모형은 결과 변수를 처치 모형에 끼워 넣어 추정량의 인과 의미를 깨뜨린다.
- 처치 후 변수 보정: 처치가 영향을 준 변수(\(L\) 의 일부) 를 propensity 모형에 포함하면 매개 효과를 차단해 over-adjustment.
- 충돌자(collider) 보정: Berkson 편향 도입.
- 모형 적합 후 가중치 점검 생략: 극단치·overlap 점검 없이 추정값을 보고.
- 단일 specification 만 사용: sensitivity analysis 없이 결과 강건성 미점검.
직관 — 이 함정들의 공통 원인: 회귀를 “예측 도구” 로만 보는 습관에서 비롯된다. 예측에서는 상관 있는 변수를 모두 넣는 게 좋지만, 인과에서는 변수의 인과적 역할 (교란자 vs 매개자 vs 충돌자) 에 따라 포함 여부가 달라진다. DAG 분석이 변수 선택의 첫 도구가 되어야 한다 — Ch.7, Ch.8, Ch.18 의 핵심 메시지이다.