在R中创建具有时变协变量的计数过程数据集
我正在阅读Singer和Willett的《应用纵向数据分析》第15章,内容是扩展Cox回归模型,但加州大学洛杉矶分校的网站上没有这一章的示例R代码。我试图重新创建关于时变协变量的部分,并且一直在讨论如何从提供的个人级别数据框架创建计数过程数据集。我查看了在R中创建具有时变协变量的计数过程数据集,r,survival-analysis,survival,R,Survival Analysis,Survival,我正在阅读Singer和Willett的《应用纵向数据分析》第15章,内容是扩展Cox回归模型,但加州大学洛杉矶分校的网站上没有这一章的示例R代码。我试图重新创建关于时变协变量的部分,并且一直在讨论如何从提供的个人级别数据框架创建计数过程数据集。我查看了生存软件包的小插曲,但在创建自己的数据集时遇到了问题。以下是根据Singer和Willett的例子模拟的玩具数据,这些数据预测了17至40岁男性首次使用可卡因的时间id是id,ageInit是首次使用可卡因或审查的年龄,used是事件日志,指示首
生存
软件包的小插曲,但在创建自己的数据集时遇到了问题。以下是根据Singer和Willett的例子模拟的玩具数据,这些数据预测了17至40岁男性首次使用可卡因的时间id
是id,ageInit
是首次使用可卡因或审查的年龄,used
是事件日志,指示首次使用可卡因(1
)或审查(0
)。有一个时间不变的预测器earlyMJ,指示17岁之前使用大麻。还有三个时变协变量需要通知数据集的创建:timeMJ
,这是17岁以后首次使用大麻的年龄,sellMJ
这是销售大麻的年龄,odFirst
,这是首次使用其他药物的年龄<这些预测因子中的code>NAs表明参与者在任何时候都没有执行相关操作
set.seed(1356)
df <- data.frame(id = 1:6,
ageInit = c(25,34,40,29,27,40),
used = c(0,1,1,0,1,1),
earlyMJ = c(0,0,1,0,1,1),
timeMJ = c(18,27,22,21,22,19),
sellMJ = c(NA,NA,25,NA,35,NA),
odFirst = c(19,22,35,NA,22,34))
我们将这个新数据与原始数据集合并,通过event()
调用创建两个新列,表示每个协变量的时间间隔。我们还通过tdc()
调用为每个参与者每次经历一个协变量事件时创建一个新行
sdata <- tmerge(df, tdata,
id=id,
firstUse = event(futime, usedCocaine),
t1MJ = tdc(timeToFirstMJ),
t1SMJ = tdc(timeToSellMJ),
t1OD = tdc(timeToFirstOD),
options= list(idname="subject"))
attr(sdata, "tcount")
并得到无意义系数和警告信息
In fitter(X, Y, strats, offset, init, control, weights = weights, :
Loglik converged before variable 1,3 ; beta may be infinite.
此外,我甚至不知道这是否是一个正确的计数过程数据帧,因为在Singer和Willett中,他们建议每次数据集中有人经历事件时,每个参与者都需要有一行
对于这些问题的任何指导都将不胜感激。一个良好的开端是生存
包中的小插曲
问题是,当我运行Cox回归时,使用时不变和一些时变协变量,我无法使模型工作
乍一看,您所做的似乎是正确的,但可能只是因为您只有6个人和3个参数需要估计
获取无意义系数和警告消息
In fitter(X, Y, strats, offset, init, control, weights = weights, :
Loglik converged before variable 1,3 ; beta may be infinite.
这个警告很有道理。两个参数估计值的标准误差大于1000。见下文
此外,我甚至不知道这是否是一个正确的计数过程数据帧,因为在Singer和Willett中,他们建议每次数据集中有人经历事件时,每个参与者都需要有一行
这在coxph
中进行内部处理
这是我的代码来重现你的结果
#####
#设置数据
df
#R> n=17,事件数=4
#R>
#R> coef exp(coef)se(coef)z Pr(>z)
#R> 早期MJ 2.047e+017.792e+082.791e+040.001 0.999
#R> t1SMJ 4.744e-16 1.000e+00 1.414e+00 0.000 1.000
#R> t1OD 4.157e+01 1.136e+18 3.883e+04 0.001 0.999
#R>
#R> exp(coef)exp(-coef)lower.95 upper.95
#R> 早期MJ 7.792e+08 1.283e-09 0.00000 Inf
#R> t1SMJ 1.000e+00 1.000e+00 0.06255 15.99
#R> t1OD 1.136e+18 8.806e-19 0.00000 Inf
#R>
#R> 一致性=1(se=0.258)
#R> Rsquare=0.273(最大可能值=0.33)
#R> 3个df的似然比检验=5.42,p=0.1437
#R> 3个df上的瓦尔德试验=0,p=1
#R> 3个df的得分(对数秩)检验=4.14,p=0.2463
一个好的开始是生存计划中的小插曲
问题是,当我运行Cox回归时,使用时不变和一些时变协变量,我无法使模型工作
乍一看,您所做的似乎是正确的,但可能只是因为您只有6个人和3个参数需要估计
获取无意义系数和警告消息
In fitter(X, Y, strats, offset, init, control, weights = weights, :
Loglik converged before variable 1,3 ; beta may be infinite.
这个警告很有道理。两个参数估计值的标准误差大于1000。见下文
此外,我甚至不知道这是否是一个正确的计数过程数据帧,因为在Singer和Willett中,他们建议每次数据集中有人经历事件时,每个参与者都需要有一行
这在coxph
中进行内部处理
这是我的代码来重现你的结果
#####
#设置数据
df
#R> n=17,事件数=4
#R>
#R> coef exp(coef)se(coef)z Pr(>z)
#R> 早期MJ 2.047e+017.792e+082.791e+040.001 0.999
#R> t1SMJ 4.744e-16 1.000e+00 1.414e+00 0.000 1.000
#R> t1OD 4.157e+01 1.136e+18 3.883e+04 0.001 0.999
#R>
#R> exp(coef)exp(-coef)lower.95 upper.95
#R> 早期MJ 7.792e+08 1.283e-09 0.00000 Inf
#R> t1SMJ 1.000e+00 1.000e+00 0.06255 15.99
#R> t1OD 1.136e+18 8.806e-19 0.00000 Inf
#R>
#R> 一致性=1(se=0.258)
#R> Rsquare=0.273(最大可能值=0.33)
#R> 3个df的似然比检验=5.42,p=0.1437
#R> 3个df上的瓦尔德试验=0,p=1
#R> 3个df的得分(对数秩)检验=4.14,p=0.2463
谢谢@Benjamin Christofferson。因此,问题在于我创建的数据不好,而不是我设置计数过程数据集本身的失败?因此@Benjamin Christoffersen我可以直截了当地说:新计数过程数据集中的每个时变协变量在所有行中都应该有0,直到协变量事件发生的间隔,那么在这个间隔之后所有列中都有1?是的。在你的例子中,协变量最多改变一次。对不起,我的意思是“在该间隔之后的所有行中”,但我想你知道我的意思。感谢本杰明·克里斯托弗森。因此,问题在于我拙劣的创作