r语言 - "if"语句的替代方案是什么,以提高MCMC算法的性能?



我正在运行一个MCMC算法,其中大都会黑斯廷斯步进了R,这需要根据逻辑规则接受或拒绝提案样本。目前,我已经将其实现为

if(sample meets condition){accept}
else{reject}

我听说if陈述很慢,但MCMC通常需要评估许多提案样本,肯定有一万个。有哪些更快的替代方案可以提高任何MCMC算法的这一部分的速度?

给出代码中步骤的示例:

A = sample(c(0,1),1,prob=c(1-A,A))
if(A==1){
s_acc[i,] = s_new
s_old     = s_new
acc[i] = 1
}
else{
s_acc[i,] = s_old
acc[i] = 0
}

其中A是样本的接受概率,s_new是建议样本的值,s_acc是所有接受样本的向量,s_old是当前先前接受的样本,acc是接受的样本的计数。这部分代码嵌入在具有大量迭代的for循环中。

Switch通常比If语句快,但在这两种情况下,这些差异都可以忽略不计,除非它真的是非常关键的代码。

我不认为if很慢(虽然ifelse很慢,但它是不同的)。 慢的是遍历 R 中的大量元素。

如果你真的关心性能,你可以使用矢量化(如果迭代是独立的)或 Rcpp。

您可能会对此示例感兴趣。

你打算手写这个算法吗?因为几个R包(基于Stan,JAGS,BUGS代码)实际上可以做Metropolis-Hastings,并且功能通常针对速度进行优化,因为它最终是限制因素。

有许多与R兼容的软件可以为您创造奇迹。也就是说,如果可以选择自动化流程。

最新更新