之前给同学们分享了利用随机提高ROC的AUC值
不过那个不是的timeROC的AUC
今天就给同学们分享利用随机,找到timeROC的最优AUC值
废话不多说,直接整👇👇
1.文件准备
准备生存时间、生存状态及基因表达数据的合并文件
2.加载包library(pROC)
library(limma)
library(tidyverse)
library(future.apply)
library(neuralnet)
library(caret)
library(NeuralNetTools)
library(caTools)
library(survival)
library("glmnet")
library(survival)
library(survminer)
library(timeROC)
library(limma)
library(future.apply)
library(parallel)
library(caret)
3.读取文件,,并将生存时间单位转换为年#读取输入文件
rt=read.table(file ="exptime.txt" , header=T, sep="\t", check.names=F,row.names = 1)
data=as.data.frame(rt)
data$futime=data$futime/365
4.设置主要参数及阈值#设置随机次数
counts=1000
#设置训练集与测试集比例
pr=0.6 #【0.6就是训练集占比60%】
#设置出图阈值
plotedge=0.4
samplecounts=as.data.frame(1:counts)
#【输入你要研究的基因】
gene="CES1"
出图的AUC阈值,为了方便演示在这里我设置为了0.4【多数情况下应设置为0.75或更高】
5.进入多线程循环#开启多线程循环
plan(multisession)
future_apply(X = samplecounts,MARGIN = 1,FUN = function(seed){
library(pROC)
library(limma)
library(tidyverse)
library(future.apply)
library(neuralnet)
library(caret)
library(NeuralNetTools)
library(caTools)
library(survival)
library("glmnet")
library(survival)
library(survminer)
library(timeROC)
library(limma)
library(future.apply)
library(parallel)
library(caret)
由于利用future_apply之后很多包需要重新加载,因此直接将所有的包放在了future_apply之后
6.将矩阵随机分为train组和test组split_T <- sample.split(rownames(data), SplitRatio = pr)
trainData <- subset(data, split_T =="TRUE")%>%as.data.frame()
testData <- subset(data, split_T =="FALSE")%>%as.data.frame()
trainData_gene=trainData[,gene,drop=F]
trainData_gene=data.frame(futime=trainData$futime,fustat=trainData$fustat,gene=trainData_gene[,1])
rownames(trainData_gene)=rownames(trainData)
testData_gene=testData[,gene,drop=F]
testData_gene=data.frame(futime=testData$futime,fustat=testData$fustat,gene=testData_gene[,1])
rownames(testData_gene)=rownames(testData)
可以看到,train组数据随机分到了200个样本,test组数据随机分到了134个样本
7.进行timeROC分析##【计算timeROC】
ROC_train=timeROC(T=trainData_gene$futime,delta=trainData_gene$fustat,
marker=trainData_gene$gene,cause=1,
weighting='aalen',
times=c(1,3,5),ROC=TRUE)
AUC_1_year_train=ROC_train[["AUC"]][["t=1"]]
AUC_3_year_train=ROC_train[["AUC"]][["t=3"]]
AUC_5_year_train=ROC_train[["AUC"]][["t=5"]]
ROC_test=timeROC(T=testData_gene$futime,delta=testData_gene$fustat,
marker=testData_gene$gene,cause=1,
weighting='aalen',
times=c(1,3,5),ROC=TRUE)
AUC_1_year_test=ROC_test[["AUC"]][["t=1"]]
AUC_3_year_test=ROC_test[["AUC"]][["t=3"]]
AUC_5_year_test=ROC_test[["AUC"]][["t=5"]]
这里选择了1,3,5年进行分析,同学们也可以修改为其他年份进行分析
8.判断是否符合阈值并绘制图片
这么多次的循环,每次都输出图片的话岂不是得筛选到天荒地老
因此我们需要对其添加限制条件👇
train组和test组1,3,5年的AUC均需大于阈值才可输出##【判断条件】
if(AUC_1_year_train>plotedge &
AUC_3_year_train>plotedge &
AUC_5_year_train>plotedge &
AUC_1_year_test>plotedge &
AUC_3_year_test>plotedge &
AUC_5_year_test>plotedge){
pdf(file=paste0(seed,"_Train_ROC.pdf"), width=5, height=5)
plot(ROC_train,time=1,col="green",title=FALSE,lwd=2)
plot(ROC_train,time=3,col="blue",add=TRUE,title=FALSE,lwd=2)
plot(ROC_train,time=5,col="red",add=TRUE,title=FALSE,lwd=2)
legend('bottomright',
c(paste0('AUC at 1 years: ',sprintf("%.03f",ROC_train$AUC[1])),
paste0('AUC at 3 years: ',sprintf("%.03f",ROC_train$AUC[2])),
paste0('AUC at 5 years: ',sprintf("%.03f",ROC_train$AUC[3]))),
col=c("green","blue","red"), lwd=2, bty = 'n')
dev.off()
pdf(file=paste0(seed,"_Test_ROC.pdf"), width=5, height=5)
plot(ROC_test,time=1,col="green",title=FALSE,lwd=2)
plot(ROC_test,time=3,col="blue",add=TRUE,title=FALSE,lwd=2)
plot(ROC_test,time=5,col="red",add=TRUE,title=FALSE,lwd=2)
legend('bottomright',
c(paste0('AUC at 1 years: ',sprintf("%.03f",ROC_test$AUC[1])),
paste0('AUC at 3 years: ',sprintf("%.03f",ROC_test$AUC[2])),
paste0('AUC at 5 years: ',sprintf("%.03f",ROC_test$AUC[3]))),
col=c("green","blue","red"), lwd=2, bty = 'n')
dev.off()
}
})
这里为了方便演示,阈值设置为了0.4,因此输出了很多图片
同学们在实际操作中可以适当的提高阈值
代码如上所示
但,如果是比较大的矩阵,想要明确train和test的最佳比例
到底需要循环多少次???
这也是一个非常常见且棘手的问题
解决的方式也很简单,就是让代码不停地跑——无人值守
👇设置阈值范围,让代码自己跑#设置出图阈值
#【为了演示直观,所以阈值调到了0.3、0.4】
plotedges=c(0.3,0.4,0.5,0.6,0.65,0.9)#【设置阈值,建议多设几个阶梯,如果没跑过循环建议从0.5开始设,梯度尽量小】
#【输入你要研究的基因】
genes="CES1"
workspace=getwd()
{source("主代码_train.R",encoding = "UTF-8")
job::job(train={XXD_timeROC(datainput,plotedges,genes,workspace)})}
此处,同学们可以依照之前跑单次timeROC时候的经验进行调整。
如果一次都没跑过的话,可以从0.5开始设置一个阈值,随后以0.03左右为一个梯度进行增加
若得到结果,则会构建文件夹并储存图片,文件夹上则显示了关键的信息——阈值及train组的比例
若卡在了某个阈值,则代码会进行不断循环,直到AUC符合阈值便进行输出【循环到符合为止,无需手动重新设置循环】
此外,无人值守为后台运行代码,即使将Rstudio出现bug意外关闭,也不影响代码的运行,它会在后台完成它的使命。
同样的,由于代码运行于后台,因此不会像其它代码一般“霸占”Rstudio,同学们仍然可以进行其它分析。尽可能提高效率
利用随机提高timeROC的代码就给同学们分享到这
完整的随机代码如上所示
无人值守的代码可在下方付费获取哦
👇感谢同学们的关注与支持👇
可试读95%
微信扫一扫
关注该公众号