问题使用theano.scan在pymc3中实现AR,ARMA和可能更复杂的时间序列模型

时间:2017-04-01 07:48:08

标签: time-series pymc3 autoregressive-models

我尝试实现一个简单的ARMA模型,但是在运行它时遇到了很大的困难。在错误术语中添加参数时,一切正常(请参阅下面注释的return x_m1 + a*e语句),但是如果我向自动回归部分添加参数,我会得到FloatingPointError或{{1或LinAlgError,取决于我使用的初始化方法。

代码也放入gist you can find here。模型定义在此复制:

PositiveDefiniteError

这里是初始化方法的错误:

“ADVI”/“ADVI_MAP”:with pm.Model() as model: a = pm.Normal("a", 0, 1) sigma = pm.Exponential('sigma', 0.1, testval=F(.1)) e = pm.Normal("e", 0, sigma, shape=(N-1,)) def x(e, x_m1, a): # return x_m1 + a*e return a*x_m1 + e x, updates = theano.scan( fn=x, sequences=[e], outputs_info=[tt.as_tensor_variable(data.iloc[0])], non_sequences=[a] ) x = pm.Deterministic('x', x) lam = pm.Exponential('lambda', 5.0, testval=F(.1)) y = pm.StudentT("y", mu=x, lam=lam, nu=1, observed=data.values[1:]) # with model: trace = pm.sample(2000, init="NUTS", n_init=1000)

“MAP”:FloatingPointError: NaN occurred in ADVI optimization.

“NUTS”:LinAlgError: 35-th leading minor not positive definite

有关错误消息的详细信息,请查看this github issue posted at pymc3

明确地说,我真的希望有一个类似扫描的解决方案,可以轻松扩展到例如完整的ARMA模型。我知道可以通过在pymc3 / distributions / timeseries.py#L18-L46中已经完成定义PositiveDefiniteError: Scaling is not positive definite. Simple check failed. Diagonal contains negatives. Check indexes [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71]来代表所呈现的AR(1)模型而不进行扫描,但是我无法将此矢量化样式扩展为完整的ARMA模型。我认为使用logP似乎更可取。

任何帮助都非常受欢迎!

0 个答案:

没有答案