Heteroskedasticityの検定-Breusch-Pagan(BP)検定
Heteroskedasticity(不均一分散性)は、線形回帰分析の誤差項において、度々問題が生じる。
この不均一分散性を評価するときに、不均一分散の検定が用いられる。
今回は、Breusch-Pagan(BP)検定を紹介する。
BP検定
$$
y_i = \beta_1 + \beta_2 x_{2i} + \dots + \beta_{ki} + u_i
$$
\(u_i\)は誤差項である。
残差の2乗\(\hat{u_i}^2\)をXで回帰する。
$$
\hat{u_i}^2 = \gamma_1 + \gamma_2 x_{1i} + \dots + \gamma_{ki} + v_i
$$
このとき帰無仮説と対立仮説は次のように立てる。
\(H_0\):均一分散\((\gamma_2 = \dots = \gamma_k = 0)\)
\(H_1\):不均一分散
残差の2乗\(\hat{u_i}^2\)とXの回帰分析で得られた\(R^2\)値を計算する。
サンプル数と\(R^2\)を掛けたもの\(n R^2\)は、\(H_0\)のもとで、自由度kの\(\chi^2\)分布に従う。
\(H_0\)を棄却したとき、誤差項は不均一分散性をもつと有意に判断できる。
Pythonによる実装
from sklearn.metrics import r2_score from scipy import stats #u2は、誤差の2乗 n=u2.shape[0] k = data_X.shape[1] #有意水準 alpha = 0.05 lr = LinearRegression() lr.fit(data_X, u2) u2_pred = lr.predict(data_X) r2 = r2_score(u2, u2_pred) nr2 = n*r2 th = stats.chi2.ppf(q=1-alpha, df=k) if nr2 > th: print("不均一分散") else: print("均一分散")
PythonによるBP検定
#import from sklearn.datasets import load_boston import numpy as np from sklearn.linear_model import LinearRegression #data_loading and data_setting boston = load_boston() data_X = boston.data data_y = boston.target n = data_X.shape[0] k = data_X.shape[1] alpha = 0.05 #目的とする回帰分析 lr = LinearRegression() lr.fit(data_X, data_y) y_pred = lr.predict(data_X) #誤差 u = data_y - y_pred u2_ = u**2 #BP検定 lr = LinearRegression() lr.fit(data_X, u2_) u2_pred = lr.predict(data_X) r2 = r2_score(u2, u2_pred) nr2 = n * r2 th = stats.chi2.ppf(q=1-alpha, df=k) if nr2 > th: print("不均一分散") else: print("均一分散")
この結果は、”不均一分散”になった。
参考