楼主: 菊花冰糖水
6603 2

[学习分享] R 语言 生存分析简介及流程 [推广有奖]

  • 2关注
  • 3粉丝

硕士生

67%

还不是VIP/贵宾

-

威望
0
论坛币
2985 个
通用积分
261.6401
学术水平
14 点
热心指数
22 点
信用等级
8 点
经验
6600 点
帖子
128
精华
0
在线时间
207 小时
注册时间
2015-7-25
最后登录
2025-3-23

楼主
菊花冰糖水 发表于 2018-4-4 09:49:53 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
下文均转译自 R-blogger 文章,自译分享。


另一种方法?

目前流行各种各样的预测模型和方法,为什么我们还需要生存分析这样的方法呢?首先,作为统计学流行的一个分支,生存分析可以在一段连续的时间进行预测。 当其他各类分析预测的方法和模型用来预测事件是否会出现时,生存分析可以用来预测在某一个时间点上事件是否会出现。所以,它需要时间的维度来完成对事件在某一时间发生概率的预测。 有的人觉得生存分析适用的领域在生物医疗科学,比如预测细菌或者细胞的生长死亡期望时间等,但是其实很多其他领域也用生存分析来预测,比如机械的寿命或者维护期限等。



How hard does it get …

直接套用生存分析的方法并不可取也并不会带来好处。 在使用生存分析之前,我们需要明白怎么使用它,为什么使用它。 比如有 Kaplan-Meier Curves, 通过 survival trees 或者 suvival forests 来建立Survival Function。

接下来我们从 R 中一步一步学习一下,如何建立一个有效的生存分析。使用的生存分析工具包为 survival

  1. # install.packages("survival")
  2. # Loading the package
  3. library("survival")
复制代码

工具包中包括了一个用来使用的数据集。数据集中记录了10年中424位在 Mayo clinic 治疗的患有原发性胆汁性胆管炎的患者的数据。值得注意的是,424位患者中,312人参加了药物D-青霉胺的试验,其余112人希望保守治疗并且进行记录并追踪,但未参加药物试验。 这112例中有6例失踪。我们对数据集中的’时间’和’状态’特征特别感兴趣。 时间表示注册后的天数和最终状态(可以被删减censored,肝脏移植或死亡)间的时间。 有关数据集的更多详细信息可以从命令中读取。
  1. #Dataset description
  2. ?pbc
复制代码
首先,我们建立新的 Surv()函数并且传入 surfit()方法中。 Surv()函数将获取时间和状态参数并从中创建一个生存对象。survfit()函数接受一个生存对象(Surv()产生的对象)并创建生存曲线。
  1. #Fitting the survival model
  2. survival_func=survfit(Surv(pbc$time,pbc$status == 2)~1)
  3. survival_func
复制代码
该函数为我们提供了值的数量,状态中的正数,中位时间和95%置信区间值。 该模型也可以绘制。
  1. #Plot the survival model
  2. plot(survival_func)
复制代码
屏幕快照 2018-04-03 09.51.31.png
正如预期的那样,该图向我们展示了随着时间的流逝,生存率的下降的概率。 虚线是上下置信区间。 在的survfit()函数中,我们将公式表示为~1,这表明我们要求函数仅根据生存对象来拟合模型。 输出和置信区间实际上是Kaplan-Meier估计值。 这一估计在医学研究生存分析中很突出。 Kaplan – Meier估计值是根据治疗后存活一段时间的总人数的患者人数(每位患者为一组数据)得出的。 我们可以用公式表示Kaplan – Meier函数:
  1. Ŝ(t)=∏(1-di/ni) for all i where ti≤t
  2. Here, di the number of events and ni is the total number of people at risk at time ti
复制代码

What to make of the graph?

与其他使用测试样本并对其进行预测的机器学习技术不同,生存分析曲线是一个自我解释的曲线。从曲线上看,处理后约1000天存活的可能性大约为0.8或80%。我们可以类似地定义治疗后不同天数的生存概率。同时,我们也有置信区间范围,表示预期误差的幅度。例如,在存活1000天的情况下,上置信区间达到约0.85或85%,并下降到约0.75或75%。数据范围大约为10年或大约3500天,概率计算非常模糊,所以并不应该被接受。例如,如果想知道治疗后存活4500天的可能性,那么尽管上面的Kaplan – Meier图显示的范围在0.25到0.55之间,这本身就是一个很大的值以适应缺乏数据,但数据仍然不是足够充分,应该使用更好的数据来做出这样的估计。


替代模型:Cox比例危险模型

工具包中还包含了cox比例风险函数coxph(),并使用数据中的其他特征来创建更好的生存模型。 虽然数据没有处理缺失值,但我这里将跳过数据处理环节并直接拟合模型。 但是在具体的实践中,研究者需要研究数据并选择如何恰当地处理数据,以便最佳模型得到拟合。 由于本文的目的是让读者熟悉函数而不是处理函数,所以我跳过处理环节来应用函数。


  1. Fit Cox Model
  2. Cox_model = coxph(Surv(pbc$time,pbc$status==2) ~.,data=pbc)
  3. summary(Cox_model)
复制代码
Call:
coxph(formula = Surv(pbc$time, pbc$status == 2) ~ ., data = pbc)

  n= 276, number of events= 111
   (142 observations deleted due to missingness)

                coef    exp(coef)       se(coef)        z   Pr(>|z|)   
id              -2.729e-03      9.973e-01   1.462e-03   -1.866  0.06203 .
trt             -1.116e-01      8.944e-01   2.156e-01   -0.518  0.60476   
age         3.191e-02   1.032e+00   1.200e-02   2.659   0.00784 **
sexf            -3.822e-01      6.824e-01   3.074e-01   -1.243  0.21378   
ascites     6.321e-02   1.065e+00   3.874e-01   0.163   0.87038   
hepato      6.257e-02   1.065e+00   2.521e-01   0.248   0.80397   
spiders     7.594e-02   1.079e+00   2.448e-01   0.310   0.75635   
edema       8.860e-01   2.425e+00   4.078e-01   2.173   0.02980 *
bili            8.038e-02   1.084e+00   2.539e-02   3.166   0.00155 **
chol        5.151e-04   1.001e+00   4.409e-04   1.168   0.24272   
albumin     -8.511e-01      4.270e-01   3.114e-01   -2.733  0.00627 **
copper      2.612e-03   1.003e+00   1.148e-03   2.275   0.02290 *
alk.phos    -2.623e-05      1.000e+00   4.206e-05   -0.624  0.53288   
ast         4.239e-03   1.004e+00   1.941e-03   2.184   0.02894 *
trig            -1.228e-03      9.988e-01   1.334e-03   -0.920  0.35741   
platelet    7.272e-04   1.001e+00   1.177e-03   0.618   0.53660   
protime     1.895e-01   1.209e+00   1.128e-01   1.680   0.09289 .
stage       4.468e-01   1.563e+00   1.784e-01   2.504   0.01226 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                exp(coef)   exp(-coef)  lower .95   upper .95
id              0.9973      1.0027      0.9944      1.000
trt             0.8944      1.1181      0.5862      1.365
age             1.0324      0.9686      1.0084      1.057
sexf            0.6824      1.4655      0.3736      1.246
ascites         1.0653      0.9387      0.4985      2.276
hepato          1.0646      0.9393      0.6495      1.745
spiders         1.0789      0.9269      0.6678      1.743
edema           2.4253      0.4123      1.0907      5.393
bili            1.0837      0.9228      1.0311      1.139
chol            1.0005      0.9995      0.9997      1.001
albumin     0.4270      2.3422      0.2319      0.786
copper          1.0026      0.9974      1.0004      1.005
alk.phos        1.0000      1.0000      0.9999      1.000
ast             1.0042      0.9958      1.0004      1.008
trig            0.9988      1.0012      0.9962      1.001
platelet        1.0007      0.9993      0.9984      1.003
protime         1.2086      0.8274      0.9690      1.508
stage           1.5634      0.6397      1.1020      2.218

Concordance= 0.849  (se = 0.031 )
Rsquare= 0.462   (max possible= 0.981 )
Likelihood ratio test= 171.3  on 18 df,   p=0
Wald test            = 172.5  on 18 df,   p=0
Score (logrank) test = 286.1  on 18 df,   p=0


Cox模型输出与线性回归输出相似。 R2只有46%不高,我们没有任何高度重要的特征。 最重要的特征似乎是年龄,胆红素(白细胞)和白蛋白。 让我们看看结果是怎样的。


  1. #Create a survival curve from the cox model
  2. Cox_curve <- survfit(Cox_model)
  3. plot(Cox_curve)
复制代码
屏幕快照 2018-04-03 10.02.35.png 随着更多的数据,我们得到一个不同的图像,且波动更大一些。 与Kaplan – Meier曲线相比,初始值的cox-plot曲线更高,而最高值更低。 这种差异的主要原因是在cox模型中包含的变量。 这些图是由类似的功能制作的,可以用与卡普兰 – 迈耶曲线相同的方式来解释。


预测:使用生存森林

随机森林也可用于生存分析,R中的ranger包提供了功能。 然而,ranger功能不能处理缺失的值,所以我将使用一个较小的数据,所有行的NA值被删除。 这会将我的数据减少到只有276个观测值。

  1. #Using the Ranger package for survival analysis
  2. Install.packages("ranger")
  3. library(ranger)
复制代码


屏幕快照 2018-04-03 10.14.00.png
让我们看一下随机森林重要性的结果:
  1. #Get the variable importance
  2. data.frame(sort(ranger_model$variable.importance,decreasing = TRUE))
  3. sort.ranger_model.variable.importance..decreasing...TRUE.
复制代码


Lessons learned: Conclusion

虽然Survival软件包的Kaplan-Meier估计,Cox模型和ranger模型的输入数据都不同,但我们会使用ggplot将它们绘制在同一图上来比较这些方法。


  1. #Comparing models
  2. library(ggplot2)
  3. #Kaplan-Meier curve dataframe
  4. #Add a row of model name
  5. km <- rep("Kaplan Meier", length(survival_func$time))
  6. #Create a dataframe
  7. km_df <- data.frame(survival_func$time,survival_func$surv,km)
  8. #Rename the columns so they are same for all dataframes
  9. names(km_df) <- c("Time","Surv","Model")
  10. #Cox model curve dataframe
  11. #Add a row of model name
  12. cox <- rep("Cox",length(Cox_curve$time))
  13. #Create a dataframe
  14. cox_df <- data.frame(Cox_curve$time,Cox_curve$surv,cox)
  15. #Rename the columns so they are same for all dataframes
  16. names(cox_df) <- c("Time","Surv","Model")
复制代码

屏幕快照 2018-04-03 10.18.07.png

我们在这里看到,考克斯模型是最具数据量和最大特征波动性的模型。处理过的数据点和处理缺失值的更好数据可能会使我们获得更好的R2和更稳定的曲线。生存与幸存对象有关,因此与机器学习完全不同,它与事件发生有关。了解这种技术对使用更多方法帮助我们解决问题非常重要,因为在这种情况下涉及时间的维度。希望本文能够为您提供生存分析的一瞥以及R中可用的,功能丰富的软件包。

——————————————————————————————————

Author Bio:

This article was contributed by Perceptive Analytics. Madhur Modi, Chaitanya Sagar, Vishnu Reddy and Saneesh Veetil contributed to this article.

Perceptive Analytics provides data analytics, data visualization, business intelligence and reporting services to e-commerce, retail, healthcare and pharmaceutical industries. Our client roster includes Fortune 500 and NYSE listed companies in the USA and India.


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


已有 1 人评分论坛币 学术水平 热心指数 收起 理由
cheetahfly + 20 + 1 + 1 精彩帖子

总评分: 论坛币 + 20  学术水平 + 1  热心指数 + 1   查看全部评分

沙发
line_us 发表于 2018-4-4 16:51:58
支持分享

藤椅
yangming98 发表于 2018-4-6 21:48:15 来自手机
菊花冰糖水 发表于 2018-4-4 09:49
下文均转译自 R-blogger 文章,自译分享。


好的好的好的好的好的

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 12:39