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

使用drc包绘制剂量反应曲线:恢复原始X轴与转换IC50值

解决drc包LL.4模型绘图X轴异常及IC50单位转换问题

问题根源

你的conc是因子类型,drm()函数默认会把因子的水平转换成整数编码(比如第1个水平对应1,第2个对应2……),这直接导致两个问题:

  • 取消log="x"后,X轴显示的是因子编码的范围(0-12),而非实际浓度的0-90000
  • 算出的IC50(7.577)是因子编码的数值,不是真实的浓度单位

分步解决

1. 把因子型conc转成数值型

先处理conc的类型,把它转换成能被模型正确识别的数值,注意要先转成字符再转数值,避免小数水平被错误解析:

# 转换因子为数值型浓度
df$conc_num <- as.numeric(as.character(df$conc))
# 检查转换结果,确保没有NA或错误值
head(df$conc_num)

2. 重新拟合LL.4模型

用转换后的数值型浓度conc_num建模,这次模型会基于实际浓度值计算:

library(drc)
# 重新构建LL.4模型
model <- drm(fl ~ conc_num, data = df, fct = LL.4())
# 查看模型参数和拟合情况
summary(model)

3. 获取实际浓度单位的IC50

现在用ED()函数提取的IC50就是真实浓度了,直接指定抑制率对应的荧光值水平即可:

# 计算IC50(如果fl是0-100的归一化值,respLev设为50;如果是0-1则设为0.5)
ic50 <- ED(model, respLev = 50, type = "absolute")
print(ic50)

4. 绘制带原始X轴的拟合曲线

直接用转换后的模型绘图,X轴会自动显示实际浓度范围,不需要依赖log="x"(如果需要对数轴也可以保留,但刻度会对应实际浓度的对数):

# 绘制拟合曲线,X轴为实际浓度
plot(model, log = "", xlab = "实际浓度", ylab = "归一化荧光值", main = "LL.4模型拟合曲线")
# 可选:添加原始数据点对比
points(fl ~ conc_num, data = df, col = "red", pch = 16)

额外提示

  • 如果转换后conc_num出现NA,检查conc因子的水平里有没有非数值字符(比如空格、特殊符号),清理后再重新转换。
  • 要是需要对数X轴但想显示实际浓度刻度,可以手动设置:
plot(model, log = "x", xlab = "实际浓度(对数轴)", ylab = "归一化荧光值")
# 手动指定关键浓度作为刻度
axis(side = 1, at = c(0, 0.1, 1, 10, 100, 1000, 10000, 90000), labels = c("0", "0.1", "1", "10", "100", "1000", "10000", "90000"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:30:28