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

如何在数据框的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:45:10