我是贝叶斯统计研究的新手。我从研究人员那里听说,贝叶斯研究人员最好自己实施 MCMC,而不是使用 JAGS/Stan 之类的工具。请问除了学习目的之外,自己实现 MCMC 算法有什么好处(用“不太快”的语言,如 R)?
做 MCMC:使用 jags/stan 或自己实现
一般来说,我强烈建议不要为真正的应用贝叶斯分析编写自己的 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 中,但通常它非常高效,具有竞争力。