Модель SARIMAX в PyMC3

#statsmodels #pymc3

#statsmodels #pymc3

Вопрос:

Я хотел бы записать следующую модель SARIMAX (2,0,0) (2,0,0,12) в PyMC3 для выполнения байесовской оценки ее коэффициентов, но я не могу понять, как начать с сезонной части Кто-нибудь пробовал что-то подобное?

 with pm.Model() as ar2:
    theta = pm.Normal("theta", 0.0, 1.0, shape=2)
    sigma = pm.HalfNormal("sigma", 3)
    likelihood = pm.AR("y", theta, sigma=sigma, observed=data)

    trace = pm.sample(
        1000,
        tune=2000,
        random_seed=13,
    )
    idata = az.from_pymc3(trace)
 

Ответ №1:

Хотя было бы лучше (например, лучшая производительность), если бы вы могли получить ответ, который использует исключительно PyMC3, в случае, если он еще не существует, существует альтернативный способ сделать это, который использует SARIMAX модель в Statsmodels в сочетании с PyMC3.

Здесь слишком много деталей, чтобы повторить полный ответ, но в основном вы переносите методы логарифмического правдоподобия и градиента, связанные с SARIMAX моделью Statsmodels. Вот ссылка на пример записной книжки Jupyter, в которой показано, как это сделать:

https://www.statsmodels.org/stable/examples/notebooks/generated/statespace_sarimax_pymc3.html

Комментарии:

1. Спасибо за ссылку @cfulton, но я уже пробовал, и я получаю ошибку на последнем шаге, когда он вычисляет трассировку. Похоже, это связано с внутренней ошибкой в theano, но я не могу понять, как ее исправить.

Ответ №2:

Я не уверен, что вам это все еще понадобится, однако, расширяя ответ cfulton, вот как исправить ошибку в statsmodels примере (https://www.statsmodels.org/dev/examples/notebooks/generated/statespace_sarimax_pymc3.html , ячейка 8):

 with pm.Model():
    # Priors
    arL1 = pm.Uniform('ar.L1', -0.99, 0.99)
    maL1 = pm.Uniform('ma.L1', -0.99, 0.99)
    sigma2 = pm.InverseGamma('sigma2', 2, 4)

    # convert variables to tensor vectors
    # # this is wrong:
    theta = tt.as_tensor_variable([arL1, maL1, sigma2])
    # # this is correct:
    theta = tt.as_tensor_variable([arL1, maL1, sigma2], 'v')

    # use a DensityDist (use a lamdba function to "call" the Op)
    # # this is wrong:
    # pm.DensityDist('likelihood', lambda v: loglike(v), observed={'v': theta})
    # # this is correct:
    pm.DensityDist('likelihood', lambda v: loglike(v), observed=theta)


    # Draw samples
    trace = pm.sample(ndraws, tune=nburn, discard_tuned_samples=True, cores=4)
 

Я не эксперт по pymc3 / theano, но я думаю, что ошибка означает, что Theano не удалось связать имя тензора со значениями. Если вы определяете имя вместе со значениями в самом начале, это работает.

Я знаю, что это не прямой ответ на ваш вопрос. Тем не менее, я надеюсь, что это поможет.