我正在尝试使用pymc来查找时间序列中的更改点。我随着时间的推移看到的值是“转换”的概率非常小,平均为0.009,范围为0.001-0.016。
我给出两个概率均匀分布作为零和最大观察之间的先验。
alpha = df.cnvrs.max() # Set upper uniform
center_1_c = pm.Uniform("center_1_c", 0, alpha)
center_2_c = pm.Uniform("center_2_c", 0, alpha)
day_c = pm.DiscreteUniform("day_c", lower=1, upper=n_days)
@pm.deterministic
def lambda_(day_c=day_c, center_1_c=center_1_c, center_2_c=center_2_c):
out = np.zeros(n_days)
out[:day_c] = center_1_c
out[day_c:] = center_2_c
return out
observation = pm.Uniform("obs", lambda_, value=df.cnvrs.values, observed=True)
当我运行此代码时,我得到:
ZeroProbability:Stochastic obs的价值超出了它的支持, 或者它禁止其父母目前的价值观。
我对pymc很新,所以不确定我是否遗漏了一些明显的东西。我的猜测是我可能没有适当的分布来建模小概率。
答案 0 :(得分:0)
无法告诉你在哪里引入了这个错误 - 在任何情况下编程都是偏离主题的 - 没有更多的输出。但这里有一个统计问题:你已经以某种方式构建了一个模型,它既不能产生观察到的变量,也不会产生潜在的变量。
举一个简单的例子,假设你有一个负值的数据集,并且你假设它是伽玛分布的;这将产生错误,因为数据在伽玛下的概率为零。同样,如果在MCMC链期间对不可能的值进行采样,则会引发错误。