PyMC3中的贝叶斯模型选择


11

我正在使用PyMC3在数据上运行贝叶斯模型。

我是贝叶斯建模的新手,但是根据一些博客文章,该站点的Wikipedia和QA所述,使用贝叶斯因子和BIC准则来选择最能代表我的数据的模型似乎是一种有效的方法(我的数据)。

要计算贝叶斯因子,我需要要比较的模型的相对可能性。这可能会让我感到困惑,但是我认为有两种方法可以获取可能性(如果我错了,请纠正我):

  • 模型简单时的代数方式:请参阅Wikipedia示例贝叶斯因子页面

  • 数字方式:这就是PyMC3与MCMC算法的区别

如何获得可能性并比较PyMC3中的模型?我发现model.logp根据doc是“对数概率密度函数”的方法。我可以用它来获得可能性吗?

奖励问题:比较两个模型时,会计算两个似然比。如果要比较多个模型会怎样?

一个具体的PyMC3示例将非常有帮助!

Answers:


15

您实际上可以使用model.logp()计算模型的可能性。作为输入,它需要一个点。例如,我可以从examples目录执行BEST模型:

np.exp(model.logp({'group1_mean': 0.1, 
                   'group2_mean': 0.2, 
                   'group1_std_interval': 1., 
                   'group2_std_interval': 1.2, 
                   'nu_minus_one_log': 1}))

请注意,此模型使用的是转换后的变量,因此我必须提供这些变量。然后,您可以使用它的exp()并将其用于数值积分器中,例如scipy.integrate提供的。问题是,即使只有5个参数,这也将非常慢。

贝叶斯因子通常很难计算,因为您必须在整个参数空间上进行积分。为此,有一些使用MCMC示例的想法。请参阅此帖子,尤其是评论部分,以获取更多信息:https : //radfordneal.wordpress.com/2008/08/17/the-harmonic-mean-of-the-likelihood-worst-monte-carlo-method-ever /不幸的是,BIC的情况相似。

如果您确实要计算贝叶斯因子,也可以查看Savage Dickey Ratio测试(请参阅例如http://drsmorey.org/bibtex/upload/Wagenmakers:etal:2010.pdf),但是它的应用受到限制。

我想您正在尝试进行模型比较,这是一个包含许多意见和解决方案(有些难以实现,例如BF)的领域。一种非常容易计算的度量是偏差信息准则。它有其缺点,尽管可以纠正其中的一些缺点(请参见http://onlinelibrary.wiley.com/doi/10.1111/rssb.12062/abstract)。不幸的是,我们还没有移植代码pymc3,但这非常简单(请参见此处以获取pymc2实现:https//github.com/pymc-devs/pymc/blob/895c24f62b9f5d786bce7ac4fe88edb4ad220364/pymc/MCMC.py# L410)。

Kruschke支持只构建完整模型并告诉您哪些参数很重要的方法。您也可以在模型本身中建立变量选择(例如,参见http://arxiv.org/pdf/math/0505633.pdf)。

最后,要获得更全面的处理,请参阅此最新博客文章:http : //jakevdp.github.io/blog/2015/08/07/frequentism-and-bayesianism-5-model-selection/


1
打开了向pymc3添加DIC的问题:github.com/pymc-devs/pymc3/issues/797
twiecki
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.