【问题标题】:Plotting dr4pl dose response curves, and how to integrate them with ggplot2?绘制 dr4pl 剂量反应曲线,以及如何将它们与 ggplot2 集成?
【发布时间】:2021-03-25 19:44:13
【问题描述】:

我正在尝试建立一种高通量方法来绘制大型筛选实验中的剂量反应曲线。 Prism 显然有最简单的方法可以很好地绘制剂量反应曲线,但我无法复制和粘贴这么多数据。

由于 CRAN 删除了 drc,包 dr4pl 似乎是要走的路,但可用的指令还很少。

#make data frame 
dose <- c("0.078125","0.156250","0.312500","0.625000","1.250000","2.500000","5.000000","10.000000","20.000000")
POC<-c("1.05637425", "0.87380081", "0.79171200", "0.83166848", "0.77361290", "0.35199288", "0.19404609",  "0.09079221", "0.09850658")
data<-data.frame(dose, POC)


#use the dr4pl pakcage to calculate curve and IC50 etc
model<-dr4pl(POC~dose, data)

summary.model <- summary(model)

summary.model$coefficients

#plot this
plot(dr4pl(POC~dose, data=data))

上面将使用 dr4pl 生成我需要的曲线类型,并为我提供 IC50。但是如何在一张图上绘制多个数据集/曲线?

理想情况下,我宁愿使用 ggplot2:plot+geom_point() 绘制数据,并通过使用 dr4pl 摘要作为+stat_smooth() 模型添加剂量反应线,如果这有意义吗?但我不知道该怎么做。

任何帮助将不胜感激

【问题讨论】:

  • OP,您能否提供一个数据集,或者在这种情况下,提供两个数据集,以便我们重现绘图并帮助演示如何组合它们?

标签: r ggplot2


【解决方案1】:

我可以走大部分路,但不是一路走来。主要步骤是为dr4pl对象写一个predict()方法:

predict.dr4pl <- function (object, newdata=NULL, se.fit=FALSE, level, interval) {
    xseq <- if (is.null(newdata)) object$data$Dose else newdata$x
    pred <- MeanResponse(xseq, object$parameters)
    if (!se.fit) {
        return(pred)
    }
    qq <- qnorm((1+level)/2)
    se <- sapply(xseq,
                 function(x) car::deltaMethod(object, 
    "UpperLimit + (LowerLimit - UpperLimit)/(1 + (x/IC50)^Slope)")[["Estimate"]])
    return(list(fit=data.frame(fit=pred,lwr=pred-qq*se,
                                upr=pred+qq*se), se.fit=se))
}

我包含了一种通过 delta 方法计算置信区间的稍微笨拙的方法 - 这可能不太可靠(自举会更好......)

它适用于您的数据(在某种程度上)(将名称更改为 dd,因为有时将数据命名为 data (fortunes::fortune("dog")) 有点冒险)。

dd <- data.frame(dose = c(0.078125,0.156250,0.312500,0.625000,1.25,
                          2.50,5.0,10.0,20.0),
                 POC = c(1.05637425, 0.87380081, 0.79171200,
                         0.83166848, 0.77361290, 0.35199288,
                         0.19404609,  0.09079221, 0.09850658))

library(dr4pl)
ggplot(dd, aes(dose,POC)) + geom_point() +
     geom_smooth(method="dr4pl",se=TRUE) + coord_trans(x="log10")

  • 置信区间很糟糕,请使用se=FALSE 将其关闭
  • dr4pl 默认情况下将 x 轴设置为 log10 刻度,但标准 scale_x_log10() 将其搞砸了,因为它是在 拟合和预测之前应用的,所以我改用 coord_trans(x="log10")
  • 但是,如果坐标轴在非常宽的对数刻度上,coord_trans() 的效果就不那么好了 - 我使用包中的 sample_data_1 数据尝试了上面的示例,但它不起作用。

但恐怕我现在已经在这方面花费了足够的时间。

使用上面的predict 方法在你想要的范围内分别生成你想要的值会更健壮,然后使用geom_line() + geom_ribbon() 将信息添加到绘图中...... .

如果您愿意先拟合模型(在geom_smooth 之外),您可以这样做(这是使用来自dr4pl 包的sample_data_1 - 它来自?dr4pl 中的第一个示例)

model2 <- dr4pl(dose = sample_data_1$Dose,
           response = sample_data_1$Response)

ggplot(sample_data_1, aes(Dose,Response)) + geom_point() +
    stat_function(fun=function(x) predict(model2,newdata=data.frame(x=x))) +
    scale_x_log10()

它对 x 轴的缩放/取消缩放顺序不太敏感。


改进但缓慢的引导 CI:

predictdf.dr4pl <- function (model, xseq, se, level, nboot=200) {
    pred <- MeanResponse(xseq, model$parameters)
    if (!se) {
        return(base::data.frame(x=xseq, y=pred))
    }
    ## bootstrap residuals
    pred0 <- MeanResponse(model$data$Dose, model$parameters)
    res <- pred0-model$data$Response
    bootres <- matrix(nrow=length(xseq), ncol=nboot)
    pb <- txtProgressBar(max=nboot,style=3)
    for (i in seq(nboot)) {
        setTxtProgressBar(pb,i)
        mboot <- dr4pl(model$data$Dose,
                       pred0 + sample(res, size=length(pred0),
                                      replace=TRUE))
        bootres[,i] <- MeanResponse(xseq, mboot$parameters)
    }
    fit <- data.frame(x = xseq,
                      y=pred,
                      ymin=apply(bootres,1,quantile,(1-level)/2),
                      ymax=apply(bootres,1,quantile,(1+level)/2))
    return(fit)
}

print(ggplot(dd, aes(dose,POC))
    + geom_point()
    + geom_smooth(method="dr4pl",se=TRUE) + coord_trans(x="log10")
)

【讨论】:

  • 嗨,本,非常感谢您解决这个问题。我想您将我的数据集更改为“dd”而不是“data”,但“sample-data_1”是什么?您的第一个代码块运行,但生成的图表不是您显示的那个。 '''> ggplot(dd, aes(dose,POC)) + geom_point() + + geom_smooth(method="dr4pl",se=TRUE) + coord_trans(x="log10") geom_smooth() 使用公式'y ~ x'''' 我无法在此处粘贴的绘图上没有线条。关于使用 '''geom_smooth''' 你没有给出使用的数据,所以我无法测试它。您能否解释一下为了运行此代码而对 sample_data_1 所做的更改?
  • 查看编辑。 sample_data_1dr4pl 附带的数据文件。
  • 您好,感谢您的澄清。再次,很抱歉很痛苦,但是 '''ggplot(dd, aes(dose,POC)) + geom_point() + geom_smooth(method="dr4pl",se=TRUE) + coord_trans(x="log10") ''' 代码不会生成您发布的图表。我可以改变什么来解决这个问题?我在两台不同的电脑上运行过,第二次我得到相同的不正确的图表,但没有一条线,但还有以下错误'''警告消息:stat_smooth() 中的计算失败:没有名为'car'的包'''
  • 你需要安装car包...(我应该写一个声明if (!require("car")) warning("...")
  • 我很难远程调试它。 packageVersion("car")?该代码是否适用于se=FALSE(您会失去置信区间,但也许这是最好的)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
相关资源
最近更新 更多