假设我有这样的功能:
f <- function(x){
exp(x) / (1 + exp(x))
}
它应该适用于 x 的任何实际值,但实际上当 x 为 710 或更大时它返回 NaN。我想知道处理这个问题的正确方法是什么。我意识到让它返回 1 很容易,但从统计学家的角度来看,这可能不是一个好的行为。有人有什么意见或建议吗?
假设我有这样的功能:
f <- function(x){
exp(x) / (1 + exp(x))
}
它应该适用于 x 的任何实际值,但实际上当 x 为 710 或更大时它返回 NaN。我想知道处理这个问题的正确方法是什么。我意识到让它返回 1 很容易,但从统计学家的角度来看,这可能不是一个好的行为。有人有什么意见或建议吗?
在这种情况下,NaN返回(不是数字),因为双精度算术中的指数计算溢出。
一个在 MacLaurin 级数中展开为的代数等价表达式是
因为这是一个交替序列,所以删除任何一项的错误不会大于下一项的大小。因此,当时,误差不大于相对于真实值。这比任何统计计算所需的精确得多,因此在这种情况下
有趣的是,当指数下溢R时不会产生。因此,您可以根据 的符号选择更可靠的计算版本,如NaNx
f <- function(x) ifelse(x < 0, exp(x) / (1 + exp(x)), 1 / (1 + exp(-x)))
这个问题几乎出现在所有的计算平台上(我还没有看到一个例外),它们在处理上溢和下溢的方式上会有所不同。指数因制造这类问题而臭名昭著,但它们并不孤单。因此,仅仅有一个解决方案是不够的R:一个好的统计学家了解计算机算术的原理,并且知道如何使用这些原理来检测和解决她计算环境的特性。
其他人已经讨论了计算问题,所以我将把它留给他们。由于我假设您正在使用 R,我想我会指出引导包带有它自己的逆 logit 函数供您使用,它在计算上非常稳定:
require(boot)
inv.logit(710)
似乎根据需要评估为 1。