使用 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.Deterministic
将 Y_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)
我有一个系统的线性模型,目前我没有任何数据。它可以是 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.Deterministic
将 Y_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)