首页 > 解决方案 > 为什么 mle 函数不能以上下限运行?

问题描述

我尝试使用 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 方法无法处理边界设置吗?

任何意见将不胜感激。

标签: rstatisticsdistributionmle

解决方案


我用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 

optim(start, f, method = method, hessian = TRUE, lower = lower, : L-BFGS-B 需要 'fn' 的有限值另外:警告消息:在 dnbinom(b, size, prob, log = TRUE):产生的 NaN

前 5 个步骤是初始值的评估和导数的有限差分逼近。下一个优化步骤将我们带到prob = 1.099,这给了我们一个NaN结果(我们需要 0 < prob < 1)。L-BFGS-B 在非有限值方面比其他优化器更挑剔;大多数其他人将非有限结果视为“坏”并尝试一些明智的事情。

您可以将下限设置为 0 forsize和 bounds (0,1) for prob... (我试过了,它似乎有效)。你必须对 L-BFGS-B 小心一点 - 它在计算有限差分近似时并不总是尊重边界,所以例如如果值 <= 0 会给出你可能需要的非有限结果将下限设置为略高于0(例如 0.002,因为默认的有限差分 epsilon 为 0.001)。


推荐阅读