R:'vmmin' 中 mle 初始值的错误不是有限的

R: error in mle initial value in 'vmmin' is not finite

nll <- function(lambda, kappa){
  logit=function(x) {log(x/(1-x))}
  a=c(1-exp(-(15/lambda)^kappa), 1-exp(-(25/lambda)^kappa), 1-exp(-(35/lambda)^kappa))
  a=logit(a)
  mu = c(0.1, 0.2, 0.3)
  mu = logit(mu)
  cov = matrix(c(0.18830690, 0.00235681, 0.00071954, 0.00235681, 0.00736811, 0.00110457, 0.00071954, 0.00110457, 0.00423955), nrow =3)
  L1 = dmvnorm(a, mu, cov)

  a=c(1-exp(-(25/lambda)^kappa), 1-exp(-(35/lambda)^kappa), 1-exp(-(45/lambda)^kappa))
  a=logit(a)
  mu = c(0.4, 0.1, 0.9)
  mu = logit(mu)
  cov = matrix(c(2.7595442, 0.0045178, 0.0010505, 0.0045178, 0.00972309, 0.0015120, 0.0010505, 0.0015120, 0.0088425), nrow =3)
  L2 = dmvnorm(a, mu, cov)
  -sum(log(L1*L2))
}


> mle(nll, start = list(lambda = 1, kappa = 1))
Error in optim(start, f, method = method, hessian = TRUE, ...) : 
  initial value in 'vmmin' is not finite

我试图找到最大化上述函数的 lambda 和 kappa 值。

我原来的似然函数returns L1*L2,但是因为mle函数需要传入负对数似然,所以我修改函数为return -sum(log(L1*L2)) 代替。

可是我运行进入了上面的错误。我也试过指定 dmvnorm(... ,log = TRUE) 但这并没有解决问题。

  • L1L2 都是标量。假设我们要将 log=TRUE 传递给 dmvnorm 所以它们都是对数似然,你是说最后一行中的 -(L1+L2) 吗?
  • 通过指定 debug(nll)nll(lambda=1,kappa=1) ,然后单步执行代码,等到我们找到一个无穷大的值,然后回溯,我们看到 1-exp(-(45/lambda)^kappa) 正好是 1 (exp(-45) 小于 1e-16,即 1+x > 1 的最小值,因此 logit(a) 的最终元素是无限的 ...

因此,如果我在两个地方都制作 dmvnorm(...,log=TRUE),将最后一行更改为 return(-(L1+L2)),并将 lambda 的初始值更改为 10,我将得到一个有限值 nll(10,1) (4474),而 stats4::mle(nll,start=list(lambda=10,kappa=1)) 给出:

Coefficients:
   lambda     kappa 
40.622673  4.883857