进行MCMC:使用锯齿/ stan或自己实施


13

我是贝叶斯统计研究的新手。我从研究人员那里听说,贝叶斯研究人员可以更好地自己实现MCMC,而不是使用JAGS / Stan之类的工具。我可以问一下,除了学习目的之外,自行实现MCMC算法(使用像R这样的“不太快”的语言)有什么好处?


因为这样您就可以自己选择提案分配,因此您应该选择它,以使由此产生的马尔可夫链尽可能快地收敛到后验。

谢谢!是唯一原因吗?
user112758'9

4
如果您是一位应用研究人员,想要通过将其用于应用程序来了解更多贝叶斯,我建议您从JAGS或Stan开始,然后在发现“需要”时开始编写自己的MCMC。请记住,JAGS和Stan的优势和局限性略有不同。
conjugateprior

谢谢!是的,我正在做应用研究。您能否进一步介绍一下JAGS和Stan的局限性。我首先尝试了Stan,但是我发现它没有“在线监视”或“直到收敛为止的样本”功能或附加组件---这很烦人,我现在可以尝试JAGS。
user112758 2016年

Answers:


26

通常,我强烈建议您不要为真正的应用贝叶斯分析编写您自己的MCMC。这既费时又费力,并且可能在代码中引入错误。黑盒采样器(例如Stan)已经使用了非常复杂的采样器。相信我,您不会只为进行这种分析而编写此口径的采样器!

在某些特殊情况下,这还不够。例如,如果您需要进行实时分析(即基于传入数据的计算机决策),那么这些程序将不是一个好主意。这是因为Stan需要编译C ++代码,这可能比只为相对简单的模型运行已经准备好的采样器花费更多的时间。在这种情况下,您可能需要编写自己的代码。另外,我相信在某些特殊情况下,诸如Stan之类的程序包表现很差,例如非高斯状态空间模型(完全披露:我相信 Stan在这种情况下的表现很差,但不知道)。在这种情况下,实现自定义MCMC可能是值得的。但这是例外,不是规则!

坦白地说,我认为大多数为单个分析编写采样器的研究人员之所以这样做(确实如此,我已经看到了)是因为他们喜欢编写自己的采样器。至少,我可以说我属于这一类(即,我对编写自己的采样器并不是最好的处理方式感到失望)。

同样,尽管为单个分析编写自己的采样器没有意义,但为一类分析编写自己的代码可能很有意义。由于JAG,Stan等都是黑盒采样器,因此,尽管改进的程度取决于模型,但始终可以通过专门针对给定的模型来加快处理速度。但是,从头开始编写一个非常高效的采样器可能需要10-1,000个小时的时间,具体取决于经验,模型的复杂性等。如果您正在使用贝叶斯方法进行研究或编写统计软件,那很好。这是你的工作。但是,如果老板说“嘿,您可以分析此重复测量数据集吗?” 而且您花250个小时编写一个高效的采样器,您的老板很可能会不高兴。相反,您可以在Stan中编写此模型,例如,需要2个小时,并且运行时间为2分钟,而不是高效采样器获得的1分钟运行时间。


3
+1。另外,Stan不能直接处理一些涉及离散分布的问题,因此您必须了解足够多的知识来将它们集成起来,而这本身并不简单,因此在滚动自己的结构可能会有所帮助的情况下。我相信JAGS可以直接处理此类情况,因此,如果您可以将BUGS / JAGS和Stan的不同哲学牢记在心,那么最好在它们之间进行切换。
韦恩

此外,斯坦(Stan)可能会遇到对角欧几里得度量不适用于后验几何的问题。这种情况下尤其有仅具有多概率后的窄,奇怪形区域时。结果是,对后部进行采样就像是尝试沿着悬崖的边缘骑自行车:如果转错弯,您可能会“掉下来”!
Sycorax说恢复莫妮卡

2
+1。我对学生的一般建议是用JAGS进行编码。如果这样不能很好地工作,请在Stan中进行编码。如果效果不佳,请开始编写自己的采样器。还有某些模型,例如空间模型,您可能想在其中使用BUGS。某些模型,例如要使用NIMBLE的非高斯状态空间模型。通过编写自己的采样器开始的机会成本太高了。
jaradniemi

我不了解“实时”情况-如果可以有一个“已准备好”的自己的采样器,为什么使用已经编译的Stan模型不那么容易?我也想知道是否任何MCMC都足够快用于实时应用程序。
Juho Kokkala 2016年

1
而且我对Stan不太熟悉,无法确切地知道什么需要编译新模型,但是很难想象,无论有什么限制,都存在一个动态模型,使得随着新数据的进入,该模型将变得更加复杂。因此需要重新编译。我认为非参数方法(参数空间随样本大小而增长)是否适合该标准?但是可能有解决这个问题的聪明方法。
Cliff AB

6

这个问题主要是基于意见的,但是我想这里写下一个答案就足够了。对于研究问题,可能有很多原因要对自己的采样器进行编码。这里是其中的一些

  1. 提案:如fcop在其评论中建议的,如果样本是MH,则编码自己的采样器可以让您试用提案分布,以获得最佳的混合采样器。

  2. 灵活性:内置程序可能无法为您提供所需的灵活性。您可能要从特定的随机值开始,或使用特定的种子结构。

  3. 理解:对自己的采样器进行编码可帮助您了解采样器的行为,从而深入了解马尔可夫链过程。这对于研究该问题的研究人员很有用。

  4. 责任:如果我要进行所有贝叶斯推理的数据来自我没有编写代码的程序,那么推理的责任就不再由我承担。作为研究人员,我想对我介绍的方法/结果承担全部责任。使用内置方法不允许这样做。

可能还有更多原因,但这是使我编写自己的采样器的四个原因。


6
我会说“信任”的理由是有争议的:Stan是开源的,并且有很多贡献者,所以有很多人查看了它的源代码,因此不太可能出现严重的错误。另一方面,如果您自己执行此操作,则始终可以忽略所产生的错误-每个人都在编写错误,这与您编写的代码行数有关...
Tim

@Tim,我同意。我改变了这一点,以反映我想说的话。谢谢。
Greenparker

5
+1为理解参数。但是,Onus的论点似乎有些夸张。您自己编写的几乎所有内容都将依赖于其他人的统计语言,线性代数库,随机数生成器等,因此“承担责任”是一个程度的问题。
conjugateprior

@conjugateprior绝对同意。这就是为什么我的答案是第一人称。这纯粹是我的意见。
Greenparker

4

我给Cliff AB的答案+1。要添加一个小窍门,如果您想在一个较低的级别上工作,但又不想降低代码本身的水平,您应该在LaplacesDemon软件包中四处摸索。最初的作者很聪明,但似乎已脱离网格,该软件包已被其他人接管。(我相信它在Github上。)

它实现了一个令人印象深刻的MCMC使用的算法号和所包含的护身符是值得的阅读,即使你不使用的包。您所了解的几乎任何种类的采样器都有。您以与BUGS / JAGS或Stan不同的方式进行编码,并且全部使用R语言编写,但通常情况下它是如此高效以至于具有竞争力。


1
无耻的插件:您还可以使用[nimble](r-nimble.org)来自定义MCMC(即,对该节点使用切片采样器,对该节点组使用块更新器,等等),而无需重写每次采样。您还可以编写自己的采样器以直接实现!披露:我曾经从事这个项目。
悬崖AB

@CliffAB:LaplacesDemon如果您熟悉的话,听起来与相似。也很高兴听到nimble。我至少会下载它。(尽管即使您使用敏捷的工具,也可以下载多个LaplacesDemon vignettes。)哦,就到页面了。如果它的SMC易于使用,我将成为它的忠实拥护者。我见过的唯一的SMC R包非常复杂。
韦恩

@CliffAB:哇,看完nimble网站后,真是令人印象深刻。为什么我从未听说过?对于习惯BUGS / JAGS建模语言的人们来说,这似乎是一个不错的选择。当然,他们会在网站上进行最好的比较,但到目前为止我还是喜欢的。(除了with rstanarmbrms在引擎盖下使用Stan的人之外,R易用性冠军是Stan。)
韦恩

它仍然很新:v0.1发布了,我想才2年前?SMC是该项目的巨大动力:PI已在粒子过滤器上进行了大量发布,并且每次都从头开始编写它们就很烦人。但是我一直在努力跟上SMC采样器的当前状态。当我离开时(大约两年前),我们只整理了一个非常原始的书。
悬崖AB

1
只是说这个的arXiv论文你可能会感兴趣的
克里夫AB
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.