如何使用分布数组作为pymc3中新分布的参数

时间:2018-04-04 22:11:47

标签: python pymc3

我试图模拟以下问题:

  • 在某个切换时间点之前(从DiscreteUniform分布中选择),从带有边界early_lowearly_high的均匀分布中选择值。在此次切换之后,将从带有边界late_lowlate_high的统一分布中选择值。给定样本列表,估计切换点和四个边界。

我想做这样的事情:

import pymc3 as pm

with pm.Model() as value_model:
        early_low = pm.Uniform("early_low", lower=value.min(), upper=value.max())
        late_low = pm.Uniform("late_low", lower=value.min(), upper=value.max())
        early_high = pm.Uniform("early_high", lower=value.min(), upper=value.max())
        late_high = pm.Uniform("late_high", lower=value.min(), upper=value.max())
        switch_date = pm.DiscreteUniform('switch_date', lower=date.min(), upper=date.max())
        low = pm.math.switch(date >= switch_date, late_low, early_low)
        high = pm.math.switch(date >= switch_date, late_high, early_high)
        measurements = pm.Uniform("measurements", low, high, observed=value)

问题是,我无法使用lowhigh作为Uniform发布的参数(请参阅measurements = ...)。可以将这些参数与泊松分布一起使用(当然只有一个参数)。 (请参阅Coal mining disasters中的代码。)我不知道为什么。

根据this帖子,您可以使用由常量组成的数组作为分布参数。我想以类似的方式使用lowhigh

This问题显示创建确定性函数,但我不确定这是否适用于数组。

最后,我考虑使用混合物,类似这样:

with pm.Model() as value_model:
        early_low = pm.Uniform("early_low", lower=value.min(), upper=value.max())
        late_low = pm.Uniform("late_low", lower=value.min(), upper=value.max())
        early_high = pm.Uniform("early_high", lower=value.min(), upper=value.max())
        late_high = pm.Uniform("late_high", lower=value.min(), upper=value.max())
        switch_date = pm.DiscreteUniform('switch_date', lower=date.min(), upper=date.max())
        early = pm.Uniform("early", early_low, early_high, observed=value)
        late = pm.Uniform("late", late_low, late_high, observed=value)
        measurements = pm.Mixture("measurements", [date >= switch_date, date < switch_date], [late, early])

然而,这似乎不太可能。

这是我对此模型进行采样的方法:

with value_model:
    trace = pm.sample(10000)

在理想情况下,我正在寻找像switch这样的方法,但不是采用固定值,而应该在两个发行版之间做出决定。

0 个答案:

没有答案