我试图通过使用optim来最小化对数似然函数的负数来拟合零膨胀的负二项分布来计算数据。我在下面用'newfunct'定义了负对数可能性:
newfunct <- function(theta,xvec,obs_freq){
theta[2] <- exp(theta[2]) + 10^-10
theta[3] <- exp(theta[3]) + 10^-10
obs_freq <- c(172,33,14,12,5,5,1,1,1,4,5,1,1,2,1,2,1,1,1,1,1,2,1,1)
xvec <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,19,21,23,24,28,29,41,49,53)
gfunct <- function(mu,k,xvec) {
(gamma(1/k+xvec)*(k*mu)^xvec)/(factorial(xvec)*gamma(1/k)*
(1+k*mu)^(1/k+xvec))
}
f <- 3861*log(theta[1]+(1-
theta[1])/((1+theta[2]*theta[3])^(1/theta[3])))+sum(obs_freq*log((1-
theta[1])*gfunct(theta[2],theta[3],xvec)))
return(-f)
}
theta包含我的3个参数,xvec包含计数值,obs_freq包含这些值的观察频率。 我期待所有3个参数都是&gt; 0,但是optim返回负值。例如:
> optim(theta <- c(.9,log(5),log(2)),newfunct,hessian = TRUE)
$par
[1] -29.140687 -4.912860 6.872521
$value
[1] 1464.211
$counts
function gradient
502 NA
$convergence
[1] 1
$message
NULL
$hessian
[,1] [,2] [,3]
[1,] 0.3167963 -4.003138 5.549092
[2,] -4.0031384 116.634414 -4.014256
[3,] 5.5490918 -4.014256 163.029903
我使用的是不正确的优化方法,还是我的初始参数值定义不正确?我长期以来一直在努力解决这个特殊问题,而且我很欣赏为什么我会得到负面值。谢谢!