Есть ли способ обрабатывать вычисления, включающие экспоненту больших значений в R? - PullRequest
0 голосов
/ 24 марта 2020

Я посмотрел немного онлайн и на сайте, но я не нашел никакого решения. Моя проблема относительно проста, поэтому, если бы вы могли указать мне на возможное решение, очень ценю.

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 может обрабатывать среднее значение, но не все значения в числителе вычисления среднего?

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Существует крайний случай, когда вы можете решить свою проблему, просто математически переосмыслив ее, но для этого потребуется, чтобы длина вашего вектора была чрезвычайно большой и / или чтобы ваш большой опыт. числа близки к цифре c предел:

Поскольку среднее значение sum(x)/n может быть записано как sum(x/n), а поскольку exp(x)/exp(y) = exp(x-y), вы можете рассчитать sum(exp(x-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

Хотя это работает для вашего примера, скорее всего, это не будет работать для вашего реального вектора. В этом случае вам придется обращаться к пакетам, таким как Rmpfr, как предлагает @fra.

0 голосов
/ 24 марта 2020

Вот один из способов, при котором вы можете выбрать только тех из ваших test_vec, которые дают ответ <<code>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, конечно.

...