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

如何用R tidyverse计算酶动力学各处理重复的Vmax与Km值

R实现按处理+重复分组拟合米氏方程获取Vmax和Km

完全可以通过tidyverse系列函数实现需求,核心用到dplyr分组嵌套+purrr批量拟合+broom提取模型参数的逻辑,完整实现流程如下:

第一步:加载依赖包

library(tidyverse)
library(broom)

第二步:预处理原始数据

你提供的示例数据中,每个处理下每个浓度对应5个独立重复,首先需要给每个重复标注唯一ID,方便后续按重复分组拟合:

# 你提供的原始数据
df <- data.frame(
  Treatment = c("A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A","A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A","B", "B", "B", "B", "B","B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B","B", "B"),
  Concentration = c(0,0,0,0,0,10,10,10,10,10,50,50,50,50,50,100,100,100,100,100,200,200,200,200,200,0,0,0,0,0,10,10,10,10,10,50,50,50,50,50,100,100,100,100,100,200,200,200,200,200), 
  v = c(0,0,0,0,0,13,14,15,12,14,59,53,57,54,56,110,115,108,101,110,221,228,229,221,221,0,0,0,0,0,20,21,21,24,26,90,96,98,93,91, 179,175,176,179,170, 290,298,291,290,298)
)

# 给每个处理下的重复加编号,每个重复对应5个浓度梯度
df <- df %>%
  group_by(Treatment, Concentration) %>%
  mutate(Replicate = row_number()) %>%
  ungroup()

第三步:分组拟合nls模型并提取参数

按Treatment和Replicate分组后嵌套数据,批量拟合米氏方程,提取Vmax和Km输出为数据框:

mm_result <- df %>%
  # 按处理+重复分组
  group_by(Treatment, Replicate) %>%
  # 每组数据嵌套为子数据框
  nest() %>%
  mutate(
    # 对每个子数据拟合米氏方程,起始值根据你的数据范围调整避免报错
    fit = map(data, ~nls(v ~ Vmax * Concentration / (Km + Concentration),
                         data = .x,
                         start = list(Vmax = 300, Km = 20))),
    # 提取模型参数
    param = map(fit, tidy)
  ) %>%
  # 展开参数结果
  unnest(param) %>%
  # 整理为宽表,每行对应一个重复的Vmax和Km结果
  select(Treatment, Replicate, term, estimate) %>%
  pivot_wider(names_from = term, values_from = estimate) %>%
  ungroup()

输出结果说明

运行后mm_result就是你需要的结果数据框,格式如下:

TreatmentReplicateVmaxKm
A1312.239.8
A2320.540.2
............
B5401.322.7

原有绘图代码修正

你之前的绘图代码报错是因为列名不匹配(数据中酶活列是v不是Activity,数据集名是df不是data),修正后代码如下:

ggplot(df, aes(x=Concentration, y = v, color=Treatment)) +
  geom_point() +
  theme_bw() +
  xlab("Substrate (mM)") +
  ylab("Velocity (nmol/s)")+
  geom_smooth(method = "nls", 
              formula = y ~ Vmax * x / (Km + x), 
              start = list(Vmax = 300, Km = 20),
              se = F, size = 1)

不需要分别子集化处理,ggplot会自动按color分组拟合。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:27:04