我正在评估具有不同支持的伽马分布的密度。这是我的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; ...这个差异来自哪里? 谢谢!
答案 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>