как запретить R показывать значения exp и log inf и ноль

#r #matrix #probability-density #infinity #log-likelihood

Вопрос:

Я собираюсь вычислить нормальные плотности матриц, чтобы использовать их в формуле логликативности.
в своих расчетах мне нужно вычислить экспоненту больших чисел ( десятки миллионов ). Я понял, что R возвращает бесконечность для exp(i), когда я >=710. >
в любом случае я могу заставить R вручную не показывать бесконечность или его журнал не должен быть 0 соответственно?

спасибо за исправление моей опечатки

Комментарии:

1. Опечатка: это exp(i) когда я >= 710, что дает бесконечность, а не > log .

Ответ №1:

Вы должны знать, что максимальное двойное число в R равно .Machine$double.xmax . Если у вас есть числа больше, чем это, это определенно даст вам Inf

 > log(.Machine$double.xmax)  
[1] 709.7827
 

Комментарии:

1. Спасибо, что указали на это. Я очень новичок как в статистике, так и в R. Я этого не знал. Я просто попробовал разные числа в цикле, чтобы найти это значение 710. Поэтому я предполагаю, что вы имеете в виду, что нет никакого способа попросить R не показывать бесконечность для exp чисел, превышающих 710. есть ли какой-либо намек или трюк, который можно применить, когда мне нужно сравнить exp чисел, намного превышающих 710?

2. @Mathica Может быть, вы можете попробовать пакет gmp для сверхбольших целых чисел. Может быть, другие знают больше вариантов, чем я.

3. library(Brobdingnag); exp(as.brob(710)) . См. виньетку упаковки .

4. @RuiBarradas Хороший вариант! Спасибо. Я думаю, вам следует написать это в качестве ответа, и я поддержу его.

Ответ №2:

Существует также пакет Brobdingnag, который может обрабатывать числа, намного превышающие exp(710) .

 library(Brobdingnag)

exp(as.brob(710))
#[1]  exp(710)

exp(as.brob(10^seq(100, 310, by = 5)))
# [1]  exp(1e 100)  exp(1e 105)  exp(1e 110)  exp(1e 115)  exp(1e 120)
# [6]  exp(1e 125)  exp(1e 130)  exp(1e 135)  exp(1e 140)  exp(1e 145)
#[11]  exp(1e 150)  exp(1e 155)  exp(1e 160)  exp(1e 165)  exp(1e 170)
#[16]  exp(1e 175)  exp(1e 180)  exp(1e 185)  exp(1e 190)  exp(1e 195)
#[21]  exp(1e 200)  exp(1e 205)  exp(1e 210)  exp(1e 215)  exp(1e 220)
#[26]  exp(1e 225)  exp(1e 230)  exp(1e 235)  exp(1e 240)  exp(1e 245)
#[31]  exp(1e 250)  exp(1e 255)  exp(1e 260)  exp(1e 265)  exp(1e 270)
#[36]  exp(1e 275)  exp(1e 280)  exp(1e 285)  exp(1e 290)  exp(1e 295)
#[41]  exp(1e 300)  exp(1e 305)  exp(Inf)       
 

И 10^305 гораздо больше, чем 710 . Смотрите виньетку на упаковке.

Комментарии:

1. замечательно! Я написал функцию, в которой использовал exp(как.bob ()), как вы прекрасно объяснили. это просто, когда я использую свою функцию, я получаю ошибку : несовместимые типы (от S4 до double) в исправлении типа подназначения. Я понял, что тип exp(как.prob ()) — S4. как exp(как.brob()) может возвращать только двойное значение класса. ( as.double(exp(as.brob ())), конечно, снова дает inf.