cox臨床預測模型構建

#單因素cox回歸用于篩選與預后相關的免疫基因

#文件要求熄云,帶有臨床生存與基因表達值的文件clinical+exp.txt

#生信課視頻上的代碼:不知道為什么就是運行不出來席函,于是我放棄了

library(survival)

pFilter=0.05

rt=read.table("clinical+exp.txt",header = T,sep="\t",check.names = F,row.names = 1)

outTab=data.frame()

sigGenes=c("funtime","funstat")

for (i in colnames(rt[,3:ncol(rt)])){

? ? cox<-coxph(Surv(funtime,funstat)~rt[,i],data = rt)

? ? coxSummary=summary(cox)

? ? coxP=coxSummary$coefficients[,"Pr(>|z|)"]

? ? ? ? ? if(coxP<pFilter){

? ? ? ? ? ? ? ? ? ? ? ? ? sigGenes=c(sigGenes,i)

? ? ? ? ? ? ? ? ? ? ? ? ? outTab=rbind(outTab,cbind(id=i,

? ? ? ? ? ? ? ? ? ? ? ? ? HR=coxSummary$conf.int[,"exp(coef)"],

? ? ? ? ? ? ? ? ? ? ? ? ? HRL=coxSummary$conf.int[,"lower .95"],

? ? ? ? ? ? ? ? ? ? ? ? ? HRH=coxSummary$conf.int[,"upper .95"],

? ? ? ? ? ? ? ? ? ? ? ? ? pValue=coxSummary$coefficients[,"Pr(>|z|)"]

? ? }

? ? ? }

#網友提供的方法

#需要多一個變量名的文件,是指差異表達的基因名仪芒,后來想想要不是有些搗亂的基因名炫贤,是不是用于做單因素分析的基因就是所需的covariates

rt=read.table("clinical_exp_gaibian.txt",header = T,sep="\t",check.names = F,row.names = 1)

covariates<-read.csv("names.csv")

covariates<-as.vector(covariates)

covariates

covariates=t(covariates)

time<-rt$funtime

time<-as.vector(time)

status<-rt$funstat

#有個小問題,就是變量命名里不能有-例如HLA-A有缆,會出現找不到HLA的錯誤,這里把這些帶-的都刪掉了

univ_formulas <- sapply(covariates,

? ? ? ? ? ? ? ? ? ? ? ? function(x) as.formula(paste('Surv(time, status)~', x)))

univ_models <- lapply( univ_formulas, function(x){coxph(x, data = rt)})

univ_results <- lapply(univ_models,

? ? ? ? ? ? ? ? ? ? ? ? function(x){

? ? ? ? ? ? ? ? ? ? ? ? x <- summary(x)

? ? ? ? ? ? ? ? ? ? ? ? p.value<-signif(x$wald["pvalue"])

? ? ? ? ? ? ? ? ? ? ? ? wald.test<-signif(x$wald["test"])

? ? ? ? ? ? ? ? ? ? ? ? beta<-signif(x$coef[1]);#coeficient beta

? ? ? ? ? ? ? ? ? ? ? ? HR <-signif(x$coef[2]);#exp(beta)#温亲,digits=2代表保留兩位有效數字

? ? ? ? ? ? ? ? ? ? ? ? #HR <-signif(x$coef[2],digits = 2);

? ? ? ? ? ? ? ? ? ? ? ? HR.confint.lower <- signif(x$conf.int[,"lower .95"])#,3,是3個有效數字

? ? ? ? ? ? ? ? ? ? ? ? HR.confint.upper <- signif(x$conf.int[,"upper .95"])

? ? ? ? ? ? ? ? ? ? ? ? HR <- paste0(HR, " (",

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? HR.confint.lower, "-", HR.confint.upper, ")")

? ? ? ? ? ? ? ? ? ? ? ? res<-c(beta, HR, wald.test, p.value)

? ? ? ? ? ? ? ? ? ? ? ? names(res)<-c("beta", "HR (95% CI for HR)", "wald.test",

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "p.value")

? ? ? ? ? ? ? ? ? ? ? ? return(res)

? ? ? ? ? ? ? ? ? ? ? ? #return(exp(cbind(coef(x),confint(x))))

? ? ? ? ? ? ? ? ? ? ? })

res <- t(as.data.frame(univ_results, check.names = FALSE))

as.data.frame(res)

write.csv(res,"cox_singel.csv")


#LSAAO回歸

#文件要求:與單因素回歸的文件格式相似

LASSO是為了避免過度擬合和刪除高度相關的基因

library(glmnet)

library(survival)

setwd("C:/Users/仙女/Documents/liver cancer/LASSO")

rt=read.table("Lasso.txt",header = T,sep="\t",check.names = F,row.names = 1)

rt$funtime[rt$funtime<=0]=0.003

#LASSO回歸中生存時間不能是0棚壁,否則會報錯

x=as.matrix(rt[,c(3:ncol(rt))])

y=data.matrix(Surv(rt$funtime,rt$funstat))

fit<-glmnet(x,y,family = "cox",maxit = 1000)

pdf(file = "lambda.pdf",onefile = FALSE)

plot(fit,xvar="lambda",label=TRUE)

dev.off

cvfit<-cv.glmnet(x,y,family="cox",maxit=1000)

#做交叉驗證并輸出圖形

pdf("cvfit.pdf",onefile = FALSE)

#onefile=FALSE很重要,因為如果沒有這個輸出圖應該在pdf的第二頁栈虚,前面有個空白的pdf頁

plot(cvfit)

abline(v=log(c(cvfit$lambda.min,cvfit$lambda.1se)),lty="dashed")

dev.off()

#maxit=1000是隨機模擬1000次袖外,這代表這次做完之后把腳本關閉重新再做得出的基因是不相同的

coef<-coef(fit,s=cvfit$lambda.min)

index<-which(coef !=0)

actCoef<-coef[index]

lassoGene=rownames(coef)[index]

lassoGene=c("funtime","funstat",lassoGene)

lassoSigExp=rt[,lassoGene]

lassoSigExp=cbind(id=row.names(lassoSigExp),lassoSigExp)

write.table(lassoSigExp,file = "lassoSigExp2.txt",sep="\t",row.names = F,quote=F)

#雖然我的lambda圖沒有做成


#多變量cox回歸及建模人群預測模型的構建

#文件要求:帶有生存數據的基因表達

setwd("C:/Users/仙女/Documents/liver cancer/multi_cox")

rt=read.table("lassoSigExp.txt",header = T,sep="\t",check.names = F,row.names = 1)

rt[,"funtime"]=rt[,"funtime"]/365

#這里生存時間要轉換成年

#使用建模數據構建模型

multiCox=coxph(Surv(funtime,funstat)~.,data = rt)

multiCox=step(multiCox,direction = "both")

multiCoxSum=summary(multiCox)

#輸出模型相關信息

outTab=data.frame()

outTab=cbind(

? coef=multiCoxSum$coefficients[,"coef"],

? 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|)"])

outTab=cbind(id=row.names(outTab),outTab)

write.table(outTab,file = "multiCox.xls",sep = "\t",row.names = F,quote=F)

#其實每運行一次產生的結果都不一樣,即使是相同的lassoSigExp文件

#結果顯示有的基因HR的p值并不小于0.05魂务,這也是可以的曼验,它可能跟別的基因互補一起預測生存

#輸出病人的風險值

riskScore=predict(multiCox,type = "risk",newdata = rt)

coxGene=row.names(multiCoxSum$coefficients)

coxGene=gsub("`","",coxGene)

outCol=c("funtime","funstat",coxGene)

risk=as.vector(ifelse(riskScore>median(riskScore),"high","low"))

write.table(cbind(id=row.names(cbind(rt[,outCol],riskScore,risk)),cbind(rt[,outCol],riskScore,risk)),

? ? ? ? ? ? file = "risk.txt",

? ? ? ? ? ? sep="\t",

? ? ? ? ? ? quote=F,

? ? ? ? ? ? row.names = F)

#可是沒有預測的具體公式,好像是summary(multiCox)的coef值


#模型驗證

#輸入驗證人群的風險文件

rtTest=read.table("test.txt",header = T,sep="\t",check.names = F,row.names = 1)

rtTest[,"funtime"]=rtTest[,"funtime"]/365

riskScoreTest=predict(multiCox,type = "risk",newdata = rtTest)

riskTest=as.vector(ifelse(riskScoreTest>medianTrainRisk,"high","low"))

write.table(cbind(id=rownames(cbind(rtTest[,outCol],riskScoreTest,riskTest)),cbind(rtTest[,outCol],riskScoreTest,riskTest)),

? ? ? ? ? ? ? ? ? file="riskTest.txt",

? ? ? ? ? ? ? ? ? sep="\t",

? ? ? ? ? ? ? ? ? quote=F,

? ? ? ? ? ? ? ? ? row.names=F)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末粘姜,一起剝皮案震驚了整個濱河市鬓照,隨后出現的幾起案子,更是在濱河造成了極大的恐慌孤紧,老刑警劉巖豺裆,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異号显,居然都是意外死亡臭猜,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門咙轩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來获讳,“玉大人,你說我怎么就攤上這事活喊。” “怎么了量愧?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵钾菊,是天一觀的道長。 經常有香客問我偎肃,道長煞烫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任累颂,我火速辦了婚禮滞详,結果婚禮上凛俱,老公的妹妹穿的比我還像新娘。我一直安慰自己料饥,他們只是感情好蒲犬,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岸啡,像睡著了一般原叮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巡蘸,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天奋隶,我揣著相機與錄音,去河邊找鬼悦荒。 笑死唯欣,一個胖子當著我的面吹牛,可吹牛的內容都是我干的搬味。 我是一名探鬼主播黍聂,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼身腻!你這毒婦竟也來了产还?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤嘀趟,失蹤者是張志新(化名)和其女友劉穎脐区,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體她按,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡牛隅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了酌泰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媒佣。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖陵刹,靈堂內的尸體忽然破棺而出默伍,到底是詐尸還是另有隱情,我是刑警寧澤衰琐,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布也糊,位于F島的核電站,受9級特大地震影響羡宙,放射性物質發(fā)生泄漏狸剃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一狗热、第九天 我趴在偏房一處隱蔽的房頂上張望钞馁。 院中可真熱鬧虑省,春花似錦、人聲如沸僧凰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽允悦。三九已至膝擂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隙弛,已是汗流浹背架馋。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留全闷,地道東北人叉寂。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像总珠,于是被迫代替她去往敵國和親屏鳍。 傳聞我的和親對象是個殘疾皇子梳虽,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容