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")
我正在尝试将一些数据合并在一起以进行一些生存分析,但我一直收到错误消息。
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")