我有两个独立的Normal分布随机变量a, b
。在pymc中,它类似于:
from pymc import Normal
def model():
a = Normal('a', tau=0.01)
b = Normal('b', tau=0.1)
我想知道a+b
如果我们可以将其视为正态分布,那就是:
from pymc import Normal
def model():
a = Normal('a', tau=0.01)
b = Normal('b', tau=0.1)
tau_c = Uniform("tau_c", lower=0.0, upper=1.0)
c = Normal("a+b", tau=tau_c, observed=True, value=a+b)
然后我想估计tau_c
,但它不适用于pymc,因为a
和b
是随机的(如果它们是阵列它是可行的,但我不是'我对a
或b
进行了观察,我只知道它们的分布。
我认为我可以这样做的方法是使用每个a
和b
的分布生成随机值,然后执行此操作:
def model(a, b):
tau_c = Uniform("tau_c", lower=0.0, upper=1.0)
c = Normal("a+b", tau=tau_c, observed=True, value=a+b)
但我认为使用pymc有更好的方法。
谢谢!
答案 0 :(得分:2)
如果我理解你的问题和代码,你应该做一些更简单的事情。如果要估计由a和b之和给出的分布参数,则仅使用以下示例中的第一个块。如果你还想独立于变量b的参数估计变量a的参数,那么使用另外两个块
with pm.Model() as model:
mu = pm.Normal('mu', mu=0, sd=10)
sd = pm.HalfNormal('sd', 10)
alpha = pm.Normal('alpha', mu=0, sd=10)
ab = pm.SkewNormal('ab', mu=mu, sd=sd, alpha=alpha, observed=a+b)
mu_a = pm.Normal('mu_a', mu=0, sd=10)
sd_a = pm.HalfNormal('sd_a', 10)
alpha_a = pm.Normal('alpha_a', mu=0, sd=10)
a = pm.SkewNormal('a', mu=mu_a, sd=sd_a, alpha=alpha_a, observed=a)
mu_b = pm.Normal('mu_b', mu=0, sd=10)
sd_b = pm.HalfNormal('sd_b', 10)
alpha_b = pm.Normal('alpha_b', mu=0, sd=10)
b = pm.SkewNormal('b', mu=mu_b, sd=sd_b, alpha=alpha_b, observed=b)
trace = pm.sample(1000)
请务必使用最新版本的PyMC3,因为以前的版本不包含SkewNormal发行版。
<强>更新强>
鉴于你改变了你的问题:
如果a和b是独立的随机变量并且两者都是正态分布的,那么它们的总和将是正态分布的。
a~N(mu_a,sd_a²)
b~N(mu_b,sd_b²)
a + b~N(mu_a + mu_b,sd_a²+sd_b²)
这就是你总结他们的手段,你总结他们的差异(而不是他们的标准偏差)。您不需要使用PyMC3。
如果您仍想使用PyMC3(可能您的分布不是高斯分布,并且您不知道如何分析计算它们的总和)。您可以从a
和b
发行版生成合成数据,然后使用PyMC3估算参数,具体如下:
with pm.Model() as model:
mu = pm.Normal('mu', mu=0, sd=10)
sd = pm.HalfNormal('sd', 10)
ab = pm.Normal('ab', mu=mu, sd=sd, observed=a+b)
trace = pm.sample(1000)