§ 9.7 ~ 9.7.1 — Mixed-Effects Logistic 적용 (1): NIMH 정신분열증 데이터와 Fixed-Effects Baseline

NIMH Schizophrenia Collaborative Study · IMPS Item 79 이항화 · 표본 attrition · sqrt(week) 시간 변환 · Fixed-effects logistic 회귀 (식 9.62) · 종단 데이터에서 독립 가정의 한계

Hedeker & Gibbons (2006) Ch.9 §9.7 ~ §9.7.1 의 자세한 풀이. § 9.7 는 mixed-effects logistic 의 적용 사례로 NIMH 정신분열증 임상시험을 사용한다. IMPS (Inpatient Multidimensional Psychiatric Scale) Item 79 “Severity of Illness” 의 7 점 척도를 mildly ill (3) / moderately ill (4) 사이에서 이항화. 처치는 placebo (N=108) 와 항정신병 약물 (N=329, chlorpromazine·fluphenazine·thioridazine 통합). 표 9.1 의 표본 attrition, 표 9.2 의 관측 비율·odds·log-odds, 그리고 logit 의 시간 곡선이 비선형이라 sqrt(week) 변환으로 선형화한 동기 (parsimony) 를 정리한다. § 9.7.1 은 비교 baseline 으로 fixed-effects logistic (Drug + sqrt(Week) + Drug×Time, 식 9.62) 을 적합한다. 표 9.3 의 결과 — Drug 주효과 비유의 (p=.41), Time 강한 음의 효과 (p<.001), Drug×Time 한계적 비유의 (p=.11) — 의 임상적 해석과, 이 모형이 종단 데이터에 독립 가정을 강요하므로 적절하지 않다는 본질적 한계 (랜덤 효과로의 다리, § 9.7.2-9.7.3 의 동기) 까지 다룬다.

Statistics
저자

Kwangmin Kim

공개

2026년 05월 06일

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 임상 배경

NIMH Schizophrenia Collaborative Study
  • 출처: 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 의 시연에 적합한 여러 특성을 가진다:

  1. 이항 응답: 중증도를 두 범주로 나누어 logistic 모형에 직접 적용 가능. 원래 7 점 척도이지만 이항화로 단순화 (순서형 분석은 Ch.10 에서 다시 다룸).
  2. 시간 효과 명확: 약물이 작동하면 시간에 따라 중증도가 감소 — 종단 변화의 신호가 분명.
  3. 그룹 비교: placebo vs 약물의 차등 변화 (differential change) 가 임상적 핵심 질문.
  4. 결측 (attrition): 표 9.1 에서 보이듯 시간이 갈수록 표본 크기가 감소 — 종단 분석의 현실적 어려움 시연.
  5. 불균등 시점: 일부 환자가 추가 시점에 측정 — 균등 격자 가정을 깨는 데이터.

→ Mixed-effects 모형의 강점 (불균등 시점·결측 처리) 을 시연하기 좋은 sample.

2.2 표본 Attrition — 표 9.1

표 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
직관 — Attrition 이 분석에 시사하는 것

표 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

표 9.2 — 4 주요 시점의 비율·Odds·Log-odds
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
직관 — 표 9.2 의 임상적 메시지

세 가지 표현 (비율, 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) 의 동기

Logit 의 시간 곡선

원 척도 (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).
직관 — 왜 sqrt 변환이 통하는가

logit 의 시간 곡선이 “초기 급격 + 후기 완만” 이라는 패턴은 임상에서 흔하다:

  • 약효가 빠르게 나타난 후 안정화 (saturation).
  • 측정 도구의 ceiling effect (모두 max 점수에서 출발해 빠르게 풀림).
  • 환자의 자연 회복이 초기에 집중.

이런 곡선은 concave (오목) 함수 — week → log(week+1), week → sqrt(week), week → 1 - exp(-week) 등이 모형화 가능. sqrt 가 가장 단순하고 데이터에 잘 맞으면 선택.

대안적 접근:

  1. 다항식 (quadratic, cubic): \(\beta_1 \cdot t + \beta_2 \cdot t^2\). 더 유연하나 모수가 늘어남 (parsimony 손실).
  2. Splines: 더 유연. 이항 데이터에서는 추정 어려움.
  3. 시간 변환 + 단일 항: \(\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 모형 정의

Baseline 모형

\[ \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 의 추가적 시간 변화 속도 차이.

같은 환자의 반복 측정이 독립 으로 가정 (랜덤 효과 없음).

왜 이 모형이 적절하지 않은가

핵심 문제: 종단 데이터에서 같은 환자의 시점 사이에 양의 상관이 존재한다 — 어떤 환자는 일관되게 더 심하고, 어떤 환자는 일관되게 덜 심함. 이 환자별 이질성을 무시하면:

  1. 표준오차 과소 추정: 독립 가정이 정보량을 부풀려 평가. SE 가 실제보다 작게 나옴.
  2. Type I error 증가: p-value 가 부풀려져 실제는 비유의한 효과가 유의로 보임.
  3. 신뢰구간 좁음: 95 % CI 가 실제 95 % 커버리지를 못 가짐.

그럼에도 불구하고 baseline 으로 제시하는 이유:

  • 비교 기준: § 9.7.2-9.7.3 의 mixed-effects 결과와 비교해 “모형 변경이 어떤 차이를 만드는가” 를 학습.
  • 모수 해석의 출발점: 회귀 계수 자체의 부호·대략적 크기는 mixed-effects 와 비슷하게 나옴 (식 9.16 의 척도 보정 후).
  • 실수의 시연: “단순 logistic 으로도 결과가 나오니 그것으로 충분” 이라는 잘못된 결론을 피하기 위함.

3.2 추정 결과 — 표 9.3

표 9.3 — Fixed-Effects Logistic Regression 결과 (N = 437)
모수 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)

식 (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 와 차이가 없다” 는 결론이 도출될 수 있음. 그러나 이 결론은 위험.

비판적 평가:

  1. 표준오차 신뢰성: 같은 환자의 시점이 독립이라는 가정이 깨졌으므로 SE 가 부정확. 진짜 SE 는 더 클 수 있고 (덜 유의), 더 작을 수도 있다 (더 유의).
  2. 임상적 효과 크기: \(\beta_3 = -0.42\) 는 결코 작지 않은 효과 (sqrt(week) 1 단위당 logit 차이). p = .11 은 “유의하지는 않지만 효과 크기는 임상적으로 의미 있음”. 표본이 더 컸으면 유의했을 가능성.
  3. 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 관련 주제

선행 지식

후속 주제

  • § 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 변환의 대안

Subscribe

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