R语言生存分析模型因果分析:非参数估计、IP加权风险模型、结构嵌套加速失效(AFT)模型分析流行病学随访研究数据

原文链接:http://tecdat.cn/?p=26632

原文出处:拓端数据部落公众号

理解世界,我们可以从相关性的角度去描述,统计,机器学习,很多问题都是从相关的角度去描述的。我们去构建一个模型,不管是统计机器学习模型,还是深度学习模型,本质上是构建一个复杂映射。从特征到标签的一个映射,这个映射是有用的,但不完全有用。

因果分析

我们在这里用一个隐喻,下雨,来描述causal 和relevance。我们可以构建一个关于预测明天是否下雨的模型,从搜集到的大量特征,以及历史的下雨结果最为标签,构建模型。不管准确率多少,我们用这样一个模型能够预测明天是否能够下雨。

但是,我们很多时候要的不仅仅是预测,而是需要改变现状,例如沙漠中,我们想要哪些因素改变了,能够导致下雨。这就涉及到因果推断, causal inference 。

因果生存分析

在报告随机实验的结果时,除了意向治疗效应外,研究人员通常选择呈现符合方案效应。然而,这些符合方案的影响通常是回顾性描述的,例如,比较在整个研究期间坚持其指定治疗策略的个体之间的结果。这种对符合方案效应的回顾性定义经常被混淆,并且无法进行因果解释,因为它遇到了治疗混杂因素。

我们的目标是概述使用逆概率加权对生存结果的因果推断。这里描述的基本概念也适用于其他类型的暴露策略,尽管这些可能需要额外的设计或分析考虑。

生存曲线的非参数估计

  1.  
     
  2.  
    # 对数据进行一些预处理
  3.  
    ifelse(nes$death==0, 120,
  4.  
    (ns$yrh-83)*12+nhefs$moh) # yrt从83到92不等

summary(survtime)

survdiff(Surv(srtm, dah) ~ qmk, data=nes)

  1.  
    fit <- survfit(Surv(rvie, dth) ~ sk, data=ns)
  2.  
    ggsurvplot(fit

通过风险模型对生存曲线进行参数化估计

  1.  
    # 创建月数据
  2.  
     
  3.  
    efsurv$ent <- ifelse(nhfs.rv$time==nhfs.urv$srvme-1 &
  4.  
    nhf.srv$death==1, 1, 0)
  5.  
     
  6.  
     
  7.  
    # 拟合参数性风险模型
  8.  
    haads.el <- glm(event==0 ~ qs

  1.  
     
  2.  
    #对每个人月的估计(1-风险)的分配 */
  3.  
    qk0$pnoevt0 <- predict(hardoel, mk0, type="response")
  4.  
     
  5.  
    # 计算每个人月的生存率
  6.  
    qm0$uv0 <- cumprod(qm0$pnoet0)
  7.  
     
  8.  
    # 一些数据管理来绘制估计的生存曲线
  9.  
    hadgrh$suvdff <- haardsgph$suv1-hardgrph$srv0
  10.  
     
  11.  
    # 绘制
  12.  
    ggplot(hads.aph

通过IP加权风险模型估计生存曲线

  1.  
    # 估计ip权重的分母
  2.  
     
  3.  
    nef$p.mk <- predict(enm, nes, type="response")
  4.  
     
  5.  
    # 估计ip权重的分子
  6.  
    p.m <- glm(qk ~ 1, data=nefs, family=binomial() )
  7.  
    hfs$pnsm <- predict(p.m, nes, type="response")
  8.  
     
  9.  
    # 估计权重的计算
  10.  
    nef$s.<- ifelse(hes$qsk==1, nefs$pqmk/nhes$d.qmk,
  11.  
    (1-nfs$p.smk)/(1-nef$pdqk))
  12.  
    summary(nhs$swa)

  1.  
    # 创建人月数据
  2.  
    nhfsw <- exnRos(nhfs, "srvtime", drop=F)
  3.  
    nh.pw$ime <- sqee(rle(nefs.ipw$seqn)$lengths)-1
  4.  
    nhfipw$evnt <- ifele(nhf.iw$tie=nhefs.i$rv1 &)
  5.  
    nhfs.w$eath==1, 1, 0)
  6.  
    nhefpw$tmesq <- nhfs.pw$me^2
  7.  
     
  8.  
    # 拟合加权风险模型
  9.  
    imel <- glm(eve

  1.  
    # 创建生存曲线
  2.  
    ipw.k0 <- data.frame(cbind(seq(0, 119),0, (seq(0, 119))^2))
  3.  
     
  4.  
     
  5.  
     
  6.  
    # 对每个人月的估计(1-危险)的分配 */
  7.  
    iwqk0$p.nvnt0 <- predict(ipwdl, pwm0, type="response")
  8.  
    iwsk1$povt1 <- predict(ip.el, ipmk1, type="response")
  9.  
     
  10.  
    # 计算每个人月的生存率
  11.  
    ip.qs0$srv0 <- cumprod(ipwsk0$p.nevnt0)
  12.  
    ip.qm1$suv1 <- cumprod(iwqsk1$p.nvent1)
  13.  
     
  14.  
    # 一些数据管理来绘制估计的生存曲线
  15.  
    ipwgph <- merge(ip.qmk0,pwsm1, by=c("time", "timesq") )
  16.  
    ipw.aph$surff <-ipw.ah$sv1-pwgrph$surv0
  17.  
     
  18.  
    # 绘制
  19.  
    ggplot(ip.gph, ae

通过g-formula估计生存曲线

  1.  
    # 带有协变量的风险模型的拟合情况
  2.  
     
  3.  
    g.mo <- glm(event==0 ~ qsm

  1.  
    # 创建数据集,包括每个治疗水平下的所有时间点
  2.  
    # 每个人在每个治疗水平下的所有时间点
  3.  
    gf.qmk <- exanos(nfs, cunt=120, cotis.cl=F)
  4.  
    gf.qm0$te <- rep(q(0, 119), now(nhf))
  5.  
    gqm0$tesq <- gqk0$tie^2
  6.  
    gqsk0$qmk <- 0
  7.  
     
  8.  
    gfqsk1 <- gf.qm0
  9.  
    gf.sk1$mk <- 1
  10.  
     
  11.  
    gfqk0$p.vnt0 <- predict(g.mdel, g.qk0, type="response")
  12.  
    gfqk1$p.eent1 <- predict(gf.mol, gf.mk1, type="response")
  1.  
     
  2.  
    # 绘图
  3.  
    ggplot(gf.graph

通过结构嵌套AFT模型估计中位生存时间比率

  1.  
    # 对数据进行一些预处理
  2.  
     
  3.  
     
  4.  
    #
  5.  
    modelA <- glm(qsmk ~ sex +
  6.  
    nhs$pqsk <- predict(moeA, nhe, type="response")
  7.  
    d <- nes[!is.na(hf$surve),] # 只选择有观察到的死亡时间的人
  8.  
     
  9.  
     
  10.  
    # 定义需要被最小化的估计函数
  11.  
    smf <- function(pi){
  12.  
     
  13.  
    # 创建delta指标
  14.  
    if (psi>=0){
  15.  
    delta <- ifelse
  16.  
    1, 0)
  17.  
    } else if (psi < 0) {
  18.  
    dlta <- ifelse
  19.  
    }
  20.  
     
  21.  
     
  22.  
    # 协方差
  23.  
    sgma <- t(at) %*% smat
  24.  
    if (sa == 0){
  25.  
    siga <- 1e-16
  26.  
    }
  27.  
    etm <- svl*solve(sia)*t(sal)
  28.  
    return(etmeq)
  29.  
    }
  30.  
     
  31.  
    res <- optimize
  32.  
    # 使用简单的分割法找到95%置信度下限和上限的估计值
  33.  
    frcf <- function(x){
  34.  
    return(smef(x) - 3.84)
  35.  
    }
  36.  
     
  37.  
    if (bfuc < 3.84){
  38.  
    # 找到sumeef(x)>3.84的估计值
  39.  
     
  40.  
    # 95%CI的下限
  41.  
     
  42.  
    while (tetlw < 3.84 & cnlow < 100){
  43.  
    psl <- pilw - incre
  44.  
    teslow <- sumeef(pslw)
  45.  
    cunlow <- cunlow + 1
  46.  
    }
  47.  
     
  48.  
    # 95%CI的上限值
  49.  
     
  50.  
    while (tsigh < 3.84 & onhih < 100){
  51.  
    phigh <- pshih + inrem
  52.  
    testig <- sumeef(pihigh)
  53.  
    cunhgh <- cuntigh + 1
  54.  
    }
  55.  
     
  56.  
    # 使用分切法进行更好的估计
  57.  
    if ((tstig > 3.84) & (tslw > 3.84)){
  58.  
     
  59.  
    # 分割法
  60.  
     
  61.  
    cont <- 0
  62.  
    dif <- right - left
  63.  
     
  64.  
    while {
  65.  
    test <- fmiddle * fleft
  66.  
    if (test < 0){
  67.  
    } else {
  68.  
    }
  69.  
     
  70.  
    diff <- right - left
  71.  
    }
  72.  
     
  73.  
    psi_high <- middle
  74.  
    objfunc_high <- fmiddle + 3.84
  75.  
     
  76.  
    # 95%CI的下限
  77.  
    left <- psilow
  78.  
     
  79.  
     
  80.  
    while(!){
  81.  
    test <- fmiddle * fleft
  82.  
    if (test < 0)


最受欢迎的见解

1.R语言绘制生存曲线估计|生存分析|如何R作生存曲线图

2.R语言生存分析可视化分析

3.R语言如何在生存分析与Cox回归中计算IDI,NRI指标

4.r语言中使用Bioconductor 分析芯片数据

5.R语言生存分析数据分析可视化案例

6.r语言ggplot2误差棒图快速指南

7.R 语言绘制功能富集泡泡图

8.R语言如何找到患者数据中具有差异的指标?(PLS—DA分析)

9.R语言中的生存分析Survival analysis晚期肺癌患者4例

posted @ 2022-05-23 20:47  拓端tecdat  阅读(516)  评论(0)    收藏  举报