2

さまざまなサポートを持つガンマ分布の密度を評価しています.これが私のRcppコードです..

// [[Rcpp::export]] 
NumericVector fdensv(NumericVector w, NumericMatrix pard){
nj = w.size();
NumericVector out(nj);
for (int j=0;j<nj;j++){
    out[j] = R::dgamma(log(w[j]),pard(0,j),pard(1,j),0);
}
return out;
}

sourceCpp("test2.cpp")

コードをテストする

nj = 200
dr = exp(rgamma(nj,2,3))
pr = matrix(runif(400*2,2,4),2,200)
gg = fdensv(dr,pr)

gg2 = NULL
for (i in 1:nj)
 {
 gg2[i] = dgamma(log(dr[i]),pr[1,i],pr[2,i])
  }

cbind(gg,gg2)
all.equal(gg,gg2)

「平均相対差:32.77」ということを取得しました...この不一致はどこから来ているのですか?ありがとう!

4

2 に答える 2

2

R が関数に対して R レベルと C レベルで異なるパラメーター化を使用しているという事実に悩まされていgammaます。dgamma呼び出しを次のように変更すると、同等の結果が得られます。

R::dgamma(log(w[j]), pard(0,j), 1/pard(1,j), 0);

これは、R-exts 6.7.1で簡単に説明されてscalerateます。

于 2014-05-03T09:25:56.537 に答える