使用 pyMC3 模拟线性模型的先验而不指定输出的分布

Simulate a prior from a linear model using pyMC3 without specifying distribution for the output

我有一个系统的线性模型,目前我没有任何数据。它可以是 Y = a + b + c 的形式。我想根据对输入参数分布的假设来模拟 Y 的可能值。可能 a 分布为 Normal(mu=-1, sd=0.1)b 分布为 Normal(mu=15.0, sd=2.0),而 c 是常数。我尝试使用 pyMC3 实现这样的模拟,如下所示:

import arviz as az
import matplotlib.pyplot as plt
import pymc3 as pm

c = 2.0

with pm.Model() as my_model:
    a = pm.Normal("a", -1, 0.1)
    b = pm.Normal("b", 15.0, 2.0)
    
    Y_mu = a + b + c
    Y_sigma = pm.Normal('Y_sigma', mu=1, sd=1)
    
    Y = pm.Normal("Y", mu=Y_mu, sigma = Y_sigma)
    
    prior_checks = pm.sample_prior_predictive(samples=10000, random_seed=123)
    
fig, axes = plt.subplots(ncols=1, nrows = len(prior_checks))

for i, (key, value) in enumerate(prior_checks.items()):
    axes[i].set_title(key)
    az.plot_kde(value, ax=axes[i])

我一直无法找到一种方法来避免对 Y 的分布做出假设,例如我无法获得上面定义为 Y_mu 的值。我不想假设 Y 的标准偏差,只是查看为 Y = a + b + c.

生成的值

我的处理方式正确吗?还是我遗漏了一个简单的细节,使事情过于复杂?

您必须使用 pm.DeterministicY_mu 作为变量存储在跟踪中:

c = 2.0

with pm.Model() as my_model:
    a = pm.Normal("a", -1, 0.1)
    b = pm.Normal("b", 15.0, 2.0)
    
    Y_mu = pm.Deterministic("Y_mu", a + b + c)
    Y_sigma = pm.Normal('Y_sigma', mu=1, sd=1)
    
    Y = pm.Normal("Y", mu=Y_mu, sigma = Y_sigma)
    
    prior_checks = pm.sample_prior_predictive(samples=10000, random_seed=123)