Table of Contents
Wald検定
$\beta_j =0$の仮説検定はしばしばt-testを用いて実施されますが, ここでは$\beta_1 = 0$ かつ $\beta_2 = 0$という複合仮説を検定する手法のWald検定を紹介します.
問題設定
- $(Y_i, \bold X_i)$はi.i.d
-
$E[\epsilon_i \bold X_i]=0$ - $\mathbb E[Y_i]<\infty, \mathbb E[|\bold X_i|]<\infty$
- $rank(\bold X_i)=k+1$, full rank
という仮定が満たされているとき,
\[Y_i = \sum_j X_{ij}\beta_j + e_i\]という推定式のもとで次のような帰無仮説・対立仮説を考えます.
\[\begin{align*} H_0: \bold r(\beta) &= \bold 0\\ H_1: \bold r(\beta) &\neq \bold 0 \end{align*}\]ただし, $\bold r:\mathbb R^{k+1}\to \mathbb R^q$のベクトル関数, $q < k+1$とします.
Wald検定のIntuition
Wald検定は帰無仮説が仮に正しいならば$\bold r(\hat\beta) = \bold 0$が成り立つはずなので
- $|\bold r(\hat\beta)|^2$が大きな値を取るならば棄却すれば良い
- 大きいという理由で棄却するためには$|\bold r(\hat\beta)|^2$が従う分布がわかれば良い
- $\hat\beta$の漸近分布がわかるならば, $|\bold r(\hat\beta)|^2$が従う漸近分布はDelta Methodで計算できるはず
- Delta Methodで計算した漸近分布に基づき検定しよう
というアイデアに基づいています. そんな訳で次に, OLS推定量 $\hat\beta$の漸近分布のおさらいをまずします.
OLS推定量 $\hat\beta$の漸近分布
OLS推定量は
\[\begin{align*} \hat\beta &= (X'X)^{-1}(X'Y)\\ &= \beta + (X'X)^{-1}(X'\epsilon) \end{align*}\]これを式変形すると
\[\sqrt{n}(\hat\beta - \beta) = \left(\frac{1}{n}X'X\right)^{-1}\frac{1}{\sqrt{n}}X'\epsilon\]従って, 漸近分布は
\[\begin{align*} &\sqrt{n}(\hat\beta - \beta)\xrightarrow[\text{d}]{}N(\bold 0, \bold V)\\ &V = \mathbb E[X'X]^{-1}\mathbb E[X'\epsilon\epsilon'X]\mathbb E[X'X]^{-1} \end{align*}\]これを標本対応で置き換えると
\[\begin{align*} &\hat V = \left(\frac{1}{n}X'X\right)^{-1}\frac{1}{n}X'\Sigma X\left(\frac{1}{n}X'X\right)^{-1}\\ &\text{where }\Sigma = \text{diag}(e_1^2, e_2^2, \cdots, e_n^2) \because \text{ the assumption of no autocorrelation} \end{align*}\]従って, OLS推定量 $\hat\beta$の仮説検定上の漸近分布は
\[\sqrt{n}(\hat\beta - \beta)\xrightarrow[\text{d}]{}N(\bold 0, \hat{\bold V})\]Wald検定統計量の漸近分布
ここでのゴールは
\[\begin{align*} W_n &= n\bold r(\beta)'(\hat{\bold R}\hat{\bold V}\hat{\bold R}')^{-1}r(\beta)\xrightarrow[d]{}\chi_q\\ \text{where } \hat{\bold R} &= \left.\frac{\partial\bold r(b)}{\partial b'}\right|_{b=\hat\beta} \end{align*}\]を導出することです.
導出
まずDelta Methodより${\bold R} = \frac{\partial\bold r(b)}{\partial b’}$とすると
\[\sqrt{n}\bold r(\hat\beta) \xrightarrow[d]{} N(0, {\bold R}{\bold V}{\bold R}') \ \ \because \bold r(\beta)=0 \text{ under } H_0\]$\hat{\bold R}\hat{\bold V}\hat{\bold R}’$は$\bold r(\hat\beta)$の漸近分散共分散行列の一致推定量なのでスラツキー定理より
\[\sqrt{n}[\hat{\bold R}\hat{\bold V}\hat{\bold R}']^{-1/2}\bold r(\hat\beta) \xrightarrow[d]{} N(0,I_q)\]従って,
\[W_n \xrightarrow[d]{}\chi^2_q\]PythonでWald検定をやってみよう
Library
1
2
3
4
5
import pandas as pd
import numpy as np
from scipy import stats
import statsmodels.formula.api as smf
import statsmodels.api as sm
関数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def compute_ols(y, X):
beta_ols = np.linalg.solve(X.T @ X, X.T @ y)
residual = (y - X @ beta_ols)
inv_x = np.linalg.inv(X.T @ X)
white_v = len(y) * inv_x @ (X.T @ np.diag(residual ** 2) @ X) @ inv_x
return beta_ols, white_v
def compute_waldstatistics(n, beta, white_v, gradient_func, constraint_func, degree_of_freedom):
RHS = constraint_func(beta)
LHS = RHS.T
R = gradient_func(beta)
inv_mat = np.linalg.inv(R @ white_v @ R.T)
wald_stats = n * (LHS @ inv_mat @ RHS)
return wald_stats, stats.chi2.sf(wald_stats, degree_of_freedom)
実行
1
2
3
4
5
6
7
8
9
10
11
df = pd.read_csv("https://raw.githubusercontent.com/spring-haru/wooldridge/master/raw_data/data_csv/hprice2.csv")
df = df.dropna()
y = np.log(df['price'].values)
df['const'] = 1
df['room_squared'] = df['rooms'] ** 2
df['nox'] = np.log(df['nox'])
df['dist'] = np.log(df['dist'])
X = np.asarray(df[['const', 'nox', 'dist', 'rooms', 'room_squared']])
res_stats = sm.OLS(y, X).fit(cov_type='HC0')
beta, v = compute_ols(y, X)
statsmodelsと個人実装のOLS paramsと漸近分散共分散の比較
1
2
3
4
print(np.allclose(res_stats.params, beta))
print(np.allclose(res_stats.cov_HC0, v/len(y)))
>>> True
>>> True
statsmodelsベースのwald統計量
1
2
3
4
5
6
7
x_vars = res_stats.summary2().tables[1].index
wald_str = ' = '.join(list(x_vars[-4:])) + ' = 0'
print(res_stats.wald_test(r_matrix=wald_str, use_f=False, scalar=True)) # joint test
print(wald_str)
>>> <Wald test (chi2): statistic=546.1084114572402, p-value=7.110524920931534e-117, df_denom=4>
>>> x1 = x2 = x3 = x4 = 0
個人実装のwald統計量
1
2
3
4
5
6
7
8
9
10
11
12
13
beta, v = compute_ols(y, X)
def grandient(x):
R = np.array([[0, 1, 0, 0, 0],[0, 0, 1, 0, 0],[0, 0, 0, 1, 0], [0, 0, 0, 0, 1]])
return R
def constraint(x):
R = np.array([[0, 1, 0, 0, 0],[0, 0, 1, 0, 0],[0, 0, 0, 1, 0], [0, 0, 0, 0, 1]])
return R @ x
wald = compute_waldstatistics(n=len(y), beta=beta, white_v=v, gradient_func=grandient, constraint_func=constraint, degree_of_freedom=4)
print(wald)
>>> 546.1084114535796, 7.110524933898384e-117
Appendix: Delta Method
久保川先生の「現代数理統計学の基礎」を参考にしています.
定理
確率変数の列 ${X_n}_{n=1,2,\cdots}$について, 定数$\theta$と$a_n\to\infty$となる数列に対して
\[a_n(X_n-\theta)\xrightarrow[\text{d}]{} X\]であると仮定する. 連続微分可能な関数$g(\cdot)$について、点$\theta$で$g’(\theta)$が存在し
\[g'(\theta)\neq 0\]を仮定する. このとき
\[a_n(g(X_n)-g(\theta))\xrightarrow[\text{d}]{} g'(\theta)X\]が成り立つ。
Proof
$g(X_n)$を$X_n=\theta$の周りでテイラー展開すると
\[g(X_n)=g(\theta)+g'(\theta^{*})(X_n-\theta), \text{ where } |\theta^{*}-\theta|<|X_n-\theta|\]これを変形し,
\[a_n(g(X_n)-g(\theta))=a_ng'(\theta^{*})(X_n-\theta)\]スラツキーの定理より
\[\frac{1}{a_n}a_n(X_n-\theta)\xrightarrow[\text{d}]{} 0\cdot X=0\]これは定数収束を意味しているので以下の確率収束を得る
\[\begin{align*} (X_n-\theta)&\xrightarrow[\text{p}]{} 0\\ X_n&\xrightarrow[\text{p}]{}\theta \end{align*}\]このことは$ | \theta^{*}-\theta | < | X_n-\theta | $より |
従って, 「連続微分可能な関数$g(\cdot)$」という仮定より
\[g'(\theta^{*})a_n(X_n-\theta)\xrightarrow[\text{d}]{}g'(\theta)X\]References
(注意:GitHub Accountが必要となります)