R语言机器学习与临床预测模型52--生存分析预测模型中的单因素分析和多因素分析

本内容为【科研私家菜】R语言机器学习与临床预测模型系列课程

你想要的R语言学习资料都在这里, 快来收藏关注【科研私家菜】


01 生存分析

生存分析是指对某给定事件发生的时间进行分析和推断,研究生存时间和结局与预后因子间的关系及其程度大小的方法,是一种处理删失数据的数据分析方法,也称生存率分析或存活率分析。

患者数据进行生存分析从而实现对预后和预后因子的分析,需要通过随访提前对临床数据和预后生存信息进行收集。随访通常需要数年时间对每一个随访对象进行数据采集。在随访中,关注的事件指研究中规定的生存研究的终点,在研究开始之前就已确定。根据研究目的的不同,关注的事件可以是患者死亡、疾病复发和疾病转移等。生存时间是指从某一起点到事件发生所经过的时间。生存是一个广义的概念,不仅仅指医学中的存活,也可以是疾病复发前的无病生存时间等。删失指由于关注的事件没有被观测到或者无法观测到,从而使真实生存时间无法获得的情况。删失通常由两种原因导致:(1)失访;(2)研究结束时,关注的事件尚未发生。因此,生存分析的因变量需要用生存时间和结局状态两个变量来刻画,将终点事件是否发生以及发生终点事件所经历的时间相结合。

  # log-rank 方法 
        data.survdiff <- survdiff(Surv(futime, fustat) ~ Group, data = sur_TCGA_LUAD)
        p.val = 1 - pchisq(data.survdiff$chisq, length(data.survdiff$n) - 1)
        HR = (data.survdiff$obs[2]/data.survdiff$exp[2])/(data.survdiff$obs[1]/data.survdiff$exp[1])
        up95 = exp(log(HR) + qnorm(0.975)*sqrt(1/data.survdiff$exp[2]+1/data.survdiff$exp[1]))
        low95 = exp(log(HR) - qnorm(0.975)*sqrt(1/data.survdiff$exp[2]+1/data.survdiff$exp[1]))
   
        # cox 方法
        coxmodul <- coxph(Surv(futime, fustat) ~ Group, data = sur_TCGA_LUAD)
        # m=coxph(mySurv ~ group, data =  survival_dat)
        beta <- coef(coxmodul)
        se <- sqrt(diag(vcov(coxmodul)))
        HR_c <- exp(beta)
        HRse <- HR_c * se

02 Cox 回归方法

1)COX回归模型,又称“比例风险回归模型(proportional hazards model,简称Cox模型)”。该模型以生存结局和生存时间为因变量,可同时分析众多因素对生存期的影响,能分析带有截尾生存时间的资料,且不要求估计资料的生存分布类型。

2)原理:

假如要研究一个人从出生开始,到t时刻时死亡的概率为多大。那么它会受什么影响呢?直观的来看:

一方面,它会受时间推移的影响。一个健康的人,随着年纪的增大,他死亡的概率也会不可避免的越来越大;

另一方面,它会受一些客观因素影响,比如,一个吸烟的人在某一时刻t死亡的概率,比一个不抽烟的同龄人概率会更大;再比如,一个富豪,每年都花大价钱为自己养生、雇佣营养师为自己控制饮食起居,那么他可能就比我这个穷屌丝死亡的概率更小。

综上所述,我们抽象出了两部分的因素,一部分受时间的影响,你可以理解为是理想情况下、不受任何外界影响下的死亡的概率、是一个基准;另一部分受客观因素的影响,这些因素会影响整体的概率,使得它在基准上增加或减少。

生存分析的主要目的在于研究变量X与观察结果即生存函数(累积生存率)S(t,X)之间的关系。当S受很多因素影响,即X为向量时,传统的方法是考虑回归方程——即诸变量X 对S 的影响。但由于生存分析研究中的数据包含删失数据。且时间变量t通常不满足正态分布和方差齐性的要求,这就造成了用一般的回归方法研究上述关系的困难。

3)计算:D.R.Cox提出了Cox比例风险回归模型,它不是直接考察S 与X的关系,而是用h(t,X) 作为因变量,模型的基本形式为:



4)RR:接着,就能求出相对危险度RR:


5)Cox回归要求满足比例风险假定(proportional-hazards assumption)的前提条件。所谓比例风险假定,就是假定风险比(HR,Hazard Ratio)不随时间t变化而变化,就是等比例。另外,样本含量不易过小。

library(survival)
library("survminer")
require("survival")
library(plyr)

load("data/TCGA_LUAD_suri_exp_tumor.Rda")
View(TCGA_LUAD_suri_exp_tumor[1:100,1:100])

UniCox <- function(x){
  Group <- ifelse(coxd[,x]>= median(coxd[,x]),"High","Low")
  coxd$Group <- ifelse(coxd[,x]>= median(coxd[,x]),"High","Low")
  # Group <- factor(coxd$Group,levels = c("Low","High"))
  
  # fit_os <- survfit(Surv(OS..months., OS.censor) ~ CCT3_Group, data = sdata)
  # BaSurv <- Surv(time=sdata$OS..months.,event = sdata$OS.censor)
  BaSurv <- Surv(time=coxd$futime,event = coxd$fustat)
  # BaSurv <- Surv(time=coxd$OS_month,event = coxd$OS_censor)
  FML <- as.formula(paste0('BaSurv ~',coxd$Group))
  # FML <- as.formula(paste0('BaSurv ~',x))
  res.cox <- coxph(FML, data = coxd)
  GSum <- summary(res.cox)
  HR <- round(GSum$coefficients[,2],2)
  PValue <- round(GSum$coefficients[,5],3)
  CI <- paste0(round(GSum$conf.int[,3:4],2),collapse = '-')
  Unicox <- data.frame('Characteristics'=x,
                       'Hazard Ratio'= HR,
                       'CI95' = CI,
                       'H CI95' = paste0(HR," (",CI,")"),
                       'P Value' = PValue)
  return(Unicox)
}

03 log-rank方法

log-rank检验

需要比较两组生存曲线之间有无差别,比如某种新药组的患者生存率是否比常规药物组要高。

2×2列联表的χ2检验。这个方法有两个明显的缺点:一是由于删失的存在,难以准确计算生存率;二是时间长度可以随意指定,带来分析结果的偏差。Log-rank就是一种最常用的方法。它在每个时间点分别构建2×2列联表,然后把所有时间点结合起来分析,克服了单个时间点的缺点。

Log-rank检验的零假设是两组生存曲线一样的。如果零假设成立,那么两组内的事件发生个体数之比应该等于两组样本数之比,由此计算出事件发生的期望数。Log-rank方法就是分别将两组所有时间点的期望数加起来,与所有观察数进行比较。

为了详细说明,下面为每个时间点构建一个四格表:

如果零假设成立,那么总的事件发生数d应该按样本量等比例的分布在两组之间。那么每组的期望数(即期望的事件发生数)可以通过下式计算:



QA: 组A的所有观察数之和;

QB: 组B的所有观察数之和;

EA:组A所有的期望数之和;

EB:组B的所有期望数之和,可以简单的计算: [公式]

计算log-rank统计量:


根据P值,可以判断是否拒绝零假设,判断两组生存曲线之间有统计学差异。从km生存曲线也可以看出,两条曲线有没有差异。

mySurv=with(sur_TCGA_LUAD,Surv(futime, fustat))
View(sur_TCGA_LUAD[1:100,1:100])
exprSet <- as.matrix(t(sur_TCGA_LUAD[,-c(1,2)]))

log_rank_p <- apply(exprSet, 1 , function(gene){
  # gene=exprSet[1,]
  sur_TCGA_LUAD$group=ifelse(gene>=median(gene),'high','low')  
  sur_TCGA_LUAD$group <- factor(sur_TCGA_LUAD$group,levels = c("low","high"))
  if(length(unique(sur_TCGA_LUAD$group))>1){ 
      data.survdiff=survdiff(mySurv~group,data=sur_TCGA_LUAD)
      p.val = 1 - pchisq(data.survdiff$chisq, length(data.survdiff$n) - 1)
      # p.val = 1 - pchisq(data.survdiff$chisq, length(data.survdiff$n) - 1)
      HR = (data.survdiff$obs[2]/data.survdiff$exp[2])/(data.survdiff$obs[1]/data.survdiff$exp[1])
      up95 = exp(log(HR) + qnorm(0.975)*sqrt(1/data.survdiff$exp[2]+1/data.survdiff$exp[1]))
      low95 = exp(log(HR) - qnorm(0.975)*sqrt(1/data.survdiff$exp[2]+1/data.survdiff$exp[1]))
      
      
      tmp <- round(cbind(p = p.val,
                         HR = HR, 
                         UP95= up95,
                         LOW95= low95), 3)
      
      
      # return(p.val)
      # print(gene)
      return(tmp)
      
  }
  
})

04 参考资料

生存分析(Cox,K-M,log-rank,Fine-gray) - 哔哩哔哩 (bilibili.com)

生存分析入门之二(生存曲线的假设检验Log-rank) - 知乎 (zhihu.com)


关注R小盐,关注科研私家菜(VX_GZH: SciPrivate),有问题请联系R小盐。让我们一起来学习 R语言机器学习与临床预测模型

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350