如何使用Metropolis-Hastings算法将C或C++代码合并到我的R代码中以加速MCMC程序

use*_*814 10 c r mcmc

我正在寻求关于如何使用Metropolis-Hastings算法将C或C++代码合并到我的R代码中来加速MCMC程序的建议.我使用MCMC方法来模拟可能性,给定各种协变量,个人将被第三方(法官)分配给社会地位等级中的特定等级:每个法官(大约80个,跨越4个村庄)被要求根据对每个人的社会地位的评估,对一组个人(大约80个,跨越4个村庄)进行排名.因此,对于每个法官,我有一个等级向量,对应于他们对每个人在等级中的位置的判断.

为了模拟这种我认为,分配的行列时,法官对个人效用,一些潜在措施的相对价值根据他们的决定ü.鉴于此,然后可以假定行列,向量[R ,由给定的法官产生是未观测到的矢量的函数,ü,描述个人的效用被排名,其中与个人第k的最高值ü将被分配第k级.我建模ü,,,使用感兴趣的协变量作为多变量正态分布变量,然后确定所观察到的行列的可能性给定的分布ü由模型生成的.

除了估计最多5个协变量的影响之外,我还估计了描述法官和项目之间差异的超参数.因此,对于链的每次迭代,我估计多变量法向密度大约为8-10倍.因此,5000次迭代可能需要长达14个小时.显然,我需要运行它超过5000次运行,所以我需要一种方法来大大加快这个过程.鉴于此,我的问题如下:

(i)我是否有权假设通过在C或C++中运行一些(如果不是全部)链条来获得最佳速度增益?

(ii)假设问题1的答案是肯定的,我该怎么做呢?例如,有没有办法让我保留所有R函数,只需在C或C++中循环:即我可以从C调用R函数然后循环吗?

(iii)我想我真正想知道的是如何最好地将C或C++代码合并到我的程序中.

Spa*_*man 18

首先确保你的慢R版本是正确的.调试R代码可能比调试C代码更容易.完成了吗?大.您现在可以使用正确的代码进行比较.

接下来,找出花时间的东西.使用Rprof运行代码,看看花了多少时间.我为一些我继承过的代码做了这个,发现它花了90%的时间在t()函数中.这是因为程序员有一个矩阵A,并且在无数个地方做了t(A).我在开始时做了一个tA = t(A),并用tA替换每个t(A).大力加速,不费吹灰之力.首先描述您的代码.

现在,你已经找到了瓶颈.是你可以加速R的代码吗?它是一个可以矢量化的循环吗?去做.根据您的黄金标准正确代码检查您的结果.总是.是的,我知道很难比较依赖随机数的算法,因此设置种子相同并再试一次.

还不够快?好的,现在也许你需要在C或C++或Fortran中重写部分(一般是最低级别的部分,以及那些花费大部分时间进行分析的部分),或者如果你真的想用GPU代码那么.

再次,真的检查代码给出与正确的R代码相同的答案.真的检查一下.如果在此阶段您在常规方法中找到任何错误,请将其修复为您认为正确的R代码和最新版本,并重新运行所有测试.建立大量的自动测试.经常运行它们.

阅读有关代码重构的内容.它被称为重构,因为如果你告诉你的老板你正在重写你的代码,他或她会说'你为什么不第一次正确写它?'.如果你说你正在重构你的代码,他们会说"嗯......很好".这实际上是发生的.

正如其他人所说,Rcpp是胜利的.

  • 是的:http://www.cafepress.co.uk/cp/customize/product2.aspx?from = CustomDesigner&number = 618625436 (11认同)

Pau*_*tra 2

我认为目前集成C或C++最好的方法是Dirk Eddelbuettel的Rcpp包。你可以在他的网站上找到很多信息。通过 YouTube 可以观看Google 的一次演讲,可能会很有趣。