从Rcpp中的Log CDF值处理下溢

时间:2016-07-26 13:42:58

标签: r c++

我目前正在使用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来修复后续计算问题,但可能这并没有消除警告消息。有关如何抑制警告消息(或更优雅地处理此问题)的任何想法?提前谢谢。

1 个答案:

答案 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