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

R中ELISA分析:drc对象调用ED函数如何使用曲线特异性估计值

板特异性标准曲线样本浓度估算实现方法

核心问题本质是drc包的ED()函数没有内置自动关联样本分组、匹配对应曲线参数的逻辑,直接传入所有样本吸光度会出现参数错配,按以下步骤操作即可得到正确结果:


关键参数说明

首先明确容易混淆的参数作用:

  • pool = FALSE:必须设置,该参数设为FALSE时才会调用每块板独立拟合得到的四参数,设为TRUE会将所有板的参数合并为一套全局参数,完全丢失分板校正板间差异的设计意义
  • curves:ED()支持通过该参数指定本次计算要调用的曲线编号,编号和拟合时CURVE变量的取值一一对应,是实现参数匹配的核心入口

完整实现代码

1. 拟合板特异性四参数Logistic模型

和原有拟合逻辑完全一致:

library(drc)
set.seed(5) # 复现模拟数据,实际使用时替换为自有数据即可
# --- 模拟数据生成代码开始 ---
CURVE <- sort(rep(seq(1,25,1),4))
ctrl_n <- rep(seq(1,4,1),25)
ctrlC <- rep(c(1,10,40,250),25)
logctrlC <- log(ctrlC)
ctrlA <- rep(NA,100)
controls <- data.frame(CURVE, ctrl_n, ctrlA, ctrlC, logctrlC)
controls$ctrlA[controls$ctrl_n==1] <- abs(rnorm(25, 0.05, 0.01))
controls$ctrlA[controls$ctrl_n==2] <- abs(rnorm(25, 0.60, 0.25))
controls$ctrlA[controls$ctrl_n==3] <- abs(rnorm(25, 1.10, 0.45))
controls$ctrlA[controls$ctrl_n==4] <- abs(rnorm(25, 1.95, 0.50))

id <- sort(rep(seq(1,500,1),4))
id_n <- rep(seq(0,3,1),500)
A <- rep(NA,2000)
samples <- data.frame(id,id_n,A)
samples$A[samples$id_n==0] <- abs(rnorm(500, 0.85, 0.55))
samples$A[samples$id_n==1] <- abs(rnorm(500, 0.15, 0.20))
samples$A[samples$id_n==2] <- abs(rnorm(500, 0.30, 0.35))
samples$A[samples$id_n==3] <- abs(rnorm(500, 1.05, 0.50))
samples$CURVE <- sort(rep(seq(1,25,1),80))
# --- 模拟数据生成代码结束 ---

# 拟合板特异性模型
model1 <- drm(
  ctrlA ~ logctrlC, 
  curveid = CURVE, 
  fct = LL.4(names = c("Slope", "Lower", "Upper", "ED50")), 
  logDose = exp(1), 
  data = controls
)

2. 按板分组匹配参数计算浓度

按CURVE拆分样本,逐板调用对应曲线的参数计算浓度,最后合并回原样本表,全程不需要额外依赖包:

# 逐板计算浓度
samples$est_C <- unlist(lapply(
  split(samples, samples$CURVE),
  function(plate_subset) {
    # 获取当前板的编号
    current_curve <- unique(plate_subset$CURVE)
    # 用当前板的独立参数计算对应吸光度的浓度
    ed_result <- ED(
      model1,
      respLev = plate_subset$A,
      type = "absolute",
      logBase = exp(1),
      pool = FALSE,
      curves = current_curve # 核心:指定调用当前板的参数
    )
    # 返回浓度估计值(ED返回结果的第一列为点估计值)
    as.numeric(ed_result[, "Estimate"])
  }
))

常见踩坑提醒

  • 不要直接把所有样本的吸光度整体传入ED():这种写法默认只会用第一根曲线的参数计算所有样本,结果完全错误
  • 不要漏设pool = FALSE:哪怕指定了curves参数,如果pool = TRUE,依然会用合并后的全局参数计算
  • 计算前注意过滤吸光度超出曲线范围的样本:吸光度低于曲线下渐近线或高于上渐近线时,返回的浓度值会是极端值或NA,需要提前标记为超出定量范围

结果验证

可以手动提取单块板的参数,用四参数Logistic公式反推浓度,和函数计算结果比对确认匹配正确:

# 提取1号板的模型参数
coef_p1 <- coef(model1)[grep(":1$", names(coef(model1)))]
slope <- coef_p1["Slope:1"]
lower <- coef_p1["Lower:1"]
upper <- coef_p1["Upper:1"]
ed50 <- coef_p1["ED50:1"]

# 取1号板第一个样本的吸光度手动计算
abs_p1s1 <- samples$A[1]
manual_calc <- exp(ed50 * (((upper - lower)/(abs_p1s1 - lower)) - 1)^(1/slope))

# 对比函数返回的结果,二者完全一致
print(paste0("手动计算值:", manual_calc, ",函数返回值:", samples$est_C[1]))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:15:32