비율의 대응 구간 (McNemar)¶
개요¶
같은 피험자를 두 조건에서 측정하면 — 처리 전후처럼 — 그 결과인 이진 결과들은 종속이다. 표준적인 두 비율 신뢰구간은 집단 간 독립성을 가정하므로 대응 자료에는 타당하지 않다. McNemar 방식은 조건 사이에서 결과가 바뀐 피험자, 즉 불일치 짝만이 비율 차이에 관한 정보를 담고 있음을 인식하여 이 문제를 해결한다. 이 절에서는 대응 비율 차이에 대한 McNemar 신뢰구간을 전개한다.
일치–불일치 표¶
\(n\)명의 피험자를 각각 두 조건에서 관측하여 피험자 \(i\)마다 이진 결과의 쌍 \((Y_{i1}, Y_{i2})\)을 얻는다고 하자. \(n\)개의 쌍을 네 칸으로 분류한다:
| 조건 2: 성공 | 조건 2: 실패 | |
|---|---|---|
| 조건 1: 성공 | \(a\) | \(b\) |
| 조건 1: 실패 | \(c\) | \(d\) |
여기서 \(a + b + c + d = n\)이다. 칸 \(a\)와 \(d\)는 결과가 바뀌지 않은 일치 짝이고, 칸 \(b\)와 \(c\)는 조건 사이에서 결과가 다른 불일치 짝이다.
각 조건에서 성공의 주변비율은
이므로 주변비율의 차이는 불일치 개수에만 의존한다:
이것이 핵심 통찰이다: 일치 짝(\(a\)와 \(d\))은 상쇄된다. 두 조건 모두에서 성공하거나 모두에서 실패한 피험자는 어느 조건이 더 나은지에 대해 아무것도 말해 주지 않는다. 차이에 관한 모든 정보는 결과가 바뀐 \(b + c\)명에게 있다.
McNemar 신뢰구간¶
모집단 차이 \(p_1 - p_2\)의 신뢰구간을 만들려면 \((b - c)/n\)의 표준오차가 필요하다. \(n\)이 주어졌을 때 불일치 짝의 개수 \(b\)와 \(c\)는 \(b + c = m\)(불일치 짝의 총수)을 만족하며, 귀무가설 \(p_1 = p_2\) 아래에서 \(b \sim \text{Binomial}(m, 1/2)\)이다.
주변비율 차이에 대한 Wald 형태의 표준오차는
이고, \((1 - \alpha)\) 신뢰구간은
여기서 \(z_{\alpha/2}\)는 표준정규분포의 상위 \(\alpha/2\) 분위수이다.
대안적인 표준오차
더 단순하고 흔히 쓰이는 형태는 \(b\)와 \(c\)를 독립인 이항 개수로 취급한다:
위의 Wald 형태보다 구간이 약간 넓어지지만 단순해서 실무에서 흔히 선호된다. 이때 신뢰구간은:
풀이 보기¶
한 제약회사가 새 알레르기 약을 환자 \(n = 200\)명에게 시험한다. 각 환자의 증상 완화 여부를 치료 전후로 평가했다. 결과는 다음과 같다:
| 치료 후: 완화 | 치료 후: 미완화 | |
|---|---|---|
| 치료 전: 완화 | \(a = 20\) | \(b = 50\) |
| 치료 전: 미완화 | \(c = 30\) | \(d = 100\) |
1단계. 비율의 차이를 계산한다:
완화된 비율이 치료 전에 10 퍼센트포인트 더 높았다(즉 \(\hat{p}_{\text{before}} = 70/200 = 0.35\) 대 \(\hat{p}_{\text{after}} = 50/200 = 0.25\)).
2단계. 표준오차를 계산한다:
3단계. 95% 신뢰구간을 구성한다(\(z_{0.025} = 1.96\)):
구간이 0을 포함하지 않으므로 95% 수준에서 두 조건의 주변비율이 다르다는 증거가 있다.
결과의 해석
신뢰구간 \((0.014, 0.187)\)은 모비율의 참 차이(치료 전 빼기 치료 후)가 1.4%와 18.7% 사이에 있다고 95% 신뢰한다는 뜻이다. 치료 후 완화율이 통계적으로 유의하게, 그러나 크기는 크지 않을 수 있는 정도로 줄었음을 시사한다.

왼쪽 그림은 위 보기의 네 칸이다. 색이 들어간 두 칸 \(b = 50\)과 \(c = 30\)만 계산에 쓰이고, 회색 두 칸 \(a = 20\)과 \(d = 100\)은 식 어디에도 나타나지 않는다. 환자 200명 중 120명이 통째로 빠진다는 뜻이다. 처음 보면 정보를 버리는 것 같지만 그렇지 않다. 치료 전후 모두 완화된 환자는 "치료 전이 더 나았는가"라는 질문에 아무 답도 하지 않는다. 답을 아는 사람은 상태가 바뀐 80명뿐이고, 그중 50명은 나빠진 쪽, 30명은 좋아진 쪽이다.
오른쪽 그림은 그래서 무엇이 달라지는지 보여 준다. 다섯 줄 모두 \(n = 200\)이고 \(b - c = 20\)이라 점추정값이 \(0.10\)으로 같다. 그런데 불일치 짝의 총수 \(m = b + c\)가 20에서 200까지 커지면 오차한계가 \(\pm 0.0416\)에서 \(\pm 0.1379\)로 3배 넘게 벌어진다. 위쪽 두 줄은 0을 담지 않아 "차이가 있다"고 말할 수 있고, 아래 두 줄은 0을 담아 같은 말을 할 수 없다. 똑같은 10 퍼센트포인트인데 결론이 갈린다.
왜 그런지는 표준오차 식 \(\sqrt{b + c - (b-c)^2/n}\,/\,n\)에서 \(b+c\)가 지배한다는 데 있다. \((20, 0)\)은 상태가 바뀐 20명이 전원 같은 방향으로 바뀐 경우다. 아주 강한 증거다. \((110, 90)\)은 200명이 양방향으로 어지럽게 바뀌었고 그 와중에 한쪽이 20명 많았을 뿐이다. 동전 200번 던져 앞면이 110번 나온 것과 같은 상황이니 증거가 약할 수밖에 없다.
이 그림은 앞서 말한 \(b + c \ge 10\) 기준의 뜻도 분명히 해 준다. McNemar 구간의 실효 표본크기는 \(n\)이 아니라 \(m = b + c\)다. 환자를 아무리 많이 모아도 상태가 바뀌는 사람이 없으면 정밀도는 늘지 않는다. 반대로 말하면, 대응 설계의 정밀도를 높이려면 변화가 잘 일어나는 대상을 고르는 것이 표본을 늘리는 것만큼 중요하다.
가정¶
McNemar 신뢰구간은 다음 조건에 의존한다:
- 대응 설계: 조건 1의 각 관측값이 같은 피험자(또는 짝지은 쌍)에서 얻은 조건 2의 관측값과 대응된다.
- 이진 결과: 각 관측값이 성공 또는 실패로 분류된다.
- 큰 표본: Wald 형태의 신뢰구간에는 불일치 짝이 충분히 많아야 한다. 흔한 지침은 \(b + c \geq 10\)이다. 불일치 개수가 적으면 \(b/(b+c)\)에 대한 정확한 이항 신뢰구간이 낫다.
불일치 개수가 적을 때
\(b + c\)가 작으면(가령 10 미만이면) Wald 신뢰구간의 바탕이 되는 정규근사를 믿을 수 없다. 이런 경우에는 \(b + c\)가 주어졌을 때 \(b\)의 이항분포에 기반한 정확한 신뢰구간을 쓰라.
연습문제¶
연습문제 1. 새 약을 쓰기 전후로 검사한 환자 150명의 연구에서 결과는 다음과 같다: \(a = 60\)(두 번 모두 양성), \(b = 25\)(양성 후 음성), \(c = 15\)(음성 후 양성), \(d = 50\)(두 번 모두 음성). 주변비율 차이 \(p_1 - p_2\)의 95% 신뢰구간을 구성하라.
풀이
점추정값은:
표준오차는:
95% 신뢰구간은:
구간이 0을 포함하므로 95% 수준에서 주변비율이 다르다고 결론지을 충분한 증거가 없다.
연습문제 2. 연습문제 1의 자료에서 대표본 조건(\(b + c \geq 10\))이 만족되는지 확인하라.
풀이
불일치 짝의 개수는 \(b + c = 25 + 15 = 40\)으로 최소 기준 10을 훨씬 넘는다. 따라서 McNemar 신뢰구간의 정규근사가 적절하다.
연습문제 3. McNemar 신뢰구간에 불일치 짝(\(b\)와 \(c\))만 관련되고 일치 짝(\(a\)와 \(d\))은 주변비율 차이에 대해 아무 정보도 주지 않는 이유를 설명하라.
풀이
일치 짝(\(a\)와 \(d\))은 두 조건에서 결과가 같으므로 변화의 증거를 주지 않는다. 두 번 모두 양성이거나 두 번 모두 음성인 피험자는 어느 조건이 더 높은 양성 비율을 내는지 가려내는 데 도움이 되지 않는다.
조건 사이에서 결과가 바뀐 불일치 짝만이 차이에 관한 정보를 담는다. \(b > c\)이면 양성에서 음성으로 바뀐 피험자가 그 반대보다 많다는 뜻이므로 \(p_1 > p_2\)를 시사한다. McNemar 검정과 신뢰구간은 오직 비 \(b/(b+c)\)와 그것이 0.5와 다른지에 집중하여 이를 형식화한다.
연습문제 4. 피험자 \(n = 100\)명의 연구에서 \(b = 3\), \(c = 2\)라면 Wald 형태의 McNemar 신뢰구간을 쓰지 말아야 하는 이유를 설명하라. 어떤 대안을 권하겠는가?
풀이
불일치 짝의 개수가 \(b + c = 3 + 2 = 5\)로, 정규근사에 권장되는 최소 기준 10에 못 미친다. 불일치 짝이 이렇게 적으면 Wald 신뢰구간을 믿을 수 없다 — 개수가 작을 때 이항분포에 대한 정규근사가 나쁘기 때문이다.
권장되는 대안은 확률 \(\pi = P(\text{불일치 짝이 } b \text{ 유형}) = b/(b+c)\)에 대한 정확한 이항 신뢰구간이다. \(H_0\): \(p_1 = p_2\) 아래에서 \(b\) 유형 불일치 짝의 개수는 Binomial\((b+c, 0.5)\)을 따른다. \(\pi\)에 대한 정확한 신뢰구간을 구한 뒤 \(p_1 - p_2\)의 신뢰구간으로 되돌릴 수 있다.
연습문제 5. 불일치 짝만 보면 맥니마 문제는 동전 던지기가 된다. 이를 이용해 정확 검정과 정확 구간을 만들고, 연습문제 1의 자료(\(b=25\), \(c=15\))에 적용하라.
풀이
조건부 논증. 불일치 짝의 총수 \(m=b+c\)를 주어진 것으로 보면, \(H_0\)(주변동질성) 아래에서
다. 일치 짝 \(a\), \(d\)는 이 조건부 분포에 전혀 들어오지 않는다. 따라서 맥니마 문제는 "\(m\)번 던진 동전이 공정한가"로 환원된다.
import numpy as np
from scipy import stats
b, c, n = 25, 15, 150
m = b + c
print(f"정확 이항 양측 p = {2 * stats.binom.cdf(min(b, c), m, 0.5):.4f}")
chi = (b - c)**2 / m
print(f"맥니마 χ² = {chi:.3f} p = {stats.chi2.sf(chi, 1):.4f}")
chi_cc = (abs(b - c) - 1)**2 / m
print(f"연속성 수정 χ² = {chi_cc:.3f} p = {stats.chi2.sf(chi_cc, 1):.4f}")
# π = b/(b+c) 의 클로퍼-피어슨 구간 → 차이의 구간으로 변환
lo = stats.beta.ppf(0.025, b, m - b + 1)
hi = stats.beta.ppf(0.975, b + 1, m - b)
print(f"π = b/(b+c) 구간 ({lo:.4f}, {hi:.4f})")
print(f"p1 - p2 구간 ({(2 * lo - 1) * m / n:.4f}, {(2 * hi - 1) * m / n:.4f})")
정확 이항 양측 p = 0.1539
맥니마 χ² = 2.500 p = 0.1138
연속성 수정 χ² = 2.025 p = 0.1547
π = b/(b+c) 구간 (0.4580, 0.7727)
p1 - p2 구간 (-0.0224, 0.1455)
변환의 근거. \(\pi=P(B\text{쪽}\mid\text{불일치})\)라 두면
이므로 \(\pi\)의 구간에 이 단조변환을 적용하면 된다. 다만 \(m/n\)을 고정으로 취급하는 근사가 들어 있다.
세 \(p\)-값의 관계.
| 방법 | \(p\) | 성격 |
|---|---|---|
| 정확 이항 | 0.1539 | 보장 있음, 보수적 |
| 맥니마 \(\chi^2\) | 0.1138 | 근사, 관대 |
| 연속성 수정 | 0.1547 | 정확값에 가까움 |
연속성 수정이 정확값을 잘 흉내 낸다. 이것이 수정을 넣는 이유다. 다만 앞서 비율 구간에서 보았듯, 수정이 항상 좋은 것은 아니다.
언제 정확 방법이 필수인가. \(m=b+c<20\)이면 카이제곱 근사가 믿을 수 없다. 이 예는 \(m=40\)이라 근사가 쓸 만하지만, 정확 방법의 계산 비용이 0이므로 그냥 정확 방법을 쓰는 것이 낫다.
연습문제 6. 대응 비율 차이에 대한 뉴콤의 구간을 설명하고, 연습문제 1의 자료에서 왈드 구간과 비교하라.
풀이
착안. 두 주변비율 각각에 윌슨 구간을 만들고, 둘을 상관 \(\phi\)로 결합한다. 왈드의 경계 문제를 피하면서 대응 구조를 반영한다.
여기서 \((l_j,u_j)\)는 \(\hat p_j\)의 윌슨 구간, \(\hat\phi\)는 \(2\times2\) 표의 파이 계수다.
import numpy as np
from scipy import stats
a, b, c, d = 60, 25, 15, 50
n = a + b + c + d
z = stats.norm.ppf(0.975)
def wilson(k, nn):
ph = k / nn
dd = 1 + z**2 / nn
cc = (ph + z**2 / (2 * nn)) / dd
h = z / dd * np.sqrt(ph * (1 - ph) / nn + z**2 / (4 * nn**2))
return cc - h, cc + h
p1, p2 = (a + b) / n, (a + c) / n
l1, u1 = wilson(a + b, n)
l2, u2 = wilson(a + c, n)
phi = (a * d - b * c) / np.sqrt((a + b) * (c + d) * (a + c) * (b + d))
D = p1 - p2
lo_n = D - np.sqrt((p1 - l1)**2 - 2 * phi * (p1 - l1) * (u2 - p2) + (u2 - p2)**2)
hi_n = D + np.sqrt((u1 - p1)**2 - 2 * phi * (u1 - p1) * (p2 - l2) + (p2 - l2)**2)
se = np.sqrt(b + c - (b - c)**2 / n) / n
print(f"p1 = {p1:.4f} p2 = {p2:.4f} 차이 {D:.4f} φ = {phi:.4f}")
print(f"왈드 ({D - z * se:.4f}, {D + z * se:.4f}) 폭 {2 * z * se:.4f}")
print(f"뉴콤 ({lo_n:.4f}, {hi_n:.4f}) 폭 {hi_n - lo_n:.4f}")
p1 = 0.5667 p2 = 0.5000 차이 0.0667 φ = 0.4709
왈드 (-0.0153, 0.1486) 폭 0.1639
뉴콤 (-0.0151, 0.1468) 폭 0.1619
이 자료에서는 거의 같다. \(n=150\)이고 비율이 0.5 근처라 근사가 잘 듣는 영역이기 때문이다.
뉴콤이 빛나는 곳. \(b\)나 \(c\)가 아주 작거나 0일 때다.
- \(b=c=0\)이면 왈드의 표준오차가 0이 되어 구간이 점 \(\{0\}\)으로 퇴화한다. 뉴콤은 유한한 폭을 준다.
- \(b=5\), \(c=0\)이면 왈드는 여전히 작동하지만 하한이 경계를 넘을 수 있다.
- \(p_1\)이나 \(p_2\)가 0이나 1 근처면 왈드 구간이 \([-1,1]\)을 벗어난다. 뉴콤은 윌슨을 바탕으로 하므로 구조적으로 그럴 수 없다.
\(\phi\)의 역할. 상관이 클수록 두 윌슨 구간의 변동이 연동되어 차이의 불확실성이 줄어든다. 여기서 \(\phi=0.47\)이다. \(\phi=0\)이면 독립표본 구간과 같아지고, \(\phi\to1\)이면 구간이 좁아진다.
권고. 모의실험 연구에서 뉴콤의 방법이 포함확률과 폭의 균형에서 가장 낫다고 보고된다. 왈드는 \(b+c\)가 크고 비율이 중간일 때만 안전하다.
연습문제 7. 대응 자료에서 조건부 오즈비 \(b/c\)를 정의하고, 그 구간을 구하라. 주변비율 차이와 무엇이 다른가?
풀이
정의. 불일치 짝 중 "\(+\to-\)"의 오즈다.
\(\pi=b/(b+c)\)와는 \(\text{OR}=\pi/(1-\pi)\)의 관계에 있다.
import numpy as np
from scipy import stats
b, c = 25, 15
m = b + c
z = stats.norm.ppf(0.975)
OR = b / c
print(f"조건부 오즈비 {OR:.4f}")
# 정확 구간: π의 CP 구간을 오즈로 변환
lo = stats.beta.ppf(0.025, b, m - b + 1)
hi = stats.beta.ppf(0.975, b + 1, m - b)
print(f"정확(CP 기반) ({lo / (1 - lo):.4f}, {hi / (1 - hi):.4f})")
# 로그 척도 왈드
se = np.sqrt(1 / b + 1 / c)
print(f"로그 왈드 ({OR * np.exp(-z * se):.4f}, {OR * np.exp(z * se):.4f})")
조건부 오즈비 1.6667
정확(CP 기반) (0.8451, 3.4002)
로그 왈드 (0.8787, 3.1612)
두 구간 모두 1을 담는다. 주변비율 차이의 구간이 0을 담았던 것과 일관된다.
차이 대 오즈비 — 무엇이 다른가.
| 주변비율 차이 | 조건부 오즈비 | |
|---|---|---|
| 정의 | \((b-c)/n\) | \(b/c\) |
| 척도 | 절대(백분율 포인트) | 상대(배수) |
| \(n\) 의존 | 일치 짝 수에 영향받음 | 불일치 짝만으로 결정 |
| 해석 | "전체의 6.7%포인트가 바뀌었다" | "바뀐 사람 중 \(+\to-\)가 \(-\to+\)의 1.67배" |
핵심 차이 — 일치 짝의 역할. 오즈비는 \(a\)와 \(d\)를 완전히 무시한다. 같은 \(b=25\), \(c=15\)라도
- \(n=150\)(\(a+d=110\))이면 차이는 \(10/150=0.067\),
- \(n=1000\)(\(a+d=960\))이면 차이는 \(10/1000=0.010\)
으로 차이는 크게 달라지지만 오즈비는 1.667로 같다.
어느 것을 보고할 것인가.
- 공중보건이나 정책에서는 절대 차이가 중요하다. "전체 인구의 몇 %가 영향을 받는가"가 관심사다.
- 기전이나 개별 위험에서는 오즈비가 유용하다. 기저율이 다른 집단 간 비교에 안정적이다.
- 둘 다 보고하는 것이 가장 좋다. 하나만 보면 오해가 생긴다.
조건부 논리의 다른 예. 이 구조는 조건부 로지스틱회귀로 일반화된다. 짝마다 층을 만들고 개체효과를 조건부로 소거하면, 정확히 이 오즈비가 최대가능도추정값으로 나온다.
연습문제 8. 주변동질성과 일치도(카파) 가 서로 다른 질문임을 연습문제 1의 자료로 보여라.
풀이
두 질문.
- 주변동질성: \(p_1=p_2\)인가? 즉 전체 양성률이 두 시점에서 같은가. 맥니마가 답한다.
- 일치도: 개별 환자의 두 결과가 얼마나 잘 맞는가. 카파가 답한다.
import numpy as np
a, b, c, d = 60, 25, 15, 50
n = a + b + c + d
po = (a + d) / n # 관측 일치율
pe = ((a + b) * (a + c) + (c + d) * (b + d)) / n**2 # 우연 일치율
kappa = (po - pe) / (1 - pe)
print(f"관측 일치율 {po:.4f} 우연 일치율 {pe:.4f} 카파 {kappa:.4f}")
print(f"주변비율 p1 = {(a + b) / n:.4f} p2 = {(a + c) / n:.4f} "
f"차이 {(b - c) / n:.4f}")
관측 일치율 0.7333 우연 일치율 0.5000 카파 0.4667
주변비율 p1 = 0.5667 p2 = 0.5000 차이 0.0667
두 값이 전혀 다른 것을 말한다.
- 주변비율 차이 0.067은 작고 유의하지 않다. 전체 양성률은 거의 그대로다.
- 카파 0.47은 "보통" 수준의 일치다. 개별 환자 40명(27%)의 결과가 바뀌었다.
극단적인 예로 명확히 하자.
| 표 | \(a,b,c,d\) | 주변차이 | 카파 |
|---|---|---|---|
| A | 50, 0, 0, 50 | 0 | 1.00 |
| B | 0, 50, 50, 0 | 0 | \(-1.00\) |
| C | 25, 25, 25, 25 | 0 | 0.00 |
셋 다 주변동질성이 완벽히 성립하지만(\(b=c\)), 일치도는 완전 일치에서 완전 불일치까지 걸쳐 있다. 맥니마 검정은 이 셋을 구별하지 못한다.
반대 방향. \(a=90\), \(b=10\), \(c=0\), \(d=0\)이면 일치율이 0.9로 높지만 주변비율이 \(1.0\) 대 \(0.9\)로 다르고 맥니마가 유의하다.
실무적 함의.
-
검사법 비교에서는 둘 다 봐야 한다. "새 검사가 기존 검사와 같은 비율로 양성을 낸다"와 "같은 사람을 같게 판정한다"는 다른 요구다.
-
진단 일치도 연구에서 카파만 보고하고 주변 차이를 무시하면, 한 평가자가 체계적으로 후하게 주는 경향을 놓친다.
-
카파의 역설. 유병률이 극단적이면(\(p\)가 0이나 1 근처) 일치율이 높아도 카파가 낮게 나온다. 우연 일치율 \(p_e\)가 커지기 때문이다. 카파를 해석할 때 주변분포를 함께 제시해야 한다.
연습문제 9. 결과가 세 범주 이상인 대응 자료에서 주변동질성을 어떻게 검정하는가? \(3\times3\) 예로 설명하라.
풀이
문제. \(k\times k\) 표에서 \(H_0:\ p_{i\cdot}=p_{\cdot i}\)(\(i=1,\dots,k\))를 검정한다. 제약이 \(k-1\)개이므로 자유도가 \(k-1\)이다.
스튜어트-맥스웰 검정. 주변도수 차이 벡터 \(\mathbf d=(d_1,\dots,d_{k-1})^\top\), \(d_i=n_{i\cdot}-n_{\cdot i}\)에 대해
import numpy as np
from scipy import stats
# 세 등급(개선/유지/악화)으로 두 번 평가한 120명
N = np.array([[30, 12, 6],
[ 8, 25, 10],
[ 4, 9, 16]], dtype=float)
k = N.shape[0]
n = N.sum()
row, col = N.sum(1), N.sum(0)
print("행 주변", row, " 열 주변", col)
d = (row - col)[:k - 1]
V = np.zeros((k - 1, k - 1))
for i in range(k - 1):
V[i, i] = row[i] + col[i] - 2 * N[i, i]
for j in range(k - 1):
if i != j:
V[i, j] = -(N[i, j] + N[j, i])
chi = d @ np.linalg.solve(V, d)
print(f"스튜어트-맥스웰 χ² = {chi:.4f} df = {k - 1} "
f"p = {stats.chi2.sf(chi, k - 1):.4f}")
# 쌍별 맥니마 (참고용, 다중비교 보정 필요)
for i in range(k):
for j in range(i + 1, k):
bb, cc = N[i, j], N[j, i]
if bb + cc > 0:
pv = 2 * stats.binom.cdf(min(bb, cc), int(bb + cc), 0.5)
print(f" ({i+1},{j+1}) b={bb:.0f} c={cc:.0f} 정확 p = {min(pv, 1):.4f}")
행 주변 [48. 43. 29.] 열 주변 [42. 46. 32.]
스튜어트-맥스웰 χ² = 1.2390 df = 2 p = 0.5382
(1,2) b=12 c=8 정확 p = 0.5034
(1,3) b=6 c=4 정확 p = 0.7539
(2,3) b=10 c=9 정확 p = 1.0000
주변동질성을 기각하지 못한다(\(p=0.538\)). 쌍별 맥니마도 모두 유의하지 않아 결론이 일관된다.
주의할 점.
-
\(V\)가 특이할 수 있다. 어떤 범주의 불일치가 전혀 없으면 역행렬이 없다. 그 범주를 합치거나 일반화역행렬을 쓴다.
-
쌍별 맥니마를 그냥 여러 번 하면 안 된다. \(k=3\)이면 비교가 3개이므로 다중비교 보정이 필요하고, 게다가 서로 독립이 아니다. 전체 검정을 먼저 하고, 유의하면 사후비교로 넘어간다.
-
순서형 범주라면 순서를 활용하는 검정이 훨씬 강력하다. 주변동질성의 대립가설을 "한쪽으로 이동"으로 좁히면 자유도가 1로 줄어 검정력이 오른다.
-
보와커 검정과 구별. 보와커는 대칭성(\(p_{ij}=p_{ji}\) for all \(i,j\))을 검정하며, 자유도가 \(k(k-1)/2\)다. 대칭성은 주변동질성보다 강한 조건이다. \(2\times2\)에서는 둘이 같아진다.
구간은? \(k>2\)에서 "차이"가 벡터이므로 신뢰영역이 된다. 실무에서는 각 범주별 주변 차이에 개별 구간을 만들고 본페로니로 보정하는 것이 보통이다.
연습문제 10. 대응 비율 연구의 표본크기를 정하는 법을 설명하라. 무엇을 미리 알아야 하는가?
풀이
핵심 — 검정력을 결정하는 것은 불일치 짝의 수다. 앞서 보았듯 맥니마 검정은 \(B\mid m\sim\text{Bin}(m,\pi)\)에 대한 검정이므로, \(m=b+c\)가 실질적인 표본크기다.
두 단계.
1단계. \(H_0:\pi=1/2\)를 대립 \(\pi_1\)에서 검정하는 데 필요한 불일치 짝 수
2단계. 불일치 비율 \(p_{\text{disc}}=(b+c)/n\)으로 나누어 총 쌍 수를 얻는다.
import numpy as np
from scipy import stats
za, zb = stats.norm.ppf(0.975), stats.norm.ppf(0.80)
print(f"{'불일치율':>8s} {'π1':>6s} {'불일치 짝':>10s} {'총 쌍':>8s}")
for p_disc, pi1 in [(0.20, 0.70), (0.30, 0.65), (0.40, 0.625), (0.10, 0.70)]:
m = (za + zb)**2 / (4 * (pi1 - 0.5)**2)
print(f"{p_disc:8.2f} {pi1:6.3f} {np.ceil(m):10.0f} "
f"{np.ceil(m / p_disc):8.0f}")
불일치율 π1 불일치 짝 총 쌍
0.20 0.700 50 246
0.30 0.650 88 291
0.40 0.625 126 314
0.10 0.700 50 491
미리 알아야 할 두 가지.
-
불일치 비율 \(p_{\text{disc}}\). 두 측정이 얼마나 일치하는지. 예비연구나 문헌에서 얻어야 한다. 이것을 모르면 표본크기를 정할 수 없다.
-
불일치의 방향 비 \(\pi_1\). 탐지하고자 하는 효과의 크기. "불일치 중 70%가 한 방향"이 대립가설이다.
직관적 함의.
- 일치도가 높을수록 더 많은 쌍이 필요하다. 불일치율 0.10이면 491쌍, 0.40이면 314쌍이다. 역설적이지만 정보는 불일치 짝에서만 나오기 때문이다.
- 다만 일치도가 높으면 대체로 \(\pi_1\)을 크게 잡을 수 있어, 실제로는 상쇄되는 경우가 많다.
주변 차이로 환산. \(p_1-p_2=p_{\text{disc}}(2\pi_1-1)\)이다. 위 첫 줄은 \(0.20\times0.40=0.08\), 즉 8%포인트 차이를 탐지하는 설계다.
독립표본과 비교. 같은 8%포인트 차이를 \(p\approx0.5\)인 두 독립집단에서 탐지하려면 집단당 약 613명, 총 1,226명이 필요하다. 대응 설계가 246쌍(492 관측)으로 해결한다. 절반 이하다.
놓치기 쉬운 것. 계획 단계에서 \(p_{\text{disc}}\)를 과대추정하면 표본이 모자라게 된다. 중간분석에서 관측된 불일치 수를 확인하고 필요하면 표본을 늘리는 설계(내부 예비추정)를 고려한다. 다만 이 경우 \(\alpha\) 보정이 필요하다.
정리하며¶
대응 이진 자료에서는 불일치 짝만이 정보를 담는다.
- \(2\times2\) 표의 네 칸 중 \(b\) 와 \(c\) 만 쓴다. 두 조건에서 결과가 같았던 \(a\) 와 \(d\) 는 비율 차이에 아무 정보도 주지 않는다. 주변비율의 차가 \((b-c)/n\) 으로 적히기 때문이다.
- 독립 이표본 공식을 쓰면 안 된다. 같은 피험자에서 나온 두 결과가 종속이므로 표준오차가 틀린다. 대개 과대평가되어 구간이 지나치게 넓어진다.
- 맥니마 방식이 그 종속성을 반영한다. 표준오차가 \(b\) 와 \(c\) 로만 계산되며, 일치 짝의 수는 들어오지 않는다.
- \(b+c\) 가 작으면 근사가 나빠진다. 불일치 짝이 몇 개뿐이면 정규근사 대신 정확 이항 방법을 써야 한다.
- 9장의 맥니마 검정과 짝을 이룬다. 구간이 \(0\) 을 포함하지 않는 것이 그 검정에서 기각하는 것과 대응한다.
다음 절 대응 평균 신뢰구간의 포함확률 모의실험에서 이 이득을 수치로 확인한다.