0

VGAM 版本 0.93

> logit(1000, inverse=T)
[1] 0 # it should be 1

问题在这里:

exp(1000 - log1p(exp(1000)))

这里log1p(exp(1000))变成Inf

因此,与正常工作的基础相比,它使用的数值方法不能处理大数字plogis

是否值得提交错误报告,我在哪里可以提交?

4

1 回答 1

0

更新:这是一个错误,尽管存在浮点问题,但它应该返回 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 ....
于 2014-04-25T14:19:26.930 回答