VGAM logit函数溢出

时间:2014-04-25 13:51:43

标签: r vgam

VGAM版本0.93

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

问题在于:

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

此处log1p(exp(1000))变为Inf

所以它使用的数值方法不能处理大数,而基数中的plogis可以正常工作。

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

1 个答案:

答案 0 :(得分:0)

更新:这是一个错误,尽管浮点问题,它应该返回1.确实,在这种情况下应该使用plogis函数,因为它正确处理问题。作者和维护者在DESCRIPTION file作为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 

如果您对此处的确切值感兴趣,则必须将数字转换为可在计算机上显示的比例。


事实上,对于大量问题,问题并没有改变。要清楚您要求机器表示的内容(当您要求反向logit为1000时),请尝试使用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 ....