Some Applications Involving Binary Data

두 이항 확률 비교 · 여러 2x2 표 결합 · Ille-et-Vilaine 식도암 연구 (McCullagh §7.4)

조건부 우도 이론을 이항 자료에 적용한다. 단일 2x2 표에서 프로파일 이탈도와 조건부 이탈도를 비교하고, 여러 층화 표를 Mantel-Haenszel 검정으로 결합한 뒤, Ille-et-Vilaine 식도암 사례-대조 연구로 실전 적용을 시연한다.

Statistics
GLM
Experimentation
Epidemiology
저자

Kwangmin Kim

공개

2026년 04월 18일

1 이 장의 위치

Ch.7 조건부 우도(conditional likelihood) 이론의 핵심 응용이다. §7.2에서 장해 모수(nuisance parameter)를 소거하는 일반 원리를 세웠고, §7.3에서 그 도구인 초기하분포를 정리했다. 이제 §7.4에서는 이항 자료(binary data)라는 가장 빈번한 실전 무대에 그 도구를 배치한다.

핵심 질문은 하나다: “처치군과 대조군의 성공 확률이 다른가?” 이 질문에 답하는 세 가지 시나리오를 다룬다.

시나리오 핵심 도구
§7.4.1 단일 \(2 \times 2\) 프로파일 이탈도 vs 조건부 이탈도
§7.4.2 여러 \(2 \times 2\) 표 결합 Mantel-Haenszel 검정
§7.4.3 Ille-et-Vilaine 식도암 층화 조건부 로그선형 회귀

2 두 이항 확률의 비교 (§7.4.1)

2.1 설정과 자료

임상시험에서 처치군(treatment)과 대조군(control) 각각에 대해 성공/실패를 관측했다고 하자. McCullagh는 의도적으로 아주 작은 표본을 사용한다 — 이 규모에서 무조건부 MLE와 조건부 MLE의 차이가 극명하게 드러나기 때문이다.

Table 7.1 — 임상시험 가상 자료
성공 실패 합계
Treatment \(Y_1 = 2\) 1 \(m_1 = 3\)
Control \(Y_2 = 1\) 3 \(m_2 = 4\)
합계 \(Y_\bullet = 3\) 4 \(m_\bullet = 7\)

직관: 처치군 3명 중 2명이 성공(67%), 대조군 4명 중 1명이 성공(25%). 표면적으로 처치군이 나아 보이지만, 표본이 극도로 작아 이 차이를 얼마나 신뢰할 수 있는지가 문제다.

2.2 로짓 모수화

두 성공 확률 \(\pi_1, \pi_2\) 를 로짓 척도로 재모수화한다:

\[ \operatorname{logit} \pi_1 = \lambda + \Delta, \qquad \operatorname{logit} \pi_2 = \lambda. \]

  • \(\lambda\): 기저(baseline) 로그 오즈 — 대조군의 성공 로그 오즈
  • \(\Delta\): 로그 오즈비(log odds ratio) — 처치 효과

직관: 왜 확률 차이 \(\pi_1 - \pi_2\) 가 아니라 로그 오즈비 \(\Delta\) 를 사용하는가? 확률 차이는 기저 성공률에 따라 같은 처치 효과도 다른 값을 가진다(대조군 성공률이 10%일 때 20%p 개선과 80%일 때 20%p 개선은 질적으로 다르다). 로그 오즈비는 기저율에 상대적으로 안정적이며, 이것이 바로 다중 센터 결합(§7.4.2)의 전제가 된다.

2.3 무조건부 접근: 프로파일 이탈도

Ch.4의 표준 이항 GLM 적합 방법으로 \((\lambda, \Delta)\) 를 동시에 추정한다. MLE는 교차비(cross-ratio)로 직접 계산된다:

\[ \hat{\Delta} = \log\!\left(\frac{2 \times 3}{1 \times 1}\right) = \log 6 = 1.792. \]

대표본 분산은 네 칸 역수의 합이다:

\[ \operatorname{var}(\hat{\Delta}) = \frac{1}{2} + \frac{1}{1} + \frac{1}{1} + \frac{1}{3} = \frac{17}{6} \approx 2.833, \]

\[ \operatorname{s.e.}(\hat{\Delta}) \approx 1.683. \]

직관: 칸 도수의 역수 합이 분산이 되는 이유는 로그 오즈비가 네 칸의 로그 도수의 선형결합이고, 포아송 근사에서 각 칸 분산이 기댓값의 역수이기 때문이다. 칸 도수가 1인 곳이 있으면 분산이 폭발적으로 커진다 — Table 7.1이 정확히 그런 경우이다.

더 정확한 구간을 위해 프로파일 이탈도(profile deviance)를 사용한다:

\[ D(y;\Delta) = 2\,l(\hat{\Delta}, \hat{\lambda}) - 2\,l(\Delta, \hat{\lambda}_\Delta), \]

여기서 \(\hat{\lambda}_\Delta\)\(\Delta\) 를 고정했을 때 \(\lambda\) 의 MLE이다.

직관 — 프로파일 이탈도가 측정하는 것. \(\hat\lambda_\Delta\) 는 “주어진 \(\Delta\) 에서 최선의 \(\lambda\)” 이므로, \(l(\Delta, \hat\lambda_\Delta)\)\(\Delta\) 를 그 값으로 강제했을 때 도달할 수 있는 최대 우도 다. 이를 전역 최대 \(l(\hat\Delta, \hat\lambda)\) 와 비교한 2배가 \(D(y; \Delta)\) — 즉 “\(\Delta\) 를 이 값으로 고정하면 우도가 얼마나 손상되는가” 의 측정량이다. 값이 0 에 가까우면 \(\Delta\) 가 데이터와 잘 맞고, 커질수록 어긋난다. 우도비 검정의 기본 원리와 같으므로 귀무가설 하에서 점근적으로 \(\chi^2_1\) 을 따른다. 명목 90% 대표본 신뢰구간은

\[ \{\Delta : D(y;\Delta) < 2.71\} = (-0.80,\; 4.95). \]

이 구간의 폭이 5.75로 매우 넓다 — 데이터가 7명뿐이므로 당연하다.

2.4 조건부 접근: 초기하 우도

\(\lambda\) 를 추정하는 대신 충분통계량 \(Y_\bullet = 3\) 으로 조건부를 취해 장해 모수 \(\lambda\) 를 소거한다. §7.3에서 보았듯이 \(Y_1 | Y_\bullet \sim H(m, y_\bullet;\, \psi)\) 이고 \(\psi = e^\Delta\) 이다. 조건부 로그우도는

\[ l_c(\Delta) = y_1 \Delta - \log P_0(e^\Delta), \]

여기서 \(P_0(\psi)\) 는 §7.3의 정규화 다항식이다. Table 7.1의 경우 \(Y_1\) 의 가능한 값은 \(\max(0, 3-4) = 0\) 부터 \(\min(3, 3) = 3\) 까지이므로

\[ P_0(\psi) = \binom{3}{0}\binom{4}{3}\psi^0 + \binom{3}{1}\binom{4}{2}\psi^1 + \binom{3}{2}\binom{4}{1}\psi^2 + \binom{3}{3}\binom{4}{0}\psi^3 = 4 + 18\psi + 12\psi^2 + \psi^3. \]

직관 — P_0(psi)의 의미

\(P_0(\psi)\) 의 각 항은 “\(Y_1 = t\) 인 경우의 수 \(\times\) 가중치 \(\psi^t\)”이다. \(\psi = 1\)(처치 효과 없음)이면 순수 조합론적 가중치만 남아 중심 초기하분포가 되고, \(\psi > 1\) 이면 큰 \(t\) 에 더 많은 가중치가 실려 분포가 오른쪽으로 기울어진다.

조건부 MLE는 지수족의 표준 조건을 만족한다:

\[ y_1 = \frac{e^{\hat{\Delta}_c}\, P_0'(e^{\hat{\Delta}_c})}{P_0(e^{\hat{\Delta}_c})} = E(Y_1 \mid Y_\bullet;\, \hat{\Delta}_c). \]

수치 해를 구하면

\[ \hat{\Delta}_c = 1.493, \qquad \operatorname{s.e.}(\hat{\Delta}_c) \approx 1.492. \]

표준오차는 초기하 분산의 역수로 계산된다:

\[ \operatorname{var}(\hat{\Delta}_c) \approx \frac{1}{\operatorname{var}(Y_1;\, \hat{\Delta}_c)} = \frac{1}{0.4495}. \]

2.5 프로파일 이탈도 vs 조건부 이탈도

두 접근법의 차이를 정리한다.

항목 무조건부 (프로파일) 조건부 (초기하)
모수 수 2: \((\lambda, \Delta)\) 1: \(\Delta\)
MLE \(\hat{\Delta} = 1.792\) \(\hat{\Delta}_c = 1.493\)
s.e. 1.683 1.492
이탈도 함수 \(D(y;\Delta)\) \(2l_c(\hat{\Delta}_c) - 2l_c(\Delta)\)

일반적으로 \(|\hat{\Delta}_c| \leq |\hat{\Delta}|\) 이며, 등호는 \(\Delta = 0\) 에서만 성립한다. 즉 조건부 MLE는 원점 쪽으로 수축(shrinkage toward zero)한다.

직관: 무조건부 MLE는 \(\lambda\)\(\Delta\) 를 동시에 최적화하므로 표본 변동에 과적합(overfit)되는 경향이 있다. 조건부 추정은 \(Y_\bullet\) 을 고정하여 정보 일부를 “사용하지 않으므로” 과적합이 줄어든다. 표본이 작을수록 이 수축 효과가 두드러진다.

프로파일 이탈도와 조건부 이탈도를 같은 축에 그리면 \(\Delta\) 가 클 때 두 곡선이 현저히 갈라진다. 프로파일 이탈도는 더 넓은 신뢰구간을 주고, 조건부 이탈도는 더 보수적(좁은)이다.

3 여러 \(2 \times 2\) 표의 결합 (§7.4.2)

3.1 다중 센터 임상시험의 모형

실전에서는 하나의 \(2 \times 2\) 표가 아니라 \(n\) 개 센터(층)에서 동시에 자료를 수집한다. 센터 \(i\) 에서의 성공 확률을

\[ \operatorname{logit} \pi_{1i} = \lambda_i + \Delta, \qquad \operatorname{logit} \pi_{2i} = \lambda_i, \qquad i = 1, \ldots, n \]

으로 모형화한다.

핵심 가정: 로그 오즈비 \(\Delta\) 는 모든 센터에서 동일하지만, 기저 성공률 \(\lambda_i\) 는 센터마다 다를 수 있다. 이는 센터 간 환자 특성, 의료 환경, 지역 차이를 허용하면서도 처치 효과의 방향과 크기는 일관되다고 보는 것이다.

3.2 Neyman-Scott 문제의 재등장

이 모형에는 \(n + 1\) 개의 모수 \((\lambda_1, \ldots, \lambda_n, \Delta)\) 가 있고, 관측값은 \(2n\) 개(각 센터에서 이항 비율 2개)이다. 센터 수 \(n\) 이 증가하면 모수도 함께 증가하므로 Neyman-Scott 문제(§7.2.2)가 발생한다: 무조건부 MLE의 일치성이 보장되지 않는다.

직관: 센터당 소수의 환자만 있으면 각 \(\hat{\lambda}_i\) 의 추정 오차가 크고, 그 오차가 \(\hat{\Delta}\) 의 추정에 누적된다. 센터 수가 아무리 많아도 각 \(\hat{\lambda}_i\) 는 나아지지 않으므로 \(\hat{\Delta}\) 도 일치추정량이 되지 못한다. 이것이 조건부 우도를 사용해야 하는 근본 이유이다.

3.3 조건부 우도의 구성

각 센터 \(i\) 에서 성공 합계 \(Y_{\cdot i}\) 로 조건부를 취하면

\[ Y_{1i} \mid Y_{\cdot i} \sim H(m_i, y_{\cdot i};\, \psi), \qquad \psi = e^\Delta. \]

센터 간 독립이므로 조건부 로그우도는 합으로 분해된다:

\[ l_c(\Delta) = \sum_{i=1}^{n} \bigl\{y_{1i}\,\Delta - \log P_0(e^\Delta;\, m_{1i}, m_{2i}, y_{\cdot i})\bigr\}. \]

여기서 \(P_0(\cdot;\, m_{1i}, m_{2i}, y_{\cdot i})\) 는 센터 \(i\) 의 주변 합계에 따라 결정되는 정규화 다항식이다.

직관: \(n\) 개의 장해 모수 \(\lambda_1, \ldots, \lambda_n\) 이 모두 사라지고 관심 모수 \(\Delta\) 하나만 남았다. 각 센터가 독립적으로 “표본 크기는 작지만 치우치지 않은” \(\Delta\) 정보를 제공하고, 그것들을 합산하면 전체적으로 충분한 Fisher 정보가 확보된다.

3.4 Mantel-Haenszel 검정

\(H_0: \Delta = 0\)(처치 효과 없음)의 검정에서 조건부 우도의 스코어 통계량을 사용한다.

스코어는 \(\Delta = 0\) 에서의 1차 미분이다:

\[ U = \left.\frac{\partial l_c}{\partial \Delta}\right|_{\Delta = 0} = \sum_{i=1}^{n}\bigl\{Y_{1i} - E(Y_{1i})\bigr\} = \sum_{i=1}^{n}\left\{Y_{1i} - \frac{m_{1i}\, y_{\cdot i}}{m_{\cdot i}}\right\}. \]

직관: \(m_{1i}\, y_{\cdot i} / m_{\cdot i}\) 는 “\(\Delta = 0\) 일 때 처치군에서 기대되는 성공 수”이다. 관측값이 이 기댓값보다 일관되게 크면 \(U > 0\) 이고 처치 효과가 양(+)임을 시사한다.

\(U\) 의 정확한 귀무 분산은 초기하 분산의 합이다:

\[ \operatorname{var}(U) = \sum_{i=1}^{n} \frac{m_{1i}\, m_{2i}\, y_{\cdot i}\,(m_{\cdot i} - y_{\cdot i})}{m_{\cdot i}^2\,(m_{\cdot i} - 1)}. \]

연속성 보정(continuity correction)을 적용한 검정 통계량은

\[ Z^{-} = \frac{U - \tfrac{1}{2}}{\sigma_U}, \qquad \sigma_U = \sqrt{\operatorname{var}(U)}, \]

이고 근사적으로 \(Z^{-} \sim N(0, 1)\) 이다. 단측 유의수준은 \(1 - \Phi(Z^{-})\) 이다.

Mantel-Haenszel 검정의 특성
  • 비모수적 느낌: 각 층의 기저율 \(\lambda_i\) 를 추정하지 않으므로 모형 의존성이 낮다.
  • 효율성: \(\Delta\) 가 0에 가까울 때 스코어 검정은 우도비 검정과 동일한 1차 효율을 가진다.
  • 한계: \(\Delta\) 의 점추정이나 신뢰구간을 직접 주지는 않는다. 추정을 원하면 조건부 MLE \(\hat{\Delta}_c\) 를 사용한다. 별도로, Mantel-Haenszel 추정량(Exercise 9.10)은 조건부 MLE와 다른 가중 방식을 사용하며, 일반적으로 둘 다 일치추정량이지만 효율에 미세한 차이가 있다.

4 예제: Ille-et-Vilaine 식도암 연구 (§7.4.3)

4.1 자료 배경

Ille-et-Vilaine(프랑스 브르타뉴 지방)에서 수행된 후향적 사례-대조 연구(retrospective case-control study)이다. 관심 변수는 알코올 섭취량(고/저)이 식도암(oesophageal cancer) 발생에 미치는 영향이며, 연령으로 층화(stratify)한다.

Table 7.2 — Ille-et-Vilaine 식도암 자료
연령 암(80+) 암(80-) 비암(80+) 비암(80-) \(\tilde{\psi}_c\) \(\hat{\mu}_{11}\) 잔차
25-34 1 0 9 106 \(\infty\) 0.33 1.42
35-44 4 5 26 164 4.98 4.11 -0.07
45-54 25 21 29 138 5.61 24.49 0.18
55-64 42 34 27 139 6.30 40.09 0.59
65-74 19 36 18 88 2.56 23.74 -1.89
75+ 5 8 0 31 \(\infty\) 3.24 1.75
합계 96 104 109 666 96.01 \(X^2 = 9.04\)
  • “80+”/“80-”는 알코올 80g/day 이상/미만
  • \(\tilde{\psi}_c\): 연령층별 조건부 오즈비 추정
  • \(\hat{\mu}_{11}\), 잔차: 모형 (ii) 하의 적합값과 Pearson 잔차

직관: 후향적 연구에서는 사례(암 환자)와 대조(비-암)의 수가 연구 설계에 의해 고정된다. 따라서 질병 발생률을 직접 추정할 수 없지만, §4.4.3에서 논의한 바와 같이 오즈비는 전향적 연구와 동일하게 추정된다. 조건부 분석은 양쪽 주변 합계를 모두 고정하므로 후향적 설계와 자연스럽게 호환된다.

4.2 연령 층화의 필요성

암 발생률은 일반적으로 연령에 따라 증가한다. 이 연구에서도 사례군이 대조군보다 평균 연령이 높다. 연령을 무시하면 알코올 효과가 교란(confounding)된다 — 고연령 \(\to\) 높은 암 발생 \(\to\) (우연히) 높은 알코올 섭취로 이어지는 경로가 알코올의 진정한 효과를 부풀릴 수 있다.

연령 층화는 이 교란을 제거한다: 같은 연령대 안에서 고알코올군과 저알코올군의 암 발생을 비교하면 연령 효과가 상쇄된다.

4.3 세 가지 모형

연령 층 \(i = 1, \ldots, 6\) 에서의 오즈비 \(\psi_i\) 에 대해 세 가지 모형을 고려한다:

\[ \text{(i)}\quad \log \psi_i = 0, \qquad \text{(ii)}\quad \log \psi_i = \beta_0, \qquad \text{(iii)}\quad \log \psi_i = \beta_0 + \beta_1(i - 3.5). \]

  • 모형 (i): \(\psi_i = 1\) 전체, 알코올 효과 없음
  • 모형 (ii): 모든 연령층에서 동일한 오즈비 \(e^{\beta_0}\)
  • 모형 (iii): 오즈비가 연령에 따라 선형적으로 변화

직관: \((i - 3.5)\) 중심화는 연령 층 1~6의 중앙(3.5)을 기준으로 삼아 \(\beta_0\) 가 “평균적 연령에서의 로그 오즈비”로 해석되도록 한다.

4.4 이탈도와 모형 선택

세 모형의 잔차 이탈도(conditional deviance)를 비교한다:

모형 이탈도 자유도
(i) \(\log \psi_i = 0\) 89.83 6
(ii) \(\log \psi_i = \beta_0\) 10.73 5
(iii) \(\log \psi_i = \beta_0 + \beta_1(i - 3.5)\) 10.29 4

해석:

  • (i) \(\to\) (ii): 이탈도 감소 \(89.83 - 10.73 = 79.10\) (자유도 1). \(\chi^2_1\) 의 99.9% 임계값이 10.83이므로 알코올 효과는 압도적으로 유의하다.
  • (ii) \(\to\) (iii): 이탈도 감소 \(10.73 - 10.29 = 0.44\) (자유도 1). 전혀 유의하지 않다. 오즈비의 연령 경향은 없다.
  • 모형 (ii)의 적합도: 이탈도 10.73 (자유도 5). \(\chi^2_5\) 의 5% 임계값 11.07과 비교하면 경계선이지만, 통계적으로 유의한 부적합은 아니다.

따라서 모형 (ii)가 선택된다: 로그 오즈비는 연령과 무관하게 상수이다.

4.5 모형 (ii)의 추정 결과

조건부 MLE:

\[ \hat{\beta}_0 = 1.658, \qquad \operatorname{s.e.}(\hat{\beta}_0) \approx 0.189. \]

오즈비로 변환하면

\[ \hat{\psi} = e^{1.658} = 5.251. \]

해석: 고알코올군의 식도암 오즈가 저알코올군에 비해 약 5.25배 높다. 이 효과는 모든 연령층에 동일하게 적용된다.

근사 95% 신뢰구간:

\[ \exp(1.658 \pm 1.96 \times 0.189) = \exp(1.288,\; 2.028) = (3.624,\; 7.602). \]

이탈도 그래프(Fig. 7.2)에서 얻은 구간 \((3.636,\; 7.622)\) 와 거의 동일하다. 이는 로그 척도에서의 정규 근사가 매우 정확함을 확인해 준다.

직관 — 왜 로그 척도가 더 정확한가

오즈비 \(\psi > 0\) 는 양수 제약이 있어 분포가 비대칭(오른쪽 꼬리)이다. \(\log \psi\) 는 실수 전체에서 정의되므로 정규 근사가 훨씬 잘 맞는다. 이는 포아송 평균에 로그 변환, 이항 비율에 로짓 변환을 사용하는 것과 같은 원리이다.

4.6 적합값과 잔차

Table 7.2의 마지막 두 열은 모형 (ii) 하의 적합값 \(\hat{\mu}_{11}\)(고알코올-암 칸의 기댓값)과 Pearson 잔차이다. 잔차는

\[ r_i = \frac{y_{11,i} - \hat{\mu}_{11,i}}{\sqrt{V(\hat{\mu}_{11,i})}} \]

으로 계산된다. \(V(\hat{\mu}_{11,i})\) 는 조건부 초기하 분산이다. Pearson \(X^2 = \sum r_i^2 = 9.04\) (자유도 5)는 이탈도 10.73과 유사하며, 오즈비 상수성에서의 체계적 이탈을 시사하지 않는다.

65-74세 층의 잔차 \(-1.89\) 이 가장 크다. 이 연령층에서 조건부 오즈비가 \(\tilde{\psi}_c = 2.56\) 으로 다른 층(4.98~6.30)보다 낮다. 하지만 개별 잔차의 유의성을 판단할 때는 다중비교를 고려해야 하므로, 이 정도의 변동은 우연으로 충분히 설명 가능하다.

4.7 모형 (iii)과 무조건부 분석과의 비교

모형 (iii)의 추정값:

\[ \hat{\beta}_0 = 1.7026 \quad (\operatorname{s.e.} \approx 0.2000), \qquad \hat{\beta}_1 = -0.1255 \quad (\operatorname{s.e.} \approx 0.1879). \]

\(\hat{\beta}_1\) 이 표준오차에 비해 매우 작으므로 연령에 따른 오즈비 경향은 없다는 결론을 재확인한다.

무조건부 분석(각 행을 독립 이항으로 적합)의 결과:

항목 조건부 무조건부
모형 (ii) 이탈도 10.73 11.04
\(\hat{\beta}_0\) 1.658 1.670
s.e. 0.189 0.190

차이가 미미하다. 이 자료에서는 각 층의 표본이 상당히 크므로 조건부와 무조건부의 괴리가 작다. 그러나 원칙적으로 조건부 분석이 올바른 방법이며, 표본이 작은 센터가 섞여 있을 때는 차이가 현저해진다 — §7.4.1의 Table 7.1이 그 극단적 예시였다.

5 Python 구현

5.1 순수 구현: 조건부 우도와 Mantel-Haenszel 검정

코드
import numpy as np
from math import comb, log, exp, sqrt
from scipy.optimize import minimize_scalar
from scipy.stats import norm

# ── §7.4.1: 단일 2x2 표 ──────────────────────────
m1, m2, y_dot = 3, 4, 3
y1_obs = 2

def log_P0(psi, m1, m2, s):
    """비중심 초기하 정규화 다항식의 로그값"""
    lo = max(0, s - m2)
    hi = min(m1, s)
    terms = []
    for t in range(lo, hi + 1):
        log_term = (np.log(comb(m1, t)) + np.log(comb(m2, s - t))
                    + t * np.log(psi))
        terms.append(log_term)
    max_term = max(terms)
    return max_term + np.log(sum(np.exp(t - max_term) for t in terms))

def neg_cond_loglik(delta, y1, m1, m2, s):
    """조건부 로그우도의 음수"""
    psi = exp(delta)
    return -(y1 * delta - log_P0(psi, m1, m2, s))

# 조건부 MLE
res = minimize_scalar(neg_cond_loglik, bounds=(-5, 5), method='bounded',
                      args=(y1_obs, m1, m2, y_dot))
delta_c = res.x

# 조건부 분산 (초기하 분산의 역수)
def hyper_var(delta, m1, m2, s):
    psi = exp(delta)
    lo, hi = max(0, s - m2), min(m1, s)
    lp0 = log_P0(psi, m1, m2, s)
    probs = []
    for t in range(lo, hi + 1):
        log_p = (np.log(comb(m1, t)) + np.log(comb(m2, s - t))
                 + t * np.log(psi) - lp0)
        probs.append((t, exp(log_p)))
    mu = sum(t * p for t, p in probs)
    var = sum(t**2 * p for t, p in probs) - mu**2
    return var

var_y1 = hyper_var(delta_c, m1, m2, y_dot)
se_delta_c = 1.0 / sqrt(var_y1)

print(f"조건부 MLE:  Δ̂_c = {delta_c:.3f},  s.e. = {se_delta_c:.3f}")
print(f"무조건부 MLE: Δ̂   = {log(6):.3f},  s.e. = {sqrt(17/6):.3f}")

# ── §7.4.2: Mantel-Haenszel 검정 ──────────────────
# Ille-et-Vilaine 자료 (Table 7.2)
data = [
    # (y11, y12, y21, y22) = (암-고알코올, 암-저알코올, 비암-고알코올, 비암-저알코올)
    (1, 0, 9, 106),     # 25-34
    (4, 5, 26, 164),    # 35-44
    (25, 21, 29, 138),  # 45-54
    (42, 34, 27, 139),  # 55-64
    (19, 36, 18, 88),   # 65-74
    (5, 8, 0, 31),      # 75+
]

U = 0.0
var_U = 0.0

for y11, y12, y21, y22 in data:
    m1i = y11 + y21       # 고알코올 합계
    m2i = y12 + y22       # 저알코올 합계
    y_dot_i = y11 + y12   # 암 합계
    m_dot_i = m1i + m2i   # 전체

    E_y1i = m1i * y_dot_i / m_dot_i
    U += y11 - E_y1i

    if m_dot_i > 1:
        v = (m1i * m2i * y_dot_i * (m_dot_i - y_dot_i)
             / (m_dot_i**2 * (m_dot_i - 1)))
        var_U += v

sigma_U = sqrt(var_U)
Z_minus = (U - 0.5) / sigma_U
p_value = 1 - norm.cdf(Z_minus)

print(f"\nMantel-Haenszel 검정:")
print(f"  U = {U:.3f},  σ_U = {sigma_U:.3f}")
print(f"  Z⁻ = {Z_minus:.3f},  p-value = {p_value:.6f}")

5.2 scipy/statsmodels 활용

코드
import numpy as np
from scipy.stats import fisher_exact
import statsmodels.api as sm

# ── §7.4.1: Fisher 정확검정 (단일 2x2) ─────────────
table_71 = np.array([[2, 1], [1, 3]])
odds_ratio, p_fisher = fisher_exact(table_71, alternative='two-sided')
print(f"Fisher 정확검정: OR = {odds_ratio:.3f}, p = {p_fisher:.4f}")

# ── §7.4.3: 층화 Cochran-Mantel-Haenszel ───────────
# statsmodels의 StratifiedTable 사용
tables = [
    np.array([[1, 0], [9, 106]]),    # 25-34
    np.array([[4, 5], [26, 164]]),   # 35-44
    np.array([[25, 21], [29, 138]]), # 45-54
    np.array([[42, 34], [27, 139]]), # 55-64
    np.array([[19, 36], [18, 88]]),  # 65-74
    np.array([[5, 8], [0, 31]]),     # 75+
]

stacked = np.array(tables)  # shape (6, 2, 2)
st = sm.stats.StratifiedTable(stacked)

print(f"\nCMH 검정 통계량: {st.test_null_odds().statistic:.3f}")
print(f"CMH p-value:     {st.test_null_odds().pvalue:.6f}")
print(f"공통 오즈비 (MH): {st.oddsratio_pooled():.3f}")
print(f"공통 오즈비 (로그): {np.log(st.oddsratio_pooled()):.3f}")

6 R 구현

코드
# ── §7.4.1: 단일 2x2 표 ──────────────────────────
table_71 <- matrix(c(2, 1, 1, 3), nrow = 2, byrow = TRUE,
                   dimnames = list(c("Treatment", "Control"),
                                   c("Success", "Failure")))
fisher.test(table_71)

# ── §7.4.3: Ille-et-Vilaine 층화 분석 ─────────────
# 6개 연령층의 2x2 표 (행: 암/비암, 열: 고알코올/저알코올)
iev <- array(
  c(1, 9, 0, 106,     # 25-34
    4, 26, 5, 164,     # 35-44
    25, 29, 21, 138,   # 45-54
    42, 27, 34, 139,   # 55-64
    19, 18, 36, 88,    # 65-74
    5, 0, 8, 31),      # 75+
  dim = c(2, 2, 6),
  dimnames = list(
    Status = c("Cancer", "NoCancer"),
    Alcohol = c("High", "Low"),
    Age = c("25-34", "35-44", "45-54", "55-64", "65-74", "75+")
  )
)

# Cochran-Mantel-Haenszel 검정
mantelhaen.test(iev, correct = TRUE)

# 조건부 로지스틱 회귀 (survival::clogit)
library(survival)

# 자료를 장형(long format)으로 변환
dat <- do.call(rbind, lapply(1:6, function(i) {
  tab <- iev[, , i]
  data.frame(
    cancer = rep(c(1, 0), each = 2),
    alcohol = rep(c(1, 0), times = 2),
    count = as.vector(t(tab)),
    stratum = i
  )
}))

# 가중 조건부 로지스틱 회귀
fit <- clogit(cancer ~ alcohol + strata(stratum),
              weights = count, data = dat, method = "exact")
summary(fit)

7 핵심 요약

조건부 우도의 이항 자료 3대 응용

  • 단일 \(2 \times 2\): 장해 모수 \(\lambda\)\(Y_\bullet\) 으로 조건부 소거. 소표본에서 무조건부 MLE는 원점에서 멀어지는 편향이 있고, 조건부 MLE는 수축하여 이를 교정한다.
  • 다중 \(2 \times 2\): Neyman-Scott 문제를 조건부 우도로 회피. 스코어 통계량이 Mantel-Haenszel 검정이 된다.
  • Ille-et-Vilaine 식도암: 6개 연령층에서 동일 오즈비 모형이 적합하며, 고알코올군의 식도암 오즈는 약 5.25배 (\(95\%\) CI: 3.62~7.60)로 추정된다.

8 관련 주제

선행 지식

후속 주제

관련 개념

Subscribe

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