如何将 Surv 对象作为新列包含在 data.table 中?

How to include a Surv object as a new column in a data.table?

我正在执行生存分析,我想在 data.table 中创建一个 Surv 对象作为它自己的列。尽管 Surv 对象被视为向量,但我不能使用它们来创建新列,因为它们实际上是一个 2 列矩阵。有没有一种优雅的方式来包含 Surv 个对象而不将它们拆分成单独的列?

这就是 Surv 对象的样子。

DT[,Surv(time, status)]
#>  [1]   9   13   13+  18   23   28+  31   34   45+  48  161+   5    5    8 
#> [15]   8   12   16+  23   27   30   33   43   45

这是我想做的事的一个例子:

library(data.table)
library(survival)

DF <- as.data.frame(survival::aml)
DT <- as.data.table(survival::aml)

# Does work
DF$survival <- Surv(DF$time, DF$status)

# Does not work
DT[,survival:=Surv(time, status)]

目前还不清楚这种构造的基本计划是什么,但如果希望在 data.table 环境中进行生存建模,那么单独构造一个 Surv 对象是不可能的必要的。人们应该习惯于在 data.table j 位置输入完整的表达式:

> DT[ , coxph( Surv(time, status) ~ 1, data=.SD) ]
Call:  coxph(formula = Surv(time, status) ~ 1, data = .SD)

Null model
  log likelihood= -42.72484 
  n= 23 

data.table 函数创建了一个环境,在该环境中,列名的计算不带引号:

> DT[ , summary(coxph( Surv(time, status) ~ x), data=.SD) ]
Call:
coxph(formula = Surv(time, status) ~ x)

  n= 23, number of events= 18 

                 coef exp(coef) se(coef)     z Pr(>|z|)  
xNonmaintained 0.9155    2.4981   0.5119 1.788   0.0737 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

               exp(coef) exp(-coef) lower .95 upper .95
xNonmaintained     2.498     0.4003    0.9159     6.813

Concordance= 0.619  (se = 0.063 )
Likelihood ratio test= 3.38  on 1 df,   p=0.07
Wald test            = 3.2  on 1 df,   p=0.07
Score (logrank) test = 3.42  on 1 df,   p=0.06

事实上,在 coxph 函数之外单独构造 Surv-对象的做法给 rhelp 邮件列表带来了问题,因为这样的外部使得对象的环境不是提供给 coxph而是globalenv()。生存包的作者 Terry Therneau 警告人们不要制作单独的 Surv-objects。这与 data.table 中有关矩阵封装的任何问题完全不同,但希望它能减少对这一障碍的失望程度。