PS 층화·표준화·매칭

Hernan Ch.15.3~15.4 — Decile 층화, PS 회귀, propensity matching 의 구체적 절차

Hernan & Robins (2020) Ch.15.3~15.4 를 다룬다. PS deciles 로 층화 후 효과 추정, PS 를 continuous 변수로 회귀에 포함, PS 매칭의 다양한 알고리즘과 closeness 정의의 bias-variance trade-off, 자동 positivity 와 ill-characterized 모집단 문제까지 정리한다.

Experimentation
Causal Inference
저자

Kwangmin Kim

공개

2026년 05월 08일

1 정의

정의: PS 층화 (Stratification)

PS 의 deciles 또는 quintiles 로 표본을 나누고, 각 층 안에서 처치-대조의 결과 차이 평균. 층 간 평균이 대표적 결과.

  • 10 개 층 → 각 층 ~10% 표본.
  • 층 안의 처치-대조 분포가 (근사적으로) 같아 confounding 약화.
  • 층 간 평균으로 ATE 추정.
정의: PS 매칭 (Matching)

각 처치 환자에 대해 PS 가 가까운 대조 환자를 짝지움. Matched 표본에서 처치-대조의 결과 차이.

  • 1:1 또는 1:M 매칭.
  • Caliper (예: \(\pm 0.05\)): 매칭 허용 PS 차이 한도.
  • 매칭 안 된 환자는 분석 제외.

직관 — 층화와 매칭의 차이: 층화는 같은 PS 빈 안에서 평균. 매칭은 같은 PS 값 의 짝끼리 평균. 층화는 모든 환자를 사용하지만 빈 안의 매칭이 느슨, 매칭은 짝의 정확도 높지만 짝 못 찾은 환자 제외.

2 15.3 PS 층화·표준화

2.1 Decile 층화 절차

NHEFS 사례 절차:

  1. 각 환자의 추정 PS \(\widehat{\pi}(L_i)\) 계산.
  2. PS 의 deciles 로 표본 분할 → 10 개 층, 각 층 ~162 명.
  3. 각 층 안에서 \(\widehat{\mathrm{E}}[Y|A=1] - \widehat{\mathrm{E}}[Y|A=0]\) 계산.
  4. 10 개 층의 효과를 평균 (또는 weighted by 층 크기).

직관 — Deciles 의 선택: 10 개 층은 관행적 선택. 각 층의 PS 분포가 충분히 좁아 처치-대조의 공변량 분포가 비슷해진다. 너무 적은 층 (예: 5) 은 confounding 잔존 위험, 너무 많은 층 (예: 50) 은 층당 표본 부족.

2.2 NHEFS Decile 결과

NHEFS PS Decile 결과 (Hernan, Program 15.3)

각 decile 의 처치 효과 추정값: 0.0 ~ 6.6 kg 범위. 95% CI 가 매우 넓음 (각 층의 표본이 적어서).

층 간 평균: ATE ≈ 3.5 kg (95% CI 약간 넓음).

직관 — Decile 별 큰 변동성의 의미: 각 층의 추정값이 0 ~ 6.6 으로 변동. 표본 변동의 영향 큼. 층 간 평균은 안정적이지만 개별 층의 추정값은 신뢰성이 떨어짐. 표본 크기와 효과 크기의 trade-off.

직관 — 층 안의 잔존 confounding: PS 가 같은 decile 인 두 사람이 정확히 같은 PS 값 갖는 건 아니다. Decile 0.2~0.3 안의 환자들 중 일부는 PS 0.21, 일부는 0.29 — 층 안에서 PS 분포가 처치-대조에서 약간 다를 수 있다. 이를 residual confounding 이라 함.

2.3 Outcome Regression with PS Decile Indicators

같은 결과를 outcome regression 으로 얻는 방식:

\[\mathrm{E}[Y|A, \widehat{\pi}(L)] = \alpha_0 + \alpha_1 A + \sum_{k=1}^{9} \alpha_k \mathbb{1}\{\text{decile}=k\}\]

product term 없이 적합 → ATE 추정값 3.5 kg (95% CI 2.6~4.4).

직관 — Decile dummy 회귀와 PS 층화의 등가성: 회귀의 dummy 가 층화와 수학적으로 같음. 회귀는 효과의 가중 평균을 자동 계산 — 층화의 manual 절차를 회귀로 자동화.

2.4 Continuous PS 사용

PS 를 continuous covariate 으로 회귀:

\[\mathrm{E}[Y|A, \widehat{\pi}(L)] = \alpha_0 + \alpha_1 A + \alpha_2 \widehat{\pi}(L) + \alpha_3 \widehat{\pi}(L)^2\]

NHEFS 결과: ATE = 3.6 kg (95% CI 2.7~4.5).

직관 — Continuous PS 가 decile 보다 약간 높은 정확도: 층화는 PS 정보의 손실 (decile 안의 변동 무시). Continuous 사용은 PS 정보를 모두 활용. 결과 모형이 PS 함수 형태를 옳게 specify 해야 함.

직관 — Cubic spline 으로 robust: PS 와 결과의 관계가 진짜 비선형이면 quadratic 도 부족. Cubic spline 같은 더 유연한 함수로 안전. PS 가 1 차원이라 spline 적용이 간단 — 차원 축소의 추가 이점.

2.5 PS 표준화

PS 회귀 모형 적합 후, 가상 시나리오 표준화:

  1. 모든 환자에게 \(A := 1\)\(\widehat{\mathrm{E}}[Y|A=1, \widehat{\pi}(L_i)]\) 평균.
  2. 모든 환자에게 \(A := 0\)\(\widehat{\mathrm{E}}[Y|A=0, \widehat{\pi}(L_i)]\) 평균.
  3. 차이가 ATE.

NHEFS PS 표준화: 3.6 kg (95% CI 2.7~4.6).

직관 — PS 표준화 vs L 표준화: PS 표준화는 \(\widehat{\pi}(L)\) 만 회귀에 두지만 L 표준화는 \(L\) 전체를 둔다. 차원 축소의 이점은 PS 쪽이지만 정보 손실 위험도 PS 쪽. trade-off 관계.

3 15.4 PS 매칭

3.1 매칭 알고리즘의 다양성

방법 절차
Greedy nearest neighbor 한 처치 환자씩 가까운 대조 짝지움
Optimal matching 전체 거리 최소화
Caliper matching \(|PS_i - PS_j| < c\) 인 짝만
1:M matching 처치 1 개당 대조 M 개
Full matching 모든 환자에 가중치 (층화의 일반화)

직관 — 알고리즘 선택의 영향: 같은 PS 라도 다른 알고리즘으로 다른 매칭 결과. 결과의 robustness 를 위해 여러 알고리즘 시도 권장.

3.2 Closeness 의 정의와 trade-off

매칭 허용 PS 차이 \(c\) (caliper):

Caliper 결과
작음 (\(c=0.01\)) 정확한 매칭, 매칭 실패 많음, 분산 큼
중간 (\(c=0.05\)) 균형
큼 (\(c=0.2\)) 느슨한 매칭, 분산 작지만 잔존 confounding

직관 — Caliper 의 bias-variance trade-off: 작은 caliper → 정확한 매칭 = 적은 잔존 confounding = 작은 편향 + 매칭 실패 많음 = 표본 작음 = 큰 분산. 큰 caliper → 반대. 편향-분산 트레이드오프의 매칭 형태.

3.3 자동 Positivity 와 ill-characterized 모집단

매칭의 강점: 매칭 실패 환자를 자동 제외 → overlap 영역만 분석. Positivity 자동 보장.

매칭의 약점: 매칭 결과 모집단이 도메인적으로 정의되지 않음.

“PS < 0.67” 모집단의 모호성

NHEFS 사례에서 PS > 0.67 인 처치 환자 2 명이 매칭 실패로 제외. 결과: “PS < 0.67 모집단의 ATE”.

이 정의가 도메인적 의미 없다 — 누가 PS < 0.67 인가? 답: “50 세 미만 + 50 세 이상이면서 10 년 미만 흡연한 사람” — 명시적이지만 인위적.

도메인 변수 (예: “50 세 미만”) 로 직접 제한하는 것이 더 자연스러움.

직관 — 매칭의 사회적 문제: PS 매칭이 “비슷한 사람끼리 비교” 라는 직관적 이해를 주지만, 결과 모집단이 PS 함수에 의존하므로 transportability 평가가 어렵다. 다른 인구나 다른 시점에 같은 결과가 적용될지 판단 불가.

직관 — 도메인 변수 제한의 우월성: 매칭으로 모호하게 모집단을 좁히는 대신, “50 세 미만 환자만 분석” 같은 명시적 제한이 결과 해석과 외부 타당성에 유리. PS 는 진단 도구로 활용, 분석 모집단 정의는 도메인 변수로.

3.4 NHEFS 매칭 결과

처치자 403 명 + 대조자 1163 명. PS Caliper \(\pm 0.05\) 매칭 시 대부분 처치자 매칭 성공 (2 명 제외). Matched 표본의 ATE ≈ 3.5 kg (Hernan 사례에서 다른 도구와 일치).

직관 — 다른 도구와의 일치성: 매칭, 회귀, 표준화 모두 ~3.5kg. 도구별 가정이 다른데 결과가 같으면 robust 한 신호. 매칭의 결과 해석 모호성에도 점추정의 안정성은 보장.

4 Effect Modification 과 PS

PS 와 효과 수정 (Hernan, Fine Point 15.2)

매칭 결과가 회귀 결과와 다르면 효과 수정의 가능성. 매칭 후 표본은 처치자 분포에 가까워 ATT (Average Treatment effect on Treated) 추정. 회귀는 ATE 추정.

ATE ≠ ATT 이면 효과 수정 존재 — “처치자에게는 더 효과 있다” 같은 해석.

직관 — 매칭이 ATT 를 추정하는 이유: 처치자를 모두 매칭에 사용 + 대조자 일부만 사용 → matched 표본이 처치자 분포에 가까움. ATT = “이미 처치 받은 사람들에게 효과가 얼마였나?” 의 답.

직관 — 정책 분석에서 ATT 의 중요성: “이 정책을 받은 사람들에게 효과가 있었나?” 가 정책 평가의 핵심 질문. 미수혜자에게 효과가 어땠을지(ATC) 보다 수혜자의 실효(ATT) 가 우선. 매칭이 이 양을 자연스럽게 추정.

5 응용 분야

  • 임상 코호트 비교 효과 연구 (CER): PS matching 표준
  • 약물 안전성 분석: PS 가중치 + matching
  • 정책 평가: PS matching 으로 ATT 추정
  • 마케팅 attribution: PS matching 으로 캠페인 효과
  • A/B 테스트 비순응: PS 로 per-protocol 분석

6 코드 — PS 층화·매칭

import pandas as pd
import numpy as np
import statsmodels.formula.api as smf

nhefs = pd.read_csv("nhefs.csv").dropna(subset=["wt82_71"]).reset_index(drop=True)

# PS 추정 (이전 단계)
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()

# === 1. PS 층화 (deciles) ===
nhefs["ps_decile"] = pd.qcut(nhefs["ps"], 10, labels=False)

decile_effects = []
for d in range(10):
    sub = nhefs[nhefs["ps_decile"] == d]
    if (sub["qsmk"] == 1).sum() > 0 and (sub["qsmk"] == 0).sum() > 0:
        m = smf.ols("wt82_71 ~ qsmk", data=sub).fit()
        decile_effects.append(m.params["qsmk"])

print(f"Decile effects: {decile_effects}")
print(f"Mean ATE: {np.mean(decile_effects):.2f}")

# === 2. Continuous PS 회귀 ===
ps_reg = smf.ols("wt82_71 ~ qsmk + ps + I(ps**2)", data=nhefs).fit()
print(f"PS regression ATE: {ps_reg.params['qsmk']:.2f}")

# === 3. PS 표준화 ===
treated = nhefs.copy(); treated["qsmk"] = 1
untreated = nhefs.copy(); untreated["qsmk"] = 0
ate_std = ps_reg.predict(treated).mean() - ps_reg.predict(untreated).mean()
print(f"PS standardization ATE: {ate_std:.2f}")

# === 4. PS 매칭 (간단한 nearest neighbor) ===
treated_idx = nhefs[nhefs["qsmk"] == 1].index
untreated_pool = nhefs[nhefs["qsmk"] == 0].copy()

caliper = 0.05
matches = []
used_untreated = set()

for ti in treated_idx:
    t_ps = nhefs.loc[ti, "ps"]
    candidates = untreated_pool[
        (~untreated_pool.index.isin(used_untreated))
        & (np.abs(untreated_pool["ps"] - t_ps) < caliper)
    ]
    if len(candidates) > 0:
        ui = candidates.iloc[
            np.argmin(np.abs(candidates["ps"] - t_ps))
        ].name
        matches.append((ti, ui))
        used_untreated.add(ui)

print(f"Matched pairs: {len(matches)}")

# Matched 표본의 ATE
matched_treated = nhefs.loc[[t for t, u in matches], "wt82_71"]
matched_untreated = nhefs.loc[[u for t, u in matches], "wt82_71"]
print(f"Matched ATE (ATT): {matched_treated.mean() - matched_untreated.mean():.2f}")

7 한 줄 요약

PS 의 4 가지 활용 — 층화·표준화·매칭·회귀 — 모두 같은 인과량을 향함. NHEFS 에서 모두 3.5~3.6kg. Decile 층화는 직관적이지만 잔존 confounding, continuous PS 회귀는 더 정확하지만 함수 형태 가정 의존, 매칭은 자동 positivity 지만 ill-characterized 모집단. Caliper 의 bias- variance trade-off 가 매칭 알고리즘 선택의 핵심.

8 관련 주제

선행 지식

후속 주제

다른 카테고리 연결

Subscribe

Enjoy this blog? Get notified of new posts by email: