R语言中使用drc包drm()函数绘制多条拟合曲线报错的原因与解决方法
刚好我对drc包的曲线绘制很熟悉,来帮你搞定这个问题!
错误原因分析
这个报错的核心问题很明确:R基础包的lines()函数没法直接识别drc包生成的拟合对象。drm()返回的fit2、fit3是drc类的列表结构,里面装的是模型参数、拟合信息这些内容,而lines()需要的是实实在在的x/y数值向量,找不到对应的x和y组件,自然就报错了。
解决方法
这里有两种简单可靠的方式,能帮你把多条拟合曲线叠加到同一张图里:
方法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




