如何在数据框的specie与test分组上应用曲线拟合函数?
问题描述
给定构造的数据框df:
(time <- rep(c(1:9),9)) (test <- rep(c(1:3),3, each = 9)) (specie <- rep(c("Lbcasei", "Lbparacasei", "Lbrhamnosus"), each = 27)) (OD <- rep(c(runif(4,min=0, max=0.4), runif(1,min=0.4, max=0.6), runif(4,min=0.6, max=1)), 9)) df <- data.frame(specie, test, time, OD)
以及S型曲线函数:
curve_func <- function(t, A, B, C){B / (1 + exp(-C * (t - A))) }
需要将nls拟合(注意原代码中函数名有误,需改为curve_func):
fit <- nls(OD ~ curve_func(time, A, B, C), start = list(A = min(time), B = max(OD), C = 0.05))
应用到specie和test的所有分组上。
可行解决方案
方法一:Tidyverse 迭代实现
利用dplyr分组嵌套+purrr映射实现批量拟合,同时加入错误处理避免流程中断:
library(tidyverse) library(broom) # 用于提取模型参数(可选) # 按specie和test分组,嵌套每组数据 nested_df <- df %>% group_by(specie, test) %>% nest() # 定义拟合函数,包含错误捕获 fit_group_model <- function(data) { tryCatch( nls(OD ~ curve_func(time, A, B, C), data = data, start = list(A = min(data$time), B = max(data$OD), C = 0.05)), error = function(e) NULL # 拟合失败时返回NULL ) } # 对每组数据拟合模型 nested_df <- nested_df %>% mutate(model = map(data, fit_group_model)) # 提取模型参数(可选,仅保留拟合成功的分组) param_df <- nested_df %>% filter(!is.null(model)) %>% mutate(params = map(model, tidy)) %>% unnest(params) # 查看参数结果 print(param_df)
方法二:基础R循环实现
用split拆分数据后,通过循环逐个拟合分组:
# 按specie和test拆分数据,drop=TRUE去除空分组 split_groups <- split(df, list(df$specie, df$test), drop = TRUE) # 初始化存储模型的列表 model_list <- list() # 循环处理每个分组 for (group_name in names(split_groups)) { current_data <- split_groups[[group_name]] # 拟合模型并捕获错误 model_list[[group_name]] <- tryCatch( nls(OD ~ curve_func(time, A, B, C), data = current_data, start = list(A = min(current_data$time), B = max(current_data$OD), C = 0.05)), error = function(e) NULL ) } # 示例:查看某一分组的拟合结果 if (!is.null(model_list[["Lbcasei.1"]])) { summary(model_list[["Lbcasei.1"]]) }
关键注意点
- 原代码中存在函数名错误:
growth_func需替换为定义好的curve_func,这是导致拟合失败的常见原因。 - 加入
tryCatch是为了防止单个分组拟合报错导致整个流程终止,可根据实际需求调整错误处理逻辑(比如记录错误信息)。 - 如果需要可视化拟合曲线,可在拟合后用
predict生成拟合值,再结合ggplot2分组绘图。
内容的提问来源于stack exchange,提问作者betterL
相关产品推荐
相关产品推荐

