如何在L-BFGS-B优化迭代中获取lambda参数的每步估计值?
获取mle()迭代过程中L-BFGS-B方法的参数估计值
Great question! The default trace=TRUE (which maps to trace=1 in optim()) for the L-BFGS-B method only outputs the function values, not the parameter estimates during iterations. Here are two reliable ways to capture the lambda values at each step:
方法一:在负对数似然函数中添加追踪代码
你可以修改你的nLL函数,让它在每次被调用时记录当前的lambda值。这样每一次迭代时,只要函数被评估,就能追踪到参数的变化:
library(stats4) x <- 0:10 y <- c(26, 17, 13, 12, 20, 5, 9, 8, 5, 4, 8) # 用环境变量存储追踪结果,避免污染全局命名空间 trace_env <- new.env() trace_env$lambda_trace <- c() nLL <- function(lambda) { # 记录当前lambda值到环境变量中 trace_env$lambda_trace <- c(trace_env$lambda_trace, lambda) # 计算负对数似然 -sum(stats::dpois(y, lambda, log = TRUE)) } # 拟合模型 fit0 <- mle(nLL, start = list(lambda = 5), nobs = NROW(y), method = "L-BFGS-B") # 查看迭代过程中的lambda值 print(trace_env$lambda_trace)
运行后,trace_env$lambda_trace会保存优化过程中所有评估过的lambda参数点,你可以直接查看或者用于后续分析。
方法二:利用optim的高级trace选项(版本依赖)
在部分R版本中,将control参数里的trace设置为3(而非TRUE/1),L-BFGS-B优化器会输出更详细的迭代信息,包括当前的参数值:
# 重置原始的nLL函数,避免追踪代码干扰 nLL <- function(lambda) -sum(stats::dpois(y, lambda, log = TRUE)) fit0 <- mle(nLL, start = list(lambda = 5), nobs = NROW(y), method = "L-BFGS-B", control = list(trace = 3))
不过这个方法的输出格式比较原始,且不同R版本或底层优化库的表现可能不一致,因此方法一的自定义追踪方式更稳定可控。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

