가설검정: LRT의 점근 분포 (Asymptotic Distribution of LRTs)

카이제곱 근사, Wald 검정, Score 검정 — Casella & Berger §10.3

우도비검정 통계량 -2log λ(X)의 점근 카이제곱 분포 (Theorem 10.3.1, 10.3.3), Wald 검정과 Score 검정의 점근 동등성, 다항분포·포아송·이항 예시를 통한 세 검정의 비교를 다룬다.

Statistics
Hypothesis Testing
Asymptotic Theory
저자

Kwangmin Kim

공개

2026년 04월 05일

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 (단순 귀무가설)

힌트

Theorem 10.3.1 (Casella & Berger, p.489)

\(H_0: \theta = \theta_0\) vs \(H_1: \theta \neq \theta_0\) 를 검정하기 위해 \(X_1, \ldots, X_n \overset{\text{iid}}{\sim} f(x \mid \theta)\) 이고, \(\hat\theta\)\(\theta\)의 MLE이며, \(f(x \mid \theta)\)가 Miscellanea 10.6.2의 정칙 조건을 만족한다고 하자. \(H_0\) 하에서 \(n \to \infty\)이면

\[-2\log\lambda(X) \xrightarrow{d} \chi^2_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 (복합 귀무가설)

단일 파라미터가 아닌 파라미터 벡터에 대한 가설을 검정할 때 일반화가 필요하다.

힌트

Theorem 10.3.3 (Casella & Berger, p.491)

\(X_1, \ldots, X_n\)\(f(x \mid \theta)\)로부터의 확률 표본이고, Miscellanea 10.6.2의 정칙 조건이 성립할 때, \(\theta \in \Theta_0\)이면

\[-2\log\lambda(X) \xrightarrow{d} \chi^2_\nu\]

여기서 자유도 \(\nu\)\(\theta \in \Theta\)에서 지정되는 자유 파라미터 수와 \(\theta \in \Theta_0\)에서 지정되는 자유 파라미터 수의 차이다.

자유도 계산의 원칙

\(\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 전후 맥락

Subscribe

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