solve.default(oout$hessian) 中的错误:Lapack routine dgesv: system is exactly singular: U[1,1] = 0

Error in solve.default(oout$hessian) : Lapack routine dgesv: system is exactly singular: U[1,1] = 0

我正在使用最大似然法来估计一组参数。现在,我将使用 R 中 stats4 包中的 mle 函数来为其中一个参数创建配置文件可能性。为此,我需要在调用 mle 函数时修复其中一个参数。这是代码:

fr <- function(x1, x2, x3) {   
  100 * (x2 - x1 * x1)^2 + (1 - x1)^2 + x3
}

out <- mle(fr,start = list(x1=1, x2=2, x3=3), method="Nelder-Mead",
           control=list(trace=4), fixed = list(x2=1))

我得到这个错误:

Error in solve.default(oout$hessian) : Lapack routine dgesv: system is exactly singular: U[1,1] = 0

如果我不使用fixed选项,那么我就不会出现这个错误,但结果不是profile likelihood。你能告诉我如何解决这个问题吗?

tl;dr 我不确定你的 objective 函数是否有意义,我猜你有错字。 (此外,如果您的 objective 函数与 mle 一起使用,则您无需显式设置 fixedprofile 方法将自动为您计算可能性概况。 .)


让我们从完整模型开始,让我们使用 optim() 而不是 stats4::mle()(我知道您想回到 mle 以便进行似然分析,但是调试 optim() 问题更容易一些,因为需要挖掘的代码层少了。)

因为 optim() 想要一个接受向量而不是参数列表的 objective 函数,写一个包装器(我们也可以使用 do.call(fr, as.list(p))):

fr0 <- function(p) {
  fr(x1=p[1], x2=p[2], x3=p[3])
}
opt1 <- optim(fn=fr0, par=c(1,2,3), method="Nelder-Mead")

结果:

$par
[1]    28.51486   812.09978 -7095.39630

$value
[1] -6238.881

$counts
function gradient 
     502       NA 

$convergence
[1] 1

注意x[3]的值是强负的,objective函数值也是,收敛码是非零的:在特定方式(来自?optim):

‘1’ indicates that the iteration limit ‘maxit’ had been reached.

如果我们设置control=list(maxit=2000)再试一次x3,objective函数会变得更小,收敛码仍然是1!

然后我们更仔细地查看 objective 函数 并注意到它转到 -Inf 作为 x3Inf,所以我们永远得不到答案。 (大概在某个时候我们会遇到一个浮点问题,但是 1000 万次迭代只会让我们达到 -1e17 ...)

如果我在你的函数中将 x3 更改为 x3^2 一切似乎都正常......也许这就是你想要的......???