- 問題
- 答え
- 解説
Python コード:
import statsmodels.api as sm import numpy as np np.random.seed(57) data = np.random.randn(100) model = sm.OLS( data[1:], sm.add_constant(data[:-1])).fit() bg_test = sm.stats.acorr_breusch_godfrey( model, nlags=1) print(f'LM Statistic: {bg_test[0]}') print(f'p-value: {bg_test[1]}')
回答の選択肢:
(A) 残差に自己相関が存在するかを検定する
(B) 定常性を持つかを検定する
(C) 共和分関係が存在するかを検定する
(D) 季節成分を検出する
LM Statistic: 1.4025722971567027 p-value: 0.23629335867124626
正解: (A)
回答の選択肢:
(A) 残差に自己相関が存在するかを検定する
(B) 定常性を持つかを検定する
(C) 共和分関係が存在するかを検定する
(D) 季節成分を検出する
- コードの解説
-
このPythonコードは、時系列データの自己相関(時間依存性)を検定するためのBreusch-Godfrey(BG)テストを実行しています。
import statsmodels.api as sm import numpy as np np.random.seed(57) data = np.random.randn(100) model = sm.OLS( data[1:], sm.add_constant(data[:-1])).fit() bg_test = sm.stats.acorr_breusch_godfrey( model, nlags=1) print(f'LM Statistic: {bg_test[0]}') print(f'p-value: {bg_test[1]}')
詳しく説明します。
まず、乱数(正規分布に従う)で100要素のデータ(時系列)を生成しています。
np.random.seed(57) data = np.random.randn(100)
data
に格納されているデータは次のようになっています。[-0.13105216 -0.2006461 -1.69012289 -0.79441848 1.52800166 2.23640541 -2.61151195 0.76600939 1.74616801 -1.68913925 -0.26618848 -1.44891974 -0.93826531 -0.07550096 -0.70175721 -0.16063802 -0.22691742 -0.43195189 -0.33979405 -0.05013272 2.00497867 -0.45319064 1.05795086 0.6164745 0.63946554 1.1177589 0.14588207 1.15908817 0.1784653 -1.39477624 -1.79737261 0.05885131 1.20757717 0.87940895 0.83723311 1.62542439 0.57013356 -1.08756308 -0.98875432 -1.44867549 0.37644375 -0.18968252 0.63182285 1.23186035 0.95779398 -1.24385983 -0.01635129 -1.11956288 0.53336825 0.17868302 1.88429923 -0.43918696 -0.86585007 1.47468644 1.84261537 1.17161507 0.31679787 -0.76157795 -1.74360981 0.7245761 -1.41105479 -1.76732561 -0.20589649 0.46081033 -1.14710441 0.85391325 -0.22894261 -0.28445405 -0.44622593 0.8135406 0.55740495 0.06118517 -0.12438019 0.99503404 -0.52734097 -0.85586327 1.57970486 0.23924948 0.16641356 0.95564445 1.58555416 -0.15358464 -0.34811141 0.31319555 0.82139125 1.77878861 -0.95876606 -0.34452807 -0.43471791 0.70134849 1.60735054 -0.51068439 -0.36694572 -2.192188 -1.26243348 0.55549585 0.22435883 0.44138977 0.10699261 2.64298133]
Ordinary Least Squares(OLS)
モデルを適用しています。このモデルは、タイムラグ1の値(前の時点でのデータ)を説明変数とし、現在の値を目的変数としています。model = sm.OLS( data[1:], sm.add_constant(data[:-1])).fit()
BGテスト(code>statsmodelsのcode>acorr_breusch_godfrey関数)を使って、OLSモデルの残差に自己相関が存在するかどうかを検定します。
bg_test = sm.stats.acorr_breusch_godfrey( model, nlags=1)
BGテストの統計量(LM Statistic)とp値を出力します。
print(f'LM Statistic: {bg_test[0]}') print(f'p-value: {bg_test[1]}')
LM Statistic: 1.4025722971567027 p-value: 0.23629335867124626
p値が一般的な有意水準(例えば0.05)より小さい場合、モデルの残差に自己相関が存在すると判断します。
- Breusch-Godfrey(BG)テストのお話し
-
Contents
BGテストとは?
Breusch-Godfrey(BG)テストは、時系列データにおける自己相関の存在を検定するために使用される統計的手法です。
具体的には、時系列回帰モデルの残差に自己相関が存在するかどうかを調べます。
時系列回帰モデルとは、時間を通じて変化するデータに対して過去の値や外部変数を用いて現在や未来の値を予測するモデルです。
残差の自己相関とは、ある時点の残差が他の時点の残差と相関している状態を指します。
- 帰無仮説(H0): モデルの残差に自己相関は存在しない。
- 対立仮説(H1): モデルの残差には自己相関が存在する。
もしBGテストで帰無仮説が棄却された場合、モデルがデータの時間的パターンを完全には捉えきれていないことを意味し、モデルの仕様を再検討する必要があることを示唆します。
逆に、帰無仮説を棄却できない場合は、残差に自己相関がないと結論づけます。
BGテストの手順
BGテストは、元の回帰モデルに「ラグ付きの残差」項を追加して拡張されたモデルを推定します。その後、この拡張されたモデルにおける「ラグ付きの残差」項の係数が統計的に有意かどうかを検定します。
もし項の係数が全体として有意であれば、残差には自己相関が存在すると判断されます。
ちなみに「ラグ付きの残差」項とは、回帰モデルの過去の残差(予測値と実際の値の差)を現在の残差に影響を与える因子として、新たな説明変数としてモデルに追加したものです。
BGテストを実行する際の手順は以下の通りです。
- 元の回帰モデルを推定します。
- 推定された回帰モデルの残差を使用して、「ラグ付きの残差」項を含む拡張モデルを構築します。
- 拡張モデルを推定し、「ラグ付きの残差」項の係数が統計的に有意かどうかを検定します。
- もし係数が有意であれば、モデルの残差には自己相関が存在すると判断します。
残差の自己相関を調べるテスト
残差の自己相関を調べるためには、Breusch-Godfrey(BG)テスト以外にもいくつかの方法があります。
ここでは、その中でも特によく使われるテストを紹介します。
テスト名 概要 特徴 注意点 Breusch-Godfrey 残差に自己相関が存在するかどうかを複数のラグで検定する。 高次の自己相関を検出 計算が複雑 Durbin-Watson 1次の自己相関を検定する。 単純な計算が単純 1次の自己相関のみ検出 Ljung-Box 複数のラグにわたる残差の自己相関を検定する。 多くのラグを含む自己相関の検定 大標本での使用が推奨される Box-Pierce 残差の自己相関を検定する。 Ljung-Boxの前身 通常はLjung-Boxテストが推奨(小標本性能が劣る) 1次の自己相関のみに興味がある場合はDurbin-Watsonテストが適しています。より複雑な自己相関構造が予想される場合は、Ljung-BoxやBreusch-Godfreyテストの使用が適切になるでしょう。