簡體   English   中英

R和C ++中的Gibbs采樣

[英]Gibbs Sampling in R and C++

我用不同的編程語言檢查過吉布斯抽樣; 在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 =觀察次數,並且取小數位數而不是速率作為默認輸入,並且rmrm也沒有n =觀察次數。

對於Rcpp,完全不同,例如;

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

你有什么問題?

R::rgamma()也來自Rcpp。 它方便地包裝C級,非命名空間的::Rf_rnorm()

請注意,您還具有矢量化的 Rcpp::rnorm() ,在達倫·威爾金森(Darren Wilkinson)發表第一篇文章之后,還有很多吉布斯采樣器(Gibbs Sampler)示例。 最好的例子可能是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> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM