You need to enable JavaScript to run this app. 为什么stats4::mle函数设置参数上下界时运行报错?
优惠活动
大模型
产品
解决方案
定价
更多

为什么stats4::mle函数设置参数上下界时运行报错?

报错原因

这个报错和L-BFGS-B方法本身能否处理上下界无关,核心原因是负二项分布的参数存在合法定义域限制,你设置的上下界允许参数迭代到定义域外,导致目标函数返回非有限值,而L-BFGS-B方法要求每一步迭代的目标函数值都必须是有限值。

负二项分布的两个参数强制约束为:

  • size:必须大于0
  • prob:必须介于0和1之间(开区间,不能取0或1)

你最初设置上下界为lower = c(-Inf,-Inf),upper = c(Inf,Inf)时,优化迭代过程中很容易出现size<=0、prob<=0或prob>=1的情况,此时dnbinom(..., log=TRUE)会返回Inf或NA,负对数似然的计算结果就是非有限值,触发L-BFGS-B的报错。

至于移除上下界后代码能正常运行,是因为stats4::mle在不指定method且无上下界时,默认使用Nelder-Mead优化方法,该方法对迭代过程中的非有限目标值容忍度更高,会自动调整搜索方向,不会直接中断运行,但本质上也存在参数越界的风险,只是你的初始值接近真实值,未触发问题。

解决建议

1. 严格限制参数上下界在合法域内

设置上下界时要避开参数边界值,预留极小的缓冲区间,同时给上下界命名避免参数顺序混淆:

stats4::mle(LL2, start = list(size = 3, prob = 0.1),
            lower = c(size = 1e-6, prob = 1e-6),
            upper = c(size = 100, prob = 1 - 1e-6))

2. 似然函数内增加越界判断

在对数似然函数中先校验参数合法性,越界时直接返回一个极大的有限值,避免出现非有限的目标函数结果:

LL2 <- function(size, prob) {
  # 新增参数合法性校验
  if (size <= 0 || prob <= 0 || prob >= 1) return(1e10)
  R = dnbinom(b, size, prob, log = TRUE)
  -sum(R)
}

3. 对参数做无界变换

将有界参数转换为实数域上的无界参数进行优化,结束后再反转换得到原参数估计值,从根源上避免越界问题:

# log(size) 可映射到全体实数,logit(prob)也可映射到全体实数
LL2_transform <- function(log_size, logit_prob) {
  size <- exp(log_size)
  prob <- plogis(logit_prob)
  R <- dnbinom(b, size, prob, log = TRUE)
  -sum(R)
}

# 调用时不需要设置上下界,也不会触发报错
fit <- stats4::mle(LL2_transform, start = list(log_size = log(3), logit_prob = qlogis(0.1)))
# 反转换得到原参数估计
exp(coef(fit)[["log_size"]])
plogis(coef(fit)[["logit_prob"]])

4. 更换兼容非有限值的优化方法

如果不想调整参数和似然函数,也可以手动指定method参数为Nelder-Mead等对非有限值容忍度更高的方法:

stats4::mle(LL2, start = list(size = 3, prob = 0.1),
            lower = c(size = 1e-6, prob = 1e-6),
            upper = c(size = 100, prob = 1 - 1e-6),
            method = "Nelder-Mead")

内容的提问来源于stack exchange,提问作者Alex Xue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 03:54:05