1 들어가며 — 이론에서 데이터로
Ch.9 Overview 부터 § 9.6 추정 까지의 다섯 sub-post 가 이론 (모형 정의, 잠재 변수 framework, ICC, 다중 랜덤 효과, response function, marginal MLE, Gauss-Hermite quadrature) 을 다뤘다. § 9.7 부터는 같은 framework 를 실제 임상 데이터에 적용 한다.
본 포스트는 § 9.7 (데이터 소개) 와 § 9.7.1 (fixed-effects baseline) 을 다룬다. 이어지는 § 9.7.2 (random intercept) 와 § 9.7.3 (random intercept + trend) 는 별도 sub-post 에서 계속.
“§ 9.7 = NIMH 정신분열증 임상시험 (placebo vs 약물, 6 주, IMPS Severity Item 79 이항화, attrition 심함). logit 의 시간 곡선이 비선형이라 sqrt(week) 변환으로 선형화. § 9.7.1 = fixed-effects logistic baseline — Drug 효과 자체는 비유의 (p=.41) 이나 Time 효과는 강함 (p<.001), Drug×Time 한계적. 그러나 이 모형은 같은 환자의 반복 측정을 독립으로 가정하므로 표준오차가 부정확 — § 9.7.2-9.7.3 의 mixed-effects 모형이 필요한 동기.”
2 § 9.7 — NIMH 정신분열증 데이터
2.1 임상 배경
- 출처: National Institute of Mental Health (미국 국립정신보건원) 정신분열증 협력 연구.
- 측정 도구: Inpatient Multidimensional Psychiatric Scale (IMPS; Lorr & Klett 1966).
- 분석 대상: Item 79 — “Severity of Illness” (질병 중증도).
- 원래 척도: 0 ~ 7 점 (0 = normal, not at all ill; 7 = among the most extremely ill).
- 이항화: mildly ill (3) 과 moderately ill (4) 사이에서 절단 → \(Y = 1\) 이면 moderately ill 이상, \(Y = 0\) 이면 mildly ill 이하.
- 처치: 4 그룹 — placebo, chlorpromazine, fluphenazine, thioridazine. Gibbons & Hedeker (1994) 에서 세 항정신병 약물의 효과가 유사함이 확인되어 본 분석에서는 drug 단일 그룹 으로 통합.
- 계획된 측정 시점: week 0, 1, 3, 6 (총 4 회). 일부 환자는 추가로 week 2, 4, 5 에 측정.
- 표본: placebo N = 108, drug N = 329, 총 N = 437.
NIMH 데이터는 종단 GLMM 의 시연에 적합한 여러 특성을 가진다:
- 이항 응답: 중증도를 두 범주로 나누어 logistic 모형에 직접 적용 가능. 원래 7 점 척도이지만 이항화로 단순화 (순서형 분석은 Ch.10 에서 다시 다룸).
- 시간 효과 명확: 약물이 작동하면 시간에 따라 중증도가 감소 — 종단 변화의 신호가 분명.
- 그룹 비교: placebo vs 약물의 차등 변화 (differential change) 가 임상적 핵심 질문.
- 결측 (attrition): 표 9.1 에서 보이듯 시간이 갈수록 표본 크기가 감소 — 종단 분석의 현실적 어려움 시연.
- 불균등 시점: 일부 환자가 추가 시점에 측정 — 균등 격자 가정을 깨는 데이터.
→ Mixed-effects 모형의 강점 (불균등 시점·결측 처리) 을 시연하기 좋은 sample.
2.2 표본 Attrition — 표 9.1
| Group | Week 0 | Week 1 | Week 2 | Week 3 | Week 4 | Week 5 | Week 6 |
|---|---|---|---|---|---|---|---|
| Placebo (N=108) | 107 | 105 | 5 | 87 | 2 | 2 | 70 |
| Drug (N=329) | 327 | 321 | 9 | 287 | 9 | 7 | 265 |
표 9.1 에서 두 가지 패턴이 두드러진다:
1. 주요 시점의 attrition: Week 0 → Week 6 사이 placebo 는 107 → 70 (35 % 손실), drug 는 327 → 265 (19 % 손실). placebo 환자의 dropout 이 더 큼 — 약물이 효과적이지 않은 환자가 연구를 그만두는 경향 (informative dropout 가능성).
2. 비주요 시점의 sparse 데이터: Week 2, 4, 5 에 측정된 환자가 매우 적음 (각 그룹 < 10). 이 추가 시점은 “기회 측정” — 환자 편의나 임상 상황에 따라 측정.
종단 분석에서 이 두 특성이 시사:
- 단순 분석의 위험: ANOVA 나 MANOVA 는 완전 데이터 (모든 시점 측정된 환자) 만 사용 → 표본의 절반 이상 손실. 결과 편향.
- Mixed-effects 의 가치: 불균등 데이터를 자연 처리. attrition 이 MAR (missing at random) 가정 만족하면 유효 추론.
- MNAR 위험: placebo 의 큰 dropout 이 informative (응답 못한 환자가 더 심한 경우) 면 MAR 가정 깨짐. § Ch.14 에서 별도 분석.
이 데이터는 § 9.7.1 의 단순 logistic 부터 § 14 의 결측 모형까지 책 전체의 시연 표본으로 반복 사용된다.
2.3 관측 통계량 — 표 9.2
| Week 0 | Week 1 | Week 3 | Week 6 | |
|---|---|---|---|---|
| 관측 비율 (P(Y=1)) | ||||
| Placebo | .98 | .91 | .89 | .71 |
| Drug | .99 | .82 | .66 | .42 |
| 관측 Odds (P/(1-P)) | ||||
| Placebo | 52.5 | 9.50 | 7.70 | 2.50 |
| Drug | 80.8 | 4.63 | 1.93 | 0.73 |
| Ratio (drug/placebo) | 1.54 | 0.49 | 0.25 | 0.29 |
| 관측 Log-odds (logit) | ||||
| Placebo | 3.96 | 2.25 | 2.04 | 0.92 |
| Drug | 4.39 | 1.53 | 0.66 | -0.31 |
| Difference (drug - placebo) | 0.43 | -0.72 | -1.38 | -1.23 |
| exp(difference) = OR | 1.54 | 0.49 | 0.25 | 0.29 |
세 가지 표현 (비율, odds, log-odds) 이 같은 정보를 다른 척도로 보여준다:
비율의 메시지: Week 0 에 거의 모든 환자가 moderately ill 이상 (~99 %). Week 6 까지 placebo 는 71 % 로, drug 는 42 % 로 감소. 두 그룹 모두 호전되나 drug 가 더 빠름.
Odds 의 메시지: 비율이 0.5 보다 크면 odds > 1 (positive logit), 작으면 odds < 1 (negative logit). Week 6 drug 의 odds = 0.73 → “moderately ill 이상” 보다 “그 이하” 가 약간 더 많음.
Log-odds (logit) 의 메시지: 로지스틱 회귀가 모형화하는 척도. 시간에 따른 logit 의 감소가 곧 약효의 직선적 표현.
핵심 — Drug 효과의 부호 변화:
- Week 0 에서 OR = 1.54 (drug 가 placebo 보다 약간 더 심함, 처치 전 baseline 의 우연 차이).
- Week 1 에서 OR = 0.49 (drug 가 placebo 보다 덜 심함, 약효 첫 신호).
- Week 3, 6 에서 OR ≈ 0.25 ~ 0.29 (강한 약효).
Drug × Time 상호작용 의 임상적 의미가 여기서 명확 — 약물 효과의 크기가 시간에 따라 커진다 (initial baseline 비교는 무의미하고, 시간이 지날수록 약물의 가치가 드러난다).
이 패턴이 § 9.7.1 의 회귀 분석에서 검정 통계량으로 정량화될 것.
2.4 시간 변환 — sqrt(week) 의 동기
원 척도 (week) 에서 logit 의 시간 변화 (Figure 9.6 의 핵심):
- Week 0 → 1: 큰 감소 (placebo: 3.96 → 2.25, drug: 4.39 → 1.53).
- Week 1 → 3: 완만한 감소.
- Week 3 → 6: 완만한 감소 지속.
→ logit 이 week 와 비선형 관계 (초기 급격, 후기 완만).
sqrt(week) 척도로 변환:
- \(\sqrt{0} = 0\), \(\sqrt{1} = 1\), \(\sqrt{3} \approx 1.73\), \(\sqrt{6} \approx 2.45\).
- 이 척도에서 logit 이 거의 직선 (Figure 9.7).
logit 의 시간 곡선이 “초기 급격 + 후기 완만” 이라는 패턴은 임상에서 흔하다:
- 약효가 빠르게 나타난 후 안정화 (saturation).
- 측정 도구의 ceiling effect (모두 max 점수에서 출발해 빠르게 풀림).
- 환자의 자연 회복이 초기에 집중.
이런 곡선은 concave (오목) 함수 — week → log(week+1), week → sqrt(week), week → 1 - exp(-week) 등이 모형화 가능. sqrt 가 가장 단순하고 데이터에 잘 맞으면 선택.
대안적 접근:
- 다항식 (quadratic, cubic): \(\beta_1 \cdot t + \beta_2 \cdot t^2\). 더 유연하나 모수가 늘어남 (parsimony 손실).
- Splines: 더 유연. 이항 데이터에서는 추정 어려움.
- 시간 변환 + 단일 항: \(\beta \cdot \sqrt{t}\). 하나의 모수로 곡선 표현 — 가장 절약적.
저자의 선택 (sqrt) 은 parsimony 우선. 단점은 해석이 약간 어색 (회귀 계수가 “\(\sqrt{week}\) 1 단위 증가” 의 효과 — 직관적이지 않음).
데이터가 비선형 곡선을 보일 때 두 가지 길:
- 변수 변환: 시간을 변환해 logit 과 선형 관계 만듦 (parsimonious, 해석 어려움).
- 모형 확장: 다항식·spline 으로 곡선을 직접 모형화 (해석 쉬움, 모수 많음).
본문 § 9.7 은 변수 변환을 선택. § 5 의 polynomial regression 모형이 모형 확장 대안.
3 § 9.7.1 — Fixed-Effects Logistic Regression Baseline
3.1 모형 정의
\[ \log \left[ \frac{p_{ij}}{1 - p_{ij}} \right] = \beta_0 + \beta_1 \text{Drug}_i + \beta_2 \sqrt{\text{Week}}_j + \beta_3 (\text{Drug}_i \cdot \sqrt{\text{Week}}_j) \]
- \(\beta_0\): 절편 — placebo 의 baseline (week 0) logit.
- \(\beta_1\): drug 주효과 — week 0 에서 drug vs placebo 의 logit 차이.
- \(\beta_2\): time 주효과 — placebo 의 sqrt(week) 1 단위 증가의 logit 변화.
- \(\beta_3\): drug × time 상호작용 — drug 의 추가적 시간 변화 속도 차이.
같은 환자의 반복 측정이 독립 으로 가정 (랜덤 효과 없음).
핵심 문제: 종단 데이터에서 같은 환자의 시점 사이에 양의 상관이 존재한다 — 어떤 환자는 일관되게 더 심하고, 어떤 환자는 일관되게 덜 심함. 이 환자별 이질성을 무시하면:
- 표준오차 과소 추정: 독립 가정이 정보량을 부풀려 평가. SE 가 실제보다 작게 나옴.
- Type I error 증가: p-value 가 부풀려져 실제는 비유의한 효과가 유의로 보임.
- 신뢰구간 좁음: 95 % CI 가 실제 95 % 커버리지를 못 가짐.
그럼에도 불구하고 baseline 으로 제시하는 이유:
- 비교 기준: § 9.7.2-9.7.3 의 mixed-effects 결과와 비교해 “모형 변경이 어떤 차이를 만드는가” 를 학습.
- 모수 해석의 출발점: 회귀 계수 자체의 부호·대략적 크기는 mixed-effects 와 비슷하게 나옴 (식 9.16 의 척도 보정 후).
- 실수의 시연: “단순 logistic 으로도 결과가 나오니 그것으로 충분” 이라는 잘못된 결론을 피하기 위함.
3.2 추정 결과 — 표 9.3
| 모수 | Estimate | SE | \(Z\) | \(p <\) |
|---|---|---|---|---|
| Intercept | 3.703 | 0.442 | 8.38 | .001 |
| Drug (0=placebo, 1=drug) | -0.405 | 0.494 | -0.82 | .41 |
| Time (\(\sqrt{\text{week}}\)) | -1.113 | 0.234 | -4.76 | .001 |
| Drug × Time | -0.418 | 0.262 | -1.60 | .11 |
\(-2 \log L = 1362.06\)
Intercept (\(\beta_0 = 3.70\), \(z = 8.38\), \(p < .001\)):
- Placebo 환자 (\(\text{Drug} = 0\)) 의 week 0 (\(\sqrt{0} = 0\)) logit 추정.
- \(p = e^{3.70} / (1 + e^{3.70}) \approx 0.976\) — 표 9.2 의 0.98 과 일치.
- 강한 유의성 — week 0 에서 거의 모든 환자가 moderately ill 이상이라는 사실의 통계적 표현.
Drug 주효과 (\(\beta_1 = -0.405\), \(z = -0.82\), \(p = .41\)):
- Drug 그룹의 week 0 logit 이 placebo 보다 -0.405 만큼 다름.
- 비유의 (p = .41) — 처치 전 baseline 에서 두 그룹이 비슷.
- Randomization 의 검증: 무작위 배정이 잘 되었으면 baseline 차이가 비유의여야 함. 이 결과가 RCT 의 정합성을 시사.
Time 주효과 (\(\beta_2 = -1.113\), \(z = -4.76\), \(p < .001\)):
- Placebo 그룹의 sqrt(week) 1 단위 증가당 logit 이 -1.113 만큼 감소.
- 매우 유의 (p < .001) — placebo 환자들도 시간에 따라 호전.
- Implication: 약효 외에도 자연 회복, hospitalization 효과, regression to the mean 등이 작용. 약물의 진짜 효과를 보려면 placebo 변화를 빼야 한다.
Drug × Time 상호작용 (\(\beta_3 = -0.418\), \(z = -1.60\), \(p = .11\)):
- Drug 그룹이 placebo 보다 sqrt(week) 1 단위당 logit 이 추가로 -0.418 만큼 더 감소.
- p = .11 — 한계적 비유의 (marginally non-significant).
- 임상적 핵심 질문에 대한 답 — “약물이 placebo 보다 더 빠른 호전을 가져오는가?” 의 통계적 답.
→ p = .11 은 5 % 유의수준에서 거부 못함. 약효의 차등 효과를 통계적으로 입증 못함.
그러나 표 9.2 의 OR 패턴 (1.54 → 0.49 → 0.25 → 0.29) 은 명확한 약효를 시사. 왜 검정에서 못 잡는가?
가능성 1 — 진짜로 차등 효과가 약함: 표본 크기 (N=437) 가 충분한데도 잡히지 않음 → 효과가 우연 변동 안에 묻혀 있음. 이 경우 결론은 “약물 효과를 입증 못함”.
가능성 2 — 통계적 검정의 부적절: 종단 데이터의 상관 구조를 무시해 SE 추정이 부정확. 진짜 효과는 있지만 fixed-effects 모형이 검출 못함.
§ 9.7.2-9.7.3 에서 mixed-effects 모형으로 같은 데이터를 분석하면: SE 추정이 더 정확해지고, Drug × Time 효과가 유의해지는지 비교한다. 만약 mixed-effects 에서 유의해진다면 가능성 2 였다는 증거.
이 비교가 본 chapter 의 핵심 시연 — “같은 데이터, 다른 모형, 다른 결론”. 모형 선택의 실무적 중요성을 보여주는 사례.
3.3 적합 logit 식 — 식 (9.62)
추정값 대입:
\[ \log \left[ \frac{\widehat{p}_{ij}}{1 - \widehat{p}_{ij}} \right] = 3.70 - 0.41 \cdot \text{Drug}_i - 1.11 \cdot \text{Time}_j - 0.42 \cdot (\text{Drug}_i \cdot \text{Time}_j) \tag{9.62} \]
여기서 \(\text{Time}_j = \sqrt{\text{Week}_j}\).
식 (9.62) 를 그룹별로 분리:
Placebo (\(\text{Drug} = 0\)):
\[ \widehat{\text{logit}}_j = 3.70 - 1.11 \cdot \sqrt{\text{Week}_j} \]
Drug (\(\text{Drug} = 1\)):
\[ \widehat{\text{logit}}_j = (3.70 - 0.41) - (1.11 + 0.42) \cdot \sqrt{\text{Week}_j} = 3.29 - 1.53 \cdot \sqrt{\text{Week}_j} \]
→ Drug 그룹은 (1) 절편이 0.41 낮고 (2) 기울기가 -0.42 더 가파름. 즉 약간 낮은 출발 + 빠른 호전.
각 시점의 예측 확률을 표 9.2 와 비교 (Figure 9.8, 9.9 의 시각화):
| Week | \(\sqrt{\text{Week}}\) | Placebo logit | Placebo p | Drug logit | Drug p | Obs Placebo | Obs Drug |
|---|---|---|---|---|---|---|---|
| 0 | 0.00 | 3.70 | 0.976 | 3.29 | 0.964 | 0.98 | 0.99 |
| 1 | 1.00 | 2.59 | 0.930 | 1.76 | 0.853 | 0.91 | 0.82 |
| 3 | 1.73 | 1.78 | 0.856 | 0.65 | 0.657 | 0.89 | 0.66 |
| 6 | 2.45 | 0.98 | 0.727 | -0.46 | 0.387 | 0.71 | 0.42 |
→ 적합값과 관측값이 잘 일치. 모형이 평균적 패턴을 포착.
3.4 Baseline 의 한계와 다음 단계
표 9.3 의 결과만 보면:
- Drug 주효과: 비유의 (p = .41).
- Drug × Time: 비유의 (p = .11).
→ “약물이 placebo 와 차이가 없다” 는 결론이 도출될 수 있음. 그러나 이 결론은 위험.
비판적 평가:
- 표준오차 신뢰성: 같은 환자의 시점이 독립이라는 가정이 깨졌으므로 SE 가 부정확. 진짜 SE 는 더 클 수 있고 (덜 유의), 더 작을 수도 있다 (더 유의).
- 임상적 효과 크기: \(\beta_3 = -0.42\) 는 결코 작지 않은 효과 (sqrt(week) 1 단위당 logit 차이). p = .11 은 “유의하지는 않지만 효과 크기는 임상적으로 의미 있음”. 표본이 더 컸으면 유의했을 가능성.
- Visual evidence: 표 9.2 와 Figure 9.8-9.9 의 패턴이 약효를 강하게 시사. 통계적 검정이 잡지 못한 것이 모형의 문제일 수 있음.
→ § 9.7.2 에서 random intercept 추가, § 9.7.3 에서 random intercept + trend 추가 — 두 모형이 같은 데이터에 무엇을 다르게 보여주는지 직접 비교.
§ 9.7.2 (random intercept):
- 환자별 절편 \(\upsilon_{0i}\) 추가 → 환자 이질성 모형화.
- 같은 환자의 시점 사이 상관을 ICC 로 정량화.
- SE 추정이 정확해짐 → p-value 도 변경.
§ 9.7.3 (random intercept + trend):
- 환자별 시간 기울기 \(\upsilon_{1i}\) 추가 → 환자별 호전 속도의 차이 모형화.
- 가장 일반적 모형 (절편·기울기 모두 환자 가변).
- Drug × Time 효과 검정의 가장 정확한 결과.
이 세 모형의 비교가 § 9.7 illustration 의 핵심 메시지 — “같은 데이터에 모형 복잡도를 점진적으로 늘리면 결론이 어떻게 달라지는가”.
4 응용 분야
| 분야 | 활용 | NIMH 데이터와의 평행 |
|---|---|---|
| 정신과 임상시험 | 우울증·불안·정신분열증 약물 효과 추적 | 본 시연의 직접 응용 |
| 종양 임상 | 항암제 반응 (CR/PR/SD/PD 이항화) | Drug × Time 차등 효과 |
| 만성 질환 관리 | 당뇨·고혈압 조절 여부 추적 | 환자 attrition + 시간 효과 |
| 행동 중재 RCT | 금연·체중 감량 성공 여부 | sqrt(time) 변환의 saturation 패턴 |
| 디지털 헬스 | 앱 사용 후 증상 호전 여부 | 불균등 측정 시점의 처리 |
| 교육 평가 | 학기말 합격 여부 + 시간 추세 | Time 주효과 + 처치 효과 분리 |
5 코드 예시
5.1 Step 1: NIMH 데이터 시뮬레이션 (재현용)
import numpy as np
import pandas as pd
def simulate_nimh_like(seed: int = 2026) -> pd.DataFrame:
"""NIMH 데이터의 구조를 모방한 시뮬레이션.
표 9.1 의 표본 attrition 패턴 + 표 9.2 의 평균 비율 패턴 재현.
"""
rng = np.random.default_rng(seed)
# 표 9.1 의 attrition 표
attrition = {
"placebo": {0: 107, 1: 105, 2: 5, 3: 87, 4: 2, 5: 2, 6: 70},
"drug": {0: 327, 1: 321, 2: 9, 3: 287, 4: 9, 5: 7, 6: 265}
}
# 식 (9.62) 의 추정 회귀식으로 응답 확률 생성 (논문 결과)
def logit_model(week: float, drug: int) -> float:
sqrt_w = np.sqrt(week)
return 3.70 - 0.41 * drug - 1.11 * sqrt_w - 0.42 * drug * sqrt_w
rows = []
subject_id = 0
for group, weeks in attrition.items():
drug = 1 if group == "drug" else 0
N = weeks[0] # 시점 0 의 표본 크기 = 그룹 총 표본
for i in range(N):
for week, count in weeks.items():
# 이 시점에 측정된 환자 비율로 무작위 결정
if rng.random() < (count / N):
p = 1.0 / (1.0 + np.exp(-logit_model(week, drug)))
y = rng.binomial(1, p)
rows.append({
"subject": subject_id, "group": group, "drug": drug,
"week": week, "sqrt_week": np.sqrt(week), "y": y
})
subject_id += 1
return pd.DataFrame(rows)
df = simulate_nimh_like()
print(f"전체 관측 수: {len(df)}")
print(f"환자 수: {df['subject'].nunique()}")
print(f"\n시점·그룹별 관측 수:")
print(df.groupby(["group", "week"]).size().unstack(fill_value=0))
print(f"\n시점·그룹별 응답 비율:")
print(df.groupby(["group", "week"])["y"].mean().unstack().round(2))이 시뮬레이션은 fixed-effects 모형 (식 9.62) 으로 데이터를 생성 한다. 즉 환자 이질성 (ICC > 0) 을 포함하지 않음. 진짜 NIMH 데이터는 환자 이질성이 있을 것이라 시뮬레이션과 결과가 약간 다를 수 있다.
§ 9.7.2-9.7.3 의 mixed-effects 분석에서는 환자 이질성을 모형화한 시뮬레이션이 더 적합 — 다음 sub-post 에서 확장.
실제 NIMH 데이터 (SchizRel.dat 또는 SCHIZ.dat) 는 Hedeker 의 웹사이트 (www.uic.edu/~hedeker) 에서 공개. 학습 목적이면 직접 다운로드해 본 분석 재현 가능.
5.2 Step 2: Fixed-Effects Logistic 적합 (statsmodels)
import statsmodels.api as sm
import statsmodels.formula.api as smf
# Fixed-effects logistic — 식 (9.62)
fit = smf.logit("y ~ drug + sqrt_week + drug:sqrt_week", data=df).fit(disp=False)
print(fit.summary())statsmodels 의 출력에서 주목:
Intercept(식 9.62 의 \(\beta_0 = 3.70\)).drug(\(\beta_1 = -0.41\)).sqrt_week(\(\beta_2 = -1.11\)).drug:sqrt_week(\(\beta_3 = -0.42\)).
표 9.3 과 거의 일치해야 함 (시뮬레이션 데이터의 변동 범위 내). 실제 NIMH 데이터로 적합하면 표 9.3 과 정확히 같은 결과.
\(-2 \log L\) 비교: statsmodels 의 fit.llf (log-likelihood) 에서 \(-2 \cdot \text{llf}\) 계산 → 표 9.3 의 1362.06 과 비교. 이 deviance 가 § 9.7.2-9.7.3 의 mixed-effects 모형과 LR test 로 비교될 baseline.
5.3 Step 3: 적합 logit 과 비율 시각화 (Figure 9.8-9.9 재현)
import numpy as np
import matplotlib.pyplot as plt
def fitted_logit(week: float, drug: int) -> float:
return 3.70 - 0.41 * drug - 1.11 * np.sqrt(week) - 0.42 * drug * np.sqrt(week)
def fitted_prob(week: float, drug: int) -> float:
return 1.0 / (1.0 + np.exp(-fitted_logit(week, drug)))
weeks_smooth = np.linspace(0, 6, 100)
weeks_obs = [0, 1, 3, 6]
# 관측 logit (표 9.2)
obs_logit_placebo = [3.96, 2.25, 2.04, 0.92]
obs_logit_drug = [4.39, 1.53, 0.66, -0.31]
obs_prop_placebo = [0.98, 0.91, 0.89, 0.71]
obs_prop_drug = [0.99, 0.82, 0.66, 0.42]
# Figure 9.8 — Logit
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
ax = axes[0]
ax.plot(np.sqrt(weeks_smooth), [fitted_logit(w, 0) for w in weeks_smooth],
"-", label="Placebo (est)", color="steelblue", linewidth=2)
ax.plot(np.sqrt(weeks_smooth), [fitted_logit(w, 1) for w in weeks_smooth],
"-", label="Drug (est)", color="darkorange", linewidth=2)
ax.scatter(np.sqrt(weeks_obs), obs_logit_placebo, marker="s",
label="Placebo (obs)", color="steelblue", s=80, zorder=5)
ax.scatter(np.sqrt(weeks_obs), obs_logit_drug, marker="^",
label="Drug (obs)", color="darkorange", s=80, zorder=5)
ax.set_xlabel("Time (sqrt weeks)")
ax.set_ylabel("Logit")
ax.set_title("Figure 9.8 — Fitted Logits (Fixed-Effects)")
ax.legend()
ax.axhline(0, color="gray", linestyle=":", alpha=0.5)
# Figure 9.9 — Proportions
ax = axes[1]
ax.plot(np.sqrt(weeks_smooth), [fitted_prob(w, 0) for w in weeks_smooth],
"-", label="Placebo (est)", color="steelblue", linewidth=2)
ax.plot(np.sqrt(weeks_smooth), [fitted_prob(w, 1) for w in weeks_smooth],
"-", label="Drug (est)", color="darkorange", linewidth=2)
ax.scatter(np.sqrt(weeks_obs), obs_prop_placebo, marker="s",
label="Placebo (obs)", color="steelblue", s=80, zorder=5)
ax.scatter(np.sqrt(weeks_obs), obs_prop_drug, marker="^",
label="Drug (obs)", color="darkorange", s=80, zorder=5)
ax.set_xlabel("Time (sqrt weeks)")
ax.set_ylabel("P(moderately ill or worse)")
ax.set_title("Figure 9.9 — Fitted Proportions (Fixed-Effects)")
ax.legend()
ax.set_ylim(0, 1)
ax.axhline(0.5, color="gray", linestyle=":", alpha=0.5)
plt.tight_layout()Figure 9.8 (logit 척도): 두 선이 모두 직선 — sqrt(week) 변환이 logit 의 선형성을 잘 만들어냄. drug 그룹이 더 가파른 음의 기울기.
Figure 9.9 (확률 척도): 두 곡선이 S-curve 의 일부 — logit 직선이 logistic cdf 통과 후 곡선화. drug 그룹이 더 빠른 감소.
이 시각화는 모형의 적합 품질 을 평가하는 표준 방법:
- 관측값 (산점도) 과 적합값 (선) 의 일치 → 모형이 평균 패턴 포착.
- Sub-group 별 패턴 차이 → 처치 효과의 시각적 증거.
- Outlier 시점 → 추가 조사 필요한 지점.
§ 9.7.2-9.7.3 에서 같은 시각화에 random effects 가 어떻게 추가되는지 (개별 환자 trajectory + 평균 곡선) 비교.
5.4 Step 4: Drug × Time 검정의 다양한 표현
import numpy as np
from scipy import stats
# 표 9.3 의 Drug × Time 추정값과 SE
beta3 = -0.418
se3 = 0.262
z = beta3 / se3
p_two_sided = 2 * (1 - stats.norm.cdf(np.abs(z)))
print(f"Drug × Time 효과:")
print(f" Estimate (β₃): {beta3:+.3f}")
print(f" SE: {se3:.3f}")
print(f" Z statistic: {z:.3f}")
print(f" p-value: {p_two_sided:.3f}")
print(f" 95% CI: ({beta3 - 1.96*se3:.3f}, {beta3 + 1.96*se3:.3f})")
# Odds ratio 해석 (sqrt(week) 1 단위당)
or_drug_per_unit = np.exp(beta3)
print(f"\nOdds ratio per unit sqrt(week) increase (drug vs placebo):")
print(f" OR = exp({beta3:.3f}) = {or_drug_per_unit:.3f}")
print(f" → drug 가 sqrt(week) 1 단위당 odds 가 placebo 의 {or_drug_per_unit:.1%} 배")
# 임상적 효과 — week 6 에서의 OR
sqrt_week6 = np.sqrt(6)
beta3_at_week6 = beta3 * sqrt_week6
print(f"\nDrug × Time 의 누적 효과 (week 6, sqrt = {sqrt_week6:.2f}):")
print(f" 추가 logit: {beta3_at_week6:.3f}")
print(f" 추가 OR: {np.exp(beta3_at_week6):.3f}")
print(f" → week 6 에서 drug 가 placebo 보다 odds 가 {np.exp(beta3_at_week6):.0%} 배")p = .11 은 통계적 유의성 (\(\alpha = .05\)) 기준으로 “거부 못함”. 그러나 효과 크기 는 결코 작지 않다:
- sqrt(week) 1 단위당 OR ≈ 0.66 — drug 가 placebo 의 약 2/3 odds.
- Week 6 누적 효과: OR ≈ 0.36 — drug 가 placebo 의 약 1/3 odds.
→ 임상적으로 매우 의미 있는 효과. 통계적 유의성을 못 보인 이유는 (1) 표본이 효과 검출에 부족하거나, (2) 모형이 부적절하거나.
§ 9.7.2-9.7.3 의 mixed-effects 분석은 SE 추정의 정확도를 높여 같은 효과 크기를 더 정확히 검정 → 차이가 검정에 어떻게 반영되는지 비교.
실무 메시지: p-value 만으로 결론 내지 말 것. 효과 크기 (OR, CI) 와 임상적 의미를 함께 평가.
6 관련 주제
선행 지식
- Ch.9 Overview — 이항 GLMM 의 전체 framework
- § 9.2-9.3 — Single-level 로지스틱 회귀의 정의와 추정
- § 9.5.1-9.5.3 — Mixed-effects 모형 정의 (§ 9.7.2-3 의 토대)
- § 9.6 추정 — Marginal MLE, Gauss-Hermite quadrature
후속 주제
- § 9.7.2 — Random Intercept Logistic Regression Model (NIMH 데이터, 환자 이질성 추가)
- § 9.7.3 — Random Intercept and Trend Logistic Regression Model (NIMH 데이터, 환자별 호전 속도 추가)
- § 9.8 — Summary
- Ch.10 GLMM 순서형 — IMPS Item 79 의 원래 7 점 척도 활용
- Ch.14 결측 데이터 — NIMH 의 attrition 패턴 분석 (informative dropout)
관련 개념
- Lorr & Klett (1966) — IMPS 척도 원전
- Gibbons & Hedeker (1994) — NIMH 데이터의 mixed-effects probit 분석 (logit 의 짝)
- Verbeke & Molenberghs (2000) — 종단 데이터의 시간 변환 일반론
- GEE (Ch.8) — Marginal 모형의 같은 데이터 적용 비교
- § 5 다항식 회귀 — sqrt 변환의 대안