Hazard·Risk·Survival과 변환

Hernan Ch.17.1~17.2 — 세 측정 단위의 정의와 Kaplan-Meier·logistic hazard 모형

Hernan & Robins (2020) Ch.17.1~17.2 를 다룬다. 시간-사건 결과의 세 측정 단위 (survival, risk, hazard) 의 정의, hazard ratio 의 함정 (시간 의존, built-in selection bias), Kaplan-Meier 추정량, logistic hazard 모형, person-time 데이터 형식, 그리고 hazard 에서 survival 로의 곱셈 변환 공식을 정리한다.

Experimentation
Causal Inference
저자

Kwangmin Kim

공개

2026년 05월 08일

1 정의

정의: 세 측정 단위

Survival probability at \(k\): \[S(k) = \Pr(T > k) = \Pr(D_k = 0)\]

Risk (cumulative incidence) at \(k\): \[F(k) = 1 - S(k) = \Pr(T \leq k)\]

Discrete-time Hazard at \(k\): \[h(k) = \Pr(D_k = 1 | D_{k-1} = 0) = \Pr(T = k | T > k - 1)\]

직관 — 세 단위의 직관: Survival = “여기까지 살아남은 사람의 비율”, risk = “이미 죽은 사람의 비율”, hazard = “지금까지 살아 있는 사람 중 이번 순간 죽는 비율”. 누적·반대·순간 의 세 관점.

2 17.1 세 측정 단위의 차이

2.1 Risk vs Hazard 의 본질적 차이

측면 Risk \(F(k)\) Hazard \(h(k)\)
분모 모집단 baseline (고정) 시점 \(k\) 직전 생존자 (시점 변동)
분자 누적 (모든 사건) 시점 \(k\) 의 새 사건
시점 변화 단조 증가 또는 평탄 증가/감소 가능
총합 \(0 \to 1\) 까지 시점별 임의

직관 — 분모의 시점 변동: Risk 의 분모는 baseline 모든 사람. Hazard 의 분모는 시점마다 살아 있는 사람. 시간이 지날수록 hazard 분모 줄어듦. 분모 변화가 두 측정의 본질적 차이.

직관 — Hazard 가 risk 보다 정보가 많은 이유: Risk 는 누적이라 일단 사건 발생하면 평탄. Hazard 는 시점별 패턴 (M 자, U 자, 단조 증가/감소) 을 직접 보여줌. 위험 패턴 분석에 hazard 가 정보 풍부.

2.2 Hazard Ratio 의 두 가지 함정 (Fine Point 17.2)

HR 의 시점 의존성

진짜 HR 이 시점에 따라 다를 수 있다. Cox 모형은 단일 HR 가정 (proportional hazards) — 가정 위반 시 결과 misleading.

단일 HR 보고 = 시점별 HR 의 가중 평균. Rare event 가정 + 행정 censoring 만 있을 때는 “untreated 의 사건 시점 분포” 로 가중. 가중 평균이 1 이라도 survival 곡선이 다를 수 있음.

직관 — Proportional Hazards 가정의 강도: “처치-대조의 hazard 비율이 모든 시점에서 동일” 가정. 약물의 즉시 효과 vs 지연 효과 같은 시점 의존 효과는 PH 위반. PH 점검 (Schoenfeld residuals) 필수.

HR 의 Built-in Selection Bias

DAG 로 보면 (Figure 17.3):

\[A \to D_1 \leftarrow U \to D_2\]

HR at \(k=2\)\(\Pr(D_2 | D_1 = 0, A)\) 를 비교. \(D_1\)\(A\)\(U\)collider. Conditioning on \(D_1=0\)\(A\)\(U\) 의 가짜 연관을 도입.

→ HR 이 자동으로 post-treatment selection bias 를 포함. Survival 또는 risk 비교는 이 문제 없음.

직관 — Cox 모형이 잘못된 결론 줄 수 있는 시나리오: 처치가 high-risk 환자만 일찍 죽임. 시점 1 이후 처치군 생존자는 low-risk, 대조군 생존자는 mixed. HR < 1 이지만 처치 효과는 중성 또는 음의 방향. Cox 결과를 항상 KM 곡선과 함께 보고 권장.

직관 — Hernan 의 권장: 단일 HR 점추정에 의존하지 말고 survival 곡선 (시점별) 로 결과 보고. 정책 결정자가 “5 년 생존율” 등 직접 의미 있는 양 사용 가능.

3 17.2 Hazard 에서 Survival 로

3.1 곱셈 공식

\[S(k) = \Pr(D_k = 0) = \prod_{m=1}^{k} \Pr(D_m = 0 | D_{m-1} = 0) = \prod_{m=1}^{k} (1 - h(m))\]

직관 — 곱셈의 의미: “시점 \(k\) 까지 살려면 시점 1 살아야 + 2 살아야 + … + \(k\) 살아야”. 각 시점 살아남을 조건부 확률의 곱. 확률 트리의 leaf 까지 가는 경로.

3.2 Kaplan-Meier 추정량

\[\widehat{S}(k) = \prod_{m=1}^{k} \left(1 - \frac{d_m}{n_m}\right)\]

  • \(d_m\): 시점 \(m\) 의 사건 수
  • \(n_m\): 시점 \(m\) 진입 시 위험 인구
NHEFS Kaplan-Meier 결과 (Hernan, Program 17.1)

120 개월 KM 생존: - Quitters (\(A=1\)): 76.2% - Non-quitters (\(A=0\)): 82.0% - Log-rank P-value: 0.005

직관 — KM 의 비모수 robustness: 가정 없이 데이터에서 직접 계산. 표본 크면 매우 정확. 표본 작거나 censoring 많으면 변동성 큼 — 이 경우 모수 모형 (logistic, Cox) 권장.

직관 — Log-rank test 의 의미: 두 KM 곡선의 차이를 검정. 비모수 + censoring robust. 그러나 PH 가정에 민감 — 곡선이 교차하면 power 낮음. NHEFS 의 P=0.005 는 연관성 의 통계적 신호이지 인과 효과 아님 (보정 안 함).

3.3 Logistic Hazard Model

Person-time 데이터 + Logistic 회귀

Person-time 형식: 1 명 환자가 추적 기간만큼 row 생성.

person_id | k  | A | D_k
1         | 0  | 1 | 0
1         | 1  | 1 | 0
...
1         | 50 | 1 | 1   ← 사망
2         | 0  | 0 | 0
...

Logistic 회귀 적합:

\[\mathrm{logit}\, \Pr(D_{k+1} = 1 | D_k = 0, A) = \theta_{0,k} + \theta_1 A + \theta_2 A k + \theta_3 A k^2\]

  • \(\theta_{0,k}\): 시간변동 절편 (예: \(\theta_0 + \theta_4 k + \theta_5 k^2\)).
  • \(\theta_2 A k + \theta_3 A k^2\): 처치 효과의 시간 의존성.

직관 — Person-time 데이터의 폭발: NHEFS 1629 명 × 120 month = 약 20 만 row (실제 17 만 — 사망/ censoring 으로 일부 제외). 적합은 회귀 한 줄이지만 데이터 변환이 첫 단계.

직관 — 시점별 절편 \(\theta_{0,k}\): 매 시점 다른 baseline hazard. 다항식 \(\theta_0 + \theta_4 k + \theta_5 k^2\) 로 매끄럽게 모형화. 너무 유연하면 분산 폭발, 너무 매끄러우면 misspecification.

3.4 Hazard ↔︎ Logistic 의 근사 (Tech Point 17.1)

Hazard 가 작으면 (rare event):

\[\Pr(D_{k+1}=1 | D_k=0, A) \approx \frac{\Pr(D_{k+1}=1 | D_k=0, A)}{\Pr(D_{k+1}=0 | D_k=0, A)} = \text{odds}\]

→ logit(hazard) ≈ log(hazard ratio). Logistic 의 모수 \(\theta_1\) 이 log-HR 근사.

직관 — Rare event 가정의 의미: hazard < 0.1 이면 odds ≈ probability. 이 가정이 깨지면 logistic ≠ hazard 모형. 시간 단위를 짧게 잡으면 (year → month → day) 자동 만족.

직관 — Logistic vs Cox 의 trade-off: Logistic 은 discrete time, person-time 형식 사용. Cox 는 continuous time, partial likelihood. 결과 비슷하지만 logistic 이 IPW MSM 등으로 자연스럽게 확장 가능 (Cox 는 어려움).

4 NHEFS Logistic Hazard 적합 결과

NHEFS Survival Curve (Program 17.2)

Logistic hazard 모형 적합 후 곱셈으로 survival 계산. KM 결과와 거의 동일 (smoothed version).

120 개월 추정: - \(\widehat{S}(120 | A=1) \approx 76\%\) - \(\widehat{S}(120 | A=0) \approx 82\%\)

차이 약 6%. 보정 안 함 — 단순 비교.

직관 — Smoothed KM: Logistic hazard 모형이 KM 의 단조 감소 step 함수를 매끄러운 곡선으로 평활. 시점별 hazard 변동을 다항식으로 근사. 함수 형태 가정의 댓가는 정확도 손실, 이득은 smooth 곡선.

5 Cox Proportional Hazards 모형

Cox 모형의 위치

\[h(k | A, L) = h_0(k) \exp(\beta_1 A + \beta_2 L)\]

  • \(h_0(k)\): baseline hazard, 비모수 (시간 함수 형태 가정 없음).
  • \(\exp(\beta_1)\): HR — 모든 시점 동일 (PH 가정).

Semiparametric — partial likelihood 로 \(\beta\) 만 추정, \(h_0\) 는 추정 안 함.

직관 — Cox 의 인기: HR 한 숫자로 결과 보고 + baseline hazard 추정 불필요. 전통 의학 통계의 표준. 그러나 PH 가정 + HR 의 함정 → Hernan 은 logistic hazard + survival 비교 권장.

직관 — Cox 와 logistic hazard 의 등가성: Rare event 가정 아래 두 모형이 거의 같은 결과. Cox 는 continuous time 직접, logistic 은 discrete time 근사. 표준 분석에서 결과 차이 미미.

6 시간 단위의 선택

Discrete vs Continuous Time

Discrete time: 사건 시간을 정수 단위 (month, year) 로 측정. Person-time 데이터 형식. Logistic hazard 모형 자연스러움.

Continuous time: 사건 시간을 실수 단위로 측정. Cox 모형, AFT 모형의 영역. Partial likelihood 사용.

NHEFS 의 시간 단위는 month — discrete. 시간 단위 짧으면 discrete 와 continuous 가 같은 결과로 수렴.

직관 — 시간 단위가 짧으면 discrete = continuous: month → week → day 로 줄이면 hazard 작아 짐 (rare event 가정 충족). discrete logistic 의 결과가 continuous Cox 결과와 같아진다. 시간 단위 선택은 분석 도구 선택의 결정 인자.

직관 — Tied event 처리의 차이: 같은 시점에 여러 사건이 발생하면 (ties) discrete 는 자연 처리, continuous Cox 는 별도 알고리즘 (Breslow, Efron approximation) 필요. 큰 표본에서는 Breslow 근사가 충분히 정확.

7 NHEFS Survival 결과의 의학적 해석

단순 비교의 함정

NHEFS 의 단순 비교: 120 개월 quitters 76% vs non-quitters 82%. 차이 -5.8% (quitters 가 사망).

이 결과를 의학적으로 해석하면 “흡연 중단이 사망 위험을 높임”? — 틀린 결론.

이유: confounding by age. 흡연 중단자가 더 나이 많고, 나이가 사망 주요 원인. 보정 후 실제 처치 효과는 거의 0 (Ch.17.4).

KM 곡선의 단순 비교를 인과 추론으로 해석하면 안 됨 — 표본 균형 점검 필수.

직관 — 의학 논문의 흔한 오류: KM 곡선 비교 + log-rank P-value 만 보고 “처치가 효과 있다” 결론. 처치-대조의 baseline 차이를 무시. 인과 분석은 KM 으로 시작하고 보정 도구로 끝나야 한다.

직관 — Survival 차이의 절대 vs 상대: 76% vs 82% 차이 6%. 사망률 비율은 18% / 24% = 0.75 (HR 비슷). 절대 차이가 정책적 의미 있을 때 많음 — “10 년 내 100 명 중 6 명 더 사망” 같은 표현. 상대 비율은 작은 baseline 에서 과장될 수 있음 (“위험 25% 감소” 가 1% → 0.75% 의미일 수도).

8 응용 분야

  • 임상 코호트 사망 분석: KM + logistic + Cox
  • 종양학 무진행 생존: 진행까지 시간
  • 신뢰성 공학: 부품 고장 시간 (failure-time analysis)
  • 고객 이탈 (Churn): 가입 → 이탈까지 시간
  • 의약품 부작용: 발생까지 시간
  • 재범률 분석: 출소 → 재범까지 시간 (사회과학)
  • 결혼·이혼 분석: 결혼 → 이혼 (사회 인구학)

9 코드 — KM + Logistic Hazard

import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
from lifelines import KaplanMeierFitter
import matplotlib.pyplot as plt

nhefs = pd.read_csv("nhefs.csv").reset_index(drop=True)
nhefs["death"] = nhefs["death"].fillna(0).astype(int)
# survtime 계산 (가상)
nhefs["survtime"] = np.where(
    nhefs["death"] == 1,
    (nhefs["yrdth"] - 1983) * 12 + nhefs["modth"],
    120
)

# === Kaplan-Meier ===
kmf = KaplanMeierFitter()
fig, ax = plt.subplots(figsize=(8, 5))
for a, label in [(0, "Non-quitters"), (1, "Quitters")]:
    sub = nhefs[nhefs["qsmk"] == a]
    kmf.fit(sub["survtime"], sub["death"], label=label)
    kmf.plot_survival_function(ax=ax)
ax.set_xlabel("Months"); ax.set_ylabel("Survival probability")
plt.show()

# === Person-time 변환 + Logistic Hazard ===
def to_person_time(df, time_col="survtime", event_col="death"):
    rows = []
    for _, r in df.iterrows():
        for k in range(int(r[time_col])):
            row = r.copy()
            row["k"] = k
            row["D_k1"] = 1 if (k == r[time_col] - 1 and r[event_col] == 1) else 0
            rows.append(row)
    return pd.DataFrame(rows)

person_time = to_person_time(nhefs)

hazard_formula = (
    "D_k1 ~ qsmk + qsmk:k + qsmk:I(k**2) + k + I(k**2)"
)
hazard_model = smf.logit(hazard_formula, data=person_time).fit(disp=False)
print(hazard_model.summary())

# Survival 도출
def survival_curve(model, A_value, k_max=120):
    surv = []
    s = 1.0
    for k in range(k_max):
        df_k = pd.DataFrame({"qsmk": [A_value], "k": [k]})
        h = model.predict(df_k).values[0]
        s *= (1 - h)
        surv.append(s)
    return surv

s1 = survival_curve(hazard_model, 1)
s0 = survival_curve(hazard_model, 0)
print(f"S(120 | A=1): {s1[-1]:.3f}")
print(f"S(120 | A=0): {s0[-1]:.3f}")

10 한 줄 요약

생존 분석의 세 측정 단위 — survival (누적), risk (반대), hazard (순간). HR 은 시점 의존 + built-in selection bias 함정으로 risk/survival 비교가 더 정직. Hazard → survival 은 곱셈 공식. KM 은 비모수 표준, logistic hazard 모형은 IPW MSM 으로 확장 가능. NHEFS 단순 비교에서 quitters 의 120 개월 생존 76% vs non-quitters 82% — 보정 안 한 결과.

11 관련 주제

선행 지식

후속 주제

다른 카테고리 연결

Subscribe

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