回帰分析のロバストなt検定
線形回帰分析では、誤差項が均一分散であることが仮定されている。
誤差項が不均一分散であるとき、標準誤差に誤りが生じる。
誤差項が不均一分散の線形回帰分析では、誤った標準誤差から、回帰係数のt値を求めることになる。
ロバストな標準誤差
不均一分散一致標準誤差(heteroskedasticity consistent standard error)
$$
\begin{aligned} v_{\mathrm{HCE}}\left[\widehat{\beta}_{\mathrm{OLS}}\right] &=\frac{1}{n}\left(\frac{1}{n} \sum_{i} X_{i} X_{i}^{\prime}\right)^{-1}\left(\frac{1}{n} \sum_{i} X_{i} X_{i}^{\prime} \widehat{u}_{i}^{2}\right)\left(\frac{1}{n} \sum_{i} X_{i} X_{i}^{\prime}\right)^{-1} \\ &=\left(\mathrm{X}^{\prime} \mathrm{X}\right)^{-1}\left(\mathrm{X}^{\prime} \operatorname{diag}\left(\widehat{u}_{1}^{2}, \ldots, \widehat{u}_{n}^{2}\right) \mathrm{X}\right)\left(\mathrm{X}^{\prime} \mathrm{X}\right)^{-1} \end{aligned}
$$
引用:https://en.wikipedia.org/wiki/Heteroscedasticity-consistent_standard_errors
memo
$$
HC_{se} = \sqrt{\frac{\sum{\{(X_i – \bar{X}) ^2\hat{u_i}^2\}}}{\{\sum{(X_i – \bar{X})^2}\}^2}}
$$
ロバストなt値
$$
t_{hce} = \frac{\hat{\beta}}{HC_{se}}
$$
Pythonで不均一分散にロバストなt検定
上の式から、Pythonでロバストなt検定を実行する。
通常なt検定は、こちらから
ボストン住宅価格のデータセットを使う。
このデータにおける、重回帰分析モデルの誤差項は、不均一分散であった。
BP検定で、不均一分散かどうか検定した。
heteroskedasticityの検定-breusch-paganbp検定
Statsmodelsを使って、不均一分散にロバストなt検定を行います。
sklearn+自作でも試してるが、Statsmodelsと一致しないので、まだ勉強中です。
Statsmodels
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | #import from sklearn.datasets import load_boston import numpy as np import pandas as pd import statsmodels.formula.api as smf import statsmodels.api as sm #data_loading and data_setting boston = load_boston() data_X = boston.data data_y = boston.target results = sm.OLS(data_y, sm.add_constant(data_X)).fit(cov_type = 'HC0' ) pd.DataFrame({ 't_hc_se' :results.tvalues[ 1 :]}, index = boston.feature_names).T |
sklearn
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #import from sklearn.datasets import load_boston import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression #data_loading and data_setting boston = load_boston() data_X = boston.data data_y = boston.target #回帰分析 lr = LinearRegression() lr.fit(data_X, data_y) coef_value = lr.coef_ y_pred = lr.predict(data_X) X = data_X e = (data_y - y_pred) e = np.diag((e.T * * 2 ).reshape( - 1 )) a = np.linalg.inv(np.dot(X.T, X)) b = np.dot(np.dot(X.T, e), X) hc_se = np.sqrt(np.diagonal(np.dot(np.dot(a, b), a))) t_hc_se = coef_value / hc_se pd.DataFrame({ 't_hc_se' : t_hc_se}, index = boston.feature_names).T |
参考
- http://www.statsmodels.org/devel/generated/statsmodels.regression.linear_model.RegressionResults.html
- http://www.statsmodels.org/devel/generated/generated/statsmodels.regression.linear_model.RegressionResults.HC0_se.html#statsmodels.regression.linear_model.RegressionResults.HC0_se
- https://en.wikipedia.org/wiki/Heteroscedasticity-consistent_standard_errors