1. 简介

本文包含3个不同但是相关的概念:

  • 时间依存协变量,以及一些常见错误;
  • 制作时间依存协变量的工具,更确切的说是如何编码相关数据集;
  • 时间依存系数。

2. 时间依存协变量

Cox模型的一个优势是有包含随时间变化的协变量的能力。原因是:在每个事件时间,程序将具有该事件的受试者的当前协变量值与当时处于风险中的所有其他人的当前值进行比较。人们可以将其视为一个彩票模型,在每个死亡时间都有一张图来决定哪个受试者“赢得”该事件。每个受试者的风险评分exp(Xβ\betaβ) 决定他们获胜的可能性,例如,他们为这张图购买多少票。 该模型尝试为每个受试者分配风险评分,以最佳方式预测每幅图的结果,基于:

  • 风险集:每个事件中都有哪些受试者; 那些能够“赢得胜利”的受试者集。
  • 在事件发生时间之前每个受试者的协变量值。

编码时间相关协变量的简单方法是使用时间间隔。 考虑一个受试者的随访时间从0时到死亡时间为185天,并假设我们有时间依存的协变量(肌酐,creatinine),在第0,90和120天测量的值分别为0.9,1.5和1.2mg/dl。 编码该数据的一种方法是将受试者的时间分解为3个时间间隔0-90,90-120,120-185,每个间隔有一行数据,则数据可能如下列所示:

subject time1 time2 death creatinine
1 5 0 90 0 0.9
2 5 90 120 0 1.5
3 5 120 185 1 1.2

一个判断是否可以是Cox模型中的时间依存协变量的关键规则很简单,基本就像赌博一样:你无法展望未来。 协变量可能在过去的数据或结果基础上以任何形式发生改变,但可能无法及时到达。 上面的简单数据集示意我们不能在肌酐值0.9和1.5之间添加线性插值,即在第100天得到预测值1.1;而在第100天的时候,1.5的后期价值则没有看到。

再举一个例子,Mayo Clinic衰老研究(MCSA)的最新分析,该研究从Olmsted County中随机抽取分层随机样本并跟进,研究轻度认知障碍(MCI),老年痴呆症和死亡的发生。 文章从一个表开始,比较从未发生MCI的人和曾经发生了MCI的人的基线协变量;然后还有一张表比较基线协变量和生存。这两张表都是对的:如果你考虑R语言的公式,他们可以写成未来结果在公式的左边而过去的信息在右边。 但是一张比较发生和没有发生MCI的人的survival的表将没有意义。因为这意味着将来的结果在等式的左右两边。

另一个更为人熟知的错误例子,是治疗反应的分析:在试验结束时,比较那些对治疗有早期响应的患者的生存曲线(肿瘤缩小,胆固醇降低,或其他什么)和那些没有响应的患者,则会发现有响应者有更好的曲线。 相同数据的情况下,该Cox模型将会显示出一个“强烈”的效果。这个错误的问题出现在那些在还没有响应现象发生的早期死亡样本,将全部被划分到无响应组。

我们经常可以听到对这种不正确方法的警告[1,2,8],但这种分析总是一再被发现。
Redmond等人[7]讨论了一种稍微微妙的错误形式。在治疗乳腺癌患者开始时设定> 85%,65%~85%或<65%的三个剂量分组,并根据患者最终接受剂量分成以上三个剂量组。 但是根据上述情况,这种方法导致了严重的偏离,因为一些早期死亡患者并没有结束他们治疗周期,因此这些患者会被划分到低剂量组里。总剂量的比例风险模型会先显示出剂量的强烈效应,以致于这样的结果鼓励治疗人员针对治疗毒性而推迟必要剂量的减少。

Redmond观察了一个变量:为每个受试者创建一个变量p,定义为受试者最后一项目标剂量的分数。 原计划的12周疗程但是只接受6周后死亡的受试者仍然可以得分100%。这种方法看上去能够解决上一段中的偏离问题,但事实证明它导致了另一个方向的偏离。 原因是经常在后期治疗期由于治疗毒性而降低放疗量,因此寿命更长反而导致了更小的变量p值。这样,关于p的比例风险回归会错误的显示更小的剂量有保护性!

正确的方法是将预测因子作为时间依存协变量处理!对于治疗响应,它是一个所有受试者都是从0开始的变量,并把响应的发生记录为1。对于剂量,它将测量累计剂量。

上述描述的错误有许多种变化:在观察时间对实验室测试值做线性插入,移除没有完成治疗计划的受试者,在两个观察时间内插入不良事件的发生日期,等等。使用未来的数据经常造成系数产生大的正偏差或负偏差,但有时它也会产生较小的偏差。 几乎不可能在任何给定数据集中先验预测哪个发生。 使用这样的协变量类似于在洛杉矶高速公路上慢跑:灾难不是一定发生,却很有可能发生。

最常见的编码时间依存协变量的方法是在模型种使用(start stop]格式。

fit<-coxph(Surv(time1,time2,status)~age+creatinine, data=mydata)

在mydata的数据集中,一个患者可能有以下观测数据:

subject time1 time2 status age creatinine
1 0 15 0 25 1.3
1 15 46 0 25 1.5
1 46 73 0 25 1.4
1 73 100 1 25 1.6

在这个例子中,变量age为研究起始时的年龄,每行保持不变,但是肌酐的值则被处理为在时间间隔(0,15]时为1.3,(15,46]时为1.5等。这个时间间隔左边开口且右边闭口,说明肌酐的值在第15天的时候还是1.3。status变量描述了在每个时间间隔的结束时的某个事件是否发生。

随着数据的建立,一个常见问题是我们是否需要担心数据相关,因为一个特定受试者有多次观测数据。答案是否定的,我们不用担心,因为这种数据表示方法只是编程技巧。 任意时间点的似然方程只使用受试者的一个副本,程序会在每个时间中选出正确的数据行。但是这个规则有两个例外:

  • 当受试者有多个事件时,受试者的各个事件的各个数据行相关,而且需要群集方差。
  • 当受试者出现有重叠的时间间隔。但是,这几乎总是一个数据错误,因为它对应的是一个受试者在同一时间层中存在的两个备份,例如,她可以在聚会上见到另一个她自己。

但是,一个受试者可以在同一时间内处于多层次风险,这对应于同时处于两个明显不同输出结果的。

3 使用tmerge构建与时间依存的数据集

3.1 函数

一个构建数据集的函数是tmerge,在survival库中。 其想法是建立一个在时间端点的时间依存数据集。 主要参数包括:

  • data1:将被进行添加的基础数据集
  • data2:新信息的来源
  • id:新数据中的受试者身份标识
  • …:将变量添加到数据集的其他参数,有四种:tdc(), cumtdc(), event(), cumevent()
  • tstart,tstop:用于设置每个受试者的时间范围
  • options

创造的数据集至少包含3个变量:id, tstart, tstop。对于“…”参数,tdc()和cumtdc()增加了一个时间依存变量, 而event()和cumevent()则增加了一个新的时间端点。在生存分析程序中,时间间隔为左开口右闭合,即(tstart,tstop]。 从时间间隔的开始应用时间依存协变量,在时间间隔的结束发生事件。 如果数据集已经具有(0,10]和(10,14]两个时间间隔,则在时间8新增的时间依存协变量或事件将导致三个区间(0,8],(8,10]和(10,14];新增的时间依存协变量值将被添加到第二个区间,一个新的事件将被添加到第一个区间。该函数的基本形式是

newdata<-tmerge(data1,data2,id,newvar=tdc(time,value),...)

这是一个复杂的函数,我们将用一系列的例子(survival包中)来逐步揭示它的特性。

3.2 CGD数据集

慢性肉芽肿病(Chronic granulomatous disease, CGD)是一组非常见异常遗传性疾病,以复发性化脓性感染为特征,通常在生命早期开始并可能导致在童年时代即死亡。 1986年,Genentech公司进行了一项随机、双盲、安慰剂对照组治疗128例CGD患者的试验,患者接受Genentech人源化干扰素γ(rIFN-g)或安慰剂,每日三次,一年。 收集所有严重感染的数据直到随访结束,大多数患者的严重感染都发生在第400天之前。 一位患者在他最后一次感染当天即死亡; 所有其他患者则跟踪随访到生命结束。

以下是第1批10个观察值,参见cgd0数据集的帮助页可以看到所有参数名称。在cgd0数据集中的最后数列包含了数次感染的时间段。1号受试者跟踪随访414天,并在219天和373天发生感染,2号受试者有7次感染,而3号受试者则没有发生感染。

library(survival)
cgd0[1:5,c(1,4:6,13:20)]

输出1-5号受试者部分信息的结果:

我们需要把这个格式的数据集转换为survival可以处理的形式

  • 数据集的每一行表示时间间隔(time1,time2],左边开口右边关闭。该行的协变量值适用于该整个时间间隔。
  • 如果时间间隔以发生事件为结束,则每行的事件变量为1,否则为0。

我们在最终数据集中不需要变量etime1~etime7,因此第一次函数调用中,它们被排除在data1参数之外。

dim(cgd0)
newcgd <- tmerge(data1=cgd0[, 1:13], data2=cgd0, id=id, tstop=futime)
newcgd <- tmerge(newcgd, cgd0, id=id, infect = event(etime1))
newcgd <- tmerge(newcgd, cgd0, id=id, infect = event(etime2))
newcgd <- tmerge(newcgd, cgd0, id=id, infect = event(etime3))
newcgd <- tmerge(newcgd, cgd0, id=id, infect = event(etime4))
newcgd <- tmerge(newcgd, cgd0, id=id, infect = event(etime5))
newcgd <- tmerge(newcgd, cgd0, id=id, infect = event(etime6))
newcgd <- tmerge(newcgd, cgd0, id=id, infect = event(etime7))
newcgd <- tmerge(newcgd, newcgd, id, enum=cumtdc(tstart))
dim(newcgd)
newcgd[1:5,c(1, 4:6, 13:17)]

结果显示为:

attr(newcgd, "tcount")

结果显示为:

coxph(Surv(tstart, tstop, infect) ~ treat + inherit + steroids + cluster(id), newcgd)

结果显示为:

以上显示了使用tmerge的规范方法:每次调用都会增加一些信息到数据集data1中。

  • 第一个调用将每个受试者的时间范围设置为从0(默认)到最后跟进事件。如果下一次调用尝试在该范围之外添加事件,比如在时间= -2时该添加会被忽略。可以使用tstop和tstart(可选参数)明确设置范围,这将在下面的心脏移植示例中完成。 第一次调用结果有128行,与cgd0相同。
  • 下次每个调用都会添加端点或协变量,从而拆分各个行并根据需要输入成为两行。一个event或cumevent指令添加事件,而tdc或者cumtdc添加一个时间依存协变量。 在时间间隔的末尾发生的事件和时间依存协变量在下一个时间间断开始时改变。
  • data2中的缺失时间值则被忽略添加。
  • tmerge的结果是data.frame会具有一些额外属性。其中一个是tcount,旨在帮助可视化过程并在最后将结果输出出来。假设受试者已经有3个时间间隔(2,5],(5,10]和(14,40]。那么在时间间隔1添加一个新的时间将表示为“early”,而在任何时间间隔之后的时间50则将被记录为“late”。在时间间隔3的事件在整个时间区间内;一个事件在时间5上的事件在两个时间间隔的边界在两个边界内上;一个事件在时间14处,是间隔3的前沿;一个事件在时间10,处于间隔2的尾部边缘;而时间11的事件则间隙之中。在此数据集中,所有新增加的内容都严格限制在之前间隔内。我们还看到etime6和etime7都只向数据集添加了一个事件。
  • 如果data2中一个人两个观察值共享完全相同的时间,则用cumtdc()和cumevent()添加值。 “tied”列说明了这种情况发生的频率。在某些数据集中可能有这样的需要,如果不需要则需要在调用tmerge之前需要除去这种联系。
  • 最后一个tmerge函数的调用添加了一个简单的时间依存变量"enum",它是对每个受试者的计次参数。这通常是一个有用的变量在以后的模型中,例如enum== 1选出受试者的第一行。
  • data.frame在tmerge函数之后的额外属性是短暂的,它们会在任何下一步操作时丢失,这是特意设定的。
  • 用tmerge生成的数据可以用cgd数据集验证,一个在survival包中的(start,stop]版本,这个数据集是几年前手工创建的。
  • tmerge函数顺序处理参数,所以上面的程序也可重写为下式。这两种程序没有计算上的差别。
test <- tmerge(cgd0[, 1:13], cgd0, id=id, tstop=futime, infect = event(etime1),infect= event(etime2),infect = event(etime3), infect= event(etime4), infect = event(etime5), infect= event(etime6), infect = event(etime7))
test <- tmerge(test, test, id= id, enum = cumtdc(tstart))
all.equal(newcgd, test)

3.3 Stanford心脏移植

jasa数据集包含的信息来自斯坦福心脏移植的研究,在Crowley和Hu的[3]文献中。数据集每个受试者有一行数据,包含随登记,移植和死亡或最后随访日期的基线协变量。我们希望创建一个transplant作为时间依存协变量。对于真实数据中经常会出现一些在建立一个分析数据集时需要处理的异常情况,如下举例。

  • 一个受试者在登记当日就死亡。但是(0,0)在coxph程序中是一个非法时间间隔。而在第0.5天死亡则满足程序条件。另一种处理方法是对每个受试者的随访时间增加1天,例如2号受试者于1968年1月2日登记并于1月7日去世,则记入6天(Kalbfleisch和Prentice在他们的书中这样处理过)。上述任一策略的coxph调用结果都相同。
  • 在第10天移植的受试者被认为已经进行了第1至第10天的治疗并且从第11天开始移植。也就是说,只有38号受试者在移植当天死亡。其余受试者应该被视为移植死亡。这个问题如果通过将这种移植时间前移0.5天也可以同样得到解决。
  • 只有当协变量以完全相同的方式定义时,才会获得和Kalbfleisch和Prentice[5]中分析表6.1中的治疗系数,因为他们的模型包括相互作何。年龄是:(以天为单位的年龄)/365.25-48 年,而登记年份是自研究开始以来的年数:(登记日期-1967/10/1)/365.25。
jasa$subject <- 1:nrow(jasa) #we need an identifier variable
tdata <- with(jasa, data.frame(subject = subject,futime= pmax(.5, fu.date - accept.dt),txtime= ifelse(tx.date== fu.date,(tx.date - accept.dt) -.5,(tx.date - accept.dt)),fustat = fustat))
sdata <- tmerge(jasa, tdata, id=subject,death = event(futime, fustat),trt = tdc(txtime),options= list(idname="subject"))
sdata[1:10, ]

结果显示为:

attr(sdata, "tcount")

结果显示为:

sdata$age <- sdata$age -48
sdata$year <- as.numeric(sdata$accept.dt - as.Date("1967-10-01"))/365.25
# model 6 of the table in K&P
coxph(Surv(tstart, tstop, death) ~ age*trt + surgery + year,data= sdata, ties="breslow")

结果显示为:

这个例子展示了tmerge函数的一个特例,但它其实非常常见:如果是第一个创建的变量是一个事件,那么每个受试者的时间范围就是从0到事件时间:不需要显式的tstop和tstart参数。对于event,cumevent,tdc和cumtdc函数都可能有第二个参数,如果存在的话就是事件代码或时间依存协变量。如果不存在的话第二个参数则使用值1。

如果创建的变量在data1中不存在,则在调用tdc或cumtdc时的第一次定义变量前,赋予两个参数起始值为NA,调用event或cumevent时则赋予0。如果创建的变量在data1里面有,那么我们更新这个变量。但是要当心,新旧交替时出现的错误。

上面tcount结果显示所有的死亡都发生在时间间隔的后沿,这是符合预期的。有两个移植发生在第0天,并被列为第一个后续间隔的前沿。其他67例移植则在(0,最后随访时间)时间间隔内。

3.4 PBC数据

pbc数据集包含一组原发性胆汁性肝硬化(primary biliary cirrhosis,PBC)受试者的基线数据和随访状态,而pbcseq数据集包含这些受试者的重复实验室值。第一个数据集包含临床试验中312名受试者的数据加上同意遵循协议的106名受试者,第二组数据仅包含试验受试者的数据。

temp <- subset(pbc, id <= 312, select=c(id:sex, stage)) # baseline
pbc2 <- tmerge(temp, temp, id=id, death = event(time, status)) #set range
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))
fit1 <- coxph(Surv(time, status==2) ~ log(bili) + log(protime), pbc)
fit2 <- coxph(Surv(tstart, tstop, death==2) ~ log(bili) + log(protime), pbc2)
rbind('baseline fit' = coef(fit1), 'time dependent' = coef(fit2))

结果显示如下:

如上程序所示,我们在具有变量子集的基线数据集上开始构建,但这不是tmerge函数的要求,并且用户当然可以自由跳过上面的第一步并直接从数据集pbc构建pbc2。

胆红素(bilirubin)和凝血酶原(prothrombin)的时间系数在时间依存分析中略大于仅使用基线值的拟合值。在这种自身免疫疾病中,肝损伤稳定进展,伴随着这两种功能障碍标志物的稳定上升。基线分析获取患者在初始患病状态,时间依存分析则能够解释那些进展更快的患者。在pbc数据集中设置状态变量status为0 =censored,1 =liver transplant,2 =death;上述分析模型就是分析到各状态的时间。 但是要注意,在PBC数据集研究时,肝移植仍处于初期阶段,因此可以看到19/312受试者随机接受该手术。在现代,有更多的等待接受者而不是器官,并且可获得的肝脏将移植给那些病情最严重的患者;censoring移植将是一个不可解释的结果。

默认情况下,data2中有任何时间或值的缺失时tmerge都会默认忽略更新。在pbcseq数据集中,有些碱性磷酸酶(phosphotase)值缺少观察结果。这种行为的结果是pbc2数据集有效地使用了前一个alk.phos的值,替换了那些缺失值。例如,6号受试者的总跟踪长度为2503天,并且在第1492和2453天alk.phos值分别为682和NA;在最终数据集中,它从第1492天到最后一直都赋值为682。可以通过将options = list(na.rm=FALSE)添加到上面的第二个调用来更改此默认设置,则(2453,2503]时间间隔内的碱性磷酸酶值将会丢失。当缺少时间时,任何tdc的调用将被忽略。

attr(pbc2, "tcount")

结果显示为:

tcount显示的结果很有趣。对于第一次腹水(ascites)增加,在随访的前沿有312个观察结果,这些是在时间为起始0天时的所有基线检测值,并且在受试者的随访间隔内进一步增加1442个检测值。后者导致增加时间端点为其每个检测日期,位于两个间隔的边界上。在pbc数据集的最后一个随访日期之后发生另外131个未缺失的碱性磷酸酶值则被忽略。没有受试者缺少胆红素的值,因此为了一些缺少腹水值的随访,增加了一些独特的断点。

pbcseq数据集的数据是在比主数据集收集的更晚。由于检测结果是患者仍然存活的某种标记,那么用一个更晚时间的检测信息来延长这138个“晚期”受试者随访时间,会不会是一个更好的分析呢?不一定。当风险集逐渐延长时,生存分析会发生奇怪的事情。 Cox模型的一个基本原则是,如果有人在某个时间间隔(s, t)被标记为“处于风险”,这意味着如果他们在该时间间隔内发生了事件,我们就会记录下来”。比如说如果有人在3000天结束了他们的初始随访,然后又在3350天进行了检查(受试者每年返回一次)。如果我们只延长那些进行测试的人的时间,然后说这个受试者在间隔期间(3000,3350)处于风险之中是错误的:如果他们在那个时间间隔内死亡,他们将不会进行实验室测试并且会未获得延期,也不会在原始pbc数据集中更新其死亡。 所以tmerge的截断规则是故意保守的,以避免产生这样的异常情况。

但是在PBC数据集的情况下,作者恰好知道所有受试者都继续进行积极的随访,包括进行进一步接受或不接受返回检查的受试者。此更新的后续信息包含在pbcseq数据中,可用于设置更宽的时间范围。然而,情况并非总是如此。通过电子系统自动添加到数据集可能特别麻烦。作者经历的一个案例涉及器官移植后患者预后的研究。病例得到了3年的积极跟进,但事件优先发生了变化而且后续工作也被重新分配。然而,州死亡指数的自动更新累计。在5年时计算的Kaplan-Meier曲线显示出3年生存率为0.9,紧接着随后在5年时急剧下降至0!这是因为根据定义,所有接受3年以上随访的受试者的死亡率为100%。

3.5 时间延长和其它选项

tmerge函数中options参数是个list,包含以下5个元素中一个或更多,它们的默认值如下:

  • idname=‘id’
  • tstartname=‘tstart’
  • tstopname=‘tstop’
  • na.rm=TRUE
  • delay=0

前三个是变量名,它们将用于添加到输出数据集的标识符,起始和终止变量。 它们只需要在一系列tmerge调用中指定一次,以便进行更改。 na.rm选项已在上面讨论过; 它只在单次tmerge调用使用tdc()和cumtdc()指令时有影响。 delay选项会导致tmerge调用中的任何tdc或cumtdc操作延迟一个固定量。 下面的最后两个tmerge调用几乎完全相同:

temp <- subset(pbc, id <= 312, select=c(id:sex, stage))
pbc2 <- tmerge(temp, temp, id=id, death = event(time, status))
pbc2a <- tmerge(pbc2, pbcseq, id=id, ascites = tdc(day, ascites),bili = tdc(day, bili), options= list(delay=14))
pbc2b <- tmerge(pbc2, pbcseq, id=id, ascites = tdc(day+14, ascites),bili = tdc(day+14, bili))

pbc2a和pbc2b的区别在于第一次调用时没有对受试者的基线值进行延迟,例如,正在受试者第一个时间点或者在此之前的一个时间的值,这样会在结果中引入一个缺失值。

更重要的问题是为什么需要延迟一个时间依存协变量。一个原因是检查反向因果关系的情况。有时,在死亡前不久测量的协变量不是死亡的预测因子,而是仅仅是已经在进行中事件的标记。一个简单的例子是时间依赖的协变量“已经电话其家人进行最后一次访问”。

通过代码的错误可能会出现更微妙的偏差。对于包含构造的时间依存协变量的任何数据集,在向关键变量添加7-14天滞后后重新运行分析已成为作者的惯例。结果显示出实质性变化并不罕见,而理解为什么会发生这种变化则是关键步骤。即使没有实际性的错误,人们也不得不质疑该协变量的价值,因为该协变量可以预测下周内的死亡,但在更长时间内的预测则失败。

3.6 累计事件

cumevent操作与cumtdc有几个方面的不同。 假设我们有一个受试者在随访间隔为0到20天中,在第5,10和15天有一种类型的结果,而在第6和第15时有另一种类型。为了说明,我将称为第一个事件’asthma ‘和第二个’IBD’(一种炎症性肠病)。 结果数据集将具有以下形式:
cumevent

interval cumtdc asthma cumtdc IBD cumevent asthma cumevent IBD
(0, 5] 0 0 1 0
(5, 6] 1 0 0 1
(6, 10] 1 1 2 0
(10, 15] 2 1 3 2
(15, 20] 3 2 0 0

事件发生在间隔的末尾,而且时间依存协变量会在下一时间间隔变更为新的值。 更重要的是,时间依存协变量持续存在而事件不存在,则一个cumevent操作只是简单的改变事件的标签。

刺激我们做tmerge函数的是一个特殊的问题:Rochester流行病学项目追踪了自1965年至今的明尼苏达州Olmsted县的所有受试者。 对于这个累积合并症的调查,我们有三个数据集:

  • 基数:性别和出生日期等人口统计数据
  • 时间表:当每个受试者是该县居民时的一行或多行年龄间隔数据。 重要的变量是id,age1和age2; 每对(age1,age2)标志着居住的间隔。 不相交的间隔并不罕见。
  • 结果:每个感兴趣的输出结果首次出为一行。 我们感兴趣的输出结果是由美国NIH的一项特定研究定义的20种合并症。

由此构建数据的结构如下所示。 (遗憾的是,此示例的数据不能包含在survival库中,因此以下显示代码不能被执行。)

newd <- tmerge(data1=base, data2=timeline, id=repid, tstart=age1,tstop=age2, options(id="repid"))
newd <- tmerge(newd, outcome, id=repid, mcount = cumtdc(age))
newd <- tmerge(newd, subset(outcome, event='diabetes'),diabetes= tdc(age))
newd <- tmerge(newd, subset(outcome, event='arthritis'),arthritis= tdc(age))

第一次调用tmerge会将每次观察的时间线添加到基线数据中。因此,第一次调用tmerge时的data1和data2都必须包含id变量的副本(此处为repid),并且data1被约束为每个id值只有一行,因为受试者只有一个基线。每个后续调用都会向数据集添加一个新变量。例如,第二行创建一个协变量,该协变量是迄今为止每个受试者的合并症数量的累积计数。第三行用tdc()产生一个糖尿病时间依存协变量,其值一直为0,直至到糖尿病年龄后为1。第四行类似产生一个关节炎的时间依存协变量。

如果在受试者的随访间隔开始之前开始的时间依存协变量,或在时间间隔中间的间断时期内发生的时间依存协变量,那么它们不会在今后的记录中记录该值。在间断时期内发生的事件也不会被计算在内。理由是,一个受试者居住在县内的这段时间内,我们希望变量“以前的糖尿病诊断”是准确的,即使该诊断发生在受试者不是居民之前。对于时间线以外的事件,我们无法知道适当的比较组是谁,因此必须忽略这些事件。正式地,风险集将是所有非居民的集合,如果他们在同一年龄发生过一次事件,我们会发现它,因为他们以后会搬到县里,在这里遇到医疗,并把这个事件写入他们病历的“先前条件”部分。

后接“Cox模型中的时间依存协变量和时间依存系数(R语言)第二部分”
本文译自Terry Therneau, Cynthia Crowson, Elizabeth Atkinson. Using Time Dependent Covariates and Time Dependent Coecients in the Cox Model. November 26, 2018.
未经同意请勿转载

Cox模型中的时间依存协变量和时间依存系数(R语言)第一部分相关推荐

  1. R语言使用dplyr包的group_by函数和summarise函数基于分组变量计算分析中涉及的所有协变量的均值(Difference in means of covariates)

    R语言使用dplyr包的group_by函数和summarise函数基于分组变量计算分析中涉及的所有协变量的均值(Difference in means of covariates) 目录

  2. R语言使用aov函数进行单因素协方差分析(One-way ANCOVA)、使用HH包中的ancova函数可视化单因素协方差分析中的因变量、协变量和因子之间关系的图

    R语言使用aov函数进行单因素协方差分析(One-way ANCOVA).使用HH包中的ancova函数可视化单因素协方差分析中的因变量.协变量和因子之间关系的图(Visualizing the re ...

  3. 广义相加模型(GAM)与向前逐步选择算法(基于R语言)

    广义相加模型(GAM)与向前逐步选择算法(基于R语言) 一.题目 (a)使用College数据集,以Outstate作为响应变量,其余作为预测变量,使用逐步回归得到一组合适的预测变量的子集. (b)将 ...

  4. R(2)时间序列分析及应用之TSA安装(R语言)

    本文原文连接: http://blog.csdn.net/freewebsys/article/details/45830613 转载请注明出处! 1,关于时间序列 时间序列分析(Time serie ...

  5. 广义线性回归模型之0,1变量回归(logit/probit回归)—R语言实现

    1.广义线性回归 广义线性模型有三个组成部分: (1) 随机部分, 即变量所属的指数族分布 族成员, 诸如正态分布, 二项分布, Poisson 分布等等. (2) 线性部分, 即 η = x⊤β. ...

  6. R语言潜类别混合效应模型(Latent Class Mixed Model ,LCMM)分析老年痴呆年龄数据

    最近我们被客户要求撰写关于混合效应模型的研究报告,包括一些图形和统计输出. 背景和定义 线性混合模型假设 N 个受试者的群体是同质的,并且在群体水平上由独特的曲线 Xi(t)β 描述.相比之下,潜在类 ...

  7. R语言回归模型诊断、离群值分析学生考试成绩、病人医护质量满意度、婴儿死亡率和人均收入、针叶树荫面积数据

    最近我们被客户要求撰写关于回归的研究报告,包括一些图形和统计输出. 一些标准的图形工具可以极大地帮助理解数据集并评估所建议模型的质量. 学生考试成绩 例如,数据集包含600个观察结果,用于国家统计教育 ...

  8. 在r中弄方差分析表_医学统计与R语言: qvalue

    微信公众号:医学统计与R语言如果你觉得对你有帮助,欢迎转发 (FalseDiscoveryRate(FDR)=Expected(FalsePositive/(FalsePositive+TruePos ...

  9. R语言hdnom包进行高维惩罚 Cox 回归模型绘制列线图-校准曲线-时间依赖ROC-外部验证

    Hdnom包可以用于用于给高维数据构建Cox 模型.绘制列线图-校准曲线-时间依赖ROC-外部验证,而且Hdnom包简化了建模过程,带有自动选择变量功能,将用户从繁琐且容易出错的调参过程中解放出来. ...

  10. r语言 svycoxph_R语言-Cox比例风险模型

    Cox比例风险模型(cox proportional-hazards model),简称Cox模型 是由英国统计学家D.R.Cox(1972)年提出的一种半参数回归模型.该模型以生存结局和生存时间为应 ...

最新文章

  1. 浙大pat1009题解
  2. 解决git提交时报“there are no staged files”
  3. 【Android开发】构建Android源码编译环境
  4. 【AI不惑境】数据压榨有多狠,人工智能就有多成功
  5. js弹出对话框的方法总结
  6. 基于React和SpringBoot的快速开发模板QuickAdmin
  7. 《iOS9开发快速入门》——第1章,第1.4节小结
  8. tensorflow reduce系列函数(tf.reduce_mean, tf.reduce_sum, tf.reduce_prod, tf.reduce_max, tf.reduce_min)
  9. MongoDB可视化工具RoboMongo----Windows安装
  10. AE一键去黑底的插件UnMult
  11. 2021年下半年软考信息安全工程师下午案例题及解析
  12. python闲鱼监控_推荐一个可玩的爬虫开源项目-闲鱼部分我已经测试过
  13. C# *未能找到类型“ * ”,请确保已引用包含此类型的程序集。如果此类型为开发项目的一部分,请确保已使用针对当前平台或任意 CPU 的设置成功生成该项目
  14. (转载)小米9开发者选项在哪里怎么打开
  15. flipboard的翻页效果的实现
  16. Java资源大全中文版
  17. unity接入声网音频sdk
  18. Spring和SpringMVC架构
  19. B03 - 006、scp
  20. 笔记:Java中HashMap集合与ArrayList集合嵌套

热门文章

  1. 机器学习指标_20种流行的机器学习指标第2部分排名统计指标
  2. python 进行文本情感分析
  3. python分析 【都挺好】小说任务关系
  4. 超声波测距原理与实现
  5. 解决IPOD NANO7无法开机
  6. 软回车和硬回车 MS高级office
  7. 涠洲岛日出日落时间表_涠洲岛日出日落
  8. 石家庄地铁站项目最终总结报告
  9. Udacity DNN
  10. 一个叫 team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球对,现在四个球对进行比赛,用一条sql 语句显示所有可能的比赛组合.