我正在运行一个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兼容的软件可以为您创造奇迹。也就是说,如果可以选择自动化流程。