什么是“if”语句的替代方案,以提高MCMC算法的性能?

时间:2017-09-22 14:38:17

标签: r performance if-statement mcmc

我正在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循环中。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我不认为if很慢(虽然ifelse is,但它不同)。 什么是缓慢的是迭代R中的许多元素。

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

您可能对

This example感兴趣。

答案 2 :(得分:0)

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

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