【问题标题】:Why the mle function can not run with lower and upper bound?为什么 mle 函数不能以上下限运行?
【发布时间】:2021-09-08 11:38:17
【问题描述】:

我尝试使用 mle 来估计负二项分布的参数。这是我的代码。

library(stats4)
library(bbmle)
library(MASS)

b=rnbinom(n=1000, size=3, prob=0.1)

LL2 <- function(size, prob) {
  R = dnbinom(b, size, prob, log = TRUE)
  -sum(R)
}

当我将 mle 函数设置为下限和上限时,我得到了

stats4::mle(LL2, start = list(size = 3, prob = 0.1),lower = c(-Inf,-Inf),upper = c(Inf,Inf))
Error in optim(start, f, method = method, hessian = TRUE, lower = lower,  : 
  L-BFGS-B needs finite values of 'fn'

当我移除边界时

stats4::mle(LL2, start = list(size = 3, prob = 0.1))

Call:
stats4::mle(minuslogl = LL2, start = list(size = 3, prob = 0.1))

Coefficients:
     size      prob 
3.0467857 0.1037522 

但是,如果我将边界更改为有限值,错误仍然存​​在。

我想知道为什么会这样?是不是因为 L-BFGS-B 方法无法处理边界设置?

我们将不胜感激。

【问题讨论】:

  • 将边界设置为 -InfInf 的意义何在 - 这与无边界相同。
  • 你尝试了哪些有限值?

标签: r statistics distribution mle


【解决方案1】:

我使用set.seed(101) 运行了您的设置代码。

创建 score 函数的检测版本,以便我们可以看到优化器的去向:

LL2 <- function(size, prob) {
   R = dnbinom(b, size, prob, log = TRUE)
   res <- -sum(R)
   cat(size,prob,res,"\n")
   res
}
stats4::mle(LL2, start = list(size = 3, prob = 0.1),lower = c(-Inf,-Inf),upper = c(Inf,Inf))
## 3 0.1 4085.146 
## 3.001 0.1 4085.166 
## 2.999 0.1 4085.127 
## 3 0.101 4084.767 
## 3 0.099 4085.858 
## 2.964666 1.099376 NaN 

优化错误(开始,f,方法 = 方法,粗麻布 = TRUE,更低 = 更低,: L-BFGS-B 需要 'fn' 的有限值 另外:警告信息: 在 dnbinom(b, size, prob, log = TRUE) 中:产生了 NaNs

前 5 个步骤是初始值的评估和导数的有限差分逼近。下一个优化步骤将我们带到prob = 1.099,这给了我们一个NaN 结果(我们需要0

您可以将size 的下限设置为 0,将prob 的下限设置为 (0,1) ...(我试过了,它似乎有效)。你必须对 L-BFGS-B 小心一点 - 它在计算有限差分近似时并不总是尊重边界,例如如果值 高于 0(例如 0.002,因为默认的有限差分 epsilon 为 0.001)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2017-12-19
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多