2015-03-23 3 views
0

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

library(multicool) 

A <- 0.68 
B <- 0.27 
C <- 0.047 
D <- 0.003 

nA <- 680 
nB <- 270 
nC <- 47 
nD <- 3 

x <- c(nA,nB,nC,nD) 
k <- multinom(x, counts = TRUE) 

prob <- (A^nA)*(B^nB)*(C^nC)*(D^nD)*(k) 
+0

редактируется, не решает проблему, спасибо –

ответ

1

Итак, даже с этой дополнительной библиотекой это не та задача, для которой предназначен R. Согласно Wolfram Alpha ваш k равен примерно 1.008 * 10^935. Я бы рекомендовал брать журналы и аппроксимировать.

Итак, что вы делаете и почему думаете, что вам нужно это значение?

Если вы хотите, чтобы приблизить это тривиальное бревнами:

# k = (sum(x))!/x[1]!/x[2]!/x[3]!/x[4]! 

но log(n!) = sum(log(1:n)), так что это должно быть хорошим приближением журнала:

log.k = sum(log(1:sum(x))) - sum(log(1:x[1])) - sum(log(1:x[2])) - 
    sum(log(1:x[3])) - sum(log(1:x[4])) 

Мы можем определить

p = c(A, B, C, D) 

, а затем

log.prob = sum(x * log(p)) + log.k 

> log.prob 
# [1] -7.867374 

(я нашел свою ошибку, пропустил пару из 1:, необходимых в факториалах.)

Или мы могли бы использовать встроенный dmultinom

dmultinom(x = x, size = 1000, prob = p, log = T) 
# [1] -7.867374 
+0

hrm, довольно разочаровывающе ... Мне нужно иметь возможность приблизиться к этому. Впрочем, речь идет не о Стирлинговских номерах. –

+0

Да, понял, что я ошибался. Это причина, по которой мы используем логарифмические вероятности, а не правдоподобие. В этом случае вместо того, чтобы говорить «Мне нужно сделать это» для небольшого шага в этом процессе, я думаю, вам лучше описать вашу проблему и вашу конечную цель. – Gregor

+0

@TanDollars см. Изменения для приближения. – Gregor

Смежные вопросы