R语言估计含未知参数两函数相关性及lambda优化求解
待求解的lambda估计优化问题

问题描述
核心需求是基于以下两个自定义函数完成参数估计:
f1 <- function(lambda, tau){ slope = (1-exp(-lambda*tau))/(lambda*tau) return(slope) } f2 <- function(lambda, tau){ curve = ((1-exp(-lambda*tau))/(lambda*tau))-exp(-lambda*tau) return(curve) }
已知tau的不同取值,例如当tau = 0.25时,f1和f2仅剩lambda一个待估计参数。直接调用optim()函数执行最小化求解时会运行失败,报错原因为f1和f2不是数值型对象,需要在保留f1、f2原有函数形式的前提下构建优化问题完成求解。
报错原因与实现方法
optim()函数对传入的目标函数有明确要求:必须是以待优化参数为入参、输出单个数值型损失值的函数。直接将f1、f2两个函数对象传入optim()不符合入参规则,因此会触发类型报错。
正确实现步骤如下:
- 保留f1、f2的原有函数定义不做修改
- 额外封装一层适配
optim()入参规则的目标函数:固定已知的tau取值,在目标函数内部调用f1、f2计算对应值,最终输出需要最小化的损失值 - 为lambda设置合理的初始搜索范围,注意lambda需为正数,避免取0触发分母为0的计算错误
- 调用
optim()传入封装好的目标函数完成求解
以tau=0.25的场景为例,可直接运行的实现代码如下:
# 原有f1、f2函数完全保留,不做任何修改 f1 <- function(lambda, tau){ slope = (1-exp(-lambda*tau))/(lambda*tau) return(slope) } f2 <- function(lambda, tau){ curve = ((1-exp(-lambda*tau))/(lambda*tau))-exp(-lambda*tau) return(curve) } # 固定已知的tau取值 tau_val <- 0.25 # 封装符合optim要求的目标函数 optim_target <- function(lambda){ # 边界保护:lambda为非正数时返回极大值,避免非法计算 if(lambda <= 1e-6) return(1e12) f1_val <- f1(lambda, tau_val) f2_val <- f2(lambda, tau_val) # 此处替换为你的优化问题对应的损失计算逻辑即可 loss <- (f1_val - f2_val)^2 return(loss) } # 调用optim求解,单参数优化推荐使用Brent方法,搜索范围可根据业务场景调整 result <- optim( par = 0.06, # 初始值取Nelson-Siegel模型常用初始值 fn = optim_target, method = "Brent", lower = 0.001, upper = 1 ) # 提取估计得到的lambda参数 estimated_lambda <- result$par
如果存在多个tau取值,只需要在optim_target函数内部遍历所有tau值,计算聚合后的总损失即可,不需要修改f1、f2的原有形式。
内容的提问来源于stack exchange,提问作者Davide Grossoni
相关产品推荐
相关产品推荐

