Использование перехвата состояния в классе MLEModel statsmodels для известных внешних входов - PullRequest
0 голосов
/ 12 января 2019

Перехват состояния 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. Однако, если она их игнорирует, она будет выше относительно отклонения от синусоиды. Как вы увидите, когда вы запустите его, оно действительно выше.

Есть идеи здесь?

1 Ответ

0 голосов
/ 15 января 2019

Нельзя использовать нотацию установки атрибутов для матриц системы пространства состояний с классом MLEModel, поэтому ваш вызов self.state_intercept не выполняется. например если вы делаете:

print(mle_results.filter_results.state_intercept)

тогда вы получите:

[[0.]]

Вместо этого вы должны сделать:

self['state_intercept'] = np.reshape(state_int, (1, N))

и это дает оценку отклонения около 4, как вы и ожидали.

...