代码之家  ›  专栏  ›  技术社区  ›  llewmills

在R中创建具有时变协变量的计数过程数据集

  •  1
  • llewmills  · 技术社区  · 8 年前

    我正在阅读第15章 应用纵向数据分析 Singer和Willett关于扩展Cox回归模型,但加州大学洛杉矶分校网站 here 本章没有示例R代码。我正在尝试重新创建关于时变协变量的部分,并且一直在研究如何从提供的个人级数据框架创建计数过程数据集。我已经看过了 survival 打包vignette,但在创建自己的数据集时遇到问题。这是以辛格和威利特为例的玩具数据,预测17至40岁男性首次使用可卡因的时间。 id 是ID, ageInit 是首次使用可卡因或审查可卡因的年龄, used 是事件日志,指示首次使用可卡因( 1 )或审查( 0 )。有一个时不变预测器 earlyMJ ,表明17岁之前使用过大麻。还有三个时变协变量需要通知数据集的创建: timeMJ ,这是17岁以后首次使用大麻的年龄, sellMJ 这是一个贩卖大麻的时代 odFirst ,这是首次使用其他药物的年龄。 NA 这些预测因子中的s表示参与者在任何时候都没有执行有问题的动作。

    set.seed(1356)
    df <- data.frame(id = 1:6,
                     ageInit = c(25,34,40,29,27,40),
                     used = c(0,1,1,0,1,1), 
                     earlyMJ = c(0,0,1,0,1,1),
                     timeMJ = c(18,27,22,21,22,19),
                     sellMJ = c(NA,NA,25,NA,35,NA),
                     odFirst = c(19,22,35,NA,22,34))
    

    按照Therneau等人的过程 生存 vignette我们创建了第二个数据集,在这种情况下,重新表示结果变量 ageInit公司 和时变预测因子,即研究开始后的年数(即17岁)。

    tdata <- with(df, data.frame (id = id,
                                  usedTime = ageInit - 17,
                                  timeToFirstMJ = timeMJ - 17,
                                  timeToSellMJ = sellMJ - 17,
                                  timeToFirstOD = odFirst - 17,
                                  usedCocaine = used))
    

    我们将此新数据与原始数据集合并,通过 event() 调用,两个新列表示每个协变量的时间间隔。我们还通过 tdc() call,每次参与者经历一个协变量事件时,他们都会换一行。

    sdata <- tmerge(df, tdata, 
                    id=id, 
                    firstUse = event(futime, usedCocaine), 
                    t1MJ   =  tdc(timeToFirstMJ),
                    t1SMJ  =  tdc(timeToSellMJ),
                    t1OD  =  tdc(timeToFirstOD),
                    options= list(idname="subject"))
    attr(sdata, "tcount")
    

    问题是,当我使用时不变和一些时变协变量运行考克斯回归时,我无法使模型工作。

    coxph(Surv(tstart, tstop, firstUse) ~ earlyMJ + t1SMJ + t1OD, data= sdata, ties="breslow")
    

    并得到无意义系数和警告信息

    In fitter(X, Y, strats, offset, init, control, weights = weights,  :
      Loglik converged before variable  1,3 ; beta may be infinite. 
    

    此外,我甚至不知道这是否是一个正确的计数过程数据帧,因为在Singer和Willett中,他们建议每个参与者每次都需要有一行 任何人 在数据集中体验事件。

    如果您能在这些问题上提供任何指导,我们将不胜感激。

    1 回复  |  直到 8 年前
        1
  •  4
  •   Benjamin Christoffersen    8 年前

    良好的开端是 Using Time Dependent Covariates and Time Dependent Coefficients in the Cox Model 中的渐晕图 survival 包裹

    问题是,当我使用时不变和一些时变协变量运行考克斯回归时,我无法使模型工作。

    乍一看,您所做的似乎是正确的,但可能只是因为您只有6个人和三个参数需要估计?

    获取无意义系数和警告消息

    这个警告很有道理。两个参数估计值的标准误差大于1000。见下文。

    此外,我甚至不知道这是否是一个正确的计数过程数据帧,因为在Singer和Willett中,他们建议每个参与者需要在数据集中的每个人每次经历事件时都有一行。

    这在内部处理 coxph


    这是我的代码来重现你的结果

    #####
    # setup data
    df <- data.frame(id = 1:6,
                     ageInit = c(25,34,40,29,27,40),
                     used =    c( 0, 1, 1, 0, 1, 1), 
                     earlyMJ = c( 0, 0, 1, 0, 1, 1),
                     timeMJ  = c(18,27,22,21,22,19),
                     sellMJ =  c(NA,NA,25,NA,35,NA),
                     odFirst = c(19,22,35,NA,22,34))
    shift_cols <- c("ageInit", "timeMJ", "sellMJ", "odFirst")
    df[shift_cols] <- lapply(df[shift_cols], "-", 17)
    
    library(survival)
    est_df <- df[, c("id", "ageInit", "earlyMJ", "used")]
    est_df <- tmerge(
      est_df, est_df, id = id, start_using = event(ageInit, used))
    est_df <- tmerge(
      est_df, df, id = id, 
      t1MJ =  tdc(timeMJ), t1SMJ = tdc(sellMJ), t1OD = tdc(odFirst))
    
    #####
    # fit model
    fit <- coxph(
      Surv(tstart, tstop, start_using) ~ earlyMJ + t1SMJ + t1OD, data = est_df)
    #R> Warning message:
    #R> In fitter(X, Y, strats, offset, init, control, weights = weights,  :
    #R>   Loglik converged before variable  1,3 ; beta may be infinite. 
    
    summary(fit)
    #R> Call:
    #R> coxph(formula = Surv(tstart, tstop, start_using) ~ earlyMJ + 
    #R>     t1SMJ + t1OD, data = est_df)
    #R> 
    #R>   n= 17, number of events= 4 
    #R> 
    #R>              coef exp(coef)  se(coef)     z Pr(>|z|)
    #R> earlyMJ 2.047e+01 7.792e+08 2.791e+04 0.001    0.999
    #R> t1SMJ   4.744e-16 1.000e+00 1.414e+00 0.000    1.000
    #R> t1OD    4.157e+01 1.136e+18 3.883e+04 0.001    0.999
    #R> 
    #R>         exp(coef) exp(-coef) lower .95 upper .95
    #R> earlyMJ 7.792e+08  1.283e-09   0.00000       Inf
    #R> t1SMJ   1.000e+00  1.000e+00   0.06255     15.99
    #R> t1OD    1.136e+18  8.806e-19   0.00000       Inf
    #R> 
    #R> Concordance= 1  (se = 0.258 )
    #R> Rsquare= 0.273   (max possible= 0.33 )
    #R> Likelihood ratio test= 5.42  on 3 df,   p=0.1437
    #R> Wald test            = 0  on 3 df,   p=1
    #R> Score (logrank) test = 4.14  on 3 df,   p=0.2463
    
    推荐文章