果子带你揭示基因与临床数据预测生存预后的关键秘密
收录于话题
在生信分析的过程中,单因素、多因素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语言内容可以持续关注小果哦~或者也可以关注我们的官网也会持续更新的哦~
往期推荐
点击“阅读原文”立刻拥有
↓↓↓