#---Figure2E-F Survival curves----- library("survival") library("survminer") clin_esti<-read.table("dat1.txt",header = T,sep="\t") fit <- survfit(Surv(futime,fustat) ~ group_stromal, data = clin_esti) #Figure2E ggsurvplot(fit, pval = TRUE, conf.int = TRUE, risk.table = TRUE, # Add risk table risk.table.col = "strata", # Change risk table color by groups linetype = "strata", # Change line type by groups surv.median.line = "hv", # Specify median survival ggtheme = theme_bw(), # Change ggplot2 theme palette = c("#E7B800", "#2E9FDF") ) print(fit)#display median survival time #Figure2F fit2 <- survfit(Surv(futime,fustat) ~ group_immune, data = clin_esti) ggsurvplot(fit2, pval = TRUE, conf.int = TRUE, risk.table = TRUE, # Add risk table risk.table.col = "strata", # Change risk table color by groups linetype = "strata", # Change line type by groups surv.median.line = "hv", # Specify median survival ggtheme = theme_bw(), # Change ggplot2 theme palette = c("#E7B800", "#2E9FDF") ) print(fit2)#display median survival time #---Differential gene analysis of High- and Low- immune score groups-- library("limma") library(pheatmap) fdrFilter=0.05#set fdr cut-off value logFCfilter=1#logFC FC=2 conNum=239 #High-immune score group samples treatNum=238#Low-immune score group samples grade=c(rep(1,conNum),rep(2,treatNum)) outTab=data.frame() #load data rt<-read.table("dat2.txt",sep="\t",header=T,check.names=F) group_list<-read.table("dat3.txt", sep="\t",header=T,check.names=F)#Group list #Sort by group list a<-as.vector(group_list$TCGA_id) colnames(rt)<-substring(colnames(rt),1,12) rt1<-rt[,a] rt1<-cbind(rt[,1],rt1) rt1=as.matrix(rt1) rownames(rt1)=rt1[,1] exp=rt1[,2:ncol(rt1)] dimnames=list(rownames(exp),colnames(exp)) data=matrix(as.numeric(as.matrix(exp)),nrow=nrow(exp),dimnames=dimnames) data=avereps(data) data=data[rowMeans(data)>0.5,] #DEGs analysis for(i in row.names(data)){ geneName=unlist(strsplit(i,"\\|",))[1] geneName=gsub("\\/", "_", geneName) rt=rbind(expression=data[i,],grade=grade) rt=as.matrix(t(rt)) wilcoxTest<-wilcox.test(expression ~ grade, data=rt) conGeneMeans=mean(data[i,1:conNum]) treatGeneMeans=mean(data[i,(conNum+1):ncol(data)]) logFC=log2(treatGeneMeans)-log2(conGeneMeans) pvalue=wilcoxTest$p.value conMed=median(data[i,1:conNum]) treatMed=median(data[i,(conNum+1):ncol(data)]) diffMed=treatMed-conMed if( ((logFC>0) & (diffMed>0)) | ((logFC<0) & (diffMed<0)) ){ outTab=rbind(outTab,cbind(gene=i,conMean=conGeneMeans,treatMean=treatGeneMeans,logFC=logFC,pValue=pvalue)) } } pValue=outTab[,"pValue"] fdr=p.adjust(as.numeric(as.vector(pValue)),method="fdr") outTab=cbind(outTab,fdr=fdr) #Output the differences of all genes write.table(outTab,file="all.xls",sep="\t",row.names=F,quote=F) #Output difference table outDiff=outTab[( abs(as.numeric(as.vector(outTab$logFC)))>logFCfilter & as.numeric(as.vector(outTab$fdr))logFCfilter) points(as.numeric(as.vector(diffSub$logFC)), -log10(diffSub$fdr), pch=20, col="red",cex=0.8) diffSub=subset(outTab, fdr|z|)"] if(coxP|z|)"]) ) } } write.table(outTab,file="tcgaUniCox.txt",sep="\t",row.names=F,quote=F) uniSigExp=rt[,sigGenes] uniSigExp=cbind(id=row.names(uniSigExp),uniSigExp) write.table(uniSigExp,file="tcgaUniSigExp.txt",sep="\t",row.names=F,quote=F) ######Drawing forest map###### rt <- read.table("tcgaUniCox.txt",header=T,sep="\t",row.names=1,check.names=F) gene <- rownames(rt) hr <- sprintf("%.3f",rt$"HR") hrLow <- sprintf("%.3f",rt$"HR.95L") hrHigh <- sprintf("%.3f",rt$"HR.95H") Hazard.ratio <- paste0(hr,"(",hrLow,"-",hrHigh,")") pVal <- ifelse(rt$pvalue<0.001, "<0.001", sprintf("%.3f", rt$pvalue)) #Output information pdf(file="forest.pdf", width = 6,height = 4.5) n <- nrow(rt) nRow <- n+1 ylim <- c(1,nRow) layout(matrix(c(1,2),nc=2),width=c(3,2)) #Drawing forest map Figure4A xlim = c(0,3) par(mar=c(4,2.5,2,1)) 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,n:1,Hazard.ratio,adj=1,cex=text.cex);text(3,n+1,'Hazard ratio',cex=text.cex,font=2,adj=1,) 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=2.5) abline(v=1,col="black",lty=2,lwd=2) boxcolor = ifelse(as.numeric(hr) > 1, 'red', 'green') points(as.numeric(hr), n:1, pch = 15, col = boxcolor, cex=1.3) axis(1) dev.off() #Lasso analysis library("glmnet") library("survival") rt=read.table("dat7.txt",header=T,sep="\t",row.names=1) rt$futime=rt$futime/365 #Building models x=as.matrix(rt[,c(3:ncol(rt))]) y=data.matrix(Surv(rt$futime,rt$fustat)) fit=glmnet(x, y, family = "cox", maxit = 1000)#construct model cvfit=cv.glmnet(x, y, family="cox", maxit = 1000)#Cross-validation; number of folds - default is 10 #Figure4B pdf("lambda.pdf") plot(fit, xvar = "lambda", label = TRUE) dev.off() #Figure4C pdf("cvfit.pdf") plot(cvfit) abline(v=log(c(cvfit$lambda.min,cvfit$lambda.1se)),lty="dashed") dev.off() #Output related gene coefficient coef=coef(fit, s = cvfit$lambda.min) index=which(coef != 0) actCoef=coef[index] lassoGene=row.names(coef)[index] geneCoef=cbind(Gene=lassoGene,Coef=actCoef) write.table(geneCoef,file="geneCoef.txt",sep="\t",quote=F,row.names=F) #Output risk score of train group trainFinalGeneExp=rt[,lassoGene] myFun=function(x){crossprod(as.numeric(x),actCoef)} trainScore=apply(trainFinalGeneExp,1,myFun) outCol=c("futime","fustat",lassoGene) risk=as.vector(ifelse(trainScore>median(trainScore),"high","low")) outTab=cbind(rt[,outCol],riskScore=as.vector(trainScore),risk) write.table(cbind(id=rownames(outTab),outTab),file="tcgaRisk.txt",sep="\t",quote=F,row.names=F) #Output risk score of test group rt=read.table("dat8.txt",header=T,sep="\t",row.names=1) rt[,3:ncol(rt)][rt[,3:ncol(rt)]<0]=0 rt$futime=rt$futime/365 testFinalGeneExp=rt[,lassoGene] testScore=apply(testFinalGeneExp,1,myFun) outCol=c("futime","fustat",lassoGene) risk=as.vector(ifelse(testScore>median(trainScore),"high","low")) outTab=cbind(rt[,outCol],riskScore=as.vector(testScore),risk) write.table(cbind(id=rownames(outTab),outTab),file="geoRisk.txt",sep="\t",quote=F,row.names=F) #---Risk curve and Survival state diagram--- library(pheatmap) bioRiskPlot=function(inputFile=null,riskScoreFile=null,survStatFile=null,heatmapFile=null){ rt=read.table(inputFile,sep="\t",header=T,row.names=1,check.names=F) rt=rt[order(rt$riskScore),] #Risk curve Figure5A & Figure6A (UP) riskClass=rt[,"risk"] lowLength=length(riskClass[riskClass=="low"]) highLength=length(riskClass[riskClass=="high"]) line=rt[,"riskScore"] line[line>10]=10 pdf(file=riskScoreFile,width = 10,height = 3.5) plot(line, type="p", pch=20, xlab="Patients (increasing risk socre)", ylab="Risk score", col=c(rep("green",lowLength),rep("red",highLength)) ) abline(h=median(rt$riskScore),v=lowLength,lty=2) legend("topleft", c("High risk", "low Risk"),bty="n",pch=19,col=c("red","green"),cex=1.2) dev.off() #Survival state diagram Figure5A & Figure6A (DOWN) color=as.vector(rt$fustat) color[color==1]="red" color[color==0]="green" pdf(file=survStatFile,width = 10,height = 3.5) plot(rt$futime, pch=19, xlab="Patients (increasing risk socre)", ylab="Survival time (years)", col=color) legend("topleft", c("Dead", "Alive"),bty="n",pch=19,col=c("red","green"),cex=1.2) abline(v=lowLength,lty=2) dev.off() #risk heatmap rt1=rt[c(3:(ncol(rt)-2))] rt1=t(scale(rt1)) rt1[rt1>=2]=2 rt1[rt1<=-2]=-2 annotation=data.frame(type=rt[,ncol(rt)]) rownames(annotation)=rownames(rt) pdf(file=heatmapFile,width = 10,height = 3.5) pheatmap(rt1, annotation=annotation, annotation_legend = T, cluster_cols = F, cluster_rows = T, fontsize_row=11, show_colnames = F, fontsize_col=3, color = colorRampPalette(c("blue", "white", "red"))(100)) dev.off() } bioRiskPlot(inputFile="dat10.txt",riskScoreFile="geo.riskScore.pdf",survStatFile="geo.survStat.pdf",heatmapFile="geo.heatmap.pdf") bioRiskPlot(inputFile="dat9.txt",riskScoreFile="tcga.riskScore.pdf",survStatFile="tcga.survStat.pdf",heatmapFile="tcga.heatmap.pdf") #---survival analysis----- library(survival) library("survminer") bioSurvival=function(inputFile=null,outFile=null){ rt=read.table(inputFile,header=T,sep="\t") diff=survdiff(Surv(futime, fustat) ~risk,data = rt) pValue=1-pchisq(diff$chisq,df=1) pValue=signif(pValue,4) pValue=format(pValue, scientific = TRUE) fit <- survfit(Surv(futime, fustat) ~ risk, data = rt) surPlot=ggsurvplot(fit, data=rt, conf.int=TRUE, pval=paste0("p=",pValue), pval.size=4, risk.table=TRUE, legend.labs=c("High risk", "Low risk"), legend.title="Risk", xlab="Time(years)", break.time.by = 1, risk.table.title="", palette=c("red", "blue"), risk.table.height=.25) pdf(file=outFile,onefile = FALSE,width = 6.5,height =5.5) print(surPlot) dev.off() } #Figure5C bioSurvival(inputFile="dat9.txt",outFile="tcgaRisk.pdf") #Figure6C bioSurvival(inputFile="dat10.txt",outFile="geoRisk.pdf") #---Independent prognostic analysis in train group--- library(survival) #load risk data risk=read.table("dat9.txt",header=T,sep="\t",check.names=F,row.names=1) #load clinical data cli=read.table("dat11.txt",sep="\t",check.names=F,header=T,row.names=1) sameSample=intersect(row.names(cli),row.names(risk)) risk=risk[sameSample,] cli=cli[sameSample,] rt=cbind(futime=risk[,1],fustat=risk[,2],cli,riskScore=risk[,(ncol(risk)-1)]) #Univariate independent prognostic analysis uniTab=data.frame() for(i in colnames(rt[,3:ncol(rt)])){ cox <- coxph(Surv(futime, fustat) ~ rt[,i], data = 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="tcga.uniCox.txt",sep="\t",row.names=F,quote=F) #Multivariate independent prognostic analysis multiCox=coxph(Surv(futime, fustat) ~ ., data = rt) 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="tcga.multiCox.txt",sep="\t",row.names=F,quote=F) ############Function of drawing forest graph############ bioForest=function(coxFile=null,forestFile=null,forestCol=null){ rt <- read.table(coxFile,header=T,sep="\t",row.names=1,check.names=F) gene <- rownames(rt) hr <- sprintf("%.3f",rt$"HR") hrLow <- sprintf("%.3f",rt$"HR.95L") hrHigh <- sprintf("%.3f",rt$"HR.95H") Hazard.ratio <- paste0(hr,"(",hrLow,"-",hrHigh,")") pVal <- ifelse(rt$pvalue<0.001, "<0.001", sprintf("%.3f", rt$pvalue)) #output graph pdf(file=forestFile, width = 6.3,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)) #output words xlim = c(0,3) par(mar=c(4,2.5,2,1)) 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,n:1,Hazard.ratio,adj=1,cex=text.cex);text(3,n+1,'Hazard ratio',cex=text.cex,font=2,adj=1,) #plot 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=2.5) 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=1.3) axis(1) dev.off() } ############forest graph############ #Figure 7A-B bioForest(coxFile="tcga.uniCox.txt",forestFile="tcga.uniForest.pdf",forestCol="green") bioForest(coxFile="tcga.multiCox.txt",forestFile="tcga.multiForest.pdf",forestCol="red") #---Independent prognostic analysis in test group--- risk=read.table("dat10.txt",header=T,sep="\t",check.names=F,row.names=1) cli=read.table("dat12.txt",sep="\t",check.names=F,header=T,row.names=1) sameSample=intersect(row.names(cli),row.names(risk)) risk=risk[sameSample,] cli=cli[sameSample,] rt=cbind(futime=risk[,1],fustat=risk[,2],cli,riskScore=risk[,(ncol(risk)-1)]) #Univariate independent prognostic analysis uniTab=data.frame() for(i in colnames(rt[,3:ncol(rt)])){ cox <- coxph(Surv(futime, fustat) ~ rt[,i], data = 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="geo.uniCox.txt",sep="\t",row.names=F,quote=F) #Multivariate independent prognostic analysis multiCox=coxph(Surv(futime, fustat) ~ ., data = rt) 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="geo.multiCox.txt",sep="\t",row.names=F,quote=F) bioForest=function(coxFile=null,forestFile=null,forestCol=null){ rt <- read.table(coxFile,header=T,sep="\t",row.names=1,check.names=F) gene <- rownames(rt) hr <- sprintf("%.3f",rt$"HR") hrLow <- sprintf("%.3f",rt$"HR.95L") hrHigh <- sprintf("%.3f",rt$"HR.95H") Hazard.ratio <- paste0(hr,"(",hrLow,"-",hrHigh,")") pVal <- ifelse(rt$pvalue<0.001, "<0.001", sprintf("%.3f", rt$pvalue)) pdf(file=forestFile, width = 6.3,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)) xlim = c(0,3) par(mar=c(4,2.5,2,1)) 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,n:1,Hazard.ratio,adj=1,cex=text.cex);text(3,n+1,'Hazard ratio',cex=text.cex,font=2,adj=1,) 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=2.5) 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=1.3) axis(1) dev.off() } ############forest graph############ #Figure 7D-E bioForest(coxFile="geo.uniCox.txt",forestFile="geo.uniForest.pdf",forestCol="green") bioForest(coxFile="geo.multiCox.txt",forestFile="geo.multiForest.pdf",forestCol="red") #---Plot ROC curves--- library(survivalROC) bioROC=function(riskFile=null,cliFile=null,outFile=null){ risk=read.table(riskFile,header=T,sep="\t",check.names=F,row.names=1) cli=read.table(cliFile,sep="\t",check.names=F,header=T,row.names=1) sameSample=intersect(row.names(cli),row.names(risk)) risk=risk[sameSample,] cli=cli[sameSample,] rt=cbind(futime=risk[,1],fustat=risk[,2],cli,riskScore=risk[,(ncol(risk)-1)]) rocCol=rainbow(ncol(rt)-2) aucText=c() #plot ROC curve of risk score pdf(file=outFile,width=6,height=6) par(oma=c(0.5,1,0,1),font.lab=1.5,font.axis=1.5) roc=survivalROC(Stime=rt$futime, status=rt$fustat, marker = rt$riskScore, predict.time =1, method="KM") plot(roc$FP, roc$TP, type="l", xlim=c(0,1), ylim=c(0,1),col=rocCol[1], xlab="False positive rate", ylab="True positive rate", lwd = 2, cex.main=1.3, cex.lab=1.2, cex.axis=1.2, font=1.2) aucText=c(aucText,paste0("risk score"," (AUC=",sprintf("%.3f",roc$AUC),")")) abline(0,1) #plot ROC curve of other clinical features j=1 for(i in colnames(rt[,3:(ncol(rt)-1)])){ roc=survivalROC(Stime=rt$futime, status=rt$fustat, marker = rt[,i], predict.time =1, method="KM") j=j+1 aucText=c(aucText,paste0(i," (AUC=",sprintf("%.3f",roc$AUC),")")) lines(roc$FP, roc$TP, type="l", xlim=c(0,1), ylim=c(0,1),col=rocCol[j],lwd = 2) } legend("bottomright", aucText,lwd=2,bty="n",col=rocCol) dev.off() } #Figure 7C and Figure 7F bioROC(riskFile="dat9.txt",cliFile="dat11.txt",outFile="tcgaROC.pdf") bioROC(riskFile="dat10.txt",cliFile="dat12.txt",outFile="geoROC.pdf") #---Plot Nomogram--- library(rms) library(survival) riskFile="dat9.txt" cliFile="dat13.txt" outFile="tcga.Nomogram.pdf" risk=read.table(riskFile,header=T,sep="\t",check.names=F,row.names=1) cli=read.table(cliFile,sep="\t",check.names=F,header=T,row.names=1) sameSample=intersect(row.names(cli),row.names(risk)) risk=risk[sameSample,] cli=cli[sameSample,] rt=cbind(futime=risk[,1],fustat=risk[,2],cli,riskScore=risk[,(ncol(risk)-1)]) rt$age<-factor(rt$age,labels=c("<=65",">65")) #packed data dd <- datadist(rt) options(datadist="dd") #Generating function f <- cph(Surv(futime, fustat) ~ age+gender+stage+`T`+N+M+riskScore, x=T, y=T, surv=T, data=rt,time.inc=1) surv <- Survival(f) #3 years and 5years nom <- nomogram(f, fun=list(function(x) surv(3, x), function(x) surv(5, x)), lp=F, funlabel=c("3-year survival", "5-year survival"), maxscale=100, fun.at=c(0.99, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3,0.2,0.1,0.05)) #Figure 9A pdf(file=outFile,height=7.5,width=11) plot(nom) dev.off() #C-index coxpe <- predict(f) c_index=1-rcorr.cens(coxpe,Surv(rt$futime,rt$fustat)) c_index #---plot calibrate curves--- riskFile="dat9.txt" cliFile="dat13.txt" risk=read.table(riskFile,header=T,sep="\t",check.names=F,row.names=1) cli=read.table(cliFile,sep="\t",check.names=F,header=T,row.names=1) sameSample=intersect(row.names(cli),row.names(risk)) risk=risk[sameSample,] cli=cli[sameSample,] rt=cbind(futime=risk[,1],fustat=risk[,2],cli,riskScore=risk[,(ncol(risk)-1)]) rt$age<-factor(rt$age,labels=c("<=65",">65")) rt$futime=rt$futime*365 #packed data dd <- datadist(rt) options(datadist="dd") #plot 3-year calibrate curve f <- cph(Surv(futime, fustat) ~ age+gender+stage+`T`+N+M+riskScore, x=T, y=T, surv=T, data=rt, time.inc=1*3*365) cal <- calibrate(f, cmethod='KM', method="boot", u=3*365, m=111, B=333) #igure 9B pdf("calibrate5.pdf",12,8) par(mar = c(10,5,3,2),cex = 1.0) plot(cal,lwd=3,lty=2,errbar.col="black",xlim = c(0,1),ylim = c(0,1),xlab ="Nomogram Predicted Survival",ylab="Actual Survival",col="blue") lines(cal,c('mean.predicted','KM'),type = 'a',lwd = 3,col ="black" ,pch = 16) mtext("") box(lwd = 1) abline(0,1,lty = 3,lwd = 3,col = "black") dev.off() ## plot 5-year calibrate curve f2 <- cph(Surv(futime, fustat) ~ age+gender+stage+`T`+N+M+riskScore, x=T, y=T, surv=T, data=rt, time.inc=5*365) cal2 <- calibrate(f2, cmethod='KM', method="boot", u=5*365, m=111, B=333) #Figure 9C pdf("calibrate6.pdf",12,8) par(mar = c(10,5,3,2),cex = 1.0) plot(cal2,lwd=3,lty=2,errbar.col="black",xlim = c(0,1),ylim = c(0,1),xlab ="Nomogram Predicted Survival",ylab="Actual Survival",col="blue") lines(cal2,c('mean.predicted','KM'),type = 'a',lwd = 3,col ="black" ,pch = 16) mtext("") box(lwd = 1) abline(0,1,lty = 3,lwd = 3,col = "black") dev.off()