一次pnorm调用即可访问正常CDF的两条尾巴

时间:2019-05-21 06:10:20

标签: c++ r

我正在写一个R包,其中我需要为非常大的矩阵Phi(.)的每个条目(例如5000 x 20000)评估正常CDF A的(对数) ),并准确地对两条尾巴(即log(Phi(A))log(1-Phi(A))做到这一点。

到目前为止,我已经两次使用R函数pnorm

logphiA <- pnorm(A, log.p = TRUE)
log1_phiA <- pnorm(A, log.p = TRUE, lower.tail = FALSE)

这是相当昂贵的。请注意,我不能为log1_phiA使用更便宜,更不准确的版本:

log1_phiA <- log(1-exp(logphiA))

因为这会引起我的稳定性问题。

我查看了pnorm的C ++实现,发现它调用了一个void函数pnorm_both,该函数可以一次计算两条尾巴,并在函数pnorm5中使用,见例如here。所以我想知道如果我可以在我的R代码中调用它,这是否可能是我更便宜的选择。您知道这是否可以选择吗?还是应该复制C ++源代码并相应地修改pnorm_both函数?

否则,您是否有另一个想法,可以在不放弃计算准确性的情况下更快地评估正常CDF?

谢谢!

0 个答案:

没有答案