如何在R语言中通过循环批量求解非线性方程并获取参数与R方
批量求解非线性方程并获取拟合参数与R方
你可以通过将方程与对应初始值整理为列表,结合向量化函数(如Map)批量完成拟合与结果计算,避免重复编写代码。以下是完整实现:
1. 准备数据、方程与初始值列表
先把所有待拟合的方程和对应的初始参数值分别存入列表,确保两者顺序严格一一对应:
# 原始数据 x <- c(1,2,3,4,5,6,7) y <- c(0.12,0.15,0.19,0.29,0.52,0.60,0.66) # 待拟合方程列表 equations <- list( y ~ a*x + b, y ~ a*(x - b), y ~ a + b*x + c*x^0.5, y ~ a*x/(b + x) ) # 对应每个方程的初始参数列表(顺序需与方程列表匹配) start_params <- list( list(a=1, b=1), list(a=1, b=1), list(a=1, b=1, c=1), list(a=1, b=1) )
2. 批量拟合与结果计算
使用Map函数同时遍历方程和初始值,完成拟合后提取系数并计算R方:
# 批量执行拟合与结果提取 model_results <- Map(function(formula, start) { # 拟合非线性模型 fit <- nls(formula, start = start, data = data.frame(x, y)) # 计算R方 pred <- predict(fit) r_sq <- cor(y, pred)^2 # 返回包含系数和R方的结果 list( coefficients = coef(fit), R_squared = r_sq ) }, equations, start_params) # 为结果命名(方便识别对应模型) names(model_results) <- paste0("model_", seq_along(model_results))
3. 查看结果
直接打印model_results即可查看所有模型的拟合参数和R方:
# 打印全部结果 print(model_results) # 单独提取某一模型的结果,比如第三个模型 model_results$model_3
这种方式可轻松扩展到20+个方程,只需在equations和start_params列表中添加对应内容,无需修改核心循环逻辑。
内容的提问来源于stack exchange,提问作者user21242742
相关产品推荐
相关产品推荐

