问题描述
我有一些代码可以将 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"))
这个函数允许我通过数据集传递模型并生成 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 (将#修改为@)