Перехват состояния c_t в формулировке пространства состояний statsmodels , по-видимому, является способом вставки внешних управляющих переменных в структуру пространства состояний. Тем не менее, я не могу заставить его работать. Самым простым возможным примером, который я мог придумать, была средняя модель с известными смещениями от базовой линии в сочетании со случайным шумом. В нотации пространства состояний 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. Однако, если она их игнорирует, она будет выше относительно отклонения от синусоиды. Как вы увидите, когда вы запустите его, оно действительно выше.
Есть идеи здесь?