我正在尝试运行一个非比例的cox回归模型,该模型具有与时间变量的交互,如Singer和Willett的 Applied Longitudinal Data Analaysis 的第15章(第15.3节)中所述。但是我似乎无法得到与本书一致的答案。
本书中使用的数据和源代码由fantastic website提供。不幸的是,最后一章没有提供R代码,并且为文本中讨论的示例提供的R的数据集不完整,并且为最简单的模型(我 知道如何运行)提供了错误的答案。相反,要获取此示例的完整数据集,必须单击“下载”#39;链接在' SAS'列(具有正确的数据集)然后,在安装haven
包(允许读取外来数据格式)之后,通过以下方式读入相关数据集:
haven::read_sas("alda/lengthofstay.sas7bdat")
此数据集表示参与者' (变量ID
)住院期间的住院时间(变量DAYS
)。审查变量为CENSOR
。研究人员假设两种不同类型的治疗方法(二元变量TREAT
)可以预测治疗结束后危险的差异值。此外,他们预计危险之间的组间差异不随时间不变,因此需要创建交互项。我可以使用简单的主效果模型,返回书中报告的相同危险系数(这是我最终发现R代码提供的.csv文件不完整)。
summary(modA <- coxph(Surv(DAYS,1-CENSOR) ~ TREAT, data = los))
coef exp(coef) se(coef) z Pr(>|z|)
TREAT 0.1457 1.1568 0.1541 0.945 0.345
我尝试按照here和here列出的程序,以及其中列出的来源(例如,survival
包中的时变协变量的Therneau插图),以及当然,当我复制粘贴别人的代码并运行它时,一切正常。但是我试图用自己的数据集从头开始为自己做这个,我可以将它与我的结果进行比较。我无法让它发挥作用。
首先我创建了一个EVENT变量
los$EVENT <- 1 - los$CENSOR
数据集中存在导致问题的重复ID号。所以我们必须将其更改为新的ID号
los$ID[which(duplicated(los$ID))] <- 842
现在,根据我阅读here和here的内容,需要对数据框进行拆分,以便每个参与者都有一行表示每个点之前的EVENT
状态当任何其他参与者遇到事件时,他们的事件(或审查)时间。因此,我们需要创建所有唯一事件时间的向量,然后在这些事件时间上分割数据集
cutPoints <- sort(unique(los$DAYS[los$EVENT == 1]))
# now split the dataset
longLOS <- survSplit(Surv(DAYS,EVENT)~ ., data = los, cut = cutPoints)
# and (just because I'm anal) rename the interval upper bound column (formerly "DAYS")
names(longLOS)[5] <- "tstop"
当我查看这个数据集时,它似乎就是我所追求的,其中(1)每个参与者的行数与在数据集中的其他任何人经历事件时事件发生时间之前的间隔一样多,(2)两列指示每个间隔的下限和上限,以及(3)当受访者没有遇到事件时所有行都为0的事件列,以及当他们遇到事件时最后一行中为1或者是审查。
接下来,我创建了与时间互动的变量,从&#39;区间上限减去1&#39;因此,TREAT
的主要作用代表住院第一天的治疗效果。
longLOS$TREATINT <- longLOS$EVENT*(longLOS$tstop - 1)
运行模型
summary(modB <- coxph(Surv(tstart, tstop, EVENT) ~ TREAT + TREATINT, data = longLOS))
但它不起作用!我得到了(相当无用的)错误消息
Error in fitter(X, Y, strats, offset, init, control, weights = weights, :
routine failed due to numeric overflow.This should never happen. Please contact the author.
我做错了什么?我已经慢慢地在Singer和Willett工作了近三年(我还是一名研究生时开始),现在最后一章证明是迄今为止我最大的挑战。我有三十页要去;任何帮助都会令人难以置信。
答案 0 :(得分:1)
我弄清楚我做错了什么。我创建交互变量TREATINT
时出现了一个愚蠢的错误。而不是
longLOS$TREATINT <- longLOS$EVENT*(longLOS$tstop - 1)
应该是
longLOS$TREATINT <- longLOS$TREAT*(longLOS$tstop - 1)
现在运行模型
summary(modB <- coxph(Surv(tstart, tstop, EVENT) ~ TREAT + TREATINT, data = longLOS))
它不仅有效,而且产生的系数与Singer和Willett书中报道的系数相符。
coef exp(coef) se(coef) z Pr(>|z|)
TREAT 0.706411 2.026705 0.292404 2.416 0.0157
TREATINT -0.020833 0.979383 0.009207 -2.263 0.0237
鉴于我的错误是多么愚蠢,我很想删除整个帖子,但我想我会把它留给像我这样想知道如何与R中的时间Cox模型进行交互的其他人。