Подтвердить что ты не робот

Арифметика с очень малыми числами в R

Я пытаюсь работать с некоторыми вероятностями, которые становятся очень маленькими, что вызывает проблемы. Например

probs <- c(4.225867e-03,3.463125e-04,2.480971e-05,1.660538e-06,1.074064e-07,6.829168e-09,4.305051e-10,2.702241e-11,1.692533e-12,1.058970e-13,6.622117e-15,4.139935e-16,2.587807e-17,1.617488e-18,1.010964e-19,6.318630e-21,3.949177e-22 2.468246e-23,1.542657e-24,9.641616e-26,6.026013e-27,3.766259e-28,2.353912e-29,1.471195e-30,9.194971e-32

Однако любая арифметика с этим вектором заставляет все после 12-й записи округлять до нуля (вероятно, потому, что она меньше .Machine $double.eps). Например:

probs > 0
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

но

1-probs < 1
[1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

Я пробовал использовать пакет gmp, но я делаю комбинаторные вычисления, и as.bigq(probs) становится очень медленным, когда он поднимается до больших мощностей.

Можно ли обойти это?

4b9b3361

Ответ 1

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

Самое популярное решение - использовать l og transform для представления ваших вероятностей, а затем использовать дополнение вместо умножения. Это называется лог-правдоподобием. Это преобразование позволяет избежать проблемы очень малых чисел, и, кроме того, значения логарифмического правдоподобия могут быть использованы непосредственно для сравнения вероятности вещей (более низкая логарифмическая правдоподобие всегда означает меньшую вероятность).

Обратите внимание, что существует тонкое различие между вероятностью и вероятностью, но преобразование журнала превращает очень маленькие числа в отрицательные с меньшим разнообразием в количестве знаков после запятой работает независимо.