pymc确定随机变量的总和

时间:2016-09-26 00:00:25

标签: python statistics probability pymc pymc3

我有两个独立的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,因为ab是随机的(如果它们是阵列它是可行的,但我不是'我对ab进行了观察,我只知道它们的分布。

我认为我可以这样做的方法是使用每个ab的分布生成随机值,然后执行此操作:

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有更好的方法。

谢谢!

1 个答案:

答案 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(可能您的分布不是高斯分布,并且您不知道如何分析计算它们的总和)。您可以从ab发行版生成合成数据,然后使用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)