【问题标题】:how to prevent R from showing exp and log values inf and zero如何防止 R 显示 exp 和 log 值 inf 和零
【发布时间】:2021-09-17 09:13:54
【问题描述】:

我将计算矩阵法向密度以在对数似然公式中使用它们。
在我的计算中,我需要计算大数的指数(数千万)。我意识到,当 i >=710 时,R 为 exp(i) 返回无穷大。
无论如何我可以手动强制 R 不显示无穷大,或者它的日志相应地不为 0?


感谢您纠正我的错字

【问题讨论】:

  • 错字:当 i >= 710 时,exp(i) 给出无穷大,而不是 log

标签: r matrix probability-density infinity log-likelihood


【解决方案1】:

你应该知道 R 中的最大双精度数是.Machine$double.xmax。如果你有比这更多的数字,它肯定会给你Inf

> log(.Machine$double.xmax)  
[1] 709.7827

【讨论】:

  • 感谢您指出这一点。我对统计和 R 都很陌生。我不知道。我只是在循环中尝试了不同的数字来找到 710 的值。所以我假设你的意思是没有办法要求 R 不显示大于 710 的数字的无穷大。当我需要比较远大于 710 的数字的 exp 时,是否有任何提示或技巧可以应用?
  • @Mathica 也许你可以尝试包gmp 来获取超大整数。也许其他人比我知道更多的选择。
  • library(Brobdingnag); exp(as.brob(710))。请参阅package 小插图。
  • @RuiBarradas 不错的选择!谢谢。我想你应该把它写成答案,我会支持它。
【解决方案2】:

还有一个贡献包Brobdingnag可以处理比exp(710)大得多的数字。

library(Brobdingnag)

exp(as.brob(710))
#[1] +exp(710)

exp(as.brob(10^seq(100, 310, by = 5)))
# [1] +exp(1e+100) +exp(1e+105) +exp(1e+110) +exp(1e+115) +exp(1e+120)
# [6] +exp(1e+125) +exp(1e+130) +exp(1e+135) +exp(1e+140) +exp(1e+145)
#[11] +exp(1e+150) +exp(1e+155) +exp(1e+160) +exp(1e+165) +exp(1e+170)
#[16] +exp(1e+175) +exp(1e+180) +exp(1e+185) +exp(1e+190) +exp(1e+195)
#[21] +exp(1e+200) +exp(1e+205) +exp(1e+210) +exp(1e+215) +exp(1e+220)
#[26] +exp(1e+225) +exp(1e+230) +exp(1e+235) +exp(1e+240) +exp(1e+245)
#[31] +exp(1e+250) +exp(1e+255) +exp(1e+260) +exp(1e+265) +exp(1e+270)
#[36] +exp(1e+275) +exp(1e+280) +exp(1e+285) +exp(1e+290) +exp(1e+295)
#[41] +exp(1e+300) +exp(1e+305) +exp(Inf)       

而且10^305710 大得多。查看包vignette

【讨论】:

  • 太棒了!我写了一个函数,我在其中使用了 exp(as.bob()) 正如你很好地解释的那样。就在我使用我的函数时,我得到了错误:子赋值类型修复中的不兼容类型(从 S4 到双精度)。我意识到 exp(as.prob()) 的类型是 S4。 exp(as.brob()) 如何只返回一个双精度类值。 ( as.double(exp(as.brob())) 当然再次给出 inf 。
猜你喜欢
  • 2018-02-20
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 2021-01-25
  • 2019-02-20
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
相关资源
最近更新 更多