使用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
相关产品推荐
相关产品推荐

