1 왜 Ch.8의 Cox 모형을 넘어서야 하는가
Ch.8에서 다룬 표준 Cox 모형은 고정 시점 공변량(fixed-time covariates) 만을 허용한다. 연구 시작 시점에 측정한 변수(성별, 질병 유형 등)만 모형에 포함되며, 그 값은 추적 기간 동안 변하지 않는다.
그러나 실제 생존 연구에서는 다음과 같은 상황이 빈번하다:
| 한계 상황 | 예시 | Ch.9 해법 |
|---|---|---|
| 공변량 값이 시간에 따라 변한다 | 혈소판 회복, 혈압, 종양 크기 | 시간의존 공변량 (§ 9.2) |
| 특정 변수에 대해 PH 가정이 깨진다 | MTX 투여 여부의 비비례 위험 | 층화 모형 (§ 9.3) |
| 관찰 시작 시점이 사건 시간 원점과 다르다 | 은퇴 커뮤니티 입소 후 관찰 시작 | 좌절단 (§ 9.4) |
| 환자가 여러 상태를 거치며 예후가 변한다 | 이식 → 혈소판 회복 → 재발/사망 | 다상태 모형 (§ 9.5) |
이 네 확장은 독립적이면서 동시에 서로 결합된다. 예를 들어 골수이식(BMT) 사례에서는 시간의존 공변량 + 층화 + 좌절단 + 다상태 예측을 모두 활용하여 환자별 조건부 생존 확률을 실시간으로 갱신한다.
2 시간의존 공변량 (§ 9.2)
2.1 기본 모형
Ch.8의 Cox 모형(식 8.1.2)에서 고정 공변량 \(\mathbf{Z}\) 를 시간의 함수 \(\mathbf{Z}(t)\) 로 대체한다:
\[ h[t \mid \mathbf{Z}(t)] = h_0(t) \exp[\boldsymbol{\beta}^\top \mathbf{Z}(t)] \]
직관적으로, 이 모형은 “시점 \(t\) 에서의 위험률은 바로 그 시점의 공변량 값에 의해 결정된다”고 말한다. 혈소판이 아직 회복되지 않은 환자와 이미 회복된 환자는 같은 시점이라도 서로 다른 위험을 가진다.
2.2 편우도(Partial Likelihood) 확장
편우도 식 역시 자연스럽게 확장된다. 사건 시점 \(t_i\) 에서 실패한 개인의 공변량 값 \(\mathbf{Z}_{(i)}(t_i)\) 와 위험집합 \(R(t_i)\) 내 모든 개인의 해당 시점 공변량 값을 사용한다:
\[ L(\boldsymbol{\beta}) = \prod_{i=1}^{D} \frac{\exp[\boldsymbol{\beta}^\top \mathbf{Z}_{(i)}(t_i)]}{\sum_{j \in R(t_i)} \exp[\boldsymbol{\beta}^\top \mathbf{Z}_j(t_i)]} \]
핵심은 분자·분모 모두 사건 시점 \(t_i\) 에서의 공변량 값을 사용한다는 점이다. Ch.8에서는 \(\mathbf{Z}_j\) 가 상수였기 때문에 시점에 무관했지만, 이제는 각 사건 시점마다 위험집합 구성원의 공변량을 재평가한다.
2.3 외부 vs 내부 공변량
- 외부 공변량(External): 값이 실패 과정과 독립인 공변량. 고정 시점 공변량, 계획된 치료 스케줄, 기온 등 외부 확률 과정의 출력이 해당한다.
- 내부 공변량(Internal): 개인이 관찰 중일 때만 측정 가능한 공변량. 혈소판 회복 시점, aGVHD 발생 여부 등이 해당한다. \(P[X \geq t \mid Z(t)] = 1\) 이므로 조건부 생존함수를 정의할 수 없다.
이 구분이 중요한 이유: 외부 공변량이면 Ch.8과 동일하게 생존함수를 추정할 수 있다. 내부 공변량이면 편우도 추정은 여전히 유효하지만, \(S(t \mid \mathbf{Z}(t))\) 를 직접 추정하는 것은 불가능하다 — 대신 § 9.5의 다상태 예측 접근이 필요하다.
2.4 PH 가정 검정에의 활용
시간의존 공변량의 또 다른 중요한 용도는 비례위험 가정의 형식적 검정이다. 고정 공변량 \(Z_1\) 에 대해 인위적으로
\[ Z_2(t) = Z_1 \times g(t) \]
를 생성한다 (보통 \(g(t) = \ln t\) ). 이 모형에서 두 개인의 위험비는
\[ \frac{h(t \mid Z_1)}{h(t \mid Z_1^*)} = \exp\{\beta_1[Z_1 - Z_1^*] + \beta_2 g(t)[Z_1 - Z_1^*]\} \]
이 되어 \(\beta_2 \neq 0\) 이면 위험비가 시간에 따라 변한다 — 즉 PH 가정이 위반된다. 따라서 \(H_0: \beta_2 = 0\) 검정은 해당 공변량의 PH 가정 검정이다.
직관적으로: “\(\ln t\) 와 상호작용하는 효과가 유의하다면, 그 변수의 효과가 시간이 지남에 따라 강해지거나 약해지고 있다”는 뜻이다.
BMT 예제 결과: Klein Example 9.1에서 MTX(이식편대숙주 예방약) 변수만 PH 가정을 위반했다 (Wald \(\chi^2 = 4.32\), \(p = 0.038\) ). 이 결과는 § 9.3에서 MTX로 층화하는 근거가 된다.
2.5 Change-Point 모형
\(g(t)\) 의 함수형을 모를 때, 시점 \(\tau\) 를 기준으로 위험비를 조각별 상수(piecewise constant)로 모형화할 수 있다:
\[ h[t \mid Z(t)] = \begin{cases} h_0(t) \exp(\beta_1 Z_1) & t \leq \tau \\ h_0(t) \exp[(\beta_1 + \beta_2) Z_1] & t > \tau \end{cases} \]
\(\exp(\beta_1)\) 은 \(\tau\) 이전의 위험비, \(\exp(\beta_1 + \beta_2)\) 는 \(\tau\) 이후의 위험비이다. 최적 \(\tau\) 는 모든 사건 시점에 대해 편우도를 최대화하는 값으로 결정한다.
Kidney Dialysis 예제 (Example 9.2): 경피적(percutaneous) vs 외과적(surgical) 카테터 삽입에서 \(\tau = 3.5\) 개월이 최적이었다. 3.5개월 이전에는 경피적 카테터 환자가 크게 유리했으나 (\(RR = 0.124\), \(p = 0.006\) ), 이후에는 두 군 간 차이가 없었다 (\(p = 0.167\) ).
3 층화 비례위험 모형 (§ 9.3)
3.1 동기와 모형
PH 가정이 깨진 변수가 있을 때, 그 변수로 층화(stratification) 하면 각 층에서 서로 다른 기저 위험함수를 허용하면서 나머지 공변량의 효과는 공통으로 추정할 수 있다:
\[ h_j[t \mid \mathbf{Z}(t)] = h_{0j}(t) \exp[\boldsymbol{\beta}^\top \mathbf{Z}(t)], \quad j = 1, \ldots, s \]
직관적으로: “MTX를 받은 군과 안 받은 군은 위험의 ’바닥 깔개’가 다르다 — 하지만 위에 얹히는 공변량 효과(질병 유형, 나이 등)는 두 군에서 동일하게 작용한다”고 가정한다.
3.2 편우도 구성
층화 편우도는 각 층 내 편우도의 합으로 구성된다:
\[ LL(\boldsymbol{\beta}) = LL_1(\boldsymbol{\beta}) + LL_2(\boldsymbol{\beta}) + \cdots + LL_s(\boldsymbol{\beta}) \]
각 \(LL_j(\boldsymbol{\beta})\) 는 해당 층의 데이터만 사용하여 Ch.8의 식 8.3.2로 계산한다. 위험집합은 층 내에서만 형성된다. 추정과 검정은 이 합산 우도의 미분을 구해 Newton-Raphson으로 수행한다.
3.3 핵심 가정과 검정
핵심 가정: 공변량 효과 \(\boldsymbol{\beta}\) 가 모든 층에서 동일하다.
이를 검정하려면:
- 우도비 검정: 공통 \(\boldsymbol{\beta}\) 모형의 \(LL(\hat{\boldsymbol{\beta}})\) vs 각 층에서 독립적으로 추정한 \(\sum_j LL_j(\hat{\boldsymbol{\beta}}_j)\) 를 비교한다. 자유도는 \((s-1)p\) 이다.
- Wald 검정: 서로 다른 층의 추정치 \(\hat{\boldsymbol{\beta}}_1, \hat{\boldsymbol{\beta}}_2, \ldots\) 는 점근적으로 독립이므로, 대비 행렬(contrast matrix)을 이용하여 동일성을 검정한다.
BMT 예제 결과: MTX 사용 여부로 층화한 후 우도비 \(\chi^2 = 6.09\) (df=7, \(p = 0.53\) ) — 두 층에서 공변량 효과가 동일하다는 증거가 충분하다. 층화 모형이 적절하다.
3.4 짝진 실험에의 적용
층화 Cox 모형은 matched pair 설계에도 적용된다. 각 쌍을 하나의 층으로 정의하면, 짝짓기에 사용된 변수는 기저 위험함수의 차이로 자연스럽게 보정된다.
6-MP 예제 (Example 9.3): 21쌍의 백혈병 환자에서 \(\hat{\beta} = -1.792\) (SE = 0.624), \(RR = 0.167\) (95% CI: [0.049, 0.566]). 위약 환자는 6-MP 환자보다 재발 위험이 2~20배 높다.
4 좌절단 (§ 9.4)
4.1 문제 설정
좌절단(left truncation)은 개인이 시간 \(V\) 이후에야 관찰에 진입하는 경우이다. 대표적 상황:
- 연령 기반 분석: 은퇴 커뮤니티 입소 나이 이후부터만 관찰 (Channing House 예제)
- 중간 사건 조건부 분석: 혈소판 회복 환자만 대상으로 이후 생존 분석 (BMT 예제)
4.2 위험집합 재정의
좌절단의 처리는 매우 간단하다: 위험집합 \(R(t)\) 를 재정의하면 된다.
\[ R(t) = \{j \mid V_j < t \leq T_j\} \]
즉, 시점 \(t\) 의 위험집합에는 (1) 이미 관찰에 진입했고 (\(V_j < t\) ), (2) 아직 사건이나 중도절단이 발생하지 않은 (\(t \leq T_j\) ) 개인만 포함된다. 이 재정의를 편우도에 적용하면, Ch.8과 동일한 추정·검정 절차를 그대로 사용할 수 있다.
직관적으로: “아직 무대에 올라오지 않은 배우는 위험에 노출되지 않으므로 분모에서 제외한다.”
4.3 조건부 독립 가정
사건 시간 \(X\) 와 진입 시간 \(V\) 가 공변량 \(\mathbf{Z}\) 가 주어졌을 때 조건부 독립이어야 한다:
\[ X \perp V \mid \mathbf{Z} \]
이 가정 하에서 조건부 위험 \(h(t \mid \mathbf{Z}, X > V)\) 과 비조건부 위험 \(h(t \mid \mathbf{Z})\) 가 동일해진다 (Andersen et al., 1993).
이 가정이 위반되면 (예: 건강한 사람만 오래 살아서 커뮤니티에 입소) 추정량에 편향이 생긴다.
4.4 실무 주의점
- 나이를 공변량으로 넣지 말고 좌절단점으로 사용: 나이가 사건 시간의 척도(time scale)일 때, 나이를 좌절단점으로 처리하면 공변량에서 제외해도 된다.
- 생존함수 추정: 고정 공변량만 있는 좌절단 Cox 모형에서는 § 8.8의 방법으로 생존함수를 추정할 수 있다.
Channing House 예제 (Example 9.4): 성별 계수 \(\hat{\beta} = 0.316\) (SE = 0.173, \(p = 0.068\) ) — 남녀 간 생존 차이가 유의하지 않다.
BMT 예제 (Example 9.5): 혈소판 회복 환자만 대상으로 MTX 층화 Cox 모형을 적합. AML low-risk 그룹이 회복 후 현저히 유리하다 (\(\hat{\beta}_1 = -1.752\), \(p < 0.0001\) ).
5 시간 변동 효과의 종합 — 다상태 모형 (§ 9.5)
5.1 동기: 환자 이력에 기반한 예측
앞선 세 가지 확장(시간의존 공변량, 층화, 좌절단)을 결합하면, 환자의 이력(history)이 축적됨에 따라 예후 예측을 실시간으로 갱신하는 시스템을 구축할 수 있다.
5.2 이력 과정(History Process)
환자의 이력 \(H(t)\) 는 시점 \(t\) 까지 수집된 모든 정보이다:
- 고정 시점 공변량 (질병 유형, 나이 등)
- 시간의존 공변량의 전체 궤적 (\(\mathbf{Z}(u), 0 \leq u \leq t\) )
- 환자가 아직 사건 없이 생존 중이라는 사실
BMT 예제에서 두 가지 이력이 가능하다:
\[ H_1(t) = \{\mathbf{Z},\; T_p > t,\; X > t\} \quad \text{(혈소판 미회복 상태로 생존 중)} \]
\[ H_2(t) = \{\mathbf{Z},\; T_p \leq t,\; X > t\} \quad \text{(혈소판 회복 후 생존 중)} \]
5.3 예측 과정(Prediction Process)
예측 과정 \(\pi[s \mid H(t)]\) 는 시점 \(t\) 까지의 이력이 주어졌을 때, 시점 \(s\) 까지 사건(재발/사망)이 발생할 확률이다:
\[ \pi[s \mid H(t)] = P(t < X \leq s \mid H(t)) \]
이 함수는 세 가지 축으로 활용된다:
| 고정 | 변동 | 해석 |
|---|---|---|
| \(t\), \(s\) | \(H\) | 서로 다른 환자 이력이 예후에 미치는 영향 비교 |
| \(H\), \(s\) | \(t\) | 정보가 축적됨에 따라 예측이 어떻게 갱신되는지 추적 |
| \(H\), \(t\) | \(s\) | 조건부 생존곡선의 아날로그 |
5.4 세 위험률과 추정
다상태 전이 구조(Figure 9.1: 이식 → 혈소판 회복 / 재발·사망):
- \(h_p(t)\): 혈소판 회복의 위험률
- \(h_1(t)\): 혈소판 미회복 상태에서의 사망/재발 위험률
- \(h_2(t)\): 혈소판 회복 후의 사망/재발 위험률
혈소판 회복 후 이력 \(H_2(t)\) 의 예측:
\[ \pi_2(s; t) = \int_t^s h_2(r) \exp\left[-\int_t^r h_2(u)\,du\right] dr \]
직관: \(\exp[-\int_t^r h_2(u)\,du]\) 는 \(t\) 부터 \(r\) 까지 사건 없이 생존할 확률이고, \(h_2(r)\) 은 시점 \(r\) 에서의 순간 실패 확률이다. 이 둘의 곱을 적분하면 구간 \((t, s]\) 동안의 실패 확률을 얻는다.
혈소판 미회복 이력 \(H_1(t)\) 의 예측:
\[ \pi_1(s; t) = \int_t^s \exp\left[-\int_t^r [h_1(u) + h_p(u)]\,du\right] \left[h_1(r) + h_p(r)\,\pi_2(s, r)\right] dr \]
이 식은 두 경로를 동시에 고려한다:
- 시점 \(r\) 에서 직접 사망/재발 (\(h_1(r)\) )
- 시점 \(r\) 에서 혈소판이 회복되고(\(h_p(r)\) ), 이후 \(r\) ~ \(s\) 사이에 사망/재발 (\(\pi_2(s, r)\) )
5.5 추정 접근법
| 접근법 | 가정 | 방법 |
|---|---|---|
| Model I: 시간의존 공변량 | \(h_1\) 과 \(h_2\) 사이에 비례위험 | 12개 시간의존 공변량으로 단일 Cox 모형 |
| Model II: 좌절단 | \(h_1\) 과 \(h_2\) 가 완전히 별개 | 혈소판 회복 후 데이터를 좌절단으로 처리하여 별도 Cox 모형 |
Model I은 기저 위험 \(h_0(t)\) 를 하나만 추정하므로 효율적이지만, \(h_1\) 과 \(h_2\) 의 비례 가정이 필요하다. Model II는 각 상태에서 완전히 독립적인 기저 위험을 허용하므로 더 유연하다.
6 네 확장의 관계 — 통일적 관점
┌───────────────────────────────────────────────┐
│ 표준 Cox PH (Ch.8) │
│ h(t|Z) = h₀(t) exp(β'Z), Z 고정 │
└───────────────┬───────────────────────────────┘
│
┌─────────────────┼─────────────────────┐
↓ ↓ ↓
┌──────────┐ ┌──────────────┐ ┌──────────────┐
│ § 9.2 │ │ § 9.3 │ │ § 9.4 │
│ Z → Z(t) │ │ h₀ → h₀ⱼ(t) │ │ R(t) 재정의 │
│ 시간의존 │ │ 층화 │ │ 좌절단 │
└─────┬────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└────────────────┴────────────────────┘
↓
┌──────────────────┐
│ § 9.5 다상태 모형 │
│ 세 확장을 결합 │
│ π[s|H(t)] 예측 │
└──────────────────┘
- § 9.2는 모형의 공변량 공간을 확장한다 (시간 방향으로).
- § 9.3은 모형의 기저 위험 공간을 확장한다 (층별로 다른 \(h_0\) ).
- § 9.4는 위험집합의 정의를 확장한다 (지연 진입 허용).
- § 9.5는 위 세 확장을 조합하여 환자 이력 조건부 예측을 가능하게 한다.
7 응용 분야
| 분야 | § 9.2 | § 9.3 | § 9.4 | § 9.5 |
|---|---|---|---|---|
| 종양학 — BMT 후 예후 예측 | 혈소판 회복, aGVHD 발생 | MTX 사용 여부 | 회복 환자 조건부 분석 | 실시간 생존 예측 |
| 신장학 — 카테터 감염 | 카테터 교체 | 삽입 방법 비비례 → 층화 | — | — |
| 노인의학 — 은퇴 커뮤니티 | — | — | 입소 나이 좌절단 | — |
| 임상시험 — 짝진 설계 | — | 쌍 번호로 층화 | — | — |
| 당뇨 — 망막병증 | 시력 변화 추적 | — | — | 상태 전이 예측 |
8 실무 주의사항 (Practical Notes)
- 시간의존 공변량이 포함되면 위험비(hazard ratio)가 시간에 따라 변한다 — 단일 RR 숫자로 요약할 수 없다.
- 내부 공변량이 있으면 전통적 생존함수 \(S(t)\) 를 추정할 수 없다. 대신 다상태 예측 과정 \(\pi[s \mid H(t)]\) 를 사용한다.
- 데이터 구조는 (시작, 끝] 시간 구간 형식으로 분할하여, 각 구간 내에서 공변량이 상수가 되도록 한다 (계수과정 형식).
- 층화 모형에서 검정의 검정력은 모든 층에서 대립가설 방향이 동일할 때 최대이다.
- 좌절단에서 나이를 사건 시간 척도로 사용하면, 나이를 공변량으로 중복 투입하지 않는다.
9 코드 예시: 시간의존 공변량 + 층화 Cox 모형
9.1 Step 1: 순수 Python 구현 (편우도 원리)
import numpy as np
def partial_log_likelihood_td(beta, data):
"""시간의존 공변량이 포함된 편우도의 로그값 계산.
data: list of dicts with keys
- 'time': 사건/중도절단 시점
- 'event': 1 if event, 0 if censored
- 'Z_at_event': 사건 시점에서의 공변량 벡터
- 'risk_set_Z': 위험집합 구성원들의 해당 시점 공변량 행렬
"""
ll = 0.0
for obs in data:
if obs['event'] == 1:
# 분자: 실패 개인의 exp(beta'Z(t_i))
numerator = np.dot(beta, obs['Z_at_event'])
# 분모: 위험집합 내 모든 개인의 exp(beta'Z_j(t_i)) 합
risk_scores = obs['risk_set_Z'] @ beta
denominator = np.log(np.sum(np.exp(risk_scores)))
ll += numerator - denominator
return ll
# 층화: 각 층의 로그 편우도를 합산
def stratified_partial_ll(beta, strata_data):
"""층화 편우도 = sum of stratum-specific partial log-likelihoods."""
return sum(partial_log_likelihood_td(beta, stratum) for stratum in strata_data)9.2 Step 2: lifelines / R survival 패키지 (실무)
from lifelines import CoxPHFitter
import pandas as pd
# 시간의존 공변량: (start, stop] 형식으로 데이터 변환
# 각 행은 한 구간을 나타내며, 구간 내 공변량은 상수
df = pd.DataFrame({
'id': [1, 1, 2, 2, 2],
'start': [0, 15, 0, 8, 20],
'stop': [15, 47, 8, 20, 35],
'event': [0, 1, 0, 0, 1],
'platelet_recovered': [0, 1, 0, 0, 1],
'group': [1, 1, 0, 0, 0],
'strata_mtx': [0, 0, 1, 1, 1]
})
cph = CoxPHFitter()
cph.fit(
df,
duration_col='stop',
event_col='event',
entry_col='start', # 좌절단/시간의존 공변량 → entry 지정
strata=['strata_mtx'], # MTX로 층화
formula='platelet_recovered + group'
)
cph.print_summary()# R: survival 패키지
library(survival)
# (tstart, tstop] 형식 + strata
fit <- coxph(
Surv(tstart, tstop, event) ~ platelet_recovered + group + strata(mtx),
data = bmt_long
)
summary(fit)10 관련 주제
선행 지식
- Ch.8 — Cox Proportional Hazards Regression
- § 8.3~8.4 — Partial Likelihood + Ties
- § 3.5~3.6 — Likelihood Master 식 + Counting Process
후속 주제 (Ch.9 세부 포스트)
- § 9.2 시간의존 공변량 상세 — PH 검정, change-point, BMT 상호작용 (예정)
- § 9.3 층화 Cox 모형 상세 — 동일 효과 검정, matched pair (예정)
- § 9.4 좌절단 회귀 상세 — Channing House, BMT 조건부 분석 (예정)
- § 9.5 다상태 모형 상세 — 예측 과정, Model I vs II 비교 (예정)
관련 개념