r-Rcpp中对数CDF值的欠流处理
r - Treatment of Underflow from Log CDF Values in Rcpp
我目前正在使用Rcpp编写一个R包,需要评估使用beta分布的日志可能性。根据数据的大小(影响贝塔中的a和b参数),一些左尾贝塔分布概率最终非常小。由于我正在获取日志,我最终会遇到下溢问题。例如:
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")
如果你运行这个代码,你会得到警告:
警告消息:在函数()中:pbeta(*,log.p=TRUE)->bpser(a=6403,b=21,x=0.8,…)下溢到-Inf
我知道我可能可以在函数本身中使用if语句将-Inf替换为-DBL_MAX来解决后续的计算问题,但这可能并不能消除警告消息。你知道如何抑制警告消息(或者更优雅地处理这个问题)吗?提前谢谢。
我们应该提供与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(当然)应该尽可能精确——这就是我们从像马丁·梅克勒这样痴迷细节的严肃统计学家(TM)的辛勤工作中得到的。我认为您应该在r-devel上尝试这个问题,因为我没有看到Rcpp在这里做错了什么——它只是将值封送至r本身使用的函数。
最后,您使用了Rf_pbeta
,这是我最不喜欢的习语。考虑标量R::pbeta
或(基于Rcpp糖的)矢量化Rcpp::pbeta
。
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 处理除以零会导致<csignal>意外行为
- 是否可以在c++中处理字符串流中的各个元素
- r-Rcpp中对数CDF值的欠流处理