Breusch-Pagan(BP)検定[不均一分散の検定]

統計学




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("均一分散")

この結果は、”不均一分散”になった。

参考


タイトルとURLをコピーしました