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

R语言drc包drm()拟合剂量反应数据收敛失败该如何解决?

drc包剂量-反应曲线拟合收敛报错问题解答

报错成因

该收敛错误由两个核心原因共同导致:

  • 浓度轴数值分布极端:你的原始浓度范围为0~0.01,存在0值且多数数值极小,drc包内置的LL系列(对数逻辑斯蒂)模型默认会对浓度做对数变换计算起始拟合参数,0值会生成负无穷值,极小浓度则会导致有限差分计算时出现除以近零值的情况,最终生成非有限数值触发optim迭代报错。而你将浓度替换为连续整数后,数值分布均匀无极端值,默认起始参数估计正常,因此可以顺利拟合。
  • 数据信噪比较低:拟合失败的数据集响应值随浓度变化的幅度非常小,默认的起始参数估计值离最优解距离过远,迭代过程中梯度消失无法收敛。
  • 额外注意:你将浓度变量命名为c,覆盖了R内置的向量拼接函数c(),也可能引发偶发计算异常,建议重命名为conc或dose这类非关键字变量名。

解决方案

可以通过以下几种方法解决收敛问题:

  1. 缩放浓度数值:将原始浓度乘以一个较大的系数(比如1e6),把数值拉到无极端小值的合理范围,拟合完成后再将结果(如IC50)除以对应系数转回原尺度即可,示例代码如下:
library(drc)
conc <- c(0.00000000, 0.00015625, 0.00031250, 0.00062500, 0.00125000, 0.00250000, 0.00500000, 0.01000000, 0.00000000, 0.00015625, 0.00031250, 0.00062500, 0.00125000, 0.00250000, 0.00500000, 0.01000000)
conc_scaled <- conc * 1e6
fit_NotOK <- drm(Data_NotOK ~ conc_scaled, fct = LL.5())
  1. 手动传入起始参数:用同类可正常拟合数据集的拟合系数作为起始参数传入drm函数,避免默认估计出错:
# 用正常拟合结果的系数作为起始值
start_params <- coef(fit_OK)
fit_NotOK <- drm(Data_NotOK ~ conc, fct = LL.5(), start = start_params)
  1. 调整模型参数:可以通过LL.5的logAdj参数设置对0浓度的偏移调整,或适当增大control参数中的最大迭代步数maxit。

批量循环实现拟合失败仍输出图片的方法

使用tryCatch捕获拟合错误即可实现需求,示例代码如下(基于ggplot2绘图,也可替换为基础绘图函数):

library(drc)
library(ggplot2)

# 示例数据集列表,可替换为你自己的批量数据
data_batch <- list(
  group1 = data.frame(conc = c, resp = Data_OK),
  group2 = data.frame(conc = c, resp = Data_NotOK)
)

# 批量处理循环
for (idx in seq_along(data_batch)) {
  cur_data <- data_batch[[idx]]
  save_path <- paste0("剂量反应图_", names(data_batch)[idx], ".png")
  
  # 先生成基础散点图
  p <- ggplot(cur_data, aes(x = conc, y = resp)) +
    geom_point(size = 2) +
    labs(x = "浓度", y = "响应值", title = names(data_batch)[idx]) +
    theme_bw()
  
  # 尝试拟合,捕获错误
  fit_res <- tryCatch({
    drm(resp ~ conc, data = cur_data, fct = LL.5())
  }, error = function(e) {
    return(NULL)
  })
  
  # 拟合成功则添加曲线,失败则添加文本标注
  if (!is.null(fit_res)) {
    p <- p + geom_line(aes(y = predict(fit_res)), color = "red", linewidth = 1)
  } else {
    p <- p + annotate("text", x = max(cur_data$conc)/2, y = max(cur_data$resp),
                      label = "模型拟合失败", color = "red", size = 5)
  }
  
  # 保存图片,无论拟合是否成功都会输出
  ggsave(save_path, p, width = 6, height = 4, dpi = 300)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:06:01