функция dmultinom для полиномиального распределения R

Функция dmultinom (x, size = NULL, prob, log = FALSE) оценивает вероятности полиномиального распределения. Однако он не работает с size = 1.

Теоретически при установке size = 1 полиномиальное распределение должно быть эквивалентно категориальному распределению.

Кто-нибудь знает, почему появляется сообщение об ошибке?

К вашему сведению, категориальное распределение можно смоделировать с помощью dist.Categorical {LaplacesDemon}.

Примеры:

dmultinom(c(1,2,1),size = 1,prob = c(0.3,0.5,0.4))

Ошибка в dmultinom (c (1, 2, 1), size = 1, prob = c (0.3, 0.5, 0.4)): size! = Sum (x)

dcat(c(1,2,1),p = c(0.3,0.5,0.4))

[1] 0.3 0.5 0.3

Спасибо


person user2597079    schedule 03.02.2017    source источник


Ответы (1)


LaplacesDemon::dcat и stats::dmultinom делают две разные вещи. Если у вас есть несколько наблюдений, dcat принимает вектор значений категорий, тогда как dmultinom принимает ответ с одним вектором, поэтому вам нужно построить матрицу ответов и использовать apply (или что-то еще).

library(LaplacesDemon)
probs <- c(0.3,0.5,0.2)
dcat(c(1,2,1), p = probs) ## ans: 0.3 0.5 0.3
x=matrix(c(1,0,0,
           0,1,0,
           1,0,0),
         nrow=3,byrow=TRUE)
apply(x,1,dmultinom,size=1, prob=probs)

(Я изменил ваш пример, потому что ваши исходные вероятности c(0.3,0.5,0.4) не суммируются до 1 - ни одна функция не выдает предупреждение, но dmultinom автоматически изменяет масштаб вероятностей до суммы 1)

Если я попробую dmultinom(c(1,2,1),p=probs, size=1), я получу

размер! = сумма (х)

то есть dmultinom интерпретирует c(1,2,1) как «один образец из группы 1, два образца из группы 2, 1 из группы 3», что не соответствует общему размеру выборки 1 ...

person Ben Bolker    schedule 03.02.2017
comment
О, теперь я понимаю. Спасибо! - person user2597079; 04.02.2017
comment
Извините, еще один быстрый вопрос. Разве prod (dcat (c (1,2,1), p = probs)) #ans 0,045 не должно быть равно 0,3 * 0,5 * 0,5 * 0,2 # ans 0,015? - person user2597079; 04.02.2017
comment
ты все еще в замешательстве. в dcat(), (1,2,1) не означает 1 типа 1, 2 типа 2, 1 типа 3, это означает 1 типа 1, затем 1 типа 2, затем 1 типа 1. I ' Не уверен, какое вычисление вы пытаетесь выполнить, может быть, лучше для CrossValidated? - person Ben Bolker; 04.02.2017
comment
Ох, хорошо. Я получаю это сейчас. Должно было быть 0,3 * 0,5 * 0,3. кстати, я пытаюсь установить функцию правдоподобия. Я понял. Еще раз большое спасибо! - person user2597079; 04.02.2017