用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
相关产品推荐
相关产品推荐

