微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

qnorm的数值问题

如何解决qnorm的数值问题

我在使用qnorm(psn())时遇到数字问题。问题出在数字上。

首先,由于psn(9)不是1,因此偏斜CDF将结果四舍五入:

 library(sn)
 psn(9)
#[1] 1

然后

 qnorm(psn(9))
#[1] Inf

看到:

 qnorm(.9999999999999999)
#[1] 8.209536
 qnorm(.99999999999999999)
#[1] Inf

请注意,8.209536并不大,因此此舍入非常不精确。

然后,我的最后一个问题是qnorm(psn())的计算,这是我copula密度的一部分。关于如何避免这些数值问题的任何提示

解决方法

(这不是解决您的困境的方法,更多地解释了为什么我认为您会看到这种情况,并且可能不太可能找到简单的解决方案。)

我认为这已经进入了无法正常使用浮点精度的领域。例如,进行函数的逆运算:

options(digits=22)
pnorm(8.209536)
# [1] 0.99999999999999989
pnorm(8.209536) - 1
# [1] -1.1102230246251565e-16

非常接近

.Machine$double.eps
# [1] 2.2204460492503131e-16
根据{{​​1}},

?.Machine

可以使用gmpRmpfr之类的辅助软件包将所需的内容转换为更高的精度。 (我不知道它们是否支持类似double.eps: the smallest positive floating-point number 'x' such that '1 + x != 1'. It equals 'double.base ^ ulp.digits' if either 'double.base' is 2 or 'double.rounding' is 0; otherwise,it is '(double.base ^ double.ulp.digits) / 2'. Normally '2.220446e-16'. 的操作。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。