VGAM 版本 0.93
> logit(1000, inverse=T)
[1] 0 # it should be 1
问题在这里:
exp(1000 - log1p(exp(1000)))
这里log1p(exp(1000))
变成Inf
因此,与正常工作的基础相比,它使用的数值方法不能处理大数字plogis
。
是否值得提交错误报告,我在哪里可以提交?
更新:这是一个错误,尽管存在浮点问题,但它应该返回 1。确实,plogis
在这种情况下应该使用该函数,因为它可以正确处理问题。作者和维护者在DESCRIPTION文件中被报告为Thomas Yee,你应该给他发一封电子邮件。
您的机器无法表示那么小的浮点数。考虑逆 logit 函数:
inv.logit<-function(x) exp(x)/(1+exp(x))
即使是 500,它也非常非常小:
inv.logit(-500)
# 7.124576e-218
在我自己的机器上,这已经接近机器可以表示的极限。你可以找到这个值.Machine$double.xmin
。
.Machine$double.xmin
# [1] 2.225074e-308
如果您真的对此处的确切值感兴趣,则必须将数字转换为可以在计算机上表示的比例。
事实上,对于大量的问题并没有改变。要清楚您要求机器代表什么(当您要求 1000 的逆 logit 时),请尝试使用该gmp
包。你要求这个数字的倒数的补码:
library(gmp)
exp(1)^as.bigz(1000)
Big Integer ('bigz') :
[1] 10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
问题是取这个数字的倒数,这将非常小,并且在您的计算机上无法表示。
您实际上可以使用Rmpfr
包来计算这个数字(它gmp
用作依赖项。这是一个示例:
library(Rmpfr)
1- (1/exp(mpfr(1000,precBits=1e5)))
[1] 0.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999994924041102450543234708 ....