#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.