我尝试实现一个简单的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
似乎更可取。
任何帮助都非常受欢迎!