【问题标题】:How to deal with very big numbers producing NaN如何处理产生 NaN 的非常大的数字
【发布时间】:2021-12-30 06:34:45
【问题描述】:

我想定义一个非常简单的函数如下:

地点:

我目前的工作

prob <- function(x, n) {
  quan <- qgamma(0.95, n, 1)
  temp <- quan / (x)^2
  first_term <- exp(-temp)
  second_term <- temp^(0:(n - 1)) / factorial(0:(n - 1))
  second_term <- sum(second_term)
  first_term * second_term
}

这里的问题是,在大 n 的总和(第二项)中,我们处理的是非常大的数字,因此 R 将它们视为无穷大。

例如:

prob(0.5, n = 1000)
[1] NaN

因为 n = 1000 的分位数等于 1052.577,所以在分母中我们必须计算 1052.577^999 和分母中的阶乘 999。R 将这两个数字理解为无穷大:

> factorial(999)
[1] Inf
> 1052.577^999
[1] Inf

所以当它试图划分它们时,会产生NaN。然而,这个函数的输出总是在区间 (0, 1) 中,因为它是一个概率。有没有可能在这一点上计算这个函数的值?

【问题讨论】:

  • 一个明显的选择是在对数尺度上构造求和的各个元素,然后在求和之前取幂。
  • Inf/Inf # [1] NaN
  • Brobdingnag 包按照 Limey 的建议处理大量数字
  • 我下载了这个包。不幸的是,我使用它获得了这个结果> brob(1052.577^999 / factorial(999)) [1] +exp(NaN)

标签: r function calculation


【解决方案1】:

您的prob 函数只是lambda = tempk = n - 1 的累积泊松。使用ppois

prob <- function(x, n) {
  return(ppois(n - 1, qgamma(0.95, n, 1)/x^2))
}

prob(0.5, n = 1000)
# [1] 0

prob(0.5, n = 1000) = 0 因为n - 1 = 999 与平均值相差甚远 (lambda = qgamma(0.95, 1000, 1)/0.5^2 = 4210.308)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2010-10-07
    • 1970-01-01
    相关资源
    最近更新 更多