Python 用PYMC3求两变量差的后验分布

Python 用PYMC3求两变量差的后验分布,python,pymc3,Python,Pymc3,现在假设我们在看两种股票A和B的每日价格。前面的例子很简单:价格都是正态分布的,mu_A和mu_B都均匀分布在[10100]上,sigma_A和sigma_B也均匀分布在[1,10]上。(我知道这些都是天真/错误的假设——只是为了让问题更清楚。) 现在假设我观察了这两支股票一个月并收集了价格数据。我可以分别得到A和B的后验分布,但idk如何得到这两个股票之间差异的后验分布 prices_A = [25,20,26,23,30,25] prices_B = [45,49,52,58,45,48]

现在假设我们在看两种股票A和B的每日价格。前面的例子很简单:价格都是正态分布的,mu_A和mu_B都均匀分布在[10100]上,sigma_A和sigma_B也均匀分布在[1,10]上。(我知道这些都是天真/错误的假设——只是为了让问题更清楚。)

现在假设我观察了这两支股票一个月并收集了价格数据。我可以分别得到A和B的后验分布,但idk如何得到这两个股票之间差异的后验分布

prices_A = [25,20,26,23,30,25]
prices_B = [45,49,52,58,45,48]
basic_model = pm.Model()
with basic_model: 
    mu_A = pm.Uniform('mu_A', lower=10, upper=100)
    sigma_A = pm.Uniform('sigma_A', lower=1, upper=10)
    mu_B = pm.Uniform('mu_B', lower=10, upper=100)
    sigma_B = pm.Uniform('sigma_B', lower=1, upper=10)
    A = pm.Normal('Y_1', mu=mu_A, sd=sigma_A, observed=prices_A)
    B = pm.Normal('Y_2', mu=mu_B, sd=sigma_B, observed=prices_B)
    dif = pm.Deterministic('dif', A-B)
map_estimate = pm.find_MAP(model=basic_model)
map_estimate

然而,结果估计并没有给我一个dif的分布。。。我是否混淆了后验分布的概念?

减去这两个变量,你可以在采样后进行如下操作:

C=trace['A']-trace['B']
或者,您可以使用确定性变量将其作为模型的一部分:

C=pm.Deterministic('C',A-B)
更新:

既然你已经发布了你的模型,我将建议如下

prices_A = [25,20,26,23,30,25]
prices_B = [45,49,52,58,45,48]
basic_model = pm.Model()
with basic_model: 
    mu_A = pm.Uniform('mu_A', lower=10, upper=100)
    sigma_A = pm.Uniform('sigma_A', lower=1, upper=10)
    mu_B = pm.Uniform('mu_B', lower=10, upper=100)
    sigma_B = pm.Uniform('sigma_B', lower=1, upper=10)
    A = pm.Normal('Y_1', mu=mu_A, sd=sigma_A, observed=prices_A)
    B = pm.Normal('Y_2', mu=mu_B, sd=sigma_B, observed=prices_B)
    dif = pm.Deterministic('dif', mu_A-mu_B) # diff of the means
    trace = pm.sample()

 pm.summary(trace)
基本上,我建议您不要使用
find_MAP()
,而是从后面采样,然后从该采样(在
trace
中)计算您想要的。例如,
summary
将为您提供从后验样本计算的平均值、标准偏差和其他数量

您还可以使用
sample\u ppc
获取“后验预测样本”

dif_ppc
代表您预期看到的股票差异,包括股票均值和标准差的不确定性


作为旁注,您可能希望用其他分布代替均匀分布,如均值的正态分布和SIGMA的半正态分布。

将两个数组从第一个日期起转换为百分比增益,从而得到两个长度相等的数组。用一个减去另一个得到百分比差,然后取分布。@ajsp,谢谢你的建议。我试图更新这个问题,使它更清楚一点。我认为这将是一个更好的方式来重新表述这个问题:鉴于我已经有了一个简单的先验知识,以及我后来观察到的价格a,价格B,如何得到两支股票之间价格差的后验分布。谢谢!我刚刚用我使用的代码更新了这个问题。然而,我仍然得到了一个‘dif’的数字列表,但不是估计的平均值和标准差。当我们谈论后验分布时,我们是只看观察到的测量值/数字,还是得出后验平均值和标准差?对不起,我把问题弄糊涂了。也许我可以这样问:考虑到价格A,价格B和我已经拥有的简单先验知识,如何得到两支股票价格差的后验分布。注意,你得到的不是“A分布”,而是后验分布的样本。我只是更新我的答案,我希望它有助于把事情弄清楚。
ppc = pm.sample_ppc(trace, 1000, basic_model)
dif_ppc = ppc['Y_1'] - ppc['Y_2']