使用R中的循环执行多个生存分析

时间:2015-06-01 03:32:12

标签: r loops survival-analysis

我最近用R进行生存分析。我有两个数据框,geneDf用于基因表达,survDf用于随访。如下例:

#Data frame:geneID  
geneID=c("EGFR","Her2","E2F1","PTEN")
patient1=c(12,23,56,23)
patient2=c(23,34,11,6)
patient3=c(56,44,32,45)
patient4=c(23,64,45,23)
geneDf=data.frame(patient1,patient2,patient3,patient4,geneID)
> geneDf
  patient1 patient2 patient3 patient4 geneID
1       12       23       56       23   EGFR
2       23       34       44       64   Her2
3       56       11       32       45   E2F1
4       23        6       45       23   PTEN
#Data frame:survDf
ID=c("patient1","patient2","patient3","patient4")
time=c(23,7,34,56)
status=c(1,0,1,1)
survDf=data.frame(ID,time,status)
#    
> survDf
        ID time status
1 patient1   23      1
2 patient1    7      0
3 patient1   34      1
4 patient1   56      1

我从geneDf中提取特定基因的表达数据,并使用其表达的中值作为截止值,通过“生存”包进行生存分析,并通过survdiff获得p值。在下面的代码中,我使用“EGFR”基因作为例子。

#extract expression of a certain gene
targetGene<-subset(geneDf,grepl("EGFR",geneDf$geneID))
targetGene$geneID<-NULL
#Transpose the table and adjust its format
targetGene<-t(targetGene[,1:ncol(targetGene)])
targetGene<-data.frame(as.factor(rownames(targetGene)),targetGene)
colnames(targetGene)<-c("ID","Expression")
rownames(targetGene)<-NULL
targetGene$Expression1<-targetGene$Expression
 targetGene$Expression1[ targetGene$Expression<median( targetGene$Expression)]<-1
targetGene$Expression1[ targetGene$Expression>=median( targetGene$Expression)]<-2
#Survival analysis
library(survival)
##Add survival object
survDf$SurvObj<-with(survDf, Surv(time,status==1))
## Kaplan-Meier estimator for stage
km<-survfit(SurvObj~targetGene$Expression1, data=survDf, conf.type = "log-log")
sdf<-survdiff(Surv(time, status) ~targetGene$Expression1, data=survDf)
#gain p value
p.val <-1-pchisq(sdf$chisq, length(sdf$n) - 1)
> p.val
[1] 0.1572992

我可以通过不同的基因一个接一个地做到这一点。但问题是:有超过10,000个基因需要分析。我想获得它们的所有p值并将它们放到一个新的数据帧中。我需要使用循环还是申请?

1 个答案:

答案 0 :(得分:-1)

这是一个丑陋的scritp但工作。

在Data10中,在第一列中您需要有时间,在第二列中您需要时间和下一个您想要的任何治疗。(患者作为rownames)

loopsurff<-function(Data10){combos<-
rbind.data.frame(rep(1,ncol(Data10)- 2),
rep(2,ncol(Data10)-2),rep(3:(ncol(Data10)-2),1))
combos<-as.matrix(sapply(combos, as.numeric));library(plyr);
library(survival) 
vv<-adply(combos, 2, function(x) {
fit <-survdiff(Surv(Data10[,1], Data10[,2]) ~ Data10[, x[3]],data=Data10)
p<-1 - pchisq(fit$chisq, 1)
out <- data.frame("var1"=colnames(Data10)[x[3]],"p.value" =   
as.numeric(sprintf("%.3f", p)))
return(out)  
})
}`

您将获得一个数据框,其中包含您的数据[,3:ncol(您的数据)]的列名称以及每个数据的p值。