r - 为什么 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 方法无法处理边界设置吗?
任何意见将不胜感激。
解决方案
我用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)。
推荐阅读
- php - Laravel 6空合并运算符给出未定义变量:调用方法时的用户?
- c# - 数组包含来自表的相同数据,而不是使用 ToArray() 的不同数据
- python - Setup.py 安装需要本地包
- windows - 适用于 Windows 的 Docker 桌面 - 由于 Bitlocker 而无法启动
- if-statement - 最大/最小方法是否比 If 语句更传统地设置值的下限/上限?
- .net - 从任务中获取 WaitHandle
- ios - 为什么一个 bname 值在快速解析时在 tableview 中显示其 paramName 计数时间?
- python - 在 For 循环中:如何将值与 groupby 函数中的值进行比较
- git - VSCode Git 跟踪颜色?
- django - Django中的分页概念和实现大型对象的有效方法