首页 > 其他分享 >TCGA代码分析流程 - 3.2 生存分析

TCGA代码分析流程 - 3.2 生存分析

时间:2023-02-02 00:44:05浏览次数:36  
标签:分析 log 生存 TCGA rank meta 3.2 data

从分析的因素上看,有单因素分析和多因素分析。

生存分析的常用的单因素分析(描述生存过程)方法有乘积极限法(Kaplan-Meier分析)和寿命表法(Life Tables),常用的多因素生存分析(分析生存过程的影响因素)方法有Cox比例风险回归模型

从采取的分析方法上看,生存分析有非参数法:如Wilcoxon法、Log-rank法(对数秩检验),参数法:如Weibull回归、lognormal回归等,和半参数分析:Cox回归。

 

在简单生存分析中,由于仅考虑单个影响因素(且为分类型或顺序型变量),故采取的是直接绘制生存曲线并作Log-Rank检验来判断影响因素和生存概率的方法。
而在COX回归分析中,需要同时考虑多个影响因素(可为分类/顺序型变量,也可为数值型变量),故而绘制生存曲线的方式显然不合适,此时就需通过建模的方法来进一步分析。

 

描述性统计分析:Kaplan-Meier分析:非参数估计,不要求总体的分布形式,直观地表现出两组或多组的生存率或死亡率,适合在文章中展示。
统计推断:组间比较:log-rank检验,两组之间生存率的差异是否显著。


 单因素生存分析绘图  KM-Plot  Kaplan-Meier analysis

rm(list = ls())
library(survival)
library(survminer)
setwd("D:/BioInformationAnalyze/TCGAdata/CRC")
load("TCGA-COAD_04.lncRNA_SurvData.Rdata") # 生存分析输入数据,包含tpm形式的表达矩阵和临床信息

年龄

sfit <- survfit(Surv(time, event) ~ age_group, data = meta)
              # Surv()函数创建生存数据对象(主要输入生存时间和状态逻辑值)
      # survfit()函数对生存数据对象拟合生存函数,创建KM(Kaplan-Meier)生存曲线
                   # time表示总生存期
                         # event表示终点时间(月),1死亡,0存活。
                                # ~age_group表示以年龄分组绘图,注意此方法仅适用二分类变量进行分组。如果不想分组,只看总体,~1即可
# 如果想看整体的sfit结果,可以summary(sfit) 或 summary(sfit)$table,
# 想看每个时间点的更好的方式则是:surv_summary(sfit):
                               # time:曲线上的时间点。
                               # n.risk:时间t时面临风险的受试者数量.
                               # n.event:在时间t发生的事件数。
                               # n.censor:在时间t时退出风险集且没有事件的受审查对象的数量。
                               # surv:生存概率的估计。
                               # std.err:生存的标准误差。
                               # upper:置信区间的上限。
                               # lower:置信区间的下限。
                               # strata:表示生存曲线的分层。如果分层不为 NULL,则结果中存在多条曲线。分层(因子)的水平是曲线的标签。
# 根据上述sfit结果,我们可以将KM生存数据进行可视化,主要使用Survminer包的ggsurvplot()函数:
ggsurvplot(sfit, conf.int = FALSE, pval = TRUE)
# 通过设置参数,可在生存曲线基础上,再绘制两张辅助图:
ggsurvplot(sfit, 
           palette = c("#E7B800", "#2E9FDF"),
           pval = TRUE, conf.int = TRUE,  # 显示p值和置信区间
           xlab = "Time in months",  # x轴标签
           linetype = "strata", # 线条类型
         # fun = "event", # 绘制cumulative events图,即事件发生累计概率图
           ggtheme = theme_light(), # 更改 ggplot2 主题
           surv.median.line = "hv", # 指定中位生存期
           risk.table = TRUE, # Number at risk图,表示在该生存时间长度内,还存活的case;较直接得反映出两组的一个差异情况。
         # risk.table.col = "strata", # 按分组改变risk table的颜色
           ncensor.plot = TRUE) # Number of censoring图,即该时间段内的删失值。

性别、年龄

sfit1 = survfit(Surv(time, event) ~ gender, data = meta)
sfit2 = survfit(Surv(time, event) ~ age_group, data = meta)
splots <- list()
splots[[1]] <- ggsurvplot(sfit1, pval = TRUE, data = meta, risk.table = TRUE)
splots[[2]] <- ggsurvplot(sfit2, pval = TRUE, data = meta, risk.table = TRUE)
arrange_ggsurvplots(splots, print = TRUE, ncol = 2, nrow = 1, risk.table.height = 0.4) # 内置拼图函数

单个基因

设定某一基因的表达基准,将临床样本分为高表达high与低表达low两组,再进行生存分析。这里用表达矩阵的tpm值进行计算。

g = rownames(exprSet)[2] # 挑选基因,可修改成自己感兴趣的基因
meta$gene = ifelse(as.integer(exprSet[g,]) > median(as.integer(exprSet[g,])), "high", "low")
sfit1 = survfit(Surv(time, event) ~ gene, data = meta)
ggsurvplot(sfit1, pval = TRUE, data = meta, risk.table = TRUE)

 多个基因

gs = rownames(exprSet)[1:4] # 挑选基因,可修改成自己感兴趣的基因
splots <- lapply(gs, function(g){
  meta$gene = ifelse(as.integer(exprSet[g,]) > median(as.integer(exprSet[g,])), "high", "low")
  sfit1 = survfit(Surv(time, event) ~ gene, data = meta)
  ggsurvplot(sfit1, pval = TRUE, data = meta, risk.table = TRUE)
}) 
arrange_ggsurvplots(splots, print = TRUE,  
                    ncol = 2, nrow = 2, risk.table.height = 0.4) # 内置拼图函数


log-rank批量生存分析

Log-Rank test:对不同组的生存率进行假设检验,是无参数检验,近似于卡方检验,零假设是组间没有差异。
用apply()函数批量计算所有表达矩阵中基因的生存分析p值,从而挑选出“显著基因”。这里用表达矩阵的tpm值进行计算

mySurv = with(meta, Surv(time, event))
log_rank_p <- apply(exprSet, 1, function(gene){
  # gene = exprSet[1,]
  meta$group = ifelse(gene > median(gene), "high", "low") 
  data.survdiff = survdiff(mySurv ~ group, data = meta)
    # survdiff()用于检验两条或多条生存曲线之间是否存在差异,
      # 或者针对已知替代项检验单条曲线,也适用于分组资料以及多组间生存曲线的比较;
  p.val = 1 - pchisq(data.survdiff$chisq, length(data.survdiff$n) - 1) # 计算log-rank检验的p值
  return(p.val)
})
log_rank_p = sort(log_rank_p) # 取出每一个基因生存分析的P值,形成表
table(log_rank_p < 0.01) # 哪些是P<0.01的
table(log_rank_p < 0.05) # 哪些是P<0.05的

KM曲线的优势:可以直接从图中看出组间差异。
KM曲线的局限性:1.无法得知暴露因素对结局的影响是非暴露组多少倍;2.没有控制其他变量。
要解决以上局限性,需引入Cox比例风险回归模型,进行多变量Cox回归分析,得到风险差异的具体估计值HR。

标签:分析,log,生存,TCGA,rank,meta,3.2,data
From: https://www.cnblogs.com/xiaogaobugao/p/17083612.html

相关文章