PyMC3 中的 SARIMAX 模型

问题描述

我想在 PyMC3 中写下以下 SARIMAX 模型 (2,0) (2,12) 以对其系数进行贝叶斯估计,但我不知道如何从季节性部分开始 有没有人尝试过这样的事情?

list

解决方法

虽然如果你能得到一个只使用 PyMC3 的答案会是最好的(例如最好的性能),如果还不存在,还有一种替代方法可以使用 SARIMAX 模型Statsmodels 结合 PyMC3。

这里有太多细节无法重复完整的答案,但基本上您可以包装与 Statsmodels SARIMAX 模型相关的对数似然和梯度方法。下面是一个示例 Jupyter 笔记本的链接,该笔记本显示了如何执行此操作:

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

,

我不确定您是否仍然需要它,但是,扩展 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)
    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,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',observed=theta)


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

我不是 pymc3/theano 专家,但我认为该错误意味着 Theano 未能将张量的名称与值相关联。如果您在开头定义名称的值,它会起作用。

我知道这不是您问题的直接答案。尽管如此,我希望它有所帮助。