如何解决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
可以使用gmp
或Rmpfr
之类的辅助软件包将所需的内容转换为更高的精度。 (我不知道它们是否支持类似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 举报,一经查实,本站将立刻删除。