Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R VGAM logit函数溢出_R_Vgam - Fatal编程技术网

R VGAM logit函数溢出

R VGAM logit函数溢出,r,vgam,R,Vgam,VGAM版本0.93 > logit(1000, inverse=T) [1] 0 # it should be 1 问题在于: exp(1000 - log1p(exp(1000))) 这里log1p(exp(1000))变成Inf 因此,它使用的数值方法与正确工作的base中的plogis相比,不能处理大的数字 它值得一个bug报告吗?我可以在哪里提交它?更新:这是一个bug,尽管存在浮点问题,但它应该返回1。实际上,在这种情况下应该使用plogis函数,因为它可以正确处理问题。作

VGAM版本0.93

> logit(1000, inverse=T)
[1] 0 # it should be 1
问题在于:

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

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


它值得一个bug报告吗?我可以在哪里提交它?

更新:这是一个bug,尽管存在浮点问题,但它应该返回1。实际上,在这种情况下应该使用
plogis
函数,因为它可以正确处理问题。作者和维护者在报告中被称为Thomas Yee,你应该给他发一封电子邮件


您的机器无法表示这么小的浮点。考虑逆logit函数:

inv.logit<-function(x) exp(x)/(1+exp(x))
在我自己的机器上,这已经接近机器所能代表的极限。您可以找到该值
.Machine$double.xmin

.Machine$double.xmin
# [1] 2.225074e-308 
如果你真的对这里的精确值感兴趣,你必须将数字转换成可以在你的计算机上表示的比例


事实上,对于大多数人来说,这个问题并没有改变。为了清楚您要求机器表示的内容(当您要求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 ....

sry,我的打字错误,它是
logit(1000,inverse=T)
,而不是
-1000
,但是你可能会说我的机器不能以任何方式表示这么大的浮点。嗯,我改变了主意,我认为这是一个错误。如果它不能表示浮点,它至少应该输出
1
library(Rmpfr)
1- (1/exp(mpfr(1000,precBits=1e5)))
[1] 0.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999994924041102450543234708 ....