가설검정: 기타 대표본 검정들 (Other Large-Sample Tests)

Wald 검정 심화, Score 검정, Delta Method 확장, Huber 강건 검정 — Casella & Berger §10.3.2

점근 정규성에 기반한 대표본 검정들을 상세히 다룬다. Wald 검정의 단측·양측·다모수 확장, Score 검정의 완전 유도, 이항·포아송 예시 비교, Delta Method Wald 검정, Huber M-추정량 기반 강건 검정과 검정력 시뮬레이션 테이블을 포함한다.

Statistics
Hypothesis Testing
Asymptotic Theory
Robust Statistics
저자

Kwangmin Kim

공개

2026년 04월 05일

1 개요

이전 포스트에서 LRT의 점근 \(\chi^2\) 분포와 Wald·Score 검정의 개념을 소개했다. 이번 포스트는 §10.3.2 Other Large-Sample Tests의 내용을 심화한다.

핵심 질문: LRT 이외에 어떤 대표본 검정들이 있고, 언제 선택하는가?

LRT는 제약·비제약 두 최적화가 필요하다. 반면 Wald 검정은 비제약 MLE만, Score 검정은 귀무가설 제약 MLE만 필요하다. 세 검정은 점근적으로 동등하지만 유한 표본에서 미묘하게 다르다. 더 나아가, 분포 가정이 의심스러울 때는 M-추정량 기반 강건 검정이 유리하다.


2 점근 정규성에 기반한 검정 구조

\(\theta\)에 대한 추정량 \(W_n\)이 어떤 CLT에 의해

\[\frac{W_n - \theta}{\sigma_n} \xrightarrow{d} N(0,1)\]

을 만족한다고 하자. \(\sigma_n\)이 알려지면 그대로, 모르면 일치 추정량 \(S_n\)으로 대체한다. Slutsky 정리: \(\sigma_n/S_n \xrightarrow{p} 1\)이면

\[\frac{W_n - \theta}{S_n} \xrightarrow{d} N(0,1)\]

이 성립한다. 이것이 모든 대표본 검정의 기본 틀이다.


3 Wald 검정

3.1 정의와 기각역

\(H_0: \theta = \theta_0\) vs \(H_1: \theta \neq \theta_0\) (양측)에 대한 Wald 검정 통계량:

\[Z_n = \frac{W_n - \theta_0}{S_n}\]

  • \(W_n\): \(\theta\)의 추정량 (주로 MLE \(\hat\theta\))
  • \(S_n\): \(W_n\)의 표준오차 추정값

\(H_0\) 하에서 \(Z_n \xrightarrow{d} N(0,1)\)이므로

가설 유형 기각역
양측: \(H_1: \theta \neq \theta_0\) \(\|Z_n\| > z_{\alpha/2}\)
단측 (우측): \(H_1: \theta > \theta_0\) \(Z_n > z_\alpha\)
단측 (좌측): \(H_1: \theta < \theta_0\) \(Z_n < -z_\alpha\)

3.2 MLE 기반 표준오차 두 종류

\(W_n = \hat\theta\) (MLE)일 때 표준오차 선택지가 두 가지다.

기대 Fisher 정보 기반:

\[S_n^{(E)} = \frac{1}{\sqrt{I_n(\hat\theta)}}\]

여기서 \(I_n(\theta) = nI_1(\theta) = -n\,E_\theta\!\left[\frac{\partial^2}{\partial\theta^2}\log f(X|\theta)\right]\).

관측 Fisher 정보 기반:

\[S_n^{(O)} = \frac{1}{\sqrt{\hat{I}_n(\hat\theta)}}, \quad \hat{I}_n(\hat\theta) = -\frac{\partial^2}{\partial\theta^2}\log L(\theta|\mathbf{x})\bigg|_{\theta=\hat\theta}\]

두 선택지 모두 일치 추정이며, 관측 정보는 \(\hat\theta\) 한 점에서만 우도를 평가하므로 계산이 단순하다.

3.3 양측 검정의 점근 크기

\(H_0: \theta = \theta_0\)가 참이면

\[P_{\theta_0}(|Z_n| > z_{\alpha/2}) \xrightarrow{n \to \infty} P(|Z| > z_{\alpha/2}) = \alpha, \quad Z \sim N(0,1)\]

즉 점근적으로 제1종 오류 확률이 \(\alpha\)로 수렴한다.

3.4 단측 검정의 점근 검정력

\(H_1: \theta > \theta_0\), 실제 파라미터 값이 \(\theta \neq \theta_0\)인 경우:

\[Z_n = \frac{W_n - \theta_0}{S_n} = \underbrace{\frac{W_n - \theta}{S_n}}_{\to N(0,1)} + \underbrace{\frac{\theta - \theta_0}{S_n}}_{\to \pm\infty}\]

\(S_n = \text{Var}(W_n)^{1/2} \to 0\)이므로 두 번째 항이 발산한다.

  • \(\theta > \theta_0\): \(Z_n \to +\infty\) → 검정력 \(\to 1\)
  • \(\theta < \theta_0\): \(Z_n \to -\infty\) → 기각 확률 \(\to 0\)
  • \(\theta = \theta_0\): \(Z_n \to N(0,1)\) → 기각 확률 \(= \alpha\)

결론: 이 검정은 점근 크기 \(\alpha\), 점근 검정력 1을 달성한다.


4 Score 검정 (Lagrange Multiplier 검정)

4.1 Score 함수의 성질

Score 함수 (로그우도의 1차 도함수):

\[S(\theta) = \frac{\partial}{\partial\theta}\log f(X \mid \theta) = \frac{\partial}{\partial\theta}\log L(\theta \mid X)\]

두 가지 핵심 성질 (§7.3.8, §7.3.10):

\[E_\theta[S(\theta)] = 0 \tag{7.3.8}\]

\[\text{Var}_\theta[S(\theta)] = E_\theta\!\left[\left(\frac{\partial}{\partial\theta}\log L(\theta|X)\right)^2\right] = -E_\theta\!\left[\frac{\partial^2}{\partial\theta^2}\log L(\theta|X)\right] = I_n(\theta) \tag{7.3.10}\]

\(H_0: \theta = \theta_0\)가 참이면: - \(E_{\theta_0}[S(\theta_0)] = 0\) - \(\text{Var}_{\theta_0}[S(\theta_0)] = I_n(\theta_0)\)

4.2 Score 검정 통계량과 점근 분포

\[Z_S = \frac{S(\theta_0)}{\sqrt{I_n(\theta_0)}}\]

Theorem (Score 검정의 점근 정규성)

\(X_1, \ldots, X_n \overset{\text{iid}}{\sim} f(x|\theta)\)이고 정칙 조건이 성립할 때, \(H_0: \theta = \theta_0\) 하에서

\[Z_S = \frac{S(\theta_0)}{\sqrt{I_n(\theta_0)}} \xrightarrow{d} N(0,1)\]

증명 스케치:

\(S(\theta_0) = \sum_{i=1}^n \frac{\partial}{\partial\theta}\log f(X_i|\theta_0)\)는 평균 0, 분산 \(I_n(\theta_0) = nI_1(\theta_0)\)인 iid 합이다. CLT에 의해 \(S(\theta_0)/\sqrt{nI_1(\theta_0)} \xrightarrow{d} N(0,1)\). Theorem 10.1.12(MLE의 점근 정규성)에서 같은 결론이 따른다. \(\square\)

기각역: \(|Z_S| > z_{\alpha/2}\) (양측), \(Z_S > z_\alpha\) (단측).

4.3 Wald vs Score: 두 표준오차의 차이

검정 통계량 표준오차 분모 계산 포인트
Wald \((W_n - \theta_0)/S_n\) \(\hat\theta\) (추정값) 사용 비제약 MLE 필요
Score \(S(\theta_0)/\sqrt{I_n(\theta_0)}\) \(\theta_0\) (귀무) 사용 \(H_0\) 하에서만 평가

Score 검정의 장점: 비제약 MLE를 구하지 않아도 된다. 복합 귀무가설 \(H_0: \theta \in \Theta_0\)에서 제약 MLE \(\hat\theta_0\)만 필요하므로, 제약 최적화(Lagrange multiplier)로 해결한다. 이것이 “Lagrange multiplier 검정”이라 불리는 이유다.


5 예시 1: 이항분포 검정 (Example 10.3.5, 10.3.6)

5.1 설정

\(X_1, \ldots, X_n \overset{\text{iid}}{\sim} \text{Bernoulli}(p)\).

로그우도와 Score 함수:

\[\ell(p|\mathbf{x}) = \sum_{i=1}^n [x_i \log p + (1-x_i)\log(1-p)]\]

\[S(p) = \frac{\partial \ell}{\partial p} = \frac{\sum x_i}{p} - \frac{n - \sum x_i}{1-p} = \frac{n(\hat{p}_n - p)}{p(1-p)}\]

Fisher 정보:

\[I_n(p) = -E\!\left[\frac{\partial^2 \ell}{\partial p^2}\right] = -E\!\left[-\frac{\sum x_i}{p^2} - \frac{n - \sum x_i}{(1-p)^2}\right] = \frac{n}{p(1-p)}\]

5.2 단측 Wald 검정 (Example 10.3.5)

\(H_0: p \leq p_0\) vs \(H_1: p > p_0\).

MLE: \(\hat{p}_n = \bar{X}\). \((\hat{p}_n - p)/\sqrt{p(1-p)/n} \to N(0,1)\). \(p\)\(\hat{p}_n\)으로 추정하면 \(\sigma_n/S_n \xrightarrow{p} 1\)이므로

\[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{ 하에서})\]

기각역: \(Z_W > z_\alpha\).

관측 Fisher 정보 확인: \(1/I_n(\hat{p}_n) = \hat{p}_n(1-\hat{p}_n)/n\) — 같은 표준오차를 준다.

5.3 양측 Score 검정 (Example 10.3.6)

\(H_0: p = p_0\) vs \(H_1: p \neq p_0\).

\[Z_S = \frac{S(p_0)}{\sqrt{I_n(p_0)}} = \frac{\dfrac{n(\hat{p}_n - p_0)}{p_0(1-p_0)}}{\sqrt{\dfrac{n}{p_0(1-p_0)}}} = \frac{\hat{p}_n - p_0}{\sqrt{p_0(1-p_0)/n}} \tag{10.3.4}\]

분모에 \(p_0\)가 들어가고, Wald 검정 분모에는 \(\hat{p}_n\)이 들어간다는 점이 유일한 차이다.

5.4 두 검정 비교

Wald Score
표준오차 \(\sqrt{\hat{p}_n(1-\hat{p}_n)/n}\) \(\sqrt{p_0(1-p_0)/n}\)
기반 추정된 분산 귀무하의 분산
유한 표본 \(\hat{p}_n \approx p_0\)이면 거의 동일 \(p_0 = 0.5\)일 때 가장 크다

\(\hat{p}_n\)\(p_0\)에서 멀수록 두 검정의 통계량이 달라진다. 어느 검정이 더 강력한지는 \(p_0\)\(p_{\text{true}}\)에 따라 달라지며, 검정력 함수가 교차하는 지점이 존재한다 (Ghosh 1979).

5.5 연속성 수정 (Continuity Correction)

이항분포는 이산이므로 정규 근사에 연속성 수정을 적용하면 크기 유지가 개선된다.

\[Z_W^{cc} = \frac{|\hat{p}_n - p_0| - \frac{1}{2n}}{\sqrt{p_0(1-p_0)/n}}\]

연속성 수정된 검정은 보수적(conservative)이 되는 경향이 있어 실제 제1종 오류가 명목 수준 \(\alpha\) 이하를 유지한다.


6 예시 2: 포아송 단측 Wald 검정

\(X_1, \ldots, X_n \overset{\text{iid}}{\sim} \text{Poisson}(\lambda)\), \(H_0: \lambda \leq \lambda_0\) vs \(H_1: \lambda > \lambda_0\).

MLE: \(\hat\lambda = \bar{X}\).

Score 함수: \[S(\lambda) = \frac{\partial}{\partial\lambda}\sum_{i=1}^n(x_i\log\lambda - \lambda) = \frac{n(\hat\lambda - \lambda)}{\lambda}\]

Fisher 정보: \(I_n(\lambda) = n/\lambda\).

Wald 통계량 (MLE 기반):

\[Z_W = \frac{\hat\lambda - \lambda_0}{\sqrt{\hat\lambda/n}}\]

Score 통계량 (\(H_0\) 기반):

\[Z_S = \frac{\hat\lambda - \lambda_0}{\sqrt{\lambda_0/n}}\]

기각역 (\(H_1: \lambda > \lambda_0\)): \(Z > z_\alpha\).


7 Delta Method를 이용한 Wald 검정: 변환된 파라미터

7.1 배경

\(\hat\theta\)이 MLE이고 \(h(\theta)\)의 신뢰구간이나 검정이 필요할 때, Delta Method가 유용하다.

\[\sqrt{n}(h(\hat\theta) - h(\theta)) \xrightarrow{d} N\!\left(0, [h'(\theta)]^2 / I_1(\theta)\right)\]

추정된 분산 \(\widehat{\text{Var}}(h(\hat\theta)) \approx [h'(\hat\theta)]^2 / \hat{I}_n(\hat\theta)\)를 이용해 Wald 통계량을 구성한다.

7.2 예시: 이항 Odds 비

\(p \in (0,1)\)에서 \(h(p) = p/(1-p)\) (odds).

Delta Method 분산:

\[[h'(p)]^2 = \frac{1}{(1-p)^4}, \quad I_1(p) = \frac{1}{p(1-p)}\]

\[\text{Var}(h(\hat{p})) \approx \frac{1/(1-p)^4}{n/[p(1-p)]} = \frac{p(1-p)}{n(1-p)^4} \cdot \frac{1}{1} = \frac{p}{n(1-p)^3}\]

정확히는: \(\widehat{\text{Var}}(\hat{p}/(1-\hat{p})) = \hat{p}/[n(1-\hat{p})^3]\).

\(H_0: p/(1-p) = \text{odds}_0\) 검정:

\[Z_W = \frac{\hat{p}/(1-\hat{p}) - \text{odds}_0}{\sqrt{\hat{p}/[n(1-\hat{p})^3]}}\]

7.3 예시: 로그 오즈비 (Log-Odds)

\(h(p) = \log[p/(1-p)]\) (로짓 변환).

\[[h'(p)]^2 = \frac{1}{[p(1-p)]^2}, \quad \widehat{\text{Var}}(h(\hat{p})) = \frac{1}{n\hat{p}(1-\hat{p})}\]

이 표준오차는 로지스틱 회귀에서 로그 오즈비의 표준오차 공식과 동일하다.


8 다모수 Wald 검정

8.1 벡터 파라미터 설정

\(\theta = (\theta_1, \ldots, \theta_q)^\top\). \(H_0: \theta \in \Theta_0\) (\(p\)차원), 자유도 \(\nu = q - p\).

MLE \(\hat\theta\)의 점근 분포:

\[\sqrt{n}(\hat\theta - \theta) \xrightarrow{d} N_q(\mathbf{0},\, I(\theta)^{-1})\]

여기서 \(I(\theta)\)\(q \times q\) Fisher 정보 행렬.

선형 제약 \(H_0: A\theta = b\) (\(A\)\(r \times q\), rank \(r = \nu\))에 대한 Wald 통계량:

\[W_n = n(A\hat\theta - b)^\top [A\hat{I}_n(\hat\theta)^{-1}A^\top]^{-1}(A\hat\theta - b) \xrightarrow{d} \chi^2_\nu\]

LRT와 같은 자유도를 가지며 점근적으로 동등하다.

8.2 포아송 회귀 예시

\(Y_i \sim \text{Poisson}(\exp(\mathbf{x}_i^\top\beta))\). \(H_0: \beta_j = 0\) (단일 계수 검정):

\[Z_j = \frac{\hat\beta_j}{\text{SE}(\hat\beta_j)} \xrightarrow{d} N(0,1)\]

\(H_0: \beta_2 = \beta_3 = 0\) (두 계수 동시 검정, \(\nu = 2\)):

\[W_n = \hat\beta_{(2)}^\top \widehat{\text{Cov}}(\hat\beta_{(2)})^{-1} \hat\beta_{(2)} \xrightarrow{d} \chi^2_2\]


9 Huber M-추정량 기반 강건 Wald 검정 (Example 10.3.7)

9.1 동기

정규 가정이 의심스러울 때 MLE 기반 Wald 검정은 분포 오지정(misspecification)에 취약하다. M-추정량 \(\hat\theta_M\)이 점근적으로

\[\sqrt{n}(\hat\theta_M - \theta_0) \xrightarrow{d} N\!\left(0, V(\theta_0)\right), \quad V(\theta_0) = \frac{E[\psi(X-\theta_0)^2]}{[E\psi'(X-\theta_0)]^2}\]

을 만족하므로, 이를 이용한 검정을 구성할 수 있다.

9.2 Huber M-추정량의 점근 분산

\(f(x|\theta) = f(x-\theta)\) (위치 모형), Huber \(\rho\) 함수:

\[\rho_k(u) = \begin{cases} \frac{1}{2}u^2 & |u| \leq k \\ k|u| - \frac{1}{2}k^2 & |u| > k \end{cases}, \quad \psi_k(u) = \rho_k'(u) = \begin{cases} u & |u| \leq k \\ k\,\text{sign}(u) & |u| > k \end{cases}\]

점근 분산 공식 (10.3.7):

\[V_k(\theta_0) = \frac{\displaystyle\int_{-k}^{k} x^2 f(x)\,dx + k^2 P_0(|X| > k)}{[P_0(|X| \leq k)]^2} \tag{10.3.7}\]

이 공식은 분포 \(f\)를 알 때 사용한다.

9.3 분산의 표본 추정량 세 종류

추정량 1 (10.3.6): ψ 함수 직접 사용

\[\widehat{V}_1(\hat\theta_M) = \frac{\frac{1}{n}\sum_{i=1}^n[\psi_k(x_i - \hat\theta_M)]^2}{\left[\frac{1}{n}\sum_{i=1}^n\psi_k'(x_i - \hat\theta_M)\right]^2} \tag{10.3.6}\]

추정량 2 (10.3.8): (10.3.7)의 표본 대응

\[\widehat{V}_2(\hat\theta_M) = \frac{\frac{1}{n}\sum_{i=1}^n(x_i - \hat\theta_M)^2 \cdot \mathbf{1}(|x_i - \hat\theta_M| < k) + k^2 \cdot \frac{1}{n}\sum_{i=1}^n\mathbf{1}(|x_i - \hat\theta_M| > k)}{\left[1 - \frac{1}{n}\sum_{i=1}^n\mathbf{1}(|x_i - \hat\theta_M| < k)\right]^2} \tag{10.3.8}\]

추정량 3 (10.3.9): 단순 표본 분산

\[\widehat{V}_3(\hat\theta_M) = \frac{1}{n}\sum_{i=1}^n(x_i - \hat\theta_M)^2 \tag{10.3.9}\]

검정 통계량:

\[Z_{GW} = \sqrt{n}\,\frac{\hat\theta_M - \theta_0}{\sqrt{\widehat{V}_2(\hat\theta_M)}}, \quad Z_N = \sqrt{n}\,\frac{\hat\theta_M - \theta_0}{\sqrt{\widehat{V}_3(\hat\theta_M)}}\]

9.4 Table 10.3.1: 검정력 시뮬레이션

\(n = 15\), 명목 수준 \(\alpha = 0.1\), \(10{,}000\)회 반복. \(k = 1.345\) (Huber 95% 효율 설정), \(\sigma = 1\) (각 분포의 표준편도로 정규화).

\(\theta\) Normal \(Z_{GW}\) Normal \(Z_N\) \(t_5\) \(Z_{GW}\) \(t_5\) \(Z_N\) Logistic \(Z_{GW}\) Logistic \(Z_N\) DE \(Z_{GW}\) DE \(Z_N\)
\(\theta_0\) .16 .16 .14 .13 .15 .15 .11 .09
\(\theta_0 + 0.25\sigma\) .27 .29 .29 .27 .27 .27 .31 .26
\(\theta_0 + 0.5\sigma\) .58 .60 .65 .63 .59 .60 .70 .64
\(\theta_0 + 0.75\sigma\) .85 .87 .89 .89 .85 .87 .92 .90
\(\theta_0 + 1.0\sigma\) .96 .97 .98 .97 .96 .97 .98 .98
\(\theta_0 + 2.0\sigma\) 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0

해석: - 명목 크기 \(\alpha = 0.1\)인데 \(\theta_0\)에서 실제 크기가 0.11-0.16. \(z_{\alpha/2}\) 임계값이 분산 추정 불확실성을 보정하지 않아 실제 크기가 팽창한다. - Double Exponential(라플라스)에서 \(Z_{GW}\)\(Z_N\)보다 일관되게 우월하다. Huber 추정량이 지수형 꼬리 분포에 대한 최적성을 가지기 때문이다 (Huber 1981, Ch.4). - 정규 분포에서는 \(Z_{GW}\)\(Z_N\)이 거의 동일하다. Huber 분산 추정량이 불필요한 복잡성을 추가할 뿐이다.

실무 함의: 분포 모양을 모를 때는 \(\widehat{V}_2\) (추정량 2) 기반 \(Z_{GW}\)가 안정적 선택이다.


10 세 검정의 점근 동등성

LRT, Wald, Score 세 검정의 관계를 정리한다.

10.1 단순 \(H_0\)에서의 관계

\(H_0: \theta = \theta_0\)에서:

LRT (Theorem 10.3.1): \[-2\log\lambda(X) \approx \hat{I}_n(\hat\theta)(\hat\theta - \theta_0)^2 = \left(\frac{\hat\theta - \theta_0}{1/\sqrt{\hat{I}_n(\hat\theta)}}\right)^2 = Z_W^2\]

Score (Taylor 전개): \[Z_S^2 = \frac{[S(\theta_0)]^2}{I_n(\theta_0)} \approx \frac{[S(\hat\theta) + S'(\hat\theta)(\theta_0 - \hat\theta)]^2}{I_n(\theta_0)}\]

\(S(\hat\theta) = 0\)이고 \(S'(\hat\theta) = \ell''(\hat\theta|x) = -\hat{I}_n(\hat\theta)\)를 이용하면

\[Z_S^2 \approx \frac{\hat{I}_n(\hat\theta)^2(\theta_0 - \hat\theta)^2}{I_n(\theta_0)} \approx \hat{I}_n(\hat\theta)(\hat\theta - \theta_0)^2 = Z_W^2\]

따라서 \(n \to \infty\)에서

\[-2\log\lambda(X) \approx Z_W^2 \approx Z_S^2\]

모두 \(\chi^2_1\)으로 수렴한다.

10.2 유한 표본 비교

유한 표본에서 세 통계량은 일반적으로 순서 관계를 갖는다. Bernoulli 예시에서 \(p_0 = 0.5\), \(\hat{p} = 0.7\), \(n = 20\):

검정 통계량 값 p-value
LRT \(2[0.7\log(0.7/0.5) + 0.3\log(0.3/0.5)] \cdot 20\) 약 0.07
Wald \((0.7-0.5)^2 / [0.7 \cdot 0.3 / 20]\) 약 0.06
Score \((0.7-0.5)^2 / [0.5 \cdot 0.5 / 20]\) 약 0.07

일반적으로 \(|T_{LRT}|\)는 Wald와 Score 사이에 위치한다.


11 복합 귀무가설 확장

\(H_0: \theta \in \Theta_0\) (복합)에서 Score 검정은 제약 MLE \(\hat\theta_0\)를 사용한다.

\[Z_S = \frac{S(\hat\theta_0)}{\sqrt{I_n(\hat\theta_0)}} \quad \text{(스칼라 경우)}\]

벡터 경우 (\(\nu = q-p\) 자유도):

\[T_S = S(\hat\theta_0)^\top [I_n(\hat\theta_0)]^{-1} S(\hat\theta_0) \xrightarrow{d} \chi^2_\nu\]

여기서 \(S(\hat\theta_0) = \nabla_\theta \log L(\theta|\mathbf{x})|_{\theta=\hat\theta_0}\)는 제약 MLE에서의 기울기 벡터다. 제약 최대화에서 기울기는 0이 아니라 라그랑주 승수 벡터와 방향이 같다. 이것이 Lagrange multiplier 검정이라는 이름의 유래다.


12 Python 구현

12.1 포아송: 세 검정 완전 비교

import numpy as np
from scipy import stats

def poisson_three_tests(data, lambda_0):
    """
    포아송 모형에서 H0: lambda = lambda_0 vs H1: lambda != lambda_0

    LRT, Wald, Score 세 검정 결과 반환
    """
    n = len(data)
    lam_hat = np.mean(data)

    # --- LRT ---
    lrt_stat = 2 * n * ((lambda_0 - lam_hat) - lam_hat * np.log(lambda_0 / lam_hat))
    lrt_pval = 1 - stats.chi2.cdf(lrt_stat, df=1)

    # --- Wald (MLE 기반 표준오차) ---
    # Var(lambda_hat) = lambda/n → SE = sqrt(lambda_hat/n)
    se_wald = np.sqrt(lam_hat / n)
    z_wald = (lam_hat - lambda_0) / se_wald
    wald_pval = 2 * (1 - stats.norm.cdf(abs(z_wald)))

    # --- Score (귀무 기반 표준오차) ---
    se_score = np.sqrt(lambda_0 / n)
    z_score = (lam_hat - lambda_0) / se_score
    score_pval = 2 * (1 - stats.norm.cdf(abs(z_score)))

    return {
        "lambda_hat": lam_hat,
        "LRT":   {"stat": lrt_stat,   "pval": lrt_pval,   "df": 1},
        "Wald":  {"stat": z_wald**2,  "pval": wald_pval,  "z": z_wald},
        "Score": {"stat": z_score**2, "pval": score_pval, "z": z_score},
    }


# 예시: 참값 lambda=5, H0: lambda=5 (참인 경우)
np.random.seed(42)
data = np.random.poisson(5, size=50)
result = poisson_three_tests(data, lambda_0=5.0)
print(f"λ̂ = {result['lambda_hat']:.3f}")
for test in ["LRT", "Wald", "Score"]:
    r = result[test]
    print(f"  {test}: stat={r['stat']:.3f}, p={r['pval']:.3f}")

12.2 이항분포: Wald vs Score vs 연속성 수정

import numpy as np
from scipy import stats

def binomial_tests(x, n, p0, continuity=True):
    """
    이항 모형에서 H0: p = p0 vs H1: p != p0

    Args:
        x: 성공 횟수
        n: 총 시행 수
        p0: 귀무 확률
        continuity: True이면 연속성 수정 Score 검정 추가

    Returns:
        dict: 검정 통계량과 p-value
    """
    p_hat = x / n

    # LRT (G-통계량)
    if 0 < p_hat < 1:
        lrt = 2 * (x * np.log(p_hat / p0) + (n - x) * np.log((1 - p_hat) / (1 - p0)))
    else:
        lrt = np.inf
    lrt_pval = 1 - stats.chi2.cdf(lrt, df=1)

    # Wald
    se_w = np.sqrt(p_hat * (1 - p_hat) / n)
    z_w = (p_hat - p0) / se_w
    wald_pval = 2 * (1 - stats.norm.cdf(abs(z_w)))

    # Score (Wilson)
    se_s = np.sqrt(p0 * (1 - p0) / n)
    z_s = (p_hat - p0) / se_s
    score_pval = 2 * (1 - stats.norm.cdf(abs(z_s)))

    res = {
        "p_hat": p_hat,
        "LRT":   {"stat": lrt,    "pval": lrt_pval},
        "Wald":  {"stat": z_w**2, "pval": wald_pval},
        "Score": {"stat": z_s**2, "pval": score_pval},
    }

    if continuity:
        # 연속성 수정 Score 검정
        z_cc = (abs(p_hat - p0) - 0.5 / n) / se_s
        cc_pval = 2 * (1 - stats.norm.cdf(z_cc))
        res["Score_CC"] = {"stat": z_cc**2, "pval": cc_pval}

    return res


# H0: p=0.5가 참일 때와 아닐 때 비교
for p_true, label in [(0.5, "H0 참"), (0.7, "H0 거짓")]:
    np.random.seed(0)
    x = np.random.binomial(50, p_true)
    res = binomial_tests(x, n=50, p0=0.5)
    print(f"\n{label}: x={x}, p̂={res['p_hat']:.2f}")
    for t in ["LRT", "Wald", "Score", "Score_CC"]:
        r = res[t]
        print(f"  {t}: stat={r['stat']:.3f}, p={r['pval']:.3f}")

12.3 Delta Method Wald 검정: 오즈비

import numpy as np
from scipy import stats

def odds_wald_test(x, n, odds0):
    """
    H0: p/(1-p) = odds0 에 대한 Delta Method Wald 검정

    delta method: h(p) = p/(1-p), h'(p) = 1/(1-p)^2
    Var(h(p_hat)) ≈ [h'(p_hat)]^2 * Var(p_hat)
                  = 1/(1-p_hat)^4 * p_hat(1-p_hat)/n
                  = p_hat / [n*(1-p_hat)^3]
    """
    p_hat = x / n
    odds_hat = p_hat / (1 - p_hat)

    # Delta Method 표준오차
    se = np.sqrt(p_hat / (n * (1 - p_hat) ** 3))
    z = (odds_hat - odds0) / se
    pval = 2 * (1 - stats.norm.cdf(abs(z)))

    return {"odds_hat": odds_hat, "se": se, "z": z, "pval": pval}


# H0: odds = 1 (p = 0.5)
np.random.seed(10)
x = np.random.binomial(100, 0.6)
res = odds_wald_test(x, n=100, odds0=1.0)
print(f"x={x}, odds_hat={res['odds_hat']:.3f}, SE={res['se']:.3f}")
print(f"H0: odds=1 → z={res['z']:.3f}, p={res['pval']:.3f}")

12.4 다모수 Wald 검정 (벡터)

import numpy as np
from scipy import stats

def multiparameter_wald(theta_hat, cov_hat, A, b):
    """
    H0: A @ theta = b 에 대한 Wald 검정
    W = n*(A@theta_hat - b)^T * [A @ cov_hat @ A^T]^{-1} * (A@theta_hat - b)
    이미 n이 cov_hat에 반영된 경우 (cov_hat = Cov(sqrt(n)*theta_hat) / n)

    Args:
        theta_hat: 추정된 파라미터 벡터 (q,)
        cov_hat: 추정 공분산 행렬 (q, q) — n이 제거된 버전
        A: 제약 행렬 (r, q)
        b: 제약 벡터 (r,)
    """
    A = np.array(A)
    b = np.array(b)
    diff = A @ theta_hat - b
    ACA = A @ cov_hat @ A.T
    W = diff @ np.linalg.solve(ACA, diff)
    df = A.shape[0]
    pval = 1 - stats.chi2.cdf(W, df=df)
    return {"W": W, "df": df, "pval": pval}


# 예시: 포아송 회귀 계수 H0: beta_1=0, beta_2=0
# 가상의 추정값과 공분산
np.random.seed(5)
theta_hat = np.array([1.2, 0.05, -0.03])  # [intercept, beta1, beta2]
# 가상 공분산 (diagonal)
cov_hat = np.diag([0.04, 0.01, 0.01])

# H0: beta_1 = 0 and beta_2 = 0 (ν=2)
A = np.array([[0, 1, 0],
              [0, 0, 1]])
b = np.array([0.0, 0.0])

result = multiparameter_wald(theta_hat, cov_hat, A, b)
print(f"Wald W = {result['W']:.3f}, df = {result['df']}, p = {result['pval']:.3f}")

12.5 Huber 강건 Wald 검정: 분산 추정량 세 종류 비교

import numpy as np
from scipy import stats

def huber_psi(r, k=1.345):
    return np.where(np.abs(r) <= k, r, k * np.sign(r))

def huber_psi_prime(r, k=1.345):
    return (np.abs(r) <= k).astype(float)

def huber_m_est(data, k=1.345, tol=1e-8, max_iter=500):
    """IRLS로 Huber M-추정량 계산"""
    theta = np.median(data)
    for _ in range(max_iter):
        r = data - theta
        w = huber_psi(r, k) / np.where(r == 0, 1e-10, r)
        theta_new = np.average(data, weights=w)
        if abs(theta_new - theta) < tol:
            return theta_new
        theta = theta_new
    return theta

def var_est_1(data, theta_hat, k=1.345):
    """추정량 1: ψ 직접 사용 (10.3.6)"""
    r = data - theta_hat
    psi = huber_psi(r, k)
    dpsi = huber_psi_prime(r, k)
    return np.mean(psi**2) / np.mean(dpsi)**2

def var_est_2(data, theta_hat, k=1.345):
    """추정량 2: (10.3.8)"""
    r = data - theta_hat
    inside = np.abs(r) < k
    outside = ~inside
    num = np.mean(r**2 * inside) + k**2 * np.mean(outside)
    den = (1 - np.mean(inside))**2 if np.mean(inside) < 1 else 1e-10
    return num / den

def var_est_3(data, theta_hat):
    """추정량 3: 단순 분산 (10.3.9)"""
    return np.mean((data - theta_hat)**2)

def huber_robust_test(data, theta0, k=1.345):
    n = len(data)
    theta_hat = huber_m_est(data, k)

    v1 = var_est_1(data, theta_hat, k)
    v2 = var_est_2(data, theta_hat, k)
    v3 = var_est_3(data, theta_hat)

    results = {}
    for label, v in [("V1 (10.3.6)", v1), ("V2 (10.3.8)", v2), ("V3 (10.3.9)", v3)]:
        se = np.sqrt(v / n)
        z = (theta_hat - theta0) / se
        p = 2 * (1 - stats.norm.cdf(abs(z)))
        results[label] = {"z": z, "pval": p}

    return theta_hat, results


# H0: theta=0 (참), 이중지수 분포 (라플라스)
np.random.seed(123)
data_de = np.random.laplace(loc=0, scale=1, size=100)
theta_hat, res = huber_robust_test(data_de, theta0=0.0)
print(f"Double Exponential, θ̂ = {theta_hat:.3f}")
for label, r in res.items():
    print(f"  {label}: z={r['z']:.3f}, p={r['pval']:.3f}")

12.6 Table 10.3.1 재현: 검정력 시뮬레이션

import numpy as np
from scipy import stats

def simulate_power(dist_name, theta0, delta, n=15, k=1.345, B=10_000, alpha=0.1):
    """
    각 분포에서 H0: theta=theta0 vs H1: theta=theta0+delta 검정력 시뮬레이션

    Z_GW: 분산 추정량 2 (10.3.8) 사용
    Z_N: 분산 추정량 3 (단순 분산) 사용
    """
    sigma = 1.0  # 정규화된 척도

    rej_gw, rej_n = 0, 0
    cutoff = stats.norm.ppf(1 - alpha / 2)

    for _ in range(B):
        # 분포별 표본 생성
        if dist_name == "normal":
            data = np.random.normal(delta, sigma, n)
        elif dist_name == "t5":
            data = np.random.standard_t(5, n) / np.sqrt(5/3) + delta
        elif dist_name == "logistic":
            data = np.random.logistic(delta, np.sqrt(3)/np.pi, n)
        elif dist_name == "double_exp":
            data = np.random.laplace(delta, 1/np.sqrt(2), n)

        theta_hat = huber_m_est(data, k)

        v2 = var_est_2(data, theta_hat, k)
        v3 = var_est_3(data, theta_hat)

        z_gw = (theta_hat - theta0) / np.sqrt(v2 / n)
        z_n  = (theta_hat - theta0) / np.sqrt(v3 / n)

        if abs(z_gw) > cutoff:
            rej_gw += 1
        if abs(z_n) > cutoff:
            rej_n += 1

    return rej_gw / B, rej_n / B


# Table 10.3.1 재현
distributions = ["normal", "t5", "logistic", "double_exp"]
deltas = [0, 0.25, 0.5, 0.75, 1.0, 2.0]

print("Table 10.3.1 재현 (n=15, alpha=0.1)")
print(f"{'delta/sigma':>12}", end="")
for d in distributions:
    print(f"  {d:>8} ZGW | ZN", end="")
print()

for delta in deltas:
    print(f"  theta0+{delta:.2f}σ", end="")
    for dist in distributions:
        pgw, pn = simulate_power(dist, theta0=0, delta=delta)
        print(f"   {pgw:.2f}  {pn:.2f}", end="")
    print()

13 실무 선택 지침

세 검정과 강건 검정 중 어느 것을 선택할지는 상황에 따라 다르다.

상황 권장 검정
분포 가정 확신, 표준오차 계산 쉬움 Wald
제약 MLE가 쉽고 비제약 MLE가 어려움 Score
복잡한 제약 구조, 이론적 타당성 중시 LRT
분포 의심, 이상치 존재 가능 Huber 강건 Wald (\(Z_{GW}\))
소표본 이항 데이터 Score + 연속성 수정
변환된 파라미터 검정 Delta Method Wald

14 요약

검정 통계량 귀무 분포 특징
LRT \(-2\log\lambda(X) \to \chi^2_\nu\) 비제약+제약 MLE 모두 이론적 효율
Wald \(Z_n = (W_n - \theta_0)/S_n \to N(0,1)\) 비제약 MLE만 직관적, 다용도
Score \(Z_S = S(\theta_0)/\sqrt{I_n(\theta_0)} \to N(0,1)\) 제약 MLE만 복합 \(H_0\) 유리
Delta Method Wald \((h(\hat\theta) - h(\theta_0))/\text{SE} \to N(0,1)\) 비제약 MLE + 미분 변환 파라미터
다모수 Wald \(W_n = n(\cdot)^\top[\cdot]^{-1}(\cdot) \to \chi^2_\nu\) MLE 공분산 필요 벡터 파라미터
강건 Wald (\(Z_{GW}\)) M-추정량 + (10.3.8) 분산 이상치에 견건 분포 불확실할 때

15 전후 맥락

  • 이전: 가설검정: LRT의 점근 분포 — LRT \(\chi^2\) 수렴, 기본 Wald·Score 소개
  • 다음: 점근 구간추정 (§10.4) — 신뢰구간의 점근 이론, MLE 기반 신뢰구간
  • 관련: M-추정량 — ψ 함수, 점근 분산, 영향함수

Subscribe

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