R 如何在optim中忽略函数执行中的错误?

R 如何在optim中忽略函数执行中的错误?,r,optimization,R,Optimization,我正在使用optim估计自定义函数的参数。此自定义函数包括一个在参数输入无效时生成错误消息的函数(它包括多个分布,但假设如果正态分布出现负标准偏差,则会产生错误。因此,与NaN值和dnorm函数的警告不同,此函数停止并返回错误消息) 现在,如果我在optim中使用BFGS选项,那么optim可能会在某个时候尝试无效的参数输入,这将导致在计算自定义函数时出错并停止optim过程。如果我改用Nelder Mead选项,这不是问题 因此,我的问题是:是否有任何方法可以将optim函数与BFGS选项一起

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

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

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

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

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


fn我们使用的是哪个库?我使用的软件包是一个非常小的R软件包,只有很少的用户。为了匿名,我不想参考它,因为我是为数不多的用户之一。相反,我在我的帖子中添加了一个例子,说明了我的意思。我不确定忽略错误的想法是否是一个好主意。我希望我们讨论的是ab执行优雅的错误处理,即观察错误并根据此状态继续操作。我会更好,更改代码以避免产生错误(为数据选择正确的优化器)。如果你想坚持使用这些优化器而不确信它们会起作用,你应该在R中使用错误处理,比如tryCatch。关于一般原则,我完全同意。我只是想知道是否有一种方法可以以与
Nelder Mead
方法类似的方式使用
BFGS
方法dy在
optim
中处理函数错误。你所说的
中处理函数错误是什么意思?这些都是启发式的,有时会遇到困难。
BFGS
不是
Nelder mead
,所以它们会显示不同的错误行为!有时Nelder mead会失败,但BFGS会收敛。
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