在生物学中,我们经常想要绘制剂量反应曲线。 R包' drc'非常有用,基础图形可以轻松处理模型'。但是,我想将我的drm曲线添加到ggplot2。
我的数据集:
library("drc")
library("reshape2")
library("ggplot2")
demo=structure(list(X = c(0, 1e-08, 3e-08, 1e-07, 3e-07, 1e-06, 3e-06,
1e-05, 3e-05, 1e-04, 3e-04), Y1 = c(0, 1, 12, 19, 28, 32, 35,
39, NA, 39, NA), Y2 = c(0, 0, 10, 18, 30, 35, 41, 43, NA, 43,
NA), Y3 = c(0, 4, 15, 22, 28, 35, 38, 44, NA, 44, NA)), .Names = c("X",
"Y1", "Y2", "Y3"), class = "data.frame", row.names = c(NA, -11L
))
使用基本图形:
plot(drm(data = reshape2::melt(demo,id.vars = "X"),value~X,fct=LL.4(),na.action = na.omit),type="bars")
产生一个很好的4参数剂量反应图。
试图在ggplot2中绘制相同的情节,我偶然发现了2个问题。
无法直接添加drm模型曲线。我需要将4-PL重写为函数,并以stat_function的形式添加它,这至少可以说是麻烦的。
ggplot(reshape2::melt(demo,id.vars = "X"),aes(X,value)) +
geom_point() +
stat_function(fun = function(x){
drm_y=function(x, drm){
coef(drm)[2]+((coef(drm)[3]-coef(drm)[2])/(1+exp((coef(drm)[1]*(log(x)-log(coef(drm)[4]))))))
}
+ drm_y(x,drm = drm(data = reshape2::melt(demo,id.vars = "X"), value~X, fct=LL.4(), na.action = na.omit))
})
如果这还不够,只有scale_x是连续的才有效。如果我想添加scale_x_log10()
,我会得到:
Warning message:
In log(x): NaNs produced
。
我意识到log10(0) = -Inf
但是有办法解决这个问题。 (与plot.drc一样)x = 0值在x轴上绘制,基本上为前x值的1/100。 (demo$X[which.min(demo$X)+1]/100
)或在GraphPad Prism中,完全从剂量响应曲线中省略0。
我的问题是:
有没有办法直接在ggplot2中绘制drm模型?
如何将数据集与其对应的4-PL曲线相匹配,以便将它们绘制成相同的颜色?
答案 0 :(得分:11)
来自Result No_of_Repeats
aaa 4
bbb 4
ccc 2
eee 1
包的作者的recent paper包含用于提取ggplot2使用的参数的说明。他们不在ggplot2中工作,但从模型中提取数据。这是他们应用于您的数据的解决方案。
drc
demo1 <- reshape2::melt(demo,id.vars = "X") # get numbers ready for use.
demo.LL.4 <- drm(data = demo1,value~X,fct=LL.4(),na.action = na.omit) # run model.
函数可以从predict
模型中提取参数。它与使用drm
拟合的多条曲线不兼容。
curveid
他们建议改变零浓度以避免coord_trans的问题。
# predictions and confidence intervals.
demo.fits <- expand.grid(conc=exp(seq(log(1.00e-04), log(1.00e-09), length=100)))
# new data with predictions
pm <- predict(demo.LL.4, newdata=demo.fits, interval="confidence")
demo.fits$p <- pm[,1]
demo.fits$pmin <- pm[,2]
demo.fits$pmax <- pm[,3]
然后绘制曲线,省略demo1$XX <- demo1$X
demo1$XX[demo1$XX == 0] <- 1.00e-09
可以阻止绘制错误。
geom_ribbon
要将多条曲线绘制在一起,可以重复该过程。为每个集添加ID。
ggplot(demo1, aes(x = XX, y = value)) +
geom_point() +
geom_ribbon(data=demo.fits, aes(x=conc, y=p, ymin=pmin, ymax=pmax), alpha=0.2) +
geom_line(data=demo.fits, aes(x=conc, y=p)) +
coord_trans(x="log")
然后使用demo.fits_1 <- data.frame(label = "curve1", demo.fits)
组合所有提取的参数。从那里ggplot可以处理颜色。
答案 1 :(得分:2)
我将回答我自己的问题,希望这将有助于其他人面临同样的问题。
当然可以使用ggplot2和drc软件包绘制剂量响应曲线,只需添加geom_或stat_smooth (method=drm, fct=LL.4(),se=FALSE)
,如果绘制在线性刻度或geom_或stat_smooth (method=drm, fct=L.4(),se=FALSE)
if {{1 }} 被添加。
为了能够使用log10比例,我将我的数据转换为:
scale_x_log10()
在这种情况下,我将X = 0值替换为前一个X值的X = 1/100(在这种情况下为1e-10)。但是,您可以通过完全省略数据集,像Prism那样轻松地删除0值,从而弄乱对数绘图。 有一点需要注意的是,正如我发现的那样,ggplot首先对轴进行缩放然后添加数据,这就是代码在尝试log10(0)时中断的原因。
另一个微妙之处在于stat_smooth功能完全能够使用demo <- demo %>%
mutate(X =
ifelse(X == 0,
yes = (sort(demo$X[which.min(sort(demo$X)) + 1]/100)),
no = X
)
) #looks for the pre-lowest value in X and divides it by 100
处理drm模型,但它不知道如何适应SE&#39; SE&#39;置信区间。因此,选择method = drm
可以进行绘图,并且在我的拙见中,无论如何都会创建一个不那么混乱的情节 - 只需添加误差线即可。
最后,将se = FALSE
更改为fct = LL.4()
可以在log10比例上进行绘图,因为再次选择比例并在之后完成拟合。因此,即使轴值是非对数的,ggplot实际上已经将数据集转换为log10,因此拟合函数现在需要只是logit-4P(即L.4())而不是log-logit-4P(LL) 0.4())。
geom_smooth()和stat_smooth()函数自然会采用与数据集相同的颜色,无需调整拟合函数的颜色以与数据点的颜色相对应。
总结:
fct = L.4()