用ggplot2和drc绘制剂量反应曲线 [英] Plotting dose response curves with ggplot2 and drc
问题描述
我的数据集:
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中绘制相同的图,我偶然发现了两个问题。
-
没有办法直接添加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] *(日志(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()
,我得到:
警告消息:
在log(x)中:NaNs产生。
我意识到 log10(0)= - Inf
但是有办法处理这个。要么(与plot.drc一样),x = 0值在x轴上绘制,实质上是前最低x值的1/100。 ( demo $ X [which.min(demo $ X)+1] / 100
)或在GraphPad Prism中,0完全从剂量响应曲线中省略。
我的问题是:
-
有没有一种绘图方式drg模型直接在ggplot2中?如何将数据集与相应的4-PL曲线连接起来,以便它们以相同的颜色绘制出来?
A
<为了绘制多条曲线,可以重复该过程。为每组添加ID。
demo.fits_1< - data.frame(label =curve1,demo.fits)
code> 然后使用 rbind
来组合所有提取的参数。从那里ggplot可以处理颜色。
In biology we often want to plot dose response curves. The R package 'drc' is really useful and base graphics can easily handle 'drm models'. However, I would like to add my drm curves to a ggplot2.
My dataset:
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
))
Using base graphics:
plot(drm(data = reshape2::melt(demo,id.vars = "X"),value~X,fct=LL.4(),na.action = na.omit),type="bars")
produces a nice 4-parameter dose response plot.
Trying to plot the same plot in ggplot2, I stumble upon 2 issues.
There is no way of directly adding the drm model curve. I need to rewrite the 4-PL as a function and add it in the form of a stat_function, which is cumbersome to say the least.
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)) })
If that wasn't enough it only works if scale_x is continuous. If I want to add
scale_x_log10()
, I get:Warning message: In log(x): NaNs produced
.
I realise that log10(0) = -Inf
but there are ways of handling this. Either (as is the case with plot.drc) the x=0 value is plotted on the x-axis essentially as 1/100 of the pre-lowest x-value. (demo$X[which.min(demo$X)+1]/100
) or as in GraphPad Prism, the 0s are omitted from the dose response curve entirely.
My questions are:
Is there a way of plotting drm models in ggplot2 directly?
How can I link a dataset with its corresponding 4-PL curvefit so that they will be plotted in the same colour?
A recent paper from the authors of the drc
package included instructions for extracting parameters for use by ggplot2. They don't work within ggplot2 but extract data from the model. This is their solution applied to your data.
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.
The predict
function can extract the parameters from drm
models. It isn't compatible with multiple curves that were fit using curveid
.
# 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]
They advise shifting the zero concentration to avoid issues with coord_trans.
demo1$XX <- demo1$X
demo1$XX[demo1$XX == 0] <- 1.00e-09
Then comes plotting the curve, omitting geom_ribbon
stops the errors from being drawn.
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")
To graph multiple curves together the process can be repeated. Add IDs to each set.
demo.fits_1 <- data.frame(label = "curve1", demo.fits)
Then use rbind
to combine all the extracted parameters. From there ggplot can handle colours.
这篇关于用ggplot2和drc绘制剂量反应曲线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!