R语言使用optimise求解泊松对数似然最大化的lambda参数
实现方案
核心问题修正
你之前的代码存在3个核心问题:
- 待优化函数的第一个入参必须是待优化的
lambda,而非数据 - 对数似然需要对所有样本的计算结果求和,
optimise仅支持对标量返回值做优化 - 无需手动生成lambda网格序列,
optimise会自动在指定区间内做数值搜索
完整实现代码
首先封装仅接收newdata单参数的估计函数:
# 泊松分布lambda最大似然估计函数,仅接收输入数据newdata estimate_poisson_lambda <- function(newdata) { # 内部定义待优化的总对数似然函数 total_log_lik <- function(lambda, input_data) { sum(dpois(x = input_data, lambda = lambda, log = TRUE)) } # 调用optimise执行最大化优化 optim_result <- optimise( f = total_log_lik, input_data = newdata, # 把固定输入数据传递给对数似然函数 lower = 0, # 泊松lambda取值必须大于0 upper = max(newdata) + 2, # 上界取数据最大值+2足够覆盖最优解 maximum = TRUE ) # 返回最优lambda值,如需完整优化结果可直接返回optim_result return(optim_result$maximum) }
测试调用
# 你的测试数据 newdata <- c(23,16,18,14,19,20,12,15,15,21) # 调用函数得到最优lambda best_lambda <- estimate_poisson_lambda(newdata) # 输出结果 best_lambda # 可通过样本均值验证结果(泊松lambda最大似然估计解析解为样本均值) mean(newdata)
逻辑说明
- 所有优化逻辑封装在
estimate_poisson_lambda内部,外部仅需传入newdata一个参数,符合要求 optimise会自动迭代调整lambda的取值,找到总对数似然最大的取值,无需手动处理lambda的入参遍历逻辑- 计算结果和样本均值一致,可作为正确性校验标准
内容的提问来源于stack exchange,提问作者DaarioNaharis
相关产品推荐
相关产品推荐

