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

用R的nlsLM模拟MATLAB lsqnonlin时遇两类错误求解决

非线性最小二乘问题报错解决

问题场景

求解非线性最小二乘问题时,将因变量设为全零向量,先遇到公式解析错误,修正后出现新报错:

Error in nlsLM(formula = y ~ fit(params, T_k_IV_matrix), start = x0, lower = lb, :
parameters without starting value in 'data': params

错误根源

nlsLM要求公式中明确指定待优化的单个参数,而非将参数打包成params向量传入自定义函数。当前代码里fit函数接收的params是向量,但nlsLM无法识别这个向量作为待优化参数,导致找不到对应初始值。

解决步骤

  • 重构自定义函数:把fit函数的参数从向量params拆分为单个参数(vt, mt, wt, nt, rhot),直接用这些参数计算表达式。
  • 调整公式写法:在nlsLM的公式中直接调用拆分参数后的fit函数,明确列出所有待优化参数。
  • 匹配参数命名:将start、lower、upper改为命名向量,确保和函数参数一一对应,避免顺序出错。

修改后的完整代码

library(minpack.lm)
library(data.table)

# 重构fit函数,使用单个参数而非向量
fit <- function(vt, mt, wt, nt, rhot, T_k_IV_matrix) {
  T <- T_k_IV_matrix[, "tenor"]
  k <- T_k_IV_matrix[, "k"]
  IV <- T_k_IV_matrix[, "impl_volatility"]
  
  (1/4) * exp(-2 * nt * T) * (wt^2) * (T^2) * (IV^4) +
    (1 - 2 * exp(-nt * T) * mt * T - exp(-nt * T) * wt * rhot * sqrt(vt) * T) * (IV^2) -
    (vt + 2 * exp(-nt * T) * wt * rhot * sqrt(vt) * k + exp(-2 * nt * T) * (wt^2) * (k^2))
}

# 示例grouped_data,实际使用替换为真实数据
grouped_data <- list(1)
params <- list()

for (i in 1:length(grouped_data)) {
  T_k_IV_matrix <- data.table(
    tenor = c(110, 110, 82, 138, 82, 173, 138, 173, 173, 47),
    k = c(0.1629164648, 0.4307829161, -0.3811180797, 0.0009384402, 
          -0.1823215568, -0.0219789067, -0.0988005847, -0.4187103349, 
          -0.0737730947, -0.0527505654),
    impl_volatility = c(0.950298, 1.106709, 0.732060, 0.740338, 
                        0.638142, 0.525060, 0.689398, 0.652785, 0.955989, 0.962296)
  )
  y <- rep(0, nrow(T_k_IV_matrix))

  # 使用命名向量指定初始值、上下界
  x0 <- c(vt = 0.04, mt = 0.1, wt = 0.5, nt = 0.3, rhot = -0.8)
  lb <- c(vt = 0.001, mt = -Inf, wt = 0.001, nt = 0.001, rhot = -.999)
  ub <- c(vt = Inf, mt = Inf, wt = Inf, nt = Inf, rhot = .999)

  # 公式中明确列出所有待优化参数
  result <- nlsLM(
    formula = y ~ fit(vt, mt, wt, nt, rhot, T_k_IV_matrix),
    start = x0, 
    lower = lb,
    upper = ub
  )
  params[[i]] <- coef(result)
}

# 查看求解得到的参数
print(params)

额外注意事项

  • 确保提前加载minpack.lm(nlsLM的来源)和data.table包;
  • 如果grouped_data是实际分组数据,替换示例中的grouped_data <- list(1)即可;
  • 命名向量的使用能避免参数顺序混乱,尤其当参数数量较多时更重要。

内容的提问来源于stack exchange,提问作者LuSm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:20:37