You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 02:48:32