从分析的因素上看,有单因素分析和多因素分析。
生存分析的常用的单因素分析(描述生存过程)方法有乘积极限法(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