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-추정량 — ψ 함수, 점근 분산, 영향함수