我在使用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密度的一部分。有什么关于如何避免这些数值问题的提示吗?
发布于 2020-10-07 02:54:35
(这不是你困境的解决方案,更多的是解释为什么我认为你看到了这一点,也许不太可能找到一个简单的解决方案。)
我认为这已经进入了一个正常的浮点精度对你不起作用的领域。例如,对您的函数进行逆操作:
options(digits=22)
pnorm(8.209536)
# [1] 0.99999999999999989
pnorm(8.209536) - 1
# [1] -1.1102230246251565e-16它非常接近于
.Machine$double.eps
# [1] 2.2204460492503131e-16根据?.Machine的说法,这是
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'.https://stackoverflow.com/questions/64231680
复制相似问题