ARモデル,Dickey-Fuller検定

やること

  1. (確率変数列が定常性を満たすとして)次数1の自己回帰モデル(ARモデル)を作成してみる。
  2. 単位根を有するか否かの検定(Dickey-Fuller検定)

参考サイト

pythonでARモデルの推定 | 分析ノート

時系列分析やってみた!(ARモデル) - Qiita

コード

次数1の自己回帰モデル(ARモデル)

まず作成

とりあえず実装しながらARモデルを理解してみる。自己回帰モデルのパラメータとして以下の3つを設定。

また、いま定常性を有することを仮定しているので、自己回帰係数は絶対値1より小さくすることに注意。(今回は0.8)

とりあえず長さ(データ数)は260とする(1年の営業日数)

#  make sample data
params = {'intercept': 1.8\
         ,'coefficient': 0.8\
         ,'sigma': 0.5\
         ,'length': 260}

mu = params['intercept'] / (1.0 - params['coefficient'])

ar1_data = []
first_term = mu + np.random.normal(0, params['sigma'])
ar1_data.append(first_term)

for i in range(1, params['length']):
    A = params['coefficient'] * ar1_data[i - 1]
    B = np.random.normal(0, params['sigma'])
    i_term = params['intercept'] + A + B
    
    ar1_data.append(i_term)

#  visualize
sns.set()
sns.lineplot(data = pd.DataFrame(ar1_data))
# sns.lineplot(data = ar1_data) #  NG

f:id:iiiiikamirin:20201110000747p:plain

とりあえずこんな過程が得られた。

コレログラムもつくってみる

import statsmodels.graphics.api as smg
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf

plot_acf(ar1_data, lags = 29)
plt.show()

plot_pacf(ar1_data, lags = 29)
plt.show()

f:id:iiiiikamirin:20201115175559p:plain 推移律を考慮したバージョンは以下 f:id:iiiiikamirin:20201115175629p:plain これをみるとラグ1だなあと。

ちなみに、初項first_termが必要だったので、過程の平均値muにホワイトノイズを追加しておいた。ここは正直てきとう(過程の平均値使ってるからまあいいでしょ、くらい。)

作成したやつを、自己回帰モデルに当てはまるか推定してみる

作ったけど、じゃあこれを自己回帰モデルに当てはまるか再度推定してみたら、本当にどれくらいパラメータを正しく推定できるの?という検証。

#  ARモデルへつっこむ
model = sm.tsa.AR(ar1_data)

#  モデルの最適次数選択
degree = model.select_order(maxlag = 6, ic = 'aic')
print(degree)

#  推定
result = model.fit(maxlag = degree)
#  比較
print('----------切片---------')
print('設定パラメータ', params['intercept'])
print('推定パラメータ', result.params[0])

print('----------自己回帰係数---------')
print('設定パラメータ', params['coefficient'])
print('推定パラメータ', result.params[1])

print('----------イノベーション分散---------')
print('設定パラメータ', params['sigma'] ** 2)
print('推定パラメータ', result.sigma2)

f:id:iiiiikamirin:20201110001426p:plain

まあ悪くないんでしょうか。よくわからんけど。

Dickey-Fuller検定

帰無仮説は「単位根が存在する」。参考サイトを本当にそのままコピペした。ちなみに、ADF検定というものにした。そっちのが、対象過程の次数を1と仮定せず検定できる。

data = ar1_data
result = sm.tsa.stattools.adfuller(data)
print('value = {:.4f}'.format(result[0]))
print('p-value = {:.4}'.format(result[1]))

f:id:iiiiikamirin:20201110003127p:plain

有意水準1%で帰無仮説棄却。よって、「単位根をもたない」(この時点では、定常性を有するとは必ずしもいえない)。

まあグラフの形状的に、定常性をもつといっていいでしょう、って感じ。(自己回帰係数の絶対値は1より小さいでしょう)