1.作用
差异分析筛选出基因之后再进行生存分析以进一步筛选出目标基因。
准备工作:
1.我们得到差异基因的表达量后还需准备TCGA的临床数据文件。从TCGA数据库下载之后进行整理。
2.将临床数据和差异基因表达数据合并
2.代码
具体的实现代码,在源代码的基础上修改较多
#install.packages("survival")
library(tidyverse)
library(survival)
library(limma)
setwd("D:/生信代码复现/3.生存分析/3.生存分析") #💚💚💚💚💚💚💚💚💚💚工作目录(需修改)
expFile="diffGeneExp.txt" #❗❗❗❗❗❗❗❗❗❗❗❗这个文件就是差异基因表达的文件,但是很奇怪的是按照教程来弄,我们这个得到的文件的格式是excel的格式,而这里需要的是txt格式
cliFile="time.txt" #❗❗❗❗❗❗❗❗❗❗❗❗这个临床的生存时间分析暂时也是不知道从哪里弄出来的
rt2=read.table(expFile, header=T, check.names=F, row.names=1)
exp_data_T = rt2%>% dplyr::select(str_which(colnames(.), "-01A")) # 匹配列名或用下示写法
nT = ncol(exp_data_T)
#读取生存数据文件
cli=read.table(cliFile, header=T, sep="\t", check.names=F, row.names=1)
cli$futime=cli$futime/365
group1=sapply(strsplit(colnames(rt2),"\\-"), "[", 4)
group1=sapply(strsplit(group1,""), "[", 1)
group1=gsub("2", "1", group1)
conNum=length(group1[group1==1]) #正常组样品数目
treatNum=length(group1[group1==0]) #肿瘤组样品数目
Type=c(rep(1,conNum), rep(2,treatNum))
#删掉正常样品
tumorData=exp_data_T
tumorData=as.matrix(tumorData)
tumorData=t(tumorData)
rownames(tumorData)=gsub("(.*?)\\-(.*?)\\-(.*?)\\-.*", "\\1\\-\\2\\-\\3", rownames(tumorData))
data=avereps(tumorData)
#数据合并并输出结果
sameSample=intersect(row.names(data), row.names(cli))
data=data[sameSample,,drop=F]
cli=cli[sameSample,,drop=F]
rt2=cbind(cli, data)
#输出合并后的数据
outTab=cbind(ID=row.names(rt2), rt2)
outTab=outTab[,-ncol(outTab)]
#差异分析
pFilter=0.05 #显著性过滤条件
rt=outTab #读取输入文件 #如果以月为单位,除以30;以年为单位,除以365
outTab=data.frame()
sigGenes=c("futime","fustat")
for(gene in colnames(rt[,4:ncol(rt)]))
{
if(sd(rt[,gene])<0.1){
next}
a=rt[,gene]<=median(rt[,gene])
rt1=rt[a,]
b=setdiff(rownames(rt),rownames(rt1))
rt2=rt[b,]
surTab1=summary(survfit(Surv(futime, fustat) ~ 1, data = rt1))
surTab2=summary(survfit(Surv(futime, fustat) ~ 1, data = rt2))
survivalTab1=cbind(time=surTab1$time, surv=surTab1$surv,lower=surTab1$lower,upper=surTab1$upper)
survivalTab1=survivalTab1[survivalTab1[,"time"]<5,]
survivalTab2=cbind(time=surTab2$time, surv=surTab2$surv,lower=surTab2$lower,upper=surTab2$upper)
survivalTab2=survivalTab2[survivalTab2[,"time"]<5,]
fiveYearsDiff=abs(survivalTab1["surv"]-survivalTab2["surv"])
#km方法
diff=survdiff(Surv(futime, fustat) ~a,data = rt)
pValue=1-pchisq(diff$chisq,df=1)
fit=survfit(Surv(futime, fustat) ~ a, data = rt)
#cox方法
cox=coxph(Surv(futime, fustat) ~ rt[,gene], data = rt)
coxSummary = summary(cox)
coxP=coxSummary$coefficients[,"Pr(>|z|)"]
if(pValue<pFilter) {
sigGenes=c(sigGenes,gene)
outTab=rbind(outTab,
cbind(gene=gene,
KM=pValue,
HR=coxSummary$conf.int[,"exp(coef)"],
HR.95L=coxSummary$conf.int[,"lower .95"],
HR.95H=coxSummary$conf.int[,"upper .95"],
coxPvalue=coxP) )
}
}
write.table(outTab,file="survival.xls",sep="\t",row.names=F,quote=F) #输出基因和p值表格文件
surSigExp=rt[,sigGenes]
surSigExp=cbind(id=row.names(surSigExp),surSigExp)
write.table(surSigExp,file="surSigExp.txt",sep="\t",row.names=F,quote=F)
3.效果
文件夹的效果

R语言中的效果

4.遇到的问题
1.首先遇到的问题就是这个time.txt文件我就找不到,查阅了网站以后了解到了这个
如何获得time.txt文件

矩阵长度超过1,还有就是最后的生存分析出来的表格啥也没有
报错了,无法读取我的文件

问了人工智能
# 如果没有安装'survival'包,取消下一行代码的注释来安装它
#install.packages("survival")
library(tidyverse) # 加载'tidyverse'包,这是一组用于数据科学的R包的集合,包含数据操作、绘图等功能的包
library(survival) # 加载'survival'包,提供了生存分析的函数和模型
library(limma) # 加载'limma'包,它主要用于生物信息学领域的表达数据分析
# 设定工作目录,这一行代码被注释掉了,需要运行时根据实际路径取消注释并修改路径
#setwd("D:/生信代码复现/3.生存分析/3.生存分析") # 设置工作目录(需根据实际情况修改)
expFile="diffGeneExp.txt" # 指定差异基因表达数据文件的名称,注意需确保文件是文本格式,而不是Excel格式
cliFile="time.txt" # 指定临床生存时间数据文件的名称,这里先做一个占位,具体文件从哪里获取还不明确
# 使用read.table函数读取名为diffGeneExp.txt的表达数据文件
# header=T表示文件的第一行是列名,check.names=F意味着不检查变量名是否为合法的R变量名,row.names=1表示文件的第一列是行名
rt2=read.table(expFile, header=T, check.names=F, row.names=1)
结果我发现:
因为还没有弄清楚,所以打算对代码的含义进行深层次理解。
# install.packages("survival") # 如果未安装survival包,取消注释该行以安装
library(tidyverse) # 载入tidyverse包,用于数据整理和可视化
library(survival) # 载入survival包,用于生存分析
library(limma) # 载入limma包,用于生物信息学和统计学分析
setwd("D:/生信代码复现/3.生存分析/3.生存分析") # 设置工作目录,这里需要根据实际情况修改路径
expFile="diffGeneExp.txt" # 定义差异基因表达文件的路径,需要的格式是文本文件(txt)
cliFile="time.txt" # 定义临床生存时间分析数据文件的路径,来源暂时未知
rt2=read.table(expFile, header=T, check.names=F, row.names=1) # 读取差异基因表达数据
exp_data_T = rt2 %>% dplyr::select(str_which(colnames(.), "-01A")) # 选择包含"-01A"的列
nT = ncol(exp_data_T) # 计算所选列的数量
# 读取临床数据文件
cli=read.table(cliFile, header=T, sep="\t", check.names=F, row.names=1) # 读取临床数据
cli$futime=cli$futime/365 # 将临床数据中的随访时间从天转换为年
group1=sapply(strsplit(colnames(rt2), "\\-"), "[", 4) # 提取列名中的第四部分用于分组
group1=sapply(strsplit(group1, ""), "[", 1) # 进一步提取分组信息
group1=gsub("2", "1", group1) # 替换分组标识,将"2"替换为"1"
conNum=length(group1[group1==1]) # 计算正常组样本数量
treatNum=length(group1[group1==0]) # 计算肿瘤组样本数量
Type=c(rep(1,conNum), rep(2,treatNum)) # 创建一个向量记录正常组和肿瘤组的样本编号
# 去除正常样品数据
tumorData=exp_data_T # 将差异基因表达数据赋值给肿瘤数据变量
tumorData=as.matrix(tumorData) # 将数据框转换为矩阵
tumorData=t(tumorData) # 转置矩阵,使得行为样品,列为基因
rownames(tumorData)=gsub("(.*?)\\-(.*?)\\-(.*?)\\-.*", "\\1\\-\\2\\-\\3", rownames(tumorData)) # 将矩阵的行名进行格式化处理
data=avereps(tumorData) # 对矩阵中的肿瘤数据执行求均值操作(limma包中的函数)
# 合并数据并输出结果
sameSample=intersect(row.names(data), row.names(cli)) # 找出既在差异基因表达数据中也在临床数据中的样本
data=data[sameSample,,drop=F] # 选取这些共有样本的差异基因表达数据
cli=cli[sameSample,,drop=F] # 选取这些共有样本的临床数据
rt2=cbind(cli, data) # 将临床数据和差异基因表达数据合并
# 输出合并后的数据
outTab=cbind(ID=row.names(rt2), rt2) # 合并数据后在最前面增加一个“ID”列用于标记样本ID
outTab=outTab[,-ncol(outTab)] # 删除最后一个冗余的列
# 差异分析部分
pFilter=0.05 # 设定显著性水平的阈值为0.05
rt=outTab # 将之前合并好的表格数据赋值给rt变量
outTab=data.frame() # 创建一个新的空数据框,用于存放差异分析结果
sigGenes=c("futime","fustat") # 初始化一个向量,用于存放显著的基因名,包括生存时间和状态
# 遍历表格中所有的基因
for(gene in colnames(rt[,4:ncol(rt)])) {
if(sd(rt[,gene])<0.1) { # 如果基因的表达标准差小于0.1,则跳过这个基因
next
}
a=rt[,gene]<=median(rt[,gene]) # 创建一个逻辑向量,基因表达低于中位数的为TRUE
rt1=rt[a,] # 根据基因表达低于中位数的条件筛选数据
b=setdiff(rownames(rt), rownames(rt1)) # 找出不在rt1中的样本
rt2=rt[b,] # 根据上面找出的样本筛选数据
surTab1=summary(survfit(Surv(futime, fustat) ~ 1, data = rt1)) # 对表达水平低的组进行生存分析并获取摘要
surTab2=summary(survfit(Surv(futime, fustat) ~ 1, data = rt2)) # 对表达水平高的组进行生存分析并获取摘要
survivalTab1=cbind(time=surTab1$time, surv=surTab1$surv,lower=surTab1$lower,upper=surTab1$upper) # 将分析结果整合到一个表中
survivalTab1=survivalTab1[survivalTab1[, "time"]<5,] # 仅保留生存时间小于5年的数据
if(class(survivalTab1) == "matrix") {
survivalTab1=survivalTab1[nrow(survivalTab1),] # 确保结果是一个矩阵
}
survivalTab2=cbind(time=surTab2$time, surv=surTab2$surv,lower=surTab2$lower,upper=surTab2$upper)
survivalTab2=survivalTab2[survivalTab2[, "time"]<5,]
if(class(survivalTab2) == "matrix") {
survivalTab2=survivalTab2[nrow(survivalTab2),]
}
fiveYearsDiff=abs(survivalTab1["surv"]-survivalTab2["surv"]) # 计算两组之间在五年生存率上的差异
# 使用Kaplan-Meier方法进行差异测试
diff=survdiff(Surv(futime, fustat) ~ a, data = rt) # 进行生存差异性检验
pValue=1-pchisq(diff$chisq, df=1) # 计算卡方检验的p值
fit=survfit(Surv(futime, fustat) ~ a, data = rt) # 使用Kaplan-Meier估计生存曲线
# 使用Cox比例风险模型进行差异分析
cox=coxph(Surv(futime, fustat) ~ rt[,gene], data = rt) # 拟合Cox比例风险模型
coxSummary = summary(cox) # 获取Cox模型的摘要统计
coxP=coxSummary$coefficients[, "Pr(>|z|)"] # 提取Cox模型的p值
# 如果Kaplan-Meier方法和Cox模型的p值均小于阈值,且五年生存率差异大于0.15,则认为该基因的表达差异与生存时间有显著相关性
if((pValue < pFilter) & (coxP < pFilter) & (fiveYearsDiff > 0.15)) {
sigGenes=c(sigGenes, gene) # 将该基因添加到显著基因列表中
outTab=rbind(outTab, cbind(gene=gene, KM=pValue, HR=coxSummary$conf.int[, "exp(coef)"], HR.95L=coxSummary$conf.int[, "lower .95"], HR.95H=coxSummary$conf.int[, "upper .95"], coxPvalue=coxP)) # 将结果添加到输出表中
}
}
# 把最终的差异分析的结果写入一个Excel文件
write.table(outTab, file="survival.xls", sep="\t", row.names=F, quote=F)
# 把显著基因的表达数据和id一起写入文本文件
surSigExp=rt[,sigGenes]
surSigExp=cbind(id=row.names(surSigExp), surSigExp)
write.table(surSigExp, file="surSigExp.txt", sep="\t", row.names=F, quote=F)
最后问了原作者,发现需要将类似这种代码的删掉
if(class(survivalTab1) == "matrix") {
survivalTab1=survivalTab1[nrow(survivalTab1),] # 确保结果是一个矩阵
}
因为最新的R已经不需要这样的确认方式了。
最后的生存分析啥也没有
需要将if((pValue < pFilter) & (coxP < pFilter) & (fiveYearsDiff > 0.15))仅保留if((pValue < pFilter)