如何用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就是你需要的结果数据框,格式如下:
| Treatment | Replicate | Vmax | Km |
|---|---|---|---|
| A | 1 | 312.2 | 39.8 |
| A | 2 | 320.5 | 40.2 |
| ... | ... | ... | ... |
| B | 5 | 401.3 | 22.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
相关产品推荐
相关产品推荐

