首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ggplot2和drc绘制剂量响应曲线

用ggplot2和drc绘制剂量响应曲线
EN

Stack Overflow用户
提问于 2016-04-21 20:59:37
回答 3查看 19.9K关注 0票数 9

在生物学中,我们经常想要绘制剂量反应曲线。R包'drc‘是真正有用的,基本图形可以轻松处理'drm模型’。但是,我想将我的drm曲线添加到一个ggplot2中。

我的数据集:

代码语言:javascript
复制
 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
))

使用基本图形:

代码语言:javascript
复制
plot(drm(data = reshape2::melt(demo,id.vars = "X"),value~X,fct=LL.4(),na.action = na.omit),type="bars")

产生了一个很好的4参数剂量反应图。

为了在ggplot2中绘制同样的情节,我偶然发现了两个问题。

  1. 没有直接添加drm模型曲线的方法。我需要将4-PL重写为一个函数,并以stat_function的形式添加它,这至少是很麻烦的。 ggplot(repe2::id.vars = "X")、aes(X,value)+ geom_point() +stat_function(stat_function= function(x){ drm_y=function(x,drm){ drm_y=function}+ drm_y(x,drm =drm)(数据=repe2::stat_function(演示),( id.vars = "X"),值~X,fct=LL.4(),na.action =na.omit)}
  2. 如果这还不够的话,只有在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棱镜中,在剂量反应曲线中完全忽略了0。

我的问题是:

  1. 有没有一种在ggplot2中直接绘制数字版权管理模型的方法?
  2. 如何将数据集与其相应的4-PL曲线链接起来,以便将其绘制成相同的颜色?
EN

回答 3

Stack Overflow用户

发布于 2016-05-05 06:21:28

来自近期论文包作者的drc包含了提取参数以供ggplot2使用的说明。它们不在ggplot2中工作,而是从模型中提取数据。这是应用于您的数据的解决方案。

代码语言:javascript
复制
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的多条曲线不兼容。

代码语言:javascript
复制
# 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]

他们建议转移零浓度以避免与coord_trans有关的问题。

代码语言:javascript
复制
demo1$XX <- demo1$X
demo1$XX[demo1$XX == 0] <- 1.00e-09

然后是绘制曲线,省略geom_ribbon会阻止绘制错误。

代码语言:javascript
复制
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") 

若要将多条曲线绘制在一起,则可以重复此过程。向每组添加ID。

代码语言:javascript
复制
demo.fits_1 <- data.frame(label = "curve1", demo.fits)

然后使用rbind组合所有提取的参数。从那起,ggplot就可以处理颜色了。

票数 17
EN

Stack Overflow用户

发布于 2016-04-29 20:34:31

我将回答我自己的问题,希望这将有助于其他面临同样问题的人。

当然,用ggplot2绘制剂量响应曲线是可能的,如果在线性尺度上绘图,则可以简单地添加geom_或stat_smooth (method=drm, fct=LL.4(),se=FALSE),或者如果添加scale_x_log10(),则绘制geom_或stat_smooth (method=drm, fct=L.4(),se=FALSE)

为了能够使用log10刻度,我将数据转换为:

代码语言:javascript
复制
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

在本例中,我将X=0替换为前一个X值的1/100(在本例中为1e-10)。但是,您可以像Prism一样,完全从dataset中省略0值,从而很容易地删除混淆对数绘图的0值。需要注意的一点是,正如我所发现的那样,ggplot首先缩放轴,然后添加数据,这就是为什么代码在尝试log10(0)时中断的原因。

另一个微妙之处是,stat_smooth函数完全能够使用method = drm处理drm模型,但它不知道如何适应'SE‘置信区间。因此,选择se = FALSE可以进行绘图,在我看来,这样可以减少混乱的情节--只需添加错误栏即可。

最后,将fct = LL.4()更改为fct = L.4()允许在log10标度上进行绘图,因为第一次选择标度,然后再进行匹配。因此,即使轴值是非对数的,ggplot实际上已经将数据集转换为log10,因此拟合函数现在只需要logit-4P (即L.4()),而不是logit 4p (LL.4())。

geom_smooth()和stat_smooth()函数将自然采用与数据集相同的颜色,无需调整拟合函数的颜色以与数据点的颜色相对应。

总结如下:

代码语言:javascript
复制
demo <- demo %>% 
      mutate(X = 
       ifelse(X == 0, 
              yes = (sort(demo$X[which.min(sort(demo$X)) + 1]/100)),
              no = X
              )
            )
demo.long <- reshape2::melt(demo,id.vars = "X") #reshapes the demo dataset to long format
ggplot(data = demo.long,
       aes(x = X, y = value, col = variable)
      ) + 
   geom_point() + 
   geom_smooth(method = drm, fct = L.4(), se = FALSE) +
   scale_x_log10() #plots out the dataset with the corresponding 4-parameter log-logit dose response curves
票数 6
EN

Stack Overflow用户

发布于 2022-01-07 19:27:07

最新的答案:geom_smooth(method = drm, method.args = list(fct = L.4()), se = FALSE)是超级有用的!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36780357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档