我目前正在使用Rcpp编写R包,需要评估利用beta版本的对数可能性。根据数据的大小(影响beta中的a和b参数),一些左尾beta分布概率最终变得非常小。由于我正在记录日志,我最终遇到了一个下溢问题。例如:
library(Rcpp)
library(inline)
src <- "double x = Rf_pbeta(0.8, (double) 6403, (double) 21, 1, 1);
return(Rcpp::wrap(x));"
fun <- cxxfunction(signature(), src, plugin = "Rcpp")
如果您运行此代码,则会收到警告:
警告讯息: 在fun()中: pbeta(*,log.p = TRUE) - &gt; bpser(a = 6403,b = 21,x = 0.8,...)下溢到-Inf
我知道我可以使用if语句在函数本身中用-DBL_MAX替换-Inf来修复后续计算问题,但可能这并没有消除警告消息。有关如何抑制警告消息(或更优雅地处理此问题)的任何想法?提前谢谢。
答案 0 :(得分:1)
我们应该提供与R本身完全相同的界面。正如您已经使用过的那样,我们可以在R:
中完成R> pbeta(seq(0.2, 0.8, by=0.1), 6403, 21, log=TRUE)
[1] -10176.71 -7583.18 -5744.24 -4319.09 -3156.15 -2174.90 -Inf
Warning message:
In pbeta(seq(0.2, 0.8, by = 0.1), 6403, 21, log = TRUE) :
pbeta(*, log.p=TRUE) -> bpser(a=6403, b=21, x=0.8,...) underflow to -Inf
R>
所以R(当然)应该尽可能精确 - 这就是我们从像Martin Maechler这样痴迷于细节的严肃统计学家(TM)的辛勤工作中获得的。我认为你应该在r-devel上尝试这个问题,因为我没有看到Rcpp在这里做错了什么 - 它只是将这些值组合到R本身使用的函数中。
最后,你使用Rf_pbeta
,这是我最不喜欢的习语。考虑标量R::pbeta
或(Rcpp基于糖)矢量化Rcpp::pbeta
。