【问题标题】: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.跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2018-07-06
    • 2017-11-30
    • 2019-11-10
    • 1970-01-01
    相关资源
    最近更新 更多