statsmodels状態空間定式化の状態切片c_tは、外因性制御変数を状態空間フレームワークに挿入する方法のようです。しかし、私はそれを動作させることができません。私が考えることができる最も単純な例は、ランダムノイズと組み合わされたベースラインからの既知のオフセットを持つ平均モデルでした。statsmodelsステートスペース表記では、次のようになります。
a_t = 0 * a_ {t-1} + sin(pi * t / 24)+ 0 * eta_t、
y_t = 30 + 1 * a_t + e_t、
ここで、t = 0、...、999およびe_t〜N(0、4)。これを実装しようとした方法を以下に示します。
# Python 3.6.3, Statsmodels 0.9.0
import numpy as np
from statsmodels.tsa.statespace.mlemodel import MLEModel
N = 1000
t = np.arange(N)
alpha = 2 * np.sin(np.pi * t / 24)
y = 30 + alpha + 2 * np.random.randn(N)
class Simple(MLEModel):
start_params = [28, 2.2]
param_names = ['int', 'sigma2_e']
def __init__(self, endog, state_int):
super().__init__(endog, k_states = 1)
self.initialize_stationary()
self.loglikelihood_burn = 100
self['transition', 0, 0] = 0.0
self['selection', 0, 0] = 0.0
self['design', 0, 0] = 1.0
self.state_intercept = np.reshape(state_int, (1, N))
def update(self, params, **kwargs):
params = super().update(params, **kwargs)
self['obs_intercept', 0, 0] = params[0]
self['obs_cov', 0, 0] = params[1]
my_Simple = Simple(y, alpha)
mle_results = my_Simple.fit(method = 'nm', maxiter = 1000)
mle_results.summary()
推定でオフセットを考慮に入れると、約4の分散推定が得られると予想されます。ただし、それらを無視すると、正弦波からの変動の方が高くなります。実行するとわかるように、実際には高くなっています。
ここに何かアイデアはありますか?
MLEModel
クラスで状態空間システム行列に属性設定表記を使用できないため、self.state_intercept
呼び出しは失敗します。たとえば、次の場合:
print(mle_results.filter_results.state_intercept)
次に、次のようになります。
[[0.]]
代わりに、次のことを行う必要があります。
self['state_intercept'] = np.reshape(state_int, (1, N))
予想どおり、分散の推定値は約4になります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加