R 和 C++ 中的吉布斯采样
Gibbs Sampling in R and C++
我检查了不同编程语言的 gibbs 采样;在
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));
你有什么问题?
R::rgamma()
也来自 Rcpp。它方便地包装了 C 级、非命名空间的 ::Rf_rnorm()
.
请注意,您还有 vectorised Rcpp::rnorm()
——并且在 Darren 最初的 post 之后还有大量 Gibbs 采样器示例威尔金森。我们最好的例子可能是 this page at the Rcpp Gallery.
编辑: 由于您显然对 shape = 1/rate
参数化感到困惑,这里有一个完整且有效的示例:
我们先通过Rcpp编译一个调用C++的方便的R函数:
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++ 函数并确保遵守“1/over”重新参数化还有:
R> set.seed(42); callrgamma(3, 2.0, 1/2.0) # calling Rcpp
[1] 1.824478 0.444055 0.779610
R>
我检查了不同编程语言的 gibbs 采样;在
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));
你有什么问题?
R::rgamma()
也来自 Rcpp。它方便地包装了 C 级、非命名空间的 ::Rf_rnorm()
.
请注意,您还有 vectorised Rcpp::rnorm()
——并且在 Darren 最初的 post 之后还有大量 Gibbs 采样器示例威尔金森。我们最好的例子可能是 this page at the Rcpp Gallery.
编辑: 由于您显然对 shape = 1/rate
参数化感到困惑,这里有一个完整且有效的示例:
我们先通过Rcpp编译一个调用C++的方便的R函数:
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++ 函数并确保遵守“1/over”重新参数化还有:
R> set.seed(42); callrgamma(3, 2.0, 1/2.0) # calling Rcpp
[1] 1.824478 0.444055 0.779610
R>