我试图模拟以下问题:
early_low
,early_high
的均匀分布中选择值。在此次切换之后,将从带有边界late_low
,late_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)
问题是,我无法使用low
和high
作为Uniform
发布的参数(请参阅measurements =
...)。可以将这些参数与泊松分布一起使用(当然只有一个参数)。 (请参阅Coal mining disasters中的代码。)我不知道为什么。
根据this帖子,您可以使用由常量组成的数组作为分布参数。我想以类似的方式使用low
和high
。
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
这样的方法,但不是采用固定值,而应该在两个发行版之间做出决定。