survival::tmerge() 给出 as.Date.numeric(value) 错误

survival::tmerge() giving as.Date.numeric(value) error

我正在尝试将一些数据合并在一起以进行一些生存分析,但我一直收到错误消息。

library(survival)
library(lubridate)

df1 <- data.frame(id = "62103",
                  hire.date = ymd("2016-05-16"),
                  end.date = ymd(Sys.Date())
)
job <- data.frame(id = c("62103", "62103"),
                  job1 = c("level 1 coder", "level 2 coder"),
                  start.date = c(ymd("2016-05-16"), ymd("2017-05-16")),
                  end.date = c(ymd("2017-05-16"), NA)
)

df2 <- tmerge(df1, df1, id = id,
              tstart = hire.date,
              tstop = end.date)
df3 <- tmerge(df2, job, id = id,
              job = tdc(start.date, job1)
)

这会引发错误:

Error in as.Date.numeric(value) : 'origin' must be supplied

以下是关于我的会话的一些信息:

> sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 17763)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] lubridate_1.7.4   survival_2.44-1.1

loaded via a namespace (and not attached):
 [1] compiler_3.6.1  magrittr_1.5    Matrix_1.2-17   tools_3.6.1    
 [5] Rcpp_1.0.2      stringi_1.4.3   splines_3.6.1   grid_3.6.1     
 [9] knitr_1.24      stringr_1.4.0   xfun_0.9        lattice_0.20-38

tdc 函数是 tmerge 函数的内部函数。这是代码顶部的定义:

 assign("tdc", function(time, value = NULL) {
        x <- list(time = time, value = value)
        class(x) <- "tdc"
        x
    }, envir = new)

它需要时间参数的名称和时变变量的名称,并且应该从旧变量创建新变量。它将继承对 tmerge 的调用的搜索路径。作为第二个参数给出的是一个完整的数据帧(并且也被分配回该数据帧的名称),因此抛出错误并不奇怪,尽管我承认错误消息不是特别有用。我想有可能只是更改列名,这样它就不会与数据框名称混淆就足够了。让我们检查一下:不,在 job 数据框中将作业列名称更改为 'job1',并且对第二个 tmerge 操作的调用仍然失败。

tmerge 帮助页面中的示例与宣传的一样:

temp <- subset(pbc, id <= 312, select=c(id:sex, stage)) # baseline data
pbc2 <- tmerge(temp, temp, id=id, endpt = event(time, status))
pbc2 <- tmerge(pbc2, pbcseq, id=id, ascites = tdc(day, ascites),
               bili = tdc(day, bili), albumin = tdc(day, albumin),
               protime = tdc(day, protime), alk.phos = tdc(day, alk.phos))

fit <- coxph(Surv(tstart, tstop, endpt==2) ~ protime + log(bili), data=pbc2)

除了使用列名作为 tdc 的参数之外,我还怀疑 tmerge 的成功操作需要一个更大的例子。 df2 示例只有一行数据,因此不清楚它应该如何随时间变化。我还注意到示例中似乎没有状态变量,而这是 Therneau 示例中的第一个操作:pbc2 <- tmerge(temp, temp, id=id, endpt = event(time, status))

帮助页面强烈建议用户查看包含的关于时变协变量的插图。

看来 tdc 的问题是某些日期数学计算不正确。将(来回?)转换为数字可以解决这个问题。

library(survival)
library(lubridate)
library(tidyverse)
df1 <- data.frame(id = "62103",
                  hire.date = ymd("2016-05-16"),
                  end.date = ymd(Sys.Date())
) %>% 
  mutate_if(is.Date, as.numeric)
job <- data.frame(id = c("62103", "62103"),
                  job1 = c("level 1 stacker", "level 2 stacker"),
                  start.date = c(ymd("2016-05-16"), ymd("2017-05-16")),
                  end.date = c(ymd("2017-05-16"), NA)
)%>% 
  mutate_if(is.Date, as.numeric)

df2 <- tmerge(df1, df1, id = id,
              tstart = hire.date,
              tstop = end.date)
df3 <- tmerge(df2, job, id = id,
              job = event(start.date, job1)
) %>%
  mutate_if(is.numeric, as.Date, origin = "1970-01-01")