我检查了不同编程语言的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));
答案 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>