如何让我的 dr4pldrc 替代剂量反应代码忽略它不适合的模型?

问题描述

我有一些代码可以将 dr4pl 模型拟合到数据集中的剂量反应曲线,并生成一个包含相关 IC50 的表格,或者将曲线拟合到 ggplot。

但是,当 dr4pl 模型无法将曲线拟合到某一特定数据位时,它就会失败,并且代码不会运行。因此,如果我在包含 100 条曲线的数据上运行代码,并且其中一条包含错误数据,那么整个批次都会失败,而不会告诉我哪里出了问题。

我需要帮助弄清楚如何 i) 让它运行,并忽略它无法拟合的曲线,或者 ii) 标记数据集的有问题的部分。

library(dr4pl)
library(car)

这是可以添加到 ggplot 的模型:

    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))
    }


ggplot(dat2,aes(dose,medPOC,col=cell_palbo))+
  geom_point(size=2.5) +
  geom_smooth(method="dr4pl",se=F)+ 
  coord_trans(x="log10")+
  scale_x_continuous(breaks = c(0.01,0.1,1,10))+
  theme_bw()+
  theme(plot.title = element_text(lineheight = 0.9,face="bold",size=20,hjust=0.5))+
  ggtitle("Dose Response")+
  theme(axis.title = element_text(face="bold",size = 14))+
  theme(axis.text = element_text(face="bold",size = 12,colour="black"))

示例图:

left=successful curve fit,right=failed curve fit

这个函数允许我通过数据集传递模型并生成 IC50: #builds IC50 表

    multiIC <- function(data,colDose,colResp,colID,inhib.percent,...) {
      
      # Get curve IDs
      locID <- unique(data[[colID]])
      
      # Prepare a vector to store IC50s
      locIC <- rep(NA,length(locID))
      
      # Calculate IC50 separately for every curve
      for (ii in seq_along(locID)) {
        # Subset a single dose response
        locSub <- data[get(colID) == locID[[ii]],]
        
        # Calculate IC50
        locIC[[ii]] <- dr4pl::IC(
          dr4pl::dr4pl(dose = locSub[[colDose]],response = locSub[[colResp]],...),inhib.percent)
      }
      
      return(data.frame(id = locID,x = locIC))
}

这会在数据集上运行该函数以生成包含 IC50 的表:

dfIC50 <- multiIC(data = dataset,colDose = "dose",colResp = "medPOC",colID = "ID",inhib.percent = 50)

加载两个不同的数据集,每个数据集有 2 条曲线。 Dat1 将使函数失败并且不生成输出。 Dat2 工作得很好。

dat1<-structure(list(cell_palbo = c("T47D-","T47D-","T47DpR-","T47DpR-"),medPOC = c(1,0.859642814335371,0.826920771904591,0.611051180630469,0.0391945343401654,0.284310200167805,0.905880254474107,0.790891253938998,0.624650692669005,1.01212913966348,0.365955169748499),dose = c(0.01,0.3,10,3,0.01,3),ID = c("SN1051760333 - T47D-","SN1051760333 - T47D-","SN1051760333 - T47DpR-","SN1051760333 - T47DpR-")),row.names = c(NA,-12L),class = c("data.table","data.frame"))

dat2<-structure(list(cell_palbo = c("T47D-",0.897544504013507,0.0792630550042949,0.0194307040668227,0.00746423387932822,0.0135067089244987,0.0396359365825015,0.0404633534404527,0.00371003042758768,0.00184166978060108,0.0024555597074681),ID = c("SN1023563430 - T47D-","SN1023563430 - T47D-","SN1023563430 - T47DpR-","SN1023563430 - T47DpR-")),"data.frame"))

如果您运行这些并尝试生成 IC50 表,您将看到:

dfIC50a <- multiIC(data = dat1,inhib.percent = 50)

dfIC50b <- multiIC(data = dat2,inhib.percent = 50)

我真的很感谢您的帮助,提前致谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...