为什么stats4::mle函数设置参数上下界时运行报错?
报错原因
这个报错和L-BFGS-B方法本身能否处理上下界无关,核心原因是负二项分布的参数存在合法定义域限制,你设置的上下界允许参数迭代到定义域外,导致目标函数返回非有限值,而L-BFGS-B方法要求每一步迭代的目标函数值都必须是有限值。
负二项分布的两个参数强制约束为:
size:必须大于0prob:必须介于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
相关产品推荐
相关产品推荐

