草庐IT

R语言与统计-6:生存分析和COX回归

Hayley笔记 2023-03-28 原文

R语言与统计-1:t检验与秩和检验
R语言与统计-2:方差分析
R语言与统计-3:卡方检验
R语言与统计-4:线性回归分析与模型诊断
R语言与统计-5:Logistic回归


更详细的可以参考之前分享的:
Kaplan-Meier生存分析的结果解读和绘制方法
TCGA生存模型的构建以及模型预测和评估

1. 生存分析

导入数据

library(coin)
data(glioma)
head(glioma)
#   no. age    sex histology group event time
# 1   1  41 Female    Grade3   RIT  TRUE   53
# 2   2  45 Female    Grade3   RIT FALSE   28
# 3   3  48   Male    Grade3   RIT FALSE   69
# 4   4  54   Male    Grade3   RIT FALSE   58
# 5   5  40 Female    Grade3   RIT FALSE   54
# 6   6  31   Male    Grade3   RIT  TRUE   25

生存分析

library(survival)
g3 <- subset(glioma,histology=='Grade3')
fit <- survfit(Surv(time,event)~group,data=g3)
plot(fit,lty = c(2,1),col = c(2,1))
legend('bottomright',legend = c('Control','Treatment'),lty=c(2,1),col=c(2,1))

进行logrank检验

survdiff(Surv(time,event)~group,data=g3)
# Call:
# survdiff(formula = Surv(time, event) ~ group, data = g3)

#                N Observed Expected (O-E)^2/E (O-E)^2/V
# group=Control  6        4     1.49      4.23      6.06
# group=RIT     11        2     4.51      1.40      6.06

#  Chisq= 6.1  on 1 degrees of freedom, p= 0.01 

也可以使用logrank_test()函数

logrank_test(Surv(time,event)~group,data=g3,distribution='exact')

#   Exact Two-Sample Logrank Test

# data:  Surv(time, event) by group (Control, RIT)
# Z = -2.1711, p-value = 0.02877
# alternative hypothesis: true theta is not equal to 1

考虑不同histology的情况

logrank_test(Surv(time,event)~group|histology,data=glioma,distribution=approximate(nresample=1000))

    Approximative Two-Sample Logrank Test

data:  Surv(time, event) by
     group (Control, RIT) 
     stratified by histology
Z = -3.6704, p-value = 0.001
alternative hypothesis: true theta is not equal to 1
2. Cox回归

COX回归模型,又称“比例风险回归模型 (proportional hazards model,简称Cox模型)”,是由英国统计学家D.R.Cox (1972)年提出的一种半参数回归模型。该模型以生存结局和生存时间为因变量,可同时分析众多因素对生存期的影响,能分析带有截尾生存时间的资料,且不要求估计资料的生存分布类型。

鉴于临床数据的特殊性,COX回归比起一般的多重线性回归Logistic回归在临床研究中具有更为广泛的应用。

COX回归与另外两者的共同点
(1) 分析目的:均可用于研究自变量影响程度,校正混杂因素以及作预测分析。
(2) 自变量类型:均可为连续型数值变量,或离散型分类变量,顺序变量。
(3) 自变量筛选:均可采用逐步回归方法筛选变量

COX回归与另外两者的相异点
(1) 因变量类型:COX回归因变量为生存资料(包含二分类结局变量和连续型生存时间变量),而多重线性回归因变量为数值型变量,Logistic回归因变量为分类或顺序型变量。
(2) 因变量数据分布:COX回归对于数据分布不作要求,而多重线性回归,Logistic回归则要求数据分布分别近似正态分布和二项分布。
(3) 模型参数解释:当自变量增大一个单位时,对于COX回归,改变了风险比HR的自然对数值。对于Logistic回归,改变了优势比OR的自然对数值。而对于多重线性回归,改变的即是Y值本身。
(4) 是否允许数据删失:COX回归允许删失值,而多重线性回归,Logistic回归不允许。

library(survival)
library(tableone)
data('GBSG2',package='TH.data')
head(GBSG2)
#   horTh age menostat tsize tgrade pnodes progrec estrec time cens
# 1    no  70     Post    21     II      3      48     66 1814    1
# 2   yes  56     Post    12     II      7      61     77 2018    1
# 3   yes  58     Post    35     II      9      52    271  712    1
# 4   yes  59     Post    17     II      4      60     29 1807    1
# 5    no  73     Post    35     II      1      26     65  772    1
# 6    no  32      Pre    57    III     24       0     13  448    1

plot(survfit(Surv(time,cens)~horTh,data = GBSG2),lty = c(2,1),col = c(2,1),mark.time = T)
legend('bottomright',legend = c('Control','Treatment'),lty=c(2,1),col=c(2,1))
coxreg <- coxph(Surv(time,cens)~.,data=GBSG2)
summary(coxreg)
#Tips:其中coef是估计得到的两个组之间的风险比的对数-ln(RR),因此真正的风险比是exp(coef),其实得到的就是RR(相对危险度)。最后三行是三种检验结果,在大样本的时候,这三种检验结果是一样,但是对于小样本也许会出现差别。
ShowRegTable(coxreg,digits= 2) #计算95%CI和置信区间 (上表的简化)
#              exp(coef) [confint] p     
# horThyes     0.71 [0.55, 0.91]    0.007
# age          0.99 [0.97, 1.01]    0.309
# menostatPost 1.29 [0.90, 1.86]    0.159
# tsize        1.01 [1.00, 1.02]    0.048
# tgrade.L     1.74 [1.20, 2.52]    0.004
# tgrade.Q     0.82 [0.64, 1.04]    0.099
# pnodes       1.05 [1.03, 1.07]   <0.001
# progrec      1.00 [1.00, 1.00]   <0.001
# estrec       1.00 [1.00, 1.00]    0.661

COX回归模型系数意义:
在COX回归模型中,取某一自变量系数为e的幂数,得到的值即为HR值。考虑HR值在临床研究中的实际意义,则当系数大于0(HR>1)时,该自变量为危险因素;当系数小于0(HR<1)时,该自变量为保护因素。

library(party)
tree <- ctree(Surv(time,cens)~.,data=GBSG2)
plot(tree)

有关R语言与统计-6:生存分析和COX回归的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  3. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  4. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  5. ruby - 如何保持我不常用的编程语言技能 - 2

    关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭11年前。Improvethisquestion我不经常使用ruby​​-通常它加起来相当于每两个月或更长时间编写一次脚本。我的大部分编程都是使用C++进行的,这与ruby​​有很大不同。由于我与ruby​​之间的差距如此之大,我总是忘记语言的基本方面(比如解析文本文件和其他简单的东西)。我想每天练习一些基本的东西,我想知道是否有一些我可以订阅的网站,并且会向我发送当天的Ruby问题或类似的东西。有人知道这样的站点/Internet服务吗?

  6. ruby-on-rails - 如果特定语言环境中缺少翻译,如何配置 i18n 以使用 en 语言环境? - 2

    如果特定语言环境中缺少翻译,如何配置i18n以使用en语言环境翻译?当前已插入翻译缺失消息。我正在使用RoR3.1。 最佳答案 找到相似的question这里是答案:#application.rb#railswillfallbacktoconfig.i18n.default_localetranslationconfig.i18n.fallbacks=true#railswillfallbacktoen,nomatterwhatissetasconfig.i18n.default_localeconfig.i18n.fallback

  7. ruby-on-rails - 如何通过 URL 更改语言环境? - 2

    在我的双语Rails4应用程序中,我有一个像这样的LocalesController:classLocalesController用户可以通过此表单更改其语言环境:deflocale_switcherform_tagurl_for(:controller=>'locales',:action=>'change_locale'),:method=>'get',:id=>'locale_switcher'doselect_tag'set_locale',options_for_select(LANGUAGES,I18n.locale.to_s)end这有效。但是,目前用户无法通过URL更改

  8. ruby - 一种语言如何被自身解释(如 Rubinius)? - 2

    我使用Ruby编程已经有一段时间了,现在只使用Ruby的标准MRI实现,但我一直对我经常听到的其他实现感到好奇。前几天我在读有关Rubinius的文章,这是一个用Ruby编写的Ruby解释器。我试着在不同的地方查找它,但我很难弄清楚这样的东西到底是如何工作的。我在编译器或语言编写方面从来没有太多经验,但我真的很想弄明白。一门语言究竟如何才能被自己解释?编译中是否有一个我不明白这有意义的基本步骤?有人可以像我是个白痴一样向我解释这个吗(因为无论如何这都不会太离谱) 最佳答案 它比你想象的要简单。Rubinius并非100%用Ruby编

  9. ruby-on-rails - ruby 真的是一种完全面向对象的语言吗? - 2

    Ruby是完全面向对象的语言。在ruby​​中,一切都是对象,因此属于某个类。例如5属于Objectclass1.9.3p194:001>5.class=>Fixnum1.9.3p194:002>5.class.superclass=>Integer1.9.3p194:003>5.class.superclass.superclass=>Numeric1.9.3p194:005>5.class.superclass.superclass.superclass=>Object1.9.3p194:006>5.class.superclass.superclass.superclass.su

  10. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

随机推荐