【问题标题】:Error in solve.default(oout$hessian) : Lapack routine dgesv: system is exactly singular: U[1,1] = 0solve.default(oout$hessian) 中的错误:Lapack 例程 dgesv:系统完全是奇异的:U[1,1] = 0
【发布时间】:2021-07-25 08:23:58
【问题描述】:

我正在使用最大似然法来估计一组参数。现在我将使用 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))

我得到这个错误:

solve.default(oout$hessian) 中的错误: Lapack 例程 dgesv:系统完全是奇异的:U[1,1] = 0

如果我不使用fixed 选项,则不会出现此错误,但结果不是配置文件可能性。您能告诉我如何解决这个问题吗?

【问题讨论】:

标签: r optimization statistics mathematical-optimization log-likelihood


【解决方案1】:

tl;dr 我不确定你的目标函数是否有意义,我猜你有错字。 (此外,如果您的目标函数与 mle 一起使用,则无需显式设置 fixed:profile 方法会自动为您计算似然分布......)


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

由于optim() 想要一个接受向量而不是参数列表的目标函数,所以编写一个包装器(我们也可以使用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] 的值是强负值,目标函数值也是如此,并且收敛码非零:特别意味着(来自?optim):

‘1’表示已经达到迭代限制‘maxit’。

如果我们设置control=list(maxit=2000) 并再次尝试x3 并且目标函数变得更小并且收敛代码仍然是1!

然后我们更仔细地查看目标函数,并注意到它以x3 → Inf 的形式到达-Inf,因此我们永远无法找到答案。 (大概在某个时候我们会遇到一个浮点问题,但是 1000 万次迭代只能让我们达到-1e17 ...)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 2016-08-25
    • 1970-01-01
    相关资源
    最近更新 更多