生信喵 发表于 2024-12-24 10:03:36

TCGA 生存分析理论+实战

<h1>一、生存分析的基本概念</h1>
<ol>
<li>生存时间:从规定的观察起点至事件终点出现所经历的时间长度。</li>
<li>生存数据:① 完全数据:准确的生存时间;② 删失数据/截尾数据:由于某种原因无法观察到事件终点出现的数据。</li>
</ol>
<p>删失数据的原因包括:1)研究结束时终点事件未发生;2)失访;3)研究对象因其他原因死亡或无法耐受而终止观察。</p>
<p><img src="https://roim-picx-bpc.pages.dev/rest/aC9xslK.png" alt="" /></p>
<p>如上图所示:1号和5号 观察期间内患者死亡,为完全数据;<br />
2号在观察结束后死亡、3号失访、4号始终未观察到终点事件,这3个数据为删失数据。</p>
<h1>二、 生存分析的常用指标</h1>
<ol>
<li>中位生存期(Median survival time):50%个体存活的时间。</li>
<li>生存函数(Survival function):某时刻观察对象仍然存活的概率,与时间相关,又称积累生存率。</li>
<li>风险函数(Hazard function) :某时刻观察对象的瞬时死亡率。</li>
</ol>
<h1>三、Kaplan-Meier 生存曲线</h1>
<p>Kaplan-Meier法,即计算的是上述概念所提到的积累生存率,是一种单因素生存分析方法,可用于研究1个因素对于生存时间的影响。<br />
<img src="https://roim-picx-bpc.pages.dev/rest/xICrulK.png" alt="" /><br />
<img src="https://roim-picx-bpc.pages.dev/rest/5q7rulK.png" alt="" /><br />
如上图所示:</p>
<p>曲线上的“+”表示删失数据;</p>
<p>曲线越高、下降越平缓表示生存率越高或预后越好;</p>
<p>曲线越低、下降越陡峭表示生存率越低或预后不佳;</p>
<p>蓝色圈表示中位生存期,肿瘤直径&gt;5cm组中位生存期约23月,≤2cm组约45月;</p>
<h1>四、生存率的比较</h1>
<ol>
<li>单因素分析方法检验</li>
</ol>
<p>非参数检验方法使用较为广泛,主要包括log-rank检验和Breslow检验,二者都属于卡方检验。</p>
<p>log-rank检验给组间死亡的远期差别更大,即log-rank方法对远期差异敏感。</p>
<p>Breslow检验给组间死亡的近期差别更大,即Breslow方法对近期差异敏感。</p>
<p>当生存曲线有交叉时,提示具有混杂因素的影响,这两种检验方法不适用。此时可以考虑R语言TSHRC包的Two-Stage方法进行检验,可以同时计算Kaplan-Meier和log-rank test的p值。</p>
<ol start="2">
<li>多因素Cox回归模型检验</li>
</ol>
<p>(1)cox回归模型的基本表达式:<br />
<img src="https://roim-picx-bpc.pages.dev/rest/1KXrulK.png" alt="3.png" /><br />
h(t)即风险函数,指在t时刻观察对象的瞬时死亡率;</p>
<p>X1<del>m是自变量,β1</del>m是对应X的回归系数;</p>
<p>因此风险函数展示了多个自变量X对因变量h(t)的影响。</p>
<p>回归系数 β 与 HR (Hazard Ratio) 有对应关系,经过对数转换,自变量X取特殊值:X=0表示未暴露组,X=1表示暴露组,风险函数可以改写为<br />
<img src="https://roim-picx-bpc.pages.dev/rest/ltcSulK.png" alt="4.png" /><br />
(2)风险比(HR, Hazard Ratio)</p>
<p>【举例】分析乳腺癌术后复发时间与是否化疗有关。X=0表示患者未接受化疗,X=1表示患者接受化疗,经过分析X的回归系数β= -0.38。故HR如下:<br />
<img src="https://roim-picx-bpc.pages.dev/rest/9aJSulK.png" alt="5.png" /><br />
提示接受化疗的乳癌术后患者复发的风险为不接受化疗患者的0.68倍。</p>
<h1>五、生存曲线绘制及假设检验</h1>
<p>前文所述,对生存分析的基本概念和方法有了基本的认识,现在可以结合之前整理的tcga临床数据来进行生存曲线的绘制。</p>
<p>生存曲线绘制的代码如下:</p>
<pre><code>rm(list = ls())####魔幻操作,一键清空~
getwd()
setwd('C:/Users/Administrator/project_gdc2')
# 加载包,准备绘制KM生存曲线
library(survival)
library(survminer)
library(dplyr)
library(ggplot2)
options(datatable.fread.datatable=FALSE)#保证fread返回数据框
df &lt;- fread('./RawData/03.LIHC_clin.txt')
class(df)
colnames(df)

# 对患者进行分组
a &lt;- select(df,c(&quot;month&quot;,&quot;Race&quot;,&quot;Gender&quot;,&quot;Status&quot;,&quot;Stage&quot;,&quot;Age&quot;,&quot;OS&quot;)) # 提取分析需要的列

# survdata = Surv(time = month, event = Status =='Dead') # 存储生存数据
a$Age &lt;- factor(cut(a$Age,breaks=c(-Inf,median(a$Age),Inf),
                  labels = c(&quot;Young&quot;,&quot;Old&quot;))) # 按中位年龄对患者进行分层
sfit &lt;- survfit(Surv(time = month, event = Status == 'Dead') ~ Age, data = a)
sfit

# 进行假设检验
# 两组间的检验可以使用survdiff函数
data.survdiff &lt;- survdiff(Surv(time = month, event = Status =='Dead') ~ Age,data = a)
data.survdiff

# 计算P值
p.val = 1 - pchisq(data.survdiff$chisq, length(data.survdiff$n) - 1)
p.val

# 分组多可以使用pairwise_survdiff函数进行两两检验
# data.survdiff2 &lt;- pairwise_survdiff(Surv(month,Status)~Race,data = a)
# data.survdiff2
# data.survdiff2$p.value
</code></pre>
<p>绘制简单的生存曲线:</p>
<pre><code>plot1 &lt;- ggsurvplot(sfit, data = a)
plot1
</code></pre>
<p><img src="https://roim-picx-bpc.pages.dev/rest/R3vUulK.png" alt="6.png" /><br />
优化生存曲线,添加p值:</p>
<pre><code>plot2 &lt;- ggsurvplot(sfit,
         data = a,
         pval = T)
plot2
</code></pre>
<p><img src="https://roim-picx-bpc.pages.dev/rest/i3YUulK.png" alt="7.png" /><br />
可以看到按中位年龄分组,两组的生存率没有明显的统计学差异,p=0.26</p>
<p>进一步优化生存曲线,添加95%置信区间、风险表等,让图更加美观!</p>
<pre><code>plot3 &lt;- ggsurvplot(sfit, # 创建的拟合对象
         data = a,# 指定变量数据来源
         conf.int = TRUE, # 显示置信区间
         pval = TRUE, # 添加P值
         surv.median.line = &quot;hv&quot;,# 添加中位生存时间线
         risk.table = TRUE, # 添加风险表
         risk.table.height=.25,
         xlab = &quot;Time in months&quot;,
         ylab = &quot;Overall Survival Probability&quot;,
         legend = c(0.8,0.75), # 指定图例位置
         legend.title = &quot;Age&quot;, # 设置图例标题“Age”
         legend.labs = c(&quot;Young&quot;,&quot;Old&quot;), # 指定图例分组标签
         break.x.by = 20,# 设置x轴刻度间距
         palette = &quot;hue&quot;)# 默认为hue,可以自定义调色板 &quot;grey&quot;,&quot;npg&quot;,&quot;aaas&quot;,&quot;lancet&quot;,&quot;jco&quot;, &quot;ucscgb&quot;,&quot;uchicago&quot;,&quot;simpsons&quot;和&quot;rickandmorty&quot;
plot3
</code></pre>
<p><img src="https://roim-picx-bpc.pages.dev/rest/iPYUulK.png" alt="8.png" /><br />
还可以添加总生存曲线:</p>
<pre><code>plot4 &lt;- ggsurvplot(sfit, # 创建的拟合对象
         data = a,# 指定变量数据来源
         conf.int = TRUE, # 显示置信区间
         pval = TRUE, # 添加P值
         surv.median.line = &quot;hv&quot;,# 添加中位生存时间线
         risk.table = TRUE, # 添加风险表
         risk.table.height=.25,
         xlab = &quot;Time in months&quot;,
         ylab = &quot;Overall Survival Probability&quot;,
         legend = c(0.8,0.75), # 指定图例位置
         legend.title = &quot;Age&quot;, # 设置图例标题为“Age”
         legend.labs = c(&quot;All&quot;,&quot;Young&quot;,&quot;Old&quot;), # 指定图例分组标签
         break.x.by = 20,# 设置x轴刻度间距
         palette = &quot;hue&quot;,# 默认为hue,可以自定义调色板 &quot;grey&quot;,&quot;npg&quot;,&quot;aaas&quot;,&quot;lancet&quot;,&quot;jco&quot;, &quot;ucscgb&quot;,&quot;uchicago&quot;,&quot;simpsons&quot;和&quot;rickandmorty&quot;
         add.all = TRUE) # 添加总患者生存曲线
plot4
</code></pre>
<p><img src="https://roim-picx-bpc.pages.dev/rest/xsEuulK.png" alt="9.png" /></p>
<h1>六、Cox回归分析</h1>
<p>接下来我们利用cox模型计算HR</p>
<pre><code>### cox回归分析计算HR
b &lt;- select(df,c(&quot;month&quot;,&quot;Race&quot;,&quot;Gender&quot;,&quot;Status&quot;,&quot;Stage&quot;,&quot;Age&quot;,&quot;OS&quot;))
res.cox &lt;- coxph(Surv(time = month, event = Status == 'Dead') ~ Age, data = b)
coxSummary &lt;- summary(res.cox)
coxSummary
</code></pre>
<p>结果:</p>
<pre><code>&gt; coxSummary
Call:
coxph(formula = Surv(time = month, event = Status == &quot;Dead&quot;) ~
    Age, data = b)

n= 422, number of events= 164

      coef exp(coef) se(coef)   z Pr(&gt;|z|)
Age 0.0089391.008979 0.006062 1.475   0.14

    exp(coef) exp(-coef) lower .95 upper .95
Age   1.009   0.9911    0.9971   1.021

Concordance= 0.524(se = 0.026 )
Likelihood ratio test= 2.25on 1 df,   p=0.1
Wald test            = 2.17on 1 df,   p=0.1
Score (logrank) test = 2.18on 1 df,   p=0.1
</code></pre>
<p>cox分析结果:HR=1.009(1.003-1.015),似然比检验和Wald检验p均大于0.05。</p>
页: [1]
查看完整版本: TCGA 生存分析理论+实战