You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用survival包tmerge()的tdc()时,如何动态指定生存分析协变量?

动态指定tmerge()中的时变协变量

在生存分析中使用tmerge()处理时变协变量时,若需要动态切换协变量(比如批量运行模型时在bmi和modifiedBmi之间切换),会遇到tdc()非标准评估导致字符串变量无法直接传入的问题。以下是具体场景和解决方法:

模拟数据

首先定义示例数据:

personWise <- data.frame(personId=1:2, startDay=0, endDay=1:2 * 300, 
  event=c(TRUE, FALSE))
print.data.frame(personWise)

输出:

personId startDay endDay event
1        1        0    300  TRUE
2        2        0    600 FALSE
visitWise <- data.frame(
  personId=c(1, 1, 1, 2, 2),
  visitDay=c(50, 150, 200, 20, 500),
  bmi=c(3, 4, 3, 6, 5),
  modifiedBmi=c(1, 7, 8, 2, 6)
)
print.data.frame(visitWise)

输出:

personId visitDay bmi modifiedBmi
1        1       50   3           1
2        1      150   4           7
3        1      200   3           8
4        2       20   6           2
5        2      500   5           6

常规静态调用tmerge()的方式如下(以bmi为例):

tv <- tmerge(data1=personWise, data2=personWise, id=personId, tstart=startDay, 
  tstop=endDay, event=event(endDay, event))
tv <- tmerge(data1=tv, data2=visitWise, id=personId, 
    bmiMeasure=tdc(visitDay, bmi))

动态指定协变量的解决方法

方法1:使用rlang的符号转换

通过rlang::sym()将字符串转为R符号,再用!!解引用传入tdc():

library(survival)
library(rlang)

# 动态设置协变量名称
bmiCovariate <- "bmi" # 可替换为"modifiedBmi"

tv <- tmerge(data1=personWise, data2=personWise, id=personId, tstart=startDay, 
             tstop=endDay, event=event(endDay, event))

# 动态传入协变量
tv <- tmerge(data1=tv, data2=visitWise, id=personId, 
             bmiMeasure=tdc(visitDay, !!sym(bmiCovariate)))

方法2:使用get()直接提取变量

get()可以从数据框中按名称提取变量,适合简单场景:

library(survival)

bmiCovariate <- "modifiedBmi"

tv <- tmerge(data1=personWise, data2=personWise, id=personId, tstart=startDay, 
             tstop=endDay, event=event(endDay, event))

tv <- tmerge(data1=tv, data2=visitWise, id=personId, 
             bmiMeasure=tdc(visitDay, get(bmiCovariate)))

方法3:批量处理构造表达式

如果需要批量添加多个时变协变量,可以构造表达式后求值:

library(survival)
library(rlang)

covariate_list <- c("bmi", "modifiedBmi")

tv <- tmerge(data1=personWise, data2=personWise, id=personId, tstart=startDay, 
             tstop=endDay, event=event(endDay, event))

for (covar in covariate_list) {
  # 动态构造tmerge调用表达式,同时生成对应列名
  tmerge_expr <- expr(
    tmerge(data1=tv, data2=visitWise, id=personId, 
           !!sym(paste0(covar, "Measure")) := tdc(visitDay, !!sym(covar)))
  )
  # 执行表达式并更新数据集
  tv <- eval(tmerge_expr)
}

内容的提问来源于stack exchange,提问作者eac2222

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 19:16:00