VARMAX モデル¶
statsmodelsでのVARMAXモデルを紹介する簡単なnotebookです。VARMAXモデルは一般的に次のように記述されます。
ここで、 \(y_t\) は \(\text\{k_endog\} \times 1\) ベクトルです。
[ ]:
%matplotlib inline
[ ]:
import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
[ ]:
dta = sm.datasets.webuse('lutkepohl2', 'https://www.stata-press.com/data/r12/')
dta.index = dta.qtr
dta.index.freq = dta.index.inferred_freq
endog = dta.loc['1960-04-01':'1978-10-01', ['dln_inv', 'dln_inc', 'dln_consump']]
モデルの仕様¶
statsmodelsのVARMAXクラスでは、VAR、VMA、およびVARMAモデルを(order引数を介して)推定することができ、オプションで(trend引数を介して)定数項を推定することもできます。外因性回帰変数も含めることができ(statsmodelsでは通常、exog引数によって)、このようにして年次推移を追加することができます。最後に、このクラスは(measurement_error引数を介して)測定誤差を許容し、(error_cov_type引数を介して)対角または非構造化イノベーション共分散行列を指定することができます。
例 1: VAR¶
以下は、2つの内因性変数と1つの外因性系列における単純なVARX(2)モデルですが、定数項はない。尤度推定が収束するためには、デフォルト(maxiter=50)よりも多くの反復を許容する必要があることに注意してください。これは、多くの場合、比較的少数の時系列で多数のパラメータを推定しなければならないVARモデルでは珍しいことではありません。例えば、このモデルは、3つの変数の75の観測値から27のパラメータを推定します。
[ ]:
exog = endog['dln_consump']
mod = sm.tsa.VARMAX(endog[['dln_inv', 'dln_inc']], order=(2,0), trend='n', exog=exog)
res = mod.fit(maxiter=1000, disp=False)
print(res.summary())
推定されたVARモデルから、内生変数のインパルス応答関数をプロットすることができます。
[ ]:
ax = res.impulse_responses(10, orthogonalized=True, impulse=[1, 0]).plot(figsize=(13,3))
ax.set(xlabel='t', title='Responses to a shock to `dln_inv`');
例 2: VMA¶
ベクトル移動平均モデル(VMAモデル)も構築することができます。以下では、同じデータを使用して、プロセスの誤差項が相関していない場合のVMA(2)モデルを示します。この例では、外生変数を除外していますが、定数項を含めています。
[ ]:
mod = sm.tsa.VARMAX(endog[['dln_inv', 'dln_inc']], order=(0,2), error_cov_type='diagonal')
res = mod.fit(maxiter=1000, disp=False)
print(res.summary())
警告: VARMA(p,q) 仕様¶
このモデルはVARMA(p, q)モデルの推定を可能にするものの、表現行列に追加の制約を設けなければこれらのモデルは識別されません。これらの制約は組み込まれていないため、エラーが生じる可能性があり、実際にこれらのモデルが指定される際には警告が発せられます。それにもかかわらず、特定の状況下では有益な情報を提供する場合があります。
[ ]:
mod = sm.tsa.VARMAX(endog[['dln_inv', 'dln_inc']], order=(1,1))
res = mod.fit(maxiter=1000, disp=False)
print(res.summary())