我是贝叶斯统计研究的新手。我从研究人员那里听说,贝叶斯研究人员可以更好地自己实现MCMC,而不是使用JAGS / Stan之类的工具。我可以问一下,除了学习目的之外,自行实现MCMC算法(使用像R这样的“不太快”的语言)有什么好处?
我是贝叶斯统计研究的新手。我从研究人员那里听说,贝叶斯研究人员可以更好地自己实现MCMC,而不是使用JAGS / Stan之类的工具。我可以问一下,除了学习目的之外,自行实现MCMC算法(使用像R这样的“不太快”的语言)有什么好处?
Answers:
通常,我强烈建议您不要为真正的应用贝叶斯分析编写您自己的MCMC。这既费时又费力,并且很可能在代码中引入错误。黑盒采样器(例如Stan)已经使用了非常复杂的采样器。相信我,您不会只为进行这种分析而编写此口径的采样器!
在某些特殊情况下,这还不够。例如,如果您需要进行实时分析(即基于传入数据的计算机决策),那么这些程序将不是一个好主意。这是因为Stan需要编译C ++代码,这可能比只为相对简单的模型运行已经准备好的采样器花费更多的时间。在这种情况下,您可能需要编写自己的代码。另外,我相信在某些特殊情况下,诸如Stan之类的程序包表现很差,例如非高斯状态空间模型(完全披露:我相信 Stan在这种情况下的表现很差,但不知道)。在这种情况下,实现自定义MCMC可能是值得的。但这是例外,不是规则!
坦白地说,我认为大多数为单个分析编写采样器的研究人员之所以这样做(确实如此,我已经看到了)是因为他们喜欢编写自己的采样器。至少,我可以说我属于这一类(即,我对编写自己的采样器并不是最好的处理方式感到失望)。
同样,尽管为单个分析编写自己的采样器没有意义,但为一类分析编写自己的代码可能很有意义。由于JAG,Stan等都是黑盒采样器,因此,尽管改进的程度取决于模型,但始终可以通过专门针对给定的模型来加快处理速度。但是,从头开始编写一个非常高效的采样器可能需要10-1,000个小时的时间,具体取决于经验,模型的复杂性等。如果您正在使用贝叶斯方法进行研究或编写统计软件,那很好。这是你的工作。但是,如果老板说“嘿,您可以分析此重复测量数据集吗?” 而且您花250个小时编写一个高效的采样器,您的老板很可能会不高兴。相反,您可以在Stan中编写此模型,例如,需要2个小时,并且运行时间为2分钟,而不是高效采样器获得的1分钟运行时间。
这个问题主要是基于意见的,但是我想这里写下一个答案就足够了。对于研究问题,可能有很多原因要对自己的采样器进行编码。这里是其中的一些
提案:如fcop在其评论中建议的,如果样本是MH,则编码自己的采样器可以让您试用提案分布,以获得最佳的混合采样器。
灵活性:内置程序可能无法为您提供所需的灵活性。您可能要从特定的随机值开始,或使用特定的种子结构。
理解:对自己的采样器进行编码可帮助您了解采样器的行为,从而深入了解马尔可夫链过程。这对于研究该问题的研究人员很有用。
责任:如果我要进行所有贝叶斯推理的数据来自我没有编写代码的程序,那么推理的责任就不再由我承担。作为研究人员,我想对我介绍的方法/结果承担全部责任。使用内置方法不允许这样做。
可能还有更多原因,但这是使我编写自己的采样器的四个原因。
我给Cliff AB的答案+1。要添加一个小窍门,如果您想在一个较低的级别上工作,但又不想降低代码本身的水平,您应该在LaplacesDemon软件包中四处摸索。最初的作者很聪明,但似乎已脱离网格,该软件包已被其他人接管。(我相信它在Github上。)
它实现了一个令人印象深刻的MCMC使用的算法号和所包含的护身符是值得的阅读,即使你不使用的包。您所了解的几乎任何种类的采样器都有。您以与BUGS / JAGS或Stan不同的方式进行编码,并且全部使用R语言编写,但通常情况下它是如此高效以至于具有竞争力。
LaplacesDemon
如果您熟悉的话,听起来与相似。也很高兴听到nimble
。我至少会下载它。(尽管即使您使用敏捷的工具,也可以下载多个LaplacesDemon vignettes。)哦,就到页面了。如果它的SMC易于使用,我将成为它的忠实拥护者。我见过的唯一的SMC R包非常复杂。
nimble
网站后,真是令人印象深刻。为什么我从未听说过?对于习惯BUGS / JAGS建模语言的人们来说,这似乎是一个不错的选择。当然,他们会在网站上进行最好的比较,但到目前为止我还是喜欢的。(除了with rstanarm
和brms
在引擎盖下使用Stan的人之外,R易用性冠军是Stan。)