微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在使用最大似然法来估计一组参数。现在,我将使用 R 中 mle 包中的 stats4 函数为其中一个参数生成配置文件可能性。为此,我需要在调用 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 选项,则不会出现此错误,但结果不是配置文件可能性。你能告诉我如何解决这个问题吗?

解决方法

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


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

因为 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!

然后我们更仔细地查看目标函数并注意到它到达 -Infx3Inf,所以我们永远不会到达回答。 (大概在某个时候我们会遇到一个浮点问题,但 1000 万次迭代只能让我们达到 -1e17 ...)

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。