使用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
相关产品推荐
相关产品推荐

