python实现生存分析(Survival Analysis)

目录

一、生存分析

二、生存分析中涉及的基本概念

2.1 生存时间(survival time)

2.2 完全数据(complete data)

2.3 截尾数据(censored data)

2.4 中位生存期(median survival time)

三、Kaplan-Meier生存分析

四、python代码

4.1 数据展示

4.2 基本分析及绘图

4.3 结果图展示具体参考数据

​4.4 P值计算

五、【扩展】六大肿瘤临床试验终点(End Point)

5.1 OS(overall survival)

5.2 ORR(objective response rate)

5.3 PFS(progression-free survival)

5.4 TTP(time to progress)

5.5 DFS(disease-free survival)

5.6 TTF(time to treatment failure)

六、总结


一、生存分析

        在医学或者公共卫生研究中,慢性疾病的发生、发展、预后一般不适用于治愈率、病死率等指标来考核,因为其无法在短时间内明确判断预后情况,为此,只能对患者进行长期随访,统计一定时期后的生存或死亡情况以判断诊疗效果;这样的研究往往会产生带有结局的生存时间资料,英文是time-to-event资料。在分析方法上,需要采用生存分析方法。

        也就是说生存分析是将事件的结果(终点事件)和出现这一结果所经历的时间结合起来分析的一种统计分析方法。

参考网站:统计基本功:一文搞懂生存分析 - 知乎 (zhihu.com)

需要注意的是,生存分析考虑了每个观测出现某一结局的时间长短。

二、生存分析中涉及的基本概念

2.1 生存时间(survival time)

生存时间是指终点事件与起始事件之间的时间间隔。例如:服药到痊愈,化疗到缓解,缓解到复发都是起始事件到终点事件。

2.2 完全数据(complete data)

完全数据是从起点到死亡(死于所研究疾病)所经历的时间。

2.3 截尾数据(censored data)

截尾数据也成为删失数据,从七点到截尾点所经历的时间。

截尾原因:失访、死于其它疾病、观察结束时病人尚存活等。

2.4 中位生存期(median survival time)

中位生存期又称为半数生存期,表示恰好有50%的个体尚存活的时间。

中位生存期越长,表示疾病的预后越好。

可以参考生存分析的一些整理笔记_为你千千万万遍z的博客-CSDN博客_生存分析整理的笔记。

三、Kaplan-Meier生存分析

 KM是一种单因素生存分析,主要研究一个因素对于生存时间的影响。

参考网站:Kaplan-Meier生存分析的结果解读和绘制方法 - 简书 (jianshu.com)

四、python代码

4.1 数据展示

TCGA_miRNA_list_data.csv中的部分数据展示如下:

cancerOS.statusOS.timePFI.statusPFI.timeABCB7ABL1ACTL8ACTN1ADAMTS20AIMP1ANXA2ANXA5APPL1ARHGDIBARASF1B
TCGA.OR.A5J8ACC157915307.727512.31921.963812.36220.50029.953913.61914.11148.842112.46224.84639.3267
TCGA.OR.A5JFACC02015020158.715411.81370.47110.2134010.489112.793215.32819.11169.94152.39167.0048
TCGA.OR.A5JKACC01497014978.094410.819010.37111.717310.718112.153614.77579.341211.85593.1098.5439
TCGA.OR.A5JMACC15621727.364511.03180.51710.258209.465613.163613.263610.1977.77550.51710.4527
TCGA.OR.A5JSACC038311668.444611.5596011.83510.45429.770313.422412.591810.21018.38673.50589.7868
TCGA.OR.A5JTACC090709078.860511.15681.75229.36320.559510.338911.821614.36699.94689.79967.62658.2102
TCGA.OR.A5JWACC02202022029.159511.4993010.7717010.088312.991514.20249.61689.47016.45026.7905
TCGA.OR.A5JXACC095009508.295911.7674011.143409.747813.586414.98239.827210.63675.72495.8108
TCGA.OR.A5JYACC15521758.812910.454909.41010.53399.826611.059313.463710.042110.13170.922710.2351
TCGA.OR.A5JZACC082212479.086811.60108.648709.769612.446113.25710.470610.21837.48388.8595
TCGA.OR.A5K2ACC19941978.659511.31871.447610.085809.715213.198213.14939.487710.108509.5083
TCGA.OR.A5K4ACC01082010829.448211.40076.37157.767010.630810.353914.053410.48718.53666.863110.0056
TCGA.OR.A5K5ACC149811087.917111.1059010.3746010.375911.987214.65859.38868.721909.4401
TCGA.OR.A5KVACC03878111168.63610.89091.34639.4854010.337612.635311.9099.43648.14032.27997.0995
TCGA.OR.A5LBACC1120416119.41711.648010.51530.950510.413510.613914.34989.69539.10033.66187.2921
TCGA.OU.A5PIACC0117113518.805411.7289012.39590.650910.334611.467714.67259.53569.29496.65498.0372
TCGA.PK.A5HBACC0129312139.498112.37242.07311.6983010.021713.682512.79719.69879.87544.77949.8079
TCGA.4Z.AA7NBLCA11367013678.338411.1338012.157909.738713.723511.95149.96413.20537.11798.0355
TCGA.5N.A9KMBLCA153012768.20548.8837012.2982010.306110.73389.926810.469112.822.877.2103
TCGA.BL.A3JMBLCA120511118.619510.7479011.75581.792410.025312.089512.39510.87189.97791.24429.9155
TCGA.BT.A20OBLCA137013158.795811.03291.008112.65193.10179.848114.528713.298110.274112.93652.33499.5308
TCGA.BT.A2LDBLCA162315557.777110.1681011.759909.476816.055213.112810.00912.84771.80439.7329
TCGA.BT.A3PHBLCA114211427.802310.3221012.0565010.08313.75219.56110.384911.24682.27610.5126
TCGA.CF.A1HSBLCA038211338.565211.29262.197413.0882010.157314.617212.66239.949910.96562.197410.2776
TCGA.CF.A27CBLCA042504258.07979.4013011.6254010.509513.54397.5249.798112.74566.82128.7635
TCGA.CF.A3MFBLCA038303837.48399.873010.60809.900412.12149.19978.595112.27152.38918.8282
TCGA.CF.A3MHBLCA039803987.71379.52721.14111.326809.976514.778811.71979.035913.17943.95089.5042
TCGA.CF.A47SBLCA033303337.96869.9432011.2289010.210212.992110.11919.036812.52941.47717.2587
TCGA.CF.A47TBLCA138511397.727110.13172.81611.12834.009510.469912.728710.46039.044112.002309.6026
TCGA.CF.A47VBLCA037903797.45769.8486011.174309.613312.42210.85658.628312.71993.13229.002
TCGA.CF.A47XBLCA038403847.790811.2318010.20915.599910.491911.61088.289210.425811.36277.32356.2421
TCGA.CU.A72EBLCA141312569.060910.14531.15912.28956.180210.141216.299812.627410.274512.43345.98819.5979
TCGA.DK.A1AEBLCA049112117.438611.01332.942411.4543.63510.476914.379112.215110.85949.44746.981710.1378

4.2 基本分析及绘图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from lifelines import KaplanMeierFitter
ct = ['BLCA']
f = "hsa-miR-1275"
data_Dir = "./data/TCGA/TCGA_miRNA_list_data.csv"
# 读取csv文件
data = pd.read_csv(data_Dir)
print(data.columns)
# 获取只有cancer name为ct列表中癌症名的数据
data = data[data['cancer'].isin(ct)]
# 获取只有参与计算的列数据
data = data.loc[:, ['cancer', 'OS.status', 'OS.time', 'PFI.status', 'PFI.time', f]]
# 填充因子列的缺失值
data[f] = data[f].fillna(0)
# 删除f列为0值或者NA值的行数据
data = data[-data[f].isin([0])]
groups = data[f]
fig, ax = plt.subplots(figsize=(10, 8))
# 根据基因表达量的中位数进行分组
i1 = (groups > np.median(groups))
i2 = (groups < np.median(groups))
# 开始KM分析绘图
kmf1 = KaplanMeierFitter()
kmf1.fit(data['OS.time'][i1], data['OS.status'][i1], label='High expression')
a1 = kmf1.plot()
kmf1.fit(data['OS.time'][i2], data['OS.status'][i2], label='Low expression')
plt.xlim([0, 2000])
plt.xticks([0, 400, 800, 1200, 1600, 2000], fontsize=20)
plt.yticks([0.00, 0.25, 0.50, 0.75, 1.00], fontsize=20)
plt.xlabel('Time(days)', fontsize=30)
plt.ylabel("Overall survival", fontsize=30)
plt.legend(loc='best', frameon=False)
kmf1.plot(ax=a1)
plt.show()
plt.savefig(r"C:\Users\Admin\Desktop\km1.png")

结果图如下:

4.3 结果图展示具体参考数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from lifelines.plotting import add_at_risk_counts
from lifelines import KaplanMeierFitter
ct = ['BLCA']
f = "hsa-miR-1275"
data_Dir = "./data/TCGA/TCGA_miRNA_list_data.csv"
# 读取csv文件
data = pd.read_csv(data_Dir)
print(data.columns)
# 获取只有cancer name为ct列表中癌症名的数据
data = data[data['cancer'].isin(ct)]
# 获取只有参与计算的列数据
data = data.loc[:, ['cancer', 'OS.status', 'OS.time', 'PFI.status', 'PFI.time', f]]
# 填充因子列的缺失值
data[f] = data[f].fillna(0)
# 删除f列为0值或者NA值的行数据
data = data[-data[f].isin([0])]
groups = data[f]
# 根据基因表达量的中位数进行分组
i1 = (groups > np.median(groups))
i2 = (groups < np.median(groups))
# 开始KM分析绘图
fig,ax = plt.subplots(figsize=(12,12))
high=KaplanMeierFitter().fit(data['OS.time'][i1], data['OS.status'][i1], label='High expression')
ax = high.plot_survival_function(ax=ax)
low=KaplanMeierFitter().fit(data['OS.time'][i2], data['OS.status'][i2], label='Low expression')
ax = low.plot_survival_function(ax=ax)
plt.xlim([0, 2000])
plt.xticks([0, 400, 800, 1200, 1600, 2000], fontsize=20)
plt.yticks([0.00, 0.25, 0.50, 0.75, 1.00], fontsize=20)
plt.xlabel('Time(days)', fontsize=30)
plt.ylabel("Overall survival", fontsize=30)
plt.legend(loc='best')
add_at_risk_counts(high, low, ax=ax)
plt.tight_layout()
plt.show()
plt.savefig(r"C:\Users\Admin\Desktop\km1.png",dpi=500)

结果图展示如下:

 4.4 P值计算

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from lifelines.statistics import logrank_test
ct = ['BLCA']
f = "hsa-miR-1275"
data_Dir = "./data/TCGA/TCGA_miRNA_list_data.csv"
data = pd.read_csv(data_Dir)
print(data.columns)
data = data[data['cancer'].isin(ct)]
data = data.loc[:, ['cancer', 'OS.status', 'OS.time', 'PFI.status', 'PFI.time', f]]
data[f] = data[f].fillna(0)
data = data[-data[f].isin([0])]
groups = data[f]
i1 = (groups > np.median(groups))
i2 = (groups < np.median(groups))
result = logrank_test(data['OS.time'][i1],data['OS.time'][i2],  data['OS.status'][i1],data['OS.status'][i2])
result.print_summary()
print("P_value=",result.p_value)

结果图展示如下:

 更多相关代码可参考网站:python数据分析案例-利用生存分析Kaplan-Meier法与COX比例风险回归模型进行客户流失分析与剩余价值预测_吴下阿泽的博客-CSDN博客写的比较详细。

五、【扩展】六大肿瘤临床试验终点(End Point)

5.1 OS(overall survival)

总生存率:定义为从随机化开始至(因任何原因)死亡的时间。

5.2 ORR(objective response rate)

客观缓解率:定义为肿瘤体积缩小达到预先规定值并能维持最低时限要求的患者比例,为完全缓解和部分缓解比例之和。

5.3 PFS(progression-free survival)

无进展生存率:定义为从随机化开始到肿瘤发生(任何方面)进展或(因任何原因)死亡之间的时间。

5.4 TTP(time to progress)

疾病进展时间:定义为从随机化开始到肿瘤发生(任何方面)进展的时间。

5.5 DFS(disease-free survival)

无病生存期:定义为从随机化开始至疾病复发或(因任何原因)死亡之间的时间。

5.6 TTF(time to treatment failure)

治疗失败时间:定义为:由随机化开始至「退出试验」,退出原因可能是患者拒绝、疾病进展、患者死亡、不良事件等。

参考网址:

1.OS、PFS、DFS 有什么区别?一文搞懂 6 大肿瘤临床试验终点_圈子_医脉通 (medlive.cn)

2.OS/PFS/DFS/DSS各种生存指标傻傻分不清 - 简书 (jianshu.com)

六、总结

1.保存图片设置分辨率的参数为dpi。

2.设置字体大小的参数为fontsize。

3.做KM分析图展示单个具体数据的参数为at_risk_counts=True,也可以直接调用plot_survival_function()函数。

4.做KM分析图展示多个具体数据的参数为add_at_risk_counts()函数。

5.缺失值填充采用fillna函数。

6.上述代码中横坐标设置的是固定的值,所以如果数据过多会导致数据展示不完全,而数据过少又会导致曲线过于集中,也就是曲线长度太短而造成结果展示不太美观,所以横坐标可以通过分组类别的最大值和最小值进行设置。例如:

min_value = min(data[TIME]) - 5
max_value = max(data[TIME]) + 5
plt.xlim([min_value, max_value])
plt.xticks(np.linspace(min_value, max_value, 5), fontsize=23)
plt.yticks([0.00, 0.25, 0.50, 0.75, 1.00], fontsize=23)

  • 2
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值