Rcpp和R中的密度γ

时间:2014-05-03 02:09:16

标签: r rcpp gamma

我正在评估具有不同支持的伽马分布的密度。这是我的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)

我得到了那个&#34;平均相对差异:32.77&#34; ...这个差异来自哪里? 谢谢!

2 个答案:

答案 0 :(得分:2)

对于gamma函数,R在R级别和C级别使用不同的参数化这一事实让您感到困惑。如果您将dgamma调用更改为

,则会看到相同的结果
R::dgamma(log(w[j]), pard(0,j), 1/pard(1,j), 0);

R-exts 6.7.1中对此进行了简要讨论 - 请注意,它需要scale而非rate

答案 1 :(得分:0)

你太复杂了。开始更简单:

// [[Rcpp::export]] 
double mydgamma(double a, double b, double c, int d) {
  return R::dgamma(a, b, c, d);
}

并查看有关shape和rate参数的标题。

然后

R> mydgamma(0.5, 1, 1, 0)
[1] 0.606531
R> dgamma(0.5,1)
[1] 0.606531
R> 

R> mydgamma(0.25, 0.5, 1, 0)
[1] 0.878783
R> dgamma(0.25,0.5)
[1] 0.878783
R>