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

R语言nls.lm拟合SVEIR模型提示data参数缺失报错解决问询

问题解决方案

一、报错修复方法

报错原因

你遇到的argument "data" is missing, with no default错误由以下3个代码问题共同导致:

  • 调用nls.lm的行中残留了无效代码标记`enter code here`,导致R解析参数时出错,无法正确识别末尾传入的data变量
  • 初始参数赋值错误:你提前定义的初始参数变量名为parameters,但nls.lm的par参数传入了不存在的parms变量
  • 额外参数传入不规范:给目标函数传递的data参数没有显式命名,容易出现位置匹配错误

修正后的拟合代码

删除无效字符、修正参数名、显式传参即可解决报错:

fitval <- nls.lm(
  par = parameters, # 调用提前定义的初始参数变量
  lower = c(0.000000001, 1/15, 1/5, 0.0011), 
  upper = c(1.0, 1/7 , 1/2, 0.05), 
  fn = SVEIR_SSQ, 
  data = data # 显式命名传入观测数据
)

二、使用melt计算残差平方和的方法

完全可以用melt简化残差计算逻辑,代码更简洁也不容易出现逐列写的笔误,优化后的SVEIR_SSQ函数示例如下:

SVEIR_SSQ <- function(parameters, data) {  
  # 求解微分方程
  result <- as.data.frame(ode(
    y = initial_state_values,  
    times = time,             
    func = SVEIR_fn,             
    parms = parameters
  ))
  # 仅保留和观测数据匹配的时间点、需要的状态列
  result_match <- result[round(result$time,1) %in% round(data$time,1), c("time", "S", "V", "E", "I", "R")]
  # 融合模拟结果为长表
  sim_melt <- melt(
    result_match, 
    id.vars = "time", 
    variable.name = "States", 
    value.name = "sim_num"
  )
  # 融合观测数据为长表
  obs_melt <- melt(
    data, 
    id.vars = "time", 
    variable.name = "States", 
    value.name = "obs_num"
  )
  # 合并后直接计算残差平方和
  merge_df <- merge(sim_melt, obs_melt, by = c("time", "States"))
  SSQ <- sum((merge_df$sim_num - merge_df$obs_num)^2)
  return(SSQ)
}

注:示例中用round处理时间列是为了避免浮点数精度问题导致时间匹配失败,保留的小数位和你ODE的步长精度保持一致即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:06:07