【问题标题】:Adding floating point precision to qnorm/pnorm?向 qnorm/pnorm 添加浮点精度?
【发布时间】:2011-05-09 03:44:47
【问题描述】:
我有兴趣在从当前级别计算qnorm/pnorm 时增加浮点限制,例如:
x <- pnorm(10) # 1
qnorm(x) # Inf
qnorm(.9999999999999999444) # The highst limit I've found that still return a <<Inf number
(在合理的时间内)可以做到吗?如果有,怎么做?
【问题讨论】:
标签:
r
floating-point
precision
normal-distribution
【解决方案1】:
如果参数在上尾,你应该可以通过计算 1-p 获得更好的精度。像这样:
> x = pnorm(10, lower.tail=F)
> qnorm(x, lower.tail=F)
10
我希望(虽然我不确定)pnorm() 函数是指一个 C 或 Fortran 例程,该例程卡在硬件支持的任何浮点大小上。重新排列您的问题可能会更好,这样就不需要精度了。
然后,如果您要处理非常大的 z 值,则可以使用 log.p=T:
> qnorm(pnorm(100, low=F, log=T), low=F, log=T)
100
抱歉,这不是您要查找的内容。但我认为它会更具可扩展性——pnorm 在高 z 值下如此迅速地达到 1(毕竟它是 e^(-x^2)),即使你添加更多位,它们也会很快用完。
【讨论】:
-
尽管这个答案已有 8 年以上的历史,但 lower.tail=F 解决方案正是我所需要的。它让我想起了 William Gould 的"Mata Matters: Precision",它解释了为什么 1 - pnorm 会导致精度问题。 “真正的杀手是加法和减法。” pg。 557.跨度>