You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

R语言中使用drc包drm()函数绘制多条拟合曲线报错的原因与解决方法

刚好我对drc包的曲线绘制很熟悉,来帮你搞定这个问题!

错误原因分析

这个报错的核心问题很明确:R基础包的lines()函数没法直接识别drc包生成的拟合对象drm()返回的fit2fit3drc类的列表结构,里面装的是模型参数、拟合信息这些内容,而lines()需要的是实实在在的x/y数值向量,找不到对应的xy组件,自然就报错了。

解决方法

这里有两种简单可靠的方式,能帮你把多条拟合曲线叠加到同一张图里:

方法1:用predict()生成拟合值再绘制

先通过predict()函数从每个拟合模型里算出对应浓度的预测响应值,再用lines()把预测值和浓度配对画出来,还能顺便加上原始数据点:

library(drc)
# 模拟数据
CurveData1 <- c(1, 1.1, 1.2, 1.3,2,3,4,5,5.2,5.4, 5.5, 5.6)
CurveData2 <- c(2, 2.1, 2.2, 2.3,3,4,5,6,6.2,6.4, 6.5, 6.6)
CurveData3 <- c(3, 3.1, 3.2, 3.3,4,5,6,7,7.2,7.4, 7.5, 7.6)
Conc <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

# 拟合模型
fit1 <- drm(CurveData1 ~ Conc, fct = LL.5())
fit2 <- drm(CurveData2 ~ Conc, fct = LL.5())
fit3 <- drm(CurveData3 ~ Conc, fct = LL.5())

# 绘制第一条拟合曲线作为基础图
plot(fit1, col = "black", main = "Multiple Dose-Response Curves")

# 生成第二条曲线的预测值并绘制拟合线+数据点
pred2 <- predict(fit2, newdata = data.frame(Conc = Conc))
lines(Conc, pred2, col = "orange", lwd = 2)
points(Conc, CurveData2, col = "orange", pch = 16)

# 生成第三条曲线的预测值并绘制
pred3 <- predict(fit3, newdata = data.frame(Conc = Conc))
lines(Conc, pred3, col = "blue", lwd = 2)
points(Conc, CurveData3, col = "blue", pch = 16)

方法2:用drc自带plot()add=TRUE参数

drc包自己重写了plot()方法,支持add=TRUE参数——意思是不在新画布绘图,直接叠加到已有图形上,这是最贴合drc使用习惯的方式:

library(drc)
# 模拟数据
CurveData1 <- c(1, 1.1, 1.2, 1.3,2,3,4,5,5.2,5.4, 5.5, 5.6)
CurveData2 <- c(2, 2.1, 2.2, 2.3,3,4,5,6,6.2,6.4, 6.5, 6.6)
CurveData3 <- c(3, 3.1, 3.2, 3.3,4,5,6,7,7.2,7.4, 7.5, 7.6)
Conc <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

# 拟合模型
fit1 <- drm(CurveData1 ~ Conc, fct = LL.5())
fit2 <- drm(CurveData2 ~ Conc, fct = LL.5())
fit3 <- drm(CurveData3 ~ Conc, fct = LL.5())

# 绘制第一条曲线作为基础
plot(fit1, col = "black", main = "Multiple Dose-Response Curves")

# 叠加第二条拟合曲线
plot(fit2, col = "orange", add = TRUE)

# 叠加第三条拟合曲线
plot(fit3, col = "blue", add = TRUE)
补充说明

别误会,这个错误不是plot()的锅——drc包专门给自己的拟合对象写了plot方法,所以它能识别;但lines()是R基础函数,没做这个适配,所以不能直接用拟合对象当参数。上面两种方法都能完美解决你的需求,选哪个全看你要不要额外控制数据点的显示啦~

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

火山引擎 最新活动