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
一起使用,则您无需显式设置 fixed
:profile
方法将自动为您计算可能性概况。 .)
让我们从完整模型开始,让我们使用 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
作为 x3
→ Inf
,所以我们永远得不到答案。 (大概在某个时候我们会遇到一个浮点问题,但是 1000 万次迭代只会让我们达到 -1e17
...)
如果我在你的函数中将 x3
更改为 x3^2
一切似乎都正常......也许这就是你想要的......???
我正在使用最大似然法来估计一组参数。现在,我将使用 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
一起使用,则您无需显式设置 fixed
:profile
方法将自动为您计算可能性概况。 .)
让我们从完整模型开始,让我们使用 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
作为 x3
→ Inf
,所以我们永远得不到答案。 (大概在某个时候我们会遇到一个浮点问题,但是 1000 万次迭代只会让我们达到 -1e17
...)
如果我在你的函数中将 x3
更改为 x3^2
一切似乎都正常......也许这就是你想要的......???