gpt4 book ai didi

r - 如何忽略optim中函数执行中的错误?

转载 作者:行者123 更新时间:2023-12-05 07:47:20 25 4
gpt4 key购买 nike

我正在使用 optim 来估计自定义函数的参数。此自定义函数包括一个函数,该函数在参数输入无效时生成错误消息(它包含多个分布,但假设例如,如果正态分布的标准偏差为负,则会产生错误。因此与 NaN 不同 dnorm 函数的值和警告,此函数停止并返回错误消息)。

现在,如果我在 optim 中使用 BFGS 选项,那么 optim 可能会在某些时候尝试无效的参数输入,这将导致评估自定义函数时出错并停止优化过程。如果我改为使用 Nelder-Mead 选项,这不是问题。

所以,我的问题是:是否有任何方法可以将 optim 函数与 BFGS 选项一起使用,以便在自定义函数出现错误时它不会停止进行了哪些优化?

当然,理论上我可以重写自定义函数,但这不是一个选项,因为它是一个更大的包的一部分,在其他情况下需要错误消息。我也知道 L-BFGS-B 选项,但是,在许多情况下,为参数选择合适的边界并不简单(导致错误的实际值可能是训练的复杂转换数据)。

这是一个例子(标准正态分布参数的最大似然估计)

fn <- function(par, obs){
if(par[2] < 0){stop("error msg")}
return(sum(-dnorm(obs, mean = par[1], sd = par[2], log = TRUE)))
}

dat <- rnorm(100)

optim(par = c(1,2), fn = fn, obs = dat, method = "BFGS") # stops due to error message
optim(par = c(1,2), fn = fn, obs = dat, method = "Nelder-Mead") # works
optim(par = c(1,2), fn = fn, obs = dat, method = "L-BFGS-B", lower = c(-10,0.001), upper = c(10,10)) # works

最佳答案

您可以考虑使用以下方法:

fn <- function(par, obs, const = 10 ^ 30)
{
if(par[2] < 0)
{
return(const)

}else
{
logLik <- tryCatch(sum(-dnorm(obs, mean = par[1], sd = par[2], log = TRUE)), error = function(e) NA)

if(is.na(logLik))
{
return(const)

}else
{
return(logLik)
}
}
}

dat <- rnorm(100)

optim(par = c(1,2), fn = fn, obs = dat, method = "BFGS") # stops due to error message

关于r - 如何忽略optim中函数执行中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39869458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com