【问题标题】:Behavior of optim() function in RR 中 optim() 函数的行为
【发布时间】:2013-12-21 13:29:14
【问题描述】:

我正在使用 R optim 函数进行最大似然估计。

我使用的命令是

optim(3, func, lower=1.0001, method="L-BFGS-B")$par

如果参数为1,函数func具有无限值。 因此,我将较低的值设置为 1.0001。 但有时会发生错误。

Error in optim(3, func, lower = 1.0001, method = "L-BFGS-B", sx = sx,  : 
  L-BFGS-B needs finite values of 'fn'

接下来发生的事情很难理解。 如果我再次运行相同的命令,那么它给出的结果 1.0001 是下限。 似乎optim 函数“了解到” 1 不是正确答案。 optim 函数如何在我第一次运行时给出答案 1.0001?

附: 我刚刚发现这个问题只发生在独立的 R-console 中。如果我在 R Studio 中运行相同的代码,则不会发生。很奇怪。

【问题讨论】:

  • 如果你给出一个可重现的例子会容易得多。在 RStudio 中得到不同的结果很奇怪,但并非不可能。您应该记住的一件事是,默认情况下optim 使用 0.001 的步长来计算局部梯度的有限差分近似值; 不应该(原则上)导致这个问题,但它可能。如果您使用control=list(ndeps=5e-4) 确保有限差分步长小于您的lower 值和硬边界之间的距离,会发生什么情况。
  • 您还可以检测您的 func 函数来打印(或 cat())它实际调用的值,以准确记录 optim() 正在评估的内容。
  • sessionInfo() 的 PS 结果也很有用。

标签: r optimization


【解决方案1】:

“L-BFGS-B”方法要求函数的所有计算值都是有限的。
出于某种原因,optim 似乎正在评估您的函数值为 1.0,给您一个 inf,然后抛出一个错误。

如果您想快速破解,请尝试定义一个新函数,该函数为输入 1 提供非常高的值(如果您试图最大化,则为低值)。

func2 <- function(x){
  if (x == 1){
    return -9999
  }
  else{
    return func(x)
  }
}

optim(3, func2, lower=1.0001, method="L-BFGS-B")$par

【讨论】:

    【解决方案2】:

    (现在作为答案而不是评论发布;如果合适,稍后将删除。) 对于它的价值,即使使用默认控制参数(例如ndeps=1e-3),我也无法让这个示例(奇点为 1)失败:

    func <- function(x) 1/(x-1)*x^2
    library(numDeriv)
    grad(func,x=2)  ## critical point at x=2
    optim(par=1+1e-4,fn=func,method="L-BFGS-B",lower=1+1e-4)
    

    尝试各种起始值:

    svec <- 1+10^(seq(-4,2,by=0.5))
    sapply(svec,optim,fn=func,method="L-BFGS-B",lower=1+1e-4)
    

    这些都有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      相关资源
      最近更新 更多