果子带你揭示基因与临床数据预测生存预后的关键秘密






果子带你揭示基因与临床数据预测生存预后的关键秘密

小果  生信果  2023-09-23 19:02:26

收录于话题

#生信实操

在生信分析的过程中,单因素、多因素COX回归分析常用来筛选与患者预后有关的因素,相信很多小伙伴对此并不陌生。

那么,如何在R中进行单因素、多因素COX回归分析?之前分享过绘制KM曲线,诺莫图展示COX结果,如何使用survminer包绘制Cox生存分析结果的森林图

这篇文章都会给你答案,小果接下来就给大家进行超详细的代码实操展示。

下面是示例样本的生存数据信息和临床数据文件


#install.packages('survival')library(survival)       #引用包############定义森林图函数#############定义了一个名为bioForest的函数,#该函数有三个参数:coxFile、forestFile和forestCol,这些参数可以在函数被调用时传递实际值。bioForest=function(coxFile=null, forestFile=null, forestCol=null){  #读取输入文件  rt <- read.table(coxFile, header=T, sep="t", check.names=F, row.names=1)  #用read.table函数从coxFile中读取数据,数据以Tab分隔,包含表头(header=T),  #第一列作为行名(row.names=1),并将数据保存到名为rt的数据框中。  gene <- rownames(rt)  #将rt中的行名(基因名称)保存到gene变量中。  hr <- sprintf("%.3f",rt$"HR")  #将rt数据框中"HR"列的值保留三位小数并保存到hr变量中。  hrLow  <- sprintf("%.3f",rt$"HR.95L")  hrHigh <- sprintf("%.3f",rt$"HR.95H")  Hazard.ratio <- paste0(hr,"(",hrLow,"-",hrHigh,")")  #使用paste0函数将"HR"、"HR.95L"和"HR.95H"列的值合并为一个字符串,  #形成风险比和置信区间的表示,保存到Hazard.ratio变量中。  pVal <- ifelse(rt$pvalue<0.001, "<0.001", sprintf("%.3f", rt$pvalue))  #用ifelse函数,如果rt数据框中的"pvalue"列小于0.001,  #则将pVal变量设置为"<0.001",否则将其设置为保留三位小数的字符串表示。  #输出图形pdf函数创建一个新的PDF绘图设备,指定输出文件名为forestFile  pdf(file=forestFile, width=6.5, height=4.5)  n <- nrow(rt)  nRow <- n+1  ylim <- c(1,nRow)  layout(matrix(c(1,2),nc=2),width=c(3,2.5))  #计算绘制图形所需的总行数,包括基因和每个基因对应的数据行。设置y轴的范围,从1到nRow。  #使用layout函数设置绘图的布局,将绘制分为两列,第一列宽度为3英寸,第二列宽度为2.5英寸。  #绘制森林图左边的临床信息  xlim = c(0,3)  par(mar=c(4,2.5,2,1))  #用par函数设置图形的绘图参数。mar参数用于设置边缘空白的大小,包含4个值,依次为下、左、上、右的边缘空白大小。  plot(1,xlim=xlim,ylim=ylim,type="n",axes=F,xlab="",ylab="")  text.cex=0.8  text(0,n:1,gene,adj=0,cex=text.cex)  text(1.5-0.5*0.2,n:1,pVal,adj=1,cex=text.cex);text(1.5-0.5*0.2,n+1,'pvalue',cex=text.cex,font=2,adj=1)  text(3.1,n:1,Hazard.ratio,adj=1,cex=text.cex);text(3.1,n+1,'Hazard ratio',cex=text.cex,font=2,adj=1)    #图中的坐标(1.5-0.50.2, n:1)处添加p-value的值,并通过adj=1参数将文本右对齐,cex=text.cex设置字体缩放。    #然后在坐标(1.5-0.50.2, n+1)处添加'pvalue'文本,并设置字体加粗。  #绘制右边的森林图  par(mar=c(4,1,2,1),mgp=c(2,0.5,0))  xlim = c(0,max(as.numeric(hrLow),as.numeric(hrHigh)))  plot(1,xlim=xlim,ylim=ylim,type="n",axes=F,ylab="",xaxs="i",xlab="Hazard ratio")  arrows(as.numeric(hrLow),n:1,as.numeric(hrHigh),n:1,angle=90,code=3,length=0.05,col="darkblue",lwd=3)  abline(v=1, col="black", lty=2, lwd=2)  boxcolor = ifelse(as.numeric(hr) > 1, forestCol, forestCol)  points(as.numeric(hr), n:1, pch = 15, col = boxcolor, cex=2)  axis(1)  dev.off()}############定义森林图函数############
#定义独立预后分析函数#定义了一个名为indep的函数,该函数有六个参数:expFile、cliFile、uniOutFile、multiOutFile、uniForest和multiForest,#这些参数可以在函数被调用时传递实际值。indep=function(expFile=null,cliFile=null,uniOutFile=null,multiOutFile=null,uniForest=null,multiForest=null){ exp=read.table(expFile, header=T, sep="t", check.names=F, row.names=1) #读取表达文件 cli=read.table(cliFile, header=T, sep="t", check.names=F, row.names=1) #读取临床文件 #用read.table函数从expFile中读取数据,数据以Tab分隔,包含表头(header=T), #第一列作为行名(row.names=1),并将数据保存到名为exp的数据框中。 #用read.table函数从cliFile中读取数据,数据以Tab分隔,包含表头(header=T), #第一列作为行名(row.names=1),并将数据保存到名为cli的数据框中。 #数据合并 sameSample=intersect(row.names(cli),row.names(exp)) #获取两个数据框cli和exp行名(样本名称)的交集,并保存到sameSample变量中。 exp=exp[sameSample,] cli=cli[sameSample,] rt=cbind(exp, cli)
#单因素独立预后分析 uniTab=data.frame() for(i in colnames(rt[,3:ncol(rt)])){ cox <- coxph(Surv(futime, fustat) ~ rt[,i], data = rt) #使用coxph函数进行Cox比例风险模型分析,其中Surv(futime, fustat)表示生存时间和事件发生情况, #rt[,i]表示当前循环的列作为预测因子,data=rt表示使用rt数据框。 coxSummary = summary(cox) uniTab=rbind(uniTab, cbind(id=i, HR=coxSummary$conf.int[,"exp(coef)"], HR.95L=coxSummary$conf.int[,"lower .95"], HR.95H=coxSummary$conf.int[,"upper .95"], pvalue=coxSummary$coefficients[,"Pr(>|z|)"]) ) } write.table(uniTab,file=uniOutFile,sep="t",row.names=F,quote=F) bioForest(coxFile=uniOutFile, forestFile=uniForest, forestCol="green")



#多因素独立预后分析  uniTab=uniTab[as.numeric(uniTab[,"pvalue"])<1,]  rt1=rt[,c("futime", "fustat", as.vector(uniTab[,"id"]))]  #从rt数据框中选择"futime"、"fustat"和uniTab数据框中的"pvalue"列对应的预测因子列,  #并将它们合并为一个新的数据框rt1。  multiCox=coxph(Surv(futime, fustat) ~ ., data = rt1)  multiCoxSum=summary(multiCox)  multiTab=data.frame()  multiTab=cbind(               HR=multiCoxSum$conf.int[,"exp(coef)"],               HR.95L=multiCoxSum$conf.int[,"lower .95"],               HR.95H=multiCoxSum$conf.int[,"upper .95"],               pvalue=multiCoxSum$coefficients[,"Pr(>|z|)"])  multiTab=cbind(id=row.names(multiTab),multiTab)  write.table(multiTab,file=multiOutFile,sep="t",row.names=F,quote=F)  bioForest(coxFile=multiOutFile, forestFile=multiForest, forestCol="red")}



小伙伴们,今天有没有学到新知识呢,想要继续了解R语言内容可以持续关注小果哦~或者也可以关注我们的官网也会持续更新的哦~

往期推荐

1.搭建生信分析流水线,如工厂一样24小时运转Snakemake——进阶命令
2.比blast还优秀的序列比对工具?HMMER来了
3.对单细胞分析毫无头绪?让popsicleR领你入门
4.小果带你绘制ROC曲线评估生存预测能力


点击“阅读原文”立刻拥有

↓↓↓