建立包含不同测量值的PyMC3模型

时间:2019-05-17 12:37:31

标签: python bayesian pymc3

我正在尝试将不同类型的测量值和重复测量值合并到PyMC3中的一个模型中。

考虑以下模型:P(t)= P0 * exp(-k B t)其中P(t),P0和B是浓度。 k是一个比率。我们通过对粒子计数来测量不同时间的P(t)和B一次。 k是我们要推论的感兴趣的参数。

我的问题分为两个部分: (1)如何将P(t)和B的测量值合并到一个模型中? (2)如何使用可变数量的重复实验来告知k的值?

我想我可以回答第(1)部分,但是不确定它是正确的还是口味正确的。我未能概括该代码以包含可变数量的重复项。

对于一个实验(一个重复):

class HomeAddress extends HomeAddressType{
      @Embedded
      AddressId addressId;
      ......
}

我尝试按照上述方法包含不同的重复项,但无济于事:

ts=np.asarray([time0,time1,...])
counts=np.asarray([countforB,countforPattime0,countforPattime1,...])
basic_model = pm.Model()
with basic_model:
    k=pm.Uniform('k',0,20)
    B=pm.Uniform('B',0,1000)
    P=pm.Uniform('P',0,1000)
    exprate=pm.Deterministic('exprate',k*B)
    modelmu=pm.math.concatenate(B*(np.asarray([1.0]),P*pm.math.exp(-exprate*ts)))
    Y_obs=pm.Poisson('Y_obs',mu=modelmu,observed=counts))

1 个答案:

答案 0 :(得分:1)

多个可观察物

PyMC3支持多个可观察对象,也就是说,您可以使用RandomVariable参数集将多个observed对象添加到图形中。

单次试用

在您的第一种情况下,这将使模型更加清晰:

counts=[countforPattime0, countforPattime1, ...]

with pm.Model() as single_trial:
    # priors
    k = pm.Uniform('k', 0, 20)
    B = pm.Uniform('B', 0, 1000)
    P = pm.Uniform('P', 0, 1000)

    # transformed RVs
    rate = pm.Deterministic('exprate', k*B)
    mu = P*pm.math.exp(-rate*ts)

    # observations
    B_obs = pm.Poisson('B_obs', mu=B, observed=countforB)
    Y_obs = pm.Poisson('Y_obs', mu=mu, observed=counts)

多次试用

希望通过这种额外的灵活性,使向多个试验的过渡更加明显。它应该像这样:

B_cts = np.array(...) # shape (N, 1)
Y_cts = np.array(...) # shape (N, M)
ts = np.array(...)    # shape (1, M)

with pm.Model() as multi_trial:
    # priors
    k = pm.Uniform('k', 0, 20)
    B = pm.Uniform('B', 0, 1000, shape=B_cts.shape)
    P = pm.Uniform('P', 0, 1000, shape=B_cts.shape)

    # transformed RVs
    rate = pm.Deterministic('exprate', k*B)
    mu = P*pm.math.exp(-rate*ts)

    # observations
    B_obs = pm.Poisson('B_obs', mu=B, observed=B_cts)
    Y_obs = pm.Poisson('Y_obs', mu=mu, observed=Y_cts)

可能会有一些额外的语法来使矩阵正确相乘,但这至少包括正确的形状。


优先级

一旦该设置生效,重新考虑先验条件将符合您的利益。我怀疑您有关于这些典型值的更多信息,而不是当前提供的更多信息,尤其是因为这似乎是化学或物理模型。

例如,现在模型显示,

  

我们相信B的真实值在试验期间保持不变,但是在整个试验中,是一个介于0到1000之间的完全任意值,并在试验中反复进行测量将是泊松分布。

通常,除非它们排除无意义的值,否则应避免截断。因此,下限为0很好,但上限是任意的。我建议您看看the Stan Wiki on choosing priors