我在网站上和网站上都看了一些,但没有找到任何解决方案。我的问题相对简单,因此,如果您能为我指出一个可能的解决方案,将不胜感激。
test_vec <- c(2,8,709,600)
mean(exp(test_vec))
test_vec_bis <- c(2,8,710,600)
mean(exp(test_vec_bis))
exp(709)
exp(710)
# The numerical limit of R is at exp(709)
我如何计算我的向量的平均值并处理Inf值,而我知道R可以处理平均值但不是平均值计算分子中的所有值?
答案 0 :(得分:1)
在一个极端的情况下,您可以通过数学上简单地重新求解问题来解决问题,但这将需要向量的长度非常大和/或您的exp很大。数字接近数字限制:
由于均值sum(x)/n
可以写成sum(x/n)
,并且自exp(x)/exp(y) = exp(x-y)
起,您就可以计算sum(exp(x-log(n)))
,这使log(n)减轻了。
mean(exp(test_vec))
[1] 2.054602e+307
sum(exp(test_vec - log(length(test_vec))))
[1] 2.054602e+307
sum(exp(test_vec_bis - log(length(test_vec_bis))))
[1] 5.584987e+307
虽然这适用于您的示例,但很可能不适用于您的真实矢量。
在这种情况下,您将必须咨询@fra建议的Rmpfr
之类的软件包。
答案 1 :(得分:0)
在这里,您有资格只选择test_vec
中给出答案的那些人<Inf
:
mean(exp(test_vec)[which(exp(test_vec) < Inf)])
[1] 1.257673e+260
t2 <- c(2,8,600)
mean(exp(t2))
[1] 1.257673e+260
这假定您正在寻找排除会导致Inf
的值。