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

