1 개요
복잡한 모형에서 가설 검정을 수행할 때 두 가지 어려움이 발생한다.
첫째, 우도비검정(LRT) 통계량 \(\lambda(\mathbf{x})\)의 정확 분포를 유도하기 어렵다. 둘째, 정확 분포를 알더라도 기각역 상수 \(c\)를 결정하는 것이 쉽지 않다.
점근 이론은 이 두 문제를 동시에 해결한다. 표본 크기 \(n \to \infty\) 극한에서 \(-2\log\lambda(X)\)는 자유도가 명확히 결정되는 카이제곱 분포로 수렴하기 때문이다. 이 결과는 LRT에만 국한되지 않는다. 같은 점근 정규성 이론으로부터 Wald 검정과 Score 검정도 유도되며, 세 검정은 점근적으로 동등하다.
본 포스트는 Casella & Berger (2002) §10.3을 바탕으로 이 세 검정의 이론과 실무를 다룬다.
2 우도비검정 복습
LRT 통계량은 다음과 같이 정의된다.
\[\lambda(\mathbf{x}) = \frac{\sup_{\theta \in \Theta_0} L(\theta \mid \mathbf{x})}{\sup_{\theta \in \Theta} L(\theta \mid \mathbf{x})}\]
- 분자: \(H_0\) 제약 하에서 달성 가능한 최대 우도
- 분모: 모든 파라미터 공간에서의 최대 우도 (= \(L(\hat\theta \mid \mathbf{x})\))
- \(0 \leq \lambda(\mathbf{x}) \leq 1\)
기각역은 \(\{\mathbf{x} : \lambda(\mathbf{x}) \leq c\}\)이며, 수준 \(\alpha\) 검정을 위해
\[\sup_{\theta \in \Theta_0} P_\theta(\lambda(X) \leq c) \leq \alpha \tag{10.3.1}\]
를 만족하는 \(c\)를 선택해야 한다. \(\lambda(\mathbf{x})\)의 정확 표본분포를 모를 때 이를 결정하기 어렵다. 점근 이론이 필요한 이유가 여기에 있다.
3 LRT의 점근 분포: 단순 귀무가설
3.1 Theorem 10.3.1 (단순 귀무가설)
직관: \(\lambda(\mathbf{x})\)가 1에 가까울수록 \(H_0\)는 데이터와 일치한다. \(-2\log\lambda\)는 0에 가깝고 \(H_0\)를 기각하지 않는다. 반대로 \(\lambda\)가 0에 가까우면 \(-2\log\lambda\)가 크고 \(H_0\)를 기각한다. 이 통계량이 카이제곱 분포로 수렴한다는 것이 핵심 결과다.
3.2 증명
로그우도 \(\ell(\theta \mid \mathbf{x}) = \log L(\theta \mid \mathbf{x})\)를 \(\hat\theta\) 주변에서 테일러 전개한다.
\[\ell(\theta \mid \mathbf{x}) = \ell(\hat\theta \mid \mathbf{x}) + \ell'(\hat\theta \mid \mathbf{x})(\theta - \hat\theta) + \ell''(\hat\theta \mid \mathbf{x})\frac{(\theta - \hat\theta)^2}{2} + \cdots\]
MLE의 정의에서 \(\ell'(\hat\theta \mid \mathbf{x}) = 0\)이므로 2차 항까지 근사하면
\[\ell(\theta \mid \mathbf{x}) \approx \ell(\hat\theta \mid \mathbf{x}) + \frac{1}{2}\ell''(\hat\theta \mid \mathbf{x})(\theta - \hat\theta)^2\]
이제 \(-2\log\lambda(\mathbf{x}) = -2\ell(\theta_0 \mid \mathbf{x}) + 2\ell(\hat\theta \mid \mathbf{x})\)에 대입하면
\[-2\log\lambda(\mathbf{x}) \approx -\ell''(\hat\theta \mid \mathbf{x})(\theta_0 - \hat\theta)^2 \tag{*}\]
여기서 \(-\ell''(\hat\theta \mid \mathbf{x})\)는 관측 피셔 정보 \(\hat{I}_n(\hat\theta)\)이다. 대수의 법칙에 의해 \(\frac{1}{n}\hat{I}_n(\hat\theta) \xrightarrow{p} I(\theta_0)\)이고, Theorem 10.1.12에서 \(\sqrt{n}(\hat\theta - \theta_0) \xrightarrow{d} N(0, 1/I(\theta_0))\)이다. 따라서
\[-2\log\lambda(X) \approx \hat{I}_n(\hat\theta)(\hat\theta - \theta_0)^2 = \frac{\hat{I}_n(\hat\theta)}{n} \cdot \left[\sqrt{n}(\hat\theta - \theta_0)\right]^2\]
Slutsky 정리에 의해
\[-2\log\lambda(X) \xrightarrow{d} I(\theta_0) \cdot \frac{1}{I(\theta_0)} \chi^2_1 = \chi^2_1 \qquad \square\]
3.3 비교: 정확 검정 vs 점근 검정
| 방법 | 기각역 | 계산 | 적용 범위 |
|---|---|---|---|
| 정확 LRT | \(\lambda(\mathbf{x}) \leq c\) (정확 분포로 결정) | 복잡, 종종 불가능 | 특수 모형만 |
| 점근 LRT | \(-2\log\lambda(\mathbf{x}) \geq \chi^2_{1,\alpha}\) | 간단 | 정칙 조건 만족하는 모형 전반 |
4 예시: 포아송 LRT (Example 10.3.2)
\(X_1, \ldots, X_n \overset{\text{iid}}{\sim} \text{Poisson}(\lambda)\)에서 \(H_0: \lambda = \lambda_0\) vs \(H_1: \lambda \neq \lambda_0\)를 검정한다.
LRT 통계량 유도
MLE는 \(\hat\lambda = \bar{X} = \sum x_i / n\)이다. 우도비는
\[\lambda(\mathbf{x}) = \frac{e^{-n\lambda_0}\lambda_0^{\sum x_i}}{e^{-n\hat\lambda}\hat\lambda^{\sum x_i}}\]
로그를 취하면
\[\log\lambda(\mathbf{x}) = -n\lambda_0 + \sum x_i \log\lambda_0 - (-n\hat\lambda + \sum x_i \log\hat\lambda)\] \[= n(\hat\lambda - \lambda_0) + \sum x_i(\log\lambda_0 - \log\hat\lambda)\] \[= n\hat\lambda\left[1 - \frac{\lambda_0}{\hat\lambda} + \log\frac{\lambda_0}{\hat\lambda}\right] - n(\lambda_0 - \hat\lambda) + n\lambda_0\left[1 - \frac{\lambda_0}{\hat\lambda} + \log\frac{\lambda_0}{\hat\lambda}\right]\]
정리하면
\[-2\log\lambda(\mathbf{x}) = 2n\left[(\lambda_0 - \hat\lambda) - \hat\lambda\log\frac{\lambda_0}{\hat\lambda}\right]\]
Theorem 10.3.1에 의해 \(H_0\) 하에서 \(-2\log\lambda(\mathbf{x}) \xrightarrow{d} \chi^2_1\)이므로, 수준 \(\alpha\) 검정의 기각역은 \(-2\log\lambda(\mathbf{x}) > \chi^2_{1,\alpha}\)이다.
시뮬레이션 검증 (\(\lambda_0 = 5\), \(n = 25\))
\(10{,}000\)번 반복 시뮬레이션으로 얻은 정확 분위수와 \(\chi^2_1\) 근사 분위수를 비교한다.
| 백분위수 | 시뮬레이션 (정확) | \(\chi^2_1\) (근사) |
|---|---|---|
| 80% | 1.630 | 1.642 |
| 90% | 2.726 | 2.706 |
| 95% | 3.744 | 3.841 |
| 99% | 6.304 | 6.635 |
\(n = 25\)라는 비교적 작은 표본에서도 근사가 매우 정확함을 알 수 있다.
5 LRT의 점근 분포: 복합 귀무가설
5.1 Theorem 10.3.3 (복합 귀무가설)
단일 파라미터가 아닌 파라미터 벡터에 대한 가설을 검정할 때 일반화가 필요하다.
자유도 계산의 원칙
\(\Theta\)가 \(\mathbb{R}^q\)의 열린 부분집합을 포함하는 \(q\)차원 공간의 부분집합이고, \(\Theta_0\)가 \(\mathbb{R}^p\)의 열린 부분집합을 포함하는 \(p\)차원 공간의 부분집합이면
\[\nu = q - p\]
직관적으로, \(\nu\)는 귀무가설이 파라미터에 부과하는 독립적 제약의 수다.
기각역
\(H_0: \theta \in \Theta_0\)는 다음을 만족할 때 기각한다.
\[-2\log\lambda(X) \geq \chi^2_{\nu, \alpha}\]
이 검정의 점근 제1종 오류 확률은 \(\alpha\)이다. 더 정확히는, 각 \(\theta \in \Theta_0\)에 대해
\[\lim_{n \to \infty} P_\theta(\text{reject } H_0) = \alpha\]
6 예시: 다항분포 LRT (Example 10.3.4)
6.1 설정
\(\theta = (p_1, p_2, p_3, p_4, p_5)\), \(p_j \geq 0\), \(\sum_{j=1}^5 p_j = 1\). \(X_1, \ldots, X_n \overset{\text{iid}}{\sim} \text{Categorical}(p_1, \ldots, p_5)\).
검정 가설:
\[H_0: p_1 = p_2 = p_3 \text{ 이고 } p_4 = p_5 \quad \text{vs} \quad H_1: H_0\text{이 아님}\]
6.2 자유도 계산
전체 파라미터 공간 \(\Theta\): \(p_5 = 1 - p_1 - p_2 - p_3 - p_4\)이므로 자유 파라미터는 \(p_1, p_2, p_3, p_4\)의 4개. \(q = 4\).
귀무 파라미터 공간 \(\Theta_0\): \(p_1 = p_2 = p_3\) (2개 등식 제약), \(p_4 = p_5\) (1개 등식 제약). \(p_1\)을 자유롭게 택하면 (\(0 \leq p_1 \leq 1/3\)), 나머지가 모두 결정된다. \(p = 1\).
\[\nu = q - p = 4 - 1 = 3\]
6.3 MLE 계산
\(\Theta\) 전체에서의 MLE: \(\hat{p}_j = y_j / n\), 여기서 \(y_j\)는 범주 \(j\)의 관측 수.
\(H_0\) 제약 하에서의 MLE: 우도함수를 \(H_0\) 제약에서 최대화하면
\[\hat{p}_{10} = \hat{p}_{20} = \hat{p}_{30} = \frac{y_1 + y_2 + y_3}{3n}, \quad \hat{p}_{40} = \hat{p}_{50} = \frac{y_4 + y_5}{2n}\]
6.4 LRT 통계량
\(m_j\)를 \(H_0\) 하의 기대 빈도(\(n \cdot \hat{p}_{j0}\))라 하면
\[-2\log\lambda(\mathbf{x}) = 2\sum_{j=1}^5 y_j \log\frac{y_j}{m_j} \tag{10.3.2}\]
여기서 - \(m_1 = m_2 = m_3 = (y_1 + y_2 + y_3)/3\) - \(m_4 = m_5 = (y_4 + y_5)/2\)
\(H_0\)를 \(-2\log\lambda(\mathbf{x}) \geq \chi^2_{3, \alpha}\)일 때 기각한다.
주목: (10.3.2)는 로그우도비 형태로, 카이제곱 적합도 검정의 Pearson 통계량 \(\sum (y_j - m_j)^2/m_j\)와 구별된다. 두 통계량은 점근적으로 동등하지만 유한 표본 성질이 다르다.
7 대표본 검정: Wald 검정과 Score 검정
7.1 Wald 검정
LRT 이외에도 점근 정규성에 기반한 검정들이 존재한다.
아이디어: \(W_n\)이 \(\theta\)의 점추정량이고 어떤 형태의 CLT에 의해
\[\frac{W_n - \theta}{\sigma_n} \xrightarrow{d} N(0,1)\]
이면, \(H_0: \theta = \theta_0\) 하에서 \(\sigma_n\) 또는 그 추정량 \(S_n\)으로 정규화한 통계량을 검정에 사용할 수 있다.
Wald 검정 통계량
\[Z_n = \frac{W_n - \theta_0}{S_n}\]
- \(\theta_0\): 귀무가설에서 가정하는 파라미터 값
- \(W_n\): \(\theta\)의 추정량 (주로 MLE)
- \(S_n\): \(W_n\)의 표준오차 (추정값)
\(H_0\) 하에서 \(Z_n \xrightarrow{d} N(0,1)\)이므로 양측 검정 기각역은 \(|Z_n| > z_{\alpha/2}\)
\(W_n\)이 MLE \(\hat\theta\)이면, §10.1.3에서 논의된 대로 \(S_n = 1/\sqrt{I_n(\hat\theta)}\) 또는 관측 정보를 이용한 \(S_n = 1/\sqrt{\hat{I}_n(\hat\theta)}\)를 사용한다.
여기서
\[\hat{I}_n(\hat\theta) = -\frac{\partial^2}{\partial\theta^2}\log L(\theta \mid X)\bigg|_{\theta=\hat\theta}\]
점근 검정력: 대립 \(\theta \neq \theta_0\) 하에서
\[Z_n = \frac{W_n - \theta}{\sigma_n} + \frac{\theta - \theta_0}{S_n}\]
첫 번째 항은 \(N(0,1)\)으로 수렴하고, 두 번째 항의 분모 \(S_n \to 0\)이므로 두 번째 항이 \(\pm\infty\)로 발산한다. 따라서 \(P_\theta(\text{reject } H_0) \to 1\) — 점근 검정력이 1이다.
7.2 Score 검정 (Lagrange multiplier 검정)
Score 함수: 로그우도의 1차 도함수
\[S(\theta) = \frac{\partial}{\partial\theta}\log f(X \mid \theta) = \frac{\partial}{\partial\theta}\log L(\theta \mid X)\]
핵심 성질: - \(E_\theta[S(\theta)] = 0\) (Fisher의 기댓값 항등식, §7.3) - \(\text{Var}_\theta[S(\theta)] = I_n(\theta)\) (Score의 분산 = Fisher 정보)
\(H_0: \theta = \theta_0\)가 참이면 \(S(\theta_0)\)의 기댓값은 0, 분산은 \(I_n(\theta_0)\)다.
Score 검정 통계량
\[Z_S = \frac{S(\theta_0)}{\sqrt{I_n(\theta_0)}}\]
\(H_0\) 하에서 \(Z_S \xrightarrow{d} N(0,1)\) (Theorem 10.1.12 적용)
기각역: \(|Z_S| > z_{\alpha/2}\)
Score 검정의 특징: \(H_0\)에서 지정된 \(\theta_0\)만 사용하고 MLE를 계산하지 않아도 된다. 이는 복합 귀무가설에서 \(H_0\)에 제약된 MLE를 구할 때 라그랑주 승수법과 자연스럽게 연결된다 (Lagrange multiplier test라고도 불리는 이유).
8 예시: 이항분포 세 검정 비교 (§10.3.2)
\(X_1, \ldots, X_n \overset{\text{iid}}{\sim} \text{Bernoulli}(p)\), \(H_0: p = p_0\) vs \(H_1: p \neq p_0\).
Wald 검정
MLE \(\hat{p}_n = \sum X_i / n\)의 CLT에서
\[\frac{\hat{p}_n - p}{\sqrt{p(1-p)/n}} \xrightarrow{d} N(0,1)\]
\(p\)를 \(\hat{p}_n\)으로 추정하면
\[Z_W = \frac{\hat{p}_n - p_0}{\sqrt{\hat{p}_n(1-\hat{p}_n)/n}} \xrightarrow{d} N(0,1) \quad (H_0 \text{ 하에서})\]
Score 검정
\(S(p) = \frac{\hat{p}_n - p}{p(1-p)/n}\), \(I_n(p) = n/[p(1-p)]\)이므로
\[Z_S = \frac{S(p_0)}{\sqrt{I_n(p_0)}} = \frac{\hat{p}_n - p_0}{\sqrt{p_0(1-p_0)/n}} \tag{10.3.4}\]
두 검정의 차이: 표준오차 분모에서 \(\hat{p}_n\)을 쓰느냐 (\(Z_W\), Wald) \(p_0\)를 쓰느냐 (\(Z_S\), Score) 의 차이다. 두 검정은 점근적으로 동등하지만 유한 표본 검정력이 달라질 수 있다.
LRT
\[-2\log\lambda(\mathbf{x}) = 2n\hat{p}_n\log\frac{\hat{p}_n}{p_0} + 2n(1-\hat{p}_n)\log\frac{1-\hat{p}_n}{1-p_0}\]
이 역시 \(H_0\) 하에서 \(\chi^2_1\)으로 수렴한다.
9 M-추정량 기반 강건 검정
M-추정량 \(\hat\theta_M\)은 §10.2.2에서 보인 바와 같이
\[\sqrt{n}(\hat\theta_M - \theta_0) \xrightarrow{d} N\!\left(0, \frac{E_{\theta_0}[\psi(X-\theta_0)^2]}{[E_{\theta_0}\psi'(X-\theta_0)]^2}\right) \tag{10.3.5}\]
이를 이용한 일반화 Score 통계량과 일반화 Wald 통계량을 구성할 수 있다.
\[Z_{GS} = \sqrt{n}\,\frac{\hat\theta_M - \theta_0}{\sqrt{\text{Var}_{\theta_0}(\hat\theta_M)}}, \quad Z_{GW} = \sqrt{n}\,\frac{\hat\theta_M - \theta_0}{\sqrt{\widehat{\text{Var}}(\hat\theta_M)}}\]
분산의 일치 추정량으로 표본 대응량을 사용한다.
\[\widehat{\text{Var}}(\hat\theta_M) = \frac{\frac{1}{n}\sum_{i=1}^n[\psi(x_i - \hat\theta_M)]^2}{\left[\frac{1}{n}\sum_{i=1}^n\psi'(x_i - \hat\theta_M)\right]^2} \tag{10.3.6}\]
이 검정들은 오염된 분포 아래서도 점근적으로 크기 \(\alpha\)를 유지한다. 분산 추정량의 선택이 유한 표본 성질에 중요한 영향을 미친다.
10 세 검정의 점근 동등성
세 검정의 특성을 비교한다.
| 검정 | 통계량 | 계산 부담 | 특징 |
|---|---|---|---|
| LRT | \(-2\log\lambda \to \chi^2_\nu\) | 제약·비제약 MLE 모두 필요 | 정보 효율적; 복합 \(H_0\)에 자연스러움 |
| Wald | \(Z_W = (\hat\theta - \theta_0)/S \to N(0,1)\) | 비제약 MLE만 필요 | 직관적; 표준오차 추정이 핵심 |
| Score | \(Z_S = S(\theta_0)/\sqrt{I_n(\theta_0)} \to N(0,1)\) | \(\theta_0\) 하에서 계산 | \(H_0\) 하의 MLE만 필요 (제약 모형) |
세 검정은 모두 점근 크기 \(\alpha\), 점근 검정력 1을 달성한다. 유한 표본에서는 검정력 함수가 교차할 수 있어 어느 검정도 지배적이지 않다.
실무 지침: - 복잡한 제약 \(H_0\): LRT 또는 Score 검정 선호 (비제약 MLE 회피) - 표준오차 추정이 용이: Wald 검정으로 충분 - 이상치 존재 가능: M-추정량 기반 강건 검정
11 Python 구현
11.1 포아송 LRT
import numpy as np
from scipy import stats
def poisson_lrt(data, lambda_0):
"""
포아송 모형에서 H0: lambda = lambda_0 vs H1: lambda != lambda_0 의 LRT
Returns:
stat: -2log lambda(x) 값
pvalue: p-value (카이제곱 근사)
"""
n = len(data)
lambda_hat = np.mean(data)
# -2 log lambda(x) = 2n[(lambda_0 - lambda_hat) - lambda_hat * log(lambda_0/lambda_hat)]
stat = 2 * n * ((lambda_0 - lambda_hat) - lambda_hat * np.log(lambda_0 / lambda_hat))
pvalue = 1 - stats.chi2.cdf(stat, df=1)
return stat, pvalue
# 예시: 포아송 데이터 생성 후 검정
np.random.seed(42)
n = 100
true_lambda = 5.0
data = np.random.poisson(true_lambda, n)
# H0: lambda = 5 (참인 경우)
stat, pval = poisson_lrt(data, lambda_0=5.0)
print(f"H0: lambda=5 (참) → 통계량={stat:.3f}, p-value={pval:.3f}")
# H0: lambda = 4 (거짓인 경우)
stat_false, pval_false = poisson_lrt(data, lambda_0=4.0)
print(f"H0: lambda=4 (거짓) → 통계량={stat_false:.3f}, p-value={pval_false:.3f}")11.2 시뮬레이션: LRT 분포 검증
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
def simulate_poisson_lrt(lambda_0, n, B=10_000):
"""
H0 하에서 -2log lambda(x) 분포를 시뮬레이션으로 확인
Casella & Berger Table (p.490) 재현
"""
stats_arr = []
for _ in range(B):
data = np.random.poisson(lambda_0, n)
lambda_hat = np.mean(data)
stat = 2 * n * ((lambda_0 - lambda_hat) - lambda_hat * np.log(lambda_0 / lambda_hat))
stats_arr.append(stat)
return np.array(stats_arr)
np.random.seed(0)
sim_stats = simulate_poisson_lrt(lambda_0=5, n=25, B=10_000)
# Casella Table 재현
for pct in [80, 90, 95, 99]:
sim_pct = np.percentile(sim_stats, pct)
chi2_pct = stats.chi2.ppf(pct / 100, df=1)
print(f"{pct}th percentile: Simulated={sim_pct:.3f}, chi2_1={chi2_pct:.3f}")11.3 다항분포 LRT
import numpy as np
from scipy import stats
def multinomial_lrt(observed, expected_ratios):
"""
다항분포 LRT: observed 빈도와 H0에서의 기대 비율로 검정
Args:
observed: 관측 빈도 배열 [y1, ..., yk]
expected_ratios: H0 하에서의 기대 비율 (귀무가설의 제약을 반영)
Returns:
stat: -2log lambda 값
pvalue: p-value
df: 자유도
"""
observed = np.array(observed)
n = observed.sum()
expected = n * np.array(expected_ratios)
expected = expected / expected.sum() * n # 정규화
# G-통계량: 2 * sum(y_j * log(y_j / m_j))
# 0인 셀 처리 (0 * log(0) = 0 규약)
mask = observed > 0
stat = 2 * np.sum(observed[mask] * np.log(observed[mask] / expected[mask]))
# 자유도 = 범주 수 - 1 - 귀무가설 자유 파라미터 수
# 여기서는 외부에서 df를 지정
return stat
# Example 10.3.4: H0: p1=p2=p3, p4=p5 (ν=3)
np.random.seed(123)
n = 200
# 귀무 가설 하에서 데이터 생성: p1=p2=p3=1/5, p4=p5=1/5
true_p = [0.2, 0.2, 0.2, 0.2, 0.2]
observed = np.random.multinomial(n, true_p)
print(f"관측 빈도: {observed}")
y1, y2, y3, y4, y5 = observed
# H0 하의 기대 빈도 계산
m123 = (y1 + y2 + y3) / 3
m45 = (y4 + y5) / 2
expected = np.array([m123, m123, m123, m45, m45])
# G-통계량
mask = observed > 0
stat = 2 * np.sum(observed[mask] * np.log(observed[mask] / expected[mask]))
df = 3 # ν = q - p = 4 - 1 = 3
pvalue = 1 - stats.chi2.cdf(stat, df=df)
print(f"G-통계량={stat:.3f}, 자유도={df}, p-value={pvalue:.3f}")
print(f"chi2(3, 0.05) 임계값={stats.chi2.ppf(0.95, df=3):.3f}")11.4 세 검정 비교 (이항분포)
import numpy as np
from scipy import stats
def three_tests_binomial(x, n, p0):
"""
이항분포 세 검정: LRT, Wald, Score
Args:
x: 성공 횟수
n: 시행 횟수
p0: 귀무가설에서의 성공 확률
Returns:
dict: 각 검정의 통계량과 p-value
"""
p_hat = x / n
# LRT
if p_hat > 0 and p_hat < 1:
lrt_stat = 2 * (x * np.log(p_hat / p0) + (n - x) * np.log((1 - p_hat) / (1 - p0)))
else:
lrt_stat = np.inf
lrt_pval = 1 - stats.chi2.cdf(lrt_stat, df=1)
# Wald (MLE 기반 표준오차)
se_wald = np.sqrt(p_hat * (1 - p_hat) / n)
z_wald = (p_hat - p0) / se_wald
wald_pval = 2 * (1 - stats.norm.cdf(abs(z_wald)))
# Score (귀무 표준오차)
se_score = np.sqrt(p0 * (1 - p0) / n)
z_score = (p_hat - p0) / se_score
score_pval = 2 * (1 - stats.norm.cdf(abs(z_score)))
return {
"LRT": {"stat": lrt_stat, "pval": lrt_pval},
"Wald": {"stat": z_wald**2, "pval": wald_pval},
"Score": {"stat": z_score**2, "pval": score_pval},
}
# 시뮬레이션: n=30, p_true=0.5, H0: p=0.5
np.random.seed(42)
n, p0 = 30, 0.5
x = np.random.binomial(n, p0) # H0 참인 경우
results = three_tests_binomial(x, n, p0)
print(f"n={n}, x={x}, p_hat={x/n:.2f}")
for test, res in results.items():
print(f" {test}: 통계량={res['stat']:.3f}, p-value={res['pval']:.3f}")11.5 Wald 검정력 시뮬레이션
import numpy as np
from scipy import stats
def wald_power_simulation(p0, p_true, n, alpha=0.05, B=10_000):
"""
이항분포 Wald 검정의 검정력 시뮬레이션
Returns:
power: 귀무가설 기각 비율
"""
rejections = 0
for _ in range(B):
x = np.random.binomial(n, p_true)
p_hat = x / n
se = np.sqrt(p_hat * (1 - p_hat) / n)
if se > 0:
z = (p_hat - p0) / se
if abs(z) > stats.norm.ppf(1 - alpha / 2):
rejections += 1
return rejections / B
# 검정력 곡선
import matplotlib.pyplot as plt
p0 = 0.5
n = 50
p_alternatives = np.linspace(0.3, 0.7, 30)
powers = [wald_power_simulation(p0, p_alt, n) for p_alt in p_alternatives]
plt.figure(figsize=(8, 5))
plt.plot(p_alternatives, powers, 'b-o', markersize=4)
plt.axhline(y=0.05, color='r', linestyle='--', label='α=0.05')
plt.axvline(x=p0, color='g', linestyle='--', label='H₀: p=0.5')
plt.xlabel('p (참값)')
plt.ylabel('검정력')
plt.title('이항 Wald 검정의 검정력 (n=50)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()11.6 M-추정량 기반 강건 Wald 검정
import numpy as np
from scipy import stats
def huber_psi(x, c=1.345):
"""Huber ψ 함수"""
return np.where(np.abs(x) <= c, x, c * np.sign(x))
def huber_psi_deriv(x, c=1.345):
"""Huber ψ' 함수"""
return np.where(np.abs(x) <= c, 1.0, 0.0)
def m_estimator_location(data, c=1.345, tol=1e-6, max_iter=200):
"""IRLS로 Huber M-추정량 계산"""
theta = np.median(data) # 초기값
for _ in range(max_iter):
r = data - theta
psi = huber_psi(r, c)
update = np.sum(psi) / np.sum(huber_psi_deriv(r, c))
theta += update
if abs(update) < tol:
break
return theta
def robust_wald_test(data, theta_0, c=1.345):
"""
M-추정량 기반 강건 Wald 검정 (10.3.6)
H0: theta = theta_0 vs H1: theta != theta_0
"""
n = len(data)
theta_hat = m_estimator_location(data, c)
r = data - theta_hat
psi_vals = huber_psi(r, c)
psi_d_vals = huber_psi_deriv(r, c)
# (10.3.6): 분산 추정량
numerator = np.mean(psi_vals**2)
denominator = np.mean(psi_d_vals)**2
var_hat = numerator / denominator
se = np.sqrt(var_hat / n)
z = (theta_hat - theta_0) / se
pvalue = 2 * (1 - stats.norm.cdf(abs(z)))
return {"theta_hat": theta_hat, "se": se, "z": z, "pval": pvalue}
# 이상치가 있는 경우 비교
np.random.seed(99)
n = 100
# 정상 데이터 (N(0,1)) + 이상치 5개
clean = np.random.normal(0, 1, n - 5)
outliers = np.array([10, -10, 15, -12, 8])
data = np.concatenate([clean, outliers])
theta_0 = 0.0
# 표준 Wald (MLE = 표본 평균)
x_bar = np.mean(data)
se_classic = np.std(data, ddof=1) / np.sqrt(n)
z_classic = (x_bar - theta_0) / se_classic
pval_classic = 2 * (1 - stats.norm.cdf(abs(z_classic)))
# 강건 Wald
robust_res = robust_wald_test(data, theta_0)
print("이상치 포함 데이터 (H0: θ=0 참):")
print(f" 표준 Wald: θ̂={x_bar:.3f}, z={z_classic:.3f}, p={pval_classic:.3f}")
print(f" 강건 Wald: θ̂={robust_res['theta_hat']:.3f}, "
f"z={robust_res['z']:.3f}, p={robust_res['pval']:.3f}")12 자유도의 직관
자유도 \(\nu = q - p\)를 직관적으로 이해하는 방법이 있다.
\(H_0\)는 \(q\)차원 파라미터 벡터에 \((q-p)\)개의 독립적 등식 제약을 부과한다. 각 독립적 제약이 카이제곱 분포에 자유도 1을 기여한다.
| 가설 | 제약 수 | 자유도 |
|---|---|---|
| \(p_1 = p_2 = p_3\) (5범주 다항) | \(q-p = 4-1 = 3\) | 3 |
| \(\mu = \mu_0\) (단변량) | \(q-p = 1-0 = 1\) | 1 |
| \((\mu, \sigma^2) = (\mu_0, \sigma^2_0)\) (정규) | \(q-p = 2-0 = 2\) | 2 |
| \(\mu_1 = \mu_2\) (이표본) | \(q-p = 2-1 = 1\) | 1 |
13 요약
| 항목 | 내용 |
|---|---|
| 핵심 결과 | \(-2\log\lambda(X) \xrightarrow{d} \chi^2_\nu\) (Theorem 10.3.1, 10.3.3) |
| 자유도 | \(\nu = \dim(\Theta) - \dim(\Theta_0) = q - p\) |
| 기각역 | \(-2\log\lambda(X) \geq \chi^2_{\nu, \alpha}\) |
| Wald 검정 | \(Z_n = (W_n - \theta_0)/S_n\), 비제약 MLE 표준오차 사용 |
| Score 검정 | \(Z_S = S(\theta_0)/\sqrt{I_n(\theta_0)}\), 귀무하의 파라미터 사용 |
| 세 검정 관계 | 점근적으로 동등; 유한 표본에서는 차이 존재 |
| 강건 검정 | M-추정량 + 분산 추정량 (10.3.6)으로 오염 분포에 견건한 검정 구성 |
14 전후 맥락
- 이전: M-추정량 — ρ 함수, 점근 정규성, 영향 함수
- 관련: LRT의 정확 이론 (Casella §8.2) — 소표본 정확 검정
- 다음: 점근 구간추정 — 신뢰구간의 점근 이론 (§10.4)