Я пишу MLE-функцию Линкольна-Петерсена в R. У меня есть две версии моей функции распределения, одна, которая использует гамма-функцию, и другая, которая использует Rs с внутренним dmultinom (который использует lgamma). Оба возвращают идентичные результаты, когда я вставляю значения выборки, однако версия dmultinom не может обеспечить приемлемые оценки MLE. Мне любопытно, что вызывает это.
llik_lincoln_multinom1 <- function(par,n_1,n_2,m_2) {
N <- par[1]
p_1 <- par[2]
p_2 <- par[3]
q_1 <- 1-p_1
q_2 <- 1-p_2
r <- n_1 + n_2 - m_2
l <- (gamma(sum(c(m_2,n_1-m_2,n_2-m_2,N-r))+1)/prod(gamma(c(m_2,n_1-m_2,n_2-m_2,N-r)+1)))*(((p_1*p_2)^m_2)*((p_1*q_2)^(n_1-m_2))*((q_1*p_2)^(n_2-m_2))*((q_1*q_2)^(N-r)))
return(-log(l))
}
optim(par=c(20,0.1,0.1),fn=llik_lincoln_multinom1,
n_1=10,n_2=10,m_2=2,
lower=c(18,0,0),
upper=c(Inf,1,1),
method="L-BFGS-B",
control=list(parscale=c(100,1,1)))
llik_lincoln_multinom2 <- function(par,n_1,n_2,m_2) {
N <- par[1]
p_1 <- par[2]
p_2 <- par[3]
q_1 <- 1-p_1
q_2 <- 1-p_2
r <- n_1 + n_2 - m_2
l <- dmultinom(c(m_2,n_1-m_2,n_2-m_2,N-r),prob=c(p_1*p_2,p_1*q_2,q_1*p_2,q_1*q_2))
return(-log(l))
}
optim(par=c(20,0.1,0.1),fn=llik_lincoln_multinom2,
n_1=10,n_2=10,m_2=2,
lower=c(18,0,0),
upper=c(Inf,1,1),
method="L-BFGS-B",
control=list(parscale=c(100,1,1)))
Во второй функции градиент для параметра N представляется равным 0, и MLE никогда не удаляется от начального параметра. Почему градиент для второй версии отличается от первого?