为了最小化关于3个参数的函数,我使用了optim函数和“L-BFGS-B”方法。 以下是错误消息:
optim中的错误(c(3,0.01,0.75),fn = f,lower = c(0.6,0.0001,0.1),: L-BFGS-B需要有限值'fn'
当三个参数中的至少一个达到“边界”(即较低或较高的值)时,我已经检查了函数的值,但它从未给出无限值。
如何知道哪些值在optim函数中给出了无穷大的值?
答案 0 :(得分:2)
快速而肮脏的方法是包装你的函数并打印出传递给它的参数。这是一个做这个的示例会话。
f <- function(par, data){
if(0.1 < par & par < .9){
return(Inf)
}else{
sqrt(abs(par))
}
}
并使用optim ...
调用它> optim(2, f, method = "L-BFGS-B", lower = -1)
Error in optim(2, f, method = "L-BFGS-B", lower = -1) :
L-BFGS-B needs finite values of 'fn'
现在包装代码......
wrap_f <- function(par, ...){
cat(par, "\n")
f(par, ...)
}
现在我们可以看到所谓的......
> optim(2, wrap_f, method = "L-BFGS-B", lower = -1)
2
2.001
1.999
1.646447
1.647447
1.645447
1.256777
1.257777
1.255777
-0.3018999
-0.3008999
-0.3028999
0.7441084
Error in optim(2, wrap_f, method = "L-BFGS-B", lower = -1) :
L-BFGS-B needs finite values of 'fn'
因此,在这个例子中,它最终试图评估.7441084,它通过如何定义函数给出了错误。