我正在R
中运行带有Metropolis Hastings步骤的MCMC算法,这需要根据逻辑规则接受或拒绝提案样本。目前,我已将其实现为
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
循环中。
答案 0 :(得分:1)
切换通常比 If 语句更快,但在这两种情况下,这些差别可以忽略不计,除非它真的是非常关键的代码。
答案 1 :(得分:1)
我不认为if
很慢(虽然ifelse
is,但它不同)。
什么是缓慢的是迭代R中的许多元素。
如果您真的关心性能,可以使用矢量化(如果迭代是独立的)或Rcpp。
您可能对This example感兴趣。
答案 2 :(得分:0)
你打算手写这个算法吗?因为几个 R 包(基于 Stan、JAGS、BUGS 代码)实际上可以执行 Metropolis-Hastings,并且函数通常针对速度进行了优化,因为它最终是限制因素。
有许多与 R 兼容的软件可以为您创造奇迹。也就是说,如果您可以选择自动化流程。