问题描述
我想在 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 未能将张量的名称与值相关联。如果您在开头定义名称和的值,它会起作用。
我知道这不是您问题的直接答案。尽管如此,我希望它有所帮助。