吉布斯在R和C ++中的抽样

时间:2015-11-29 21:54:13

标签: c++ r rcpp

我检查了不同编程语言的gibbs采样;在R

  x <- rgamma(1,3,y*y+4)
  y <- rnorm(1,1/(x+1),1/sqrt(2*(x+1)))

在c ++中

  x = R::rgamma(3.0,1.0/(y*y+4));
  y = R::rnorm(1.0/(x+1),1.0/sqrt(2*x+2));

如果它使用R函数,为什么它在c ++中有所不同,因为rgamma没有n =观察次数,它采用比例而不是速率作为默认输入,而rnorm也没有n =观察次数。

对于Rcpp,它完全不同,例如;

 y = ::Rf_rnorm(1.0/(x+1),1.0/sqrt(2*x+2));

1 个答案:

答案 0 :(得分:3)

你的问题是什么?

R::rgamma()也来自Rcpp。它可以方便地包装C级非命名空间::Rf_rnorm()

请注意,您还拥有 vectorised Rcpp::rnorm() - 并且Darren Wilkinson在首次发布后有大量的Gibbs Sampler示例。我们最好的例子可能是this page at the Rcpp Gallery

编辑:由于您明显对shape = 1/rate参数化感到困惑,这里有一个完整且有用的示例:

我们编译一个方便的R函数,首先通过Rcpp调用C ++:

R> cppFunction("NumericVector callrgamma(int n, double shape, double scale) { 
+                  return(rgamma(n, shape, scale)); }")
R>

然后我们打电话给R,确保我们修理种子:

R> set.seed(42); rgamma(3, 2.0, 2.0)   # calling R
[1] 1.824478 0.444055 0.779610
R>

现在,使用相同的种子,我们称之为C ++函数,我们确保尊重&#34; 1 / over&#34;重新参数化

R> set.seed(42); callrgamma(3, 2.0, 1/2.0)   # calling Rcpp
[1] 1.824478 0.444055 0.779610
R>