R中的离散时间事件历史(生存)模型


10

我正在尝试在R中拟合离散时间模型,但不确定如何执行。

我读过您可以将因变量组织在不同的行中,每个时间观察行一个,并将该glm函数与logit或cloglog链接一起使用。从这个意义上讲,我有三列:IDEvent(在每个时间范围内为1或0)和Time Elapsed(自观察开始以来)以及其他协变量。

如何编写适合模型的代码?哪个因变量?我想我可以将其Event用作因变量,并将其包括Time Elapsed在协变量中。但是,会发生什么ID呢?我需要吗?

谢谢。


当您说“我正在尝试拟合离散时间模型”时...您想拟合哪种模型?(如果这是针对某些主题的,请添加self-study标签。)
Glen_b -Reinstate Monica13 2013年

我想拟合logit离散时间生存模型。
Fran Villamil

1
ID似乎不太可能相关,但是它取决于什么,它代表什么以及是否要建模。
Glen_b-恢复莫妮卡

Answers:


8

您基本上对数据组织是正确的。如果您的案件组织如下:

ID M1 M2 M3 EVENT

您可能需要重新组织数据,使其看起来像这样:

ID TIME EVENT
1  1    0
1  2    1
1  3    1
2  1    0
2  2    0
.  .    .
.  .    .

我称此为从宽格式到长格式的转换。使用该reshape()功能可以轻松地在R中完成,甚至可以通过reshape2包装轻松完成。

我个人将保留该ID领域在确定混合效应模型中变异来源方面的潜在用途。但这不是必需的(如@BerndWeiss所指出)。以下假设您要这样做。如果不是,则使用glm(...,family=binomial)没有随机效应项的相似模型。

lme4R中的软件包将适合与您所讨论的模型类似的混合效应逻辑回归模型,只是具有一或两个随机效应以说明各个主题之间的系数差异(ID)。如果您的数据存储在名为的数据框中,则以下示例代码将用于拟合示例模型df

require(lme4)
ans <- glmer(EVENT ~ TIME + (1+TIME|ID), data=df, family=binomial)

此特定模型允许TIMEintercept系数在ID中随机变化。换句话说,这是嵌套在个人中的分层线性混合测量模型。

一的另一种形式的离散时间事件历史模型断裂TIME成离散的假人和配合各自作为一个参数。这本质上是Cox PH模型的离散情况,因为危险曲线不限于线性(或二次,或者您可以想象转换时间)。虽然,TIME如果有很多离散时间段,您可能希望将它们分组为一组可管理的(即较小的)时间段。

其他替代方案包括转换时间以使危险曲线正确。先前的方法基本上可以减轻您的麻烦,但是先前的方法(为此,以及我提出的原始线性情况)没有那么简单,因为您可能有很多时间点,因此有很多麻烦的参数。

关于此主题的出色参考是Judith Singer和John Willet的《应用纵向数据分析:建模变化和事件发生》


4
您不需要“混合效应逻辑回归模型”即可估算简单的离散时间模型(Fiona Steel已发表了几篇有关“ 多级离散时间事件历史分析 ”的文章)。你有参考吗?在数据准备步骤中,我还建议您看一下survSplit函数。
Bernd Weiss 2013年

6

歌手和威利特在这个问题上已经发表了很多文章。我强烈建议您阅读他们的一些论文。您可能还希望获得他们的书“应用的纵向数据分析:建模更改和事件发生”。显然,这是该领域最好的教科书之一。

对于大多数书籍章节,都有可用的R示例代码(请参阅第11ff章),演示了如何构造数据(“个人期间格式”)以及如何分析此类数据。对于标准的离散时间模型,您不需要ID变量,也不需要估计@ndoogan建议的混合效果模型。一个简单的glm(event ~ time + ..., family = "binomial")作品就好。Singer和Willett还讨论了如何为时间变量建模的许多问题(线性,二次方...)

要再举两个我强烈推荐的参考:

  • Allison(1982):“事件历史分析的离散方法”(PDF)(Allison文章还讨论了为什么可以使用标准glm代替混合效果模型)
  • Mills(2011):“介绍生存和事件历史分析”

1

您可以将时间分成多个间隔,并像Shumway(2001)一样执行多周期logit模型。例如,您的时间间隔是(0,1],(1,2],。我已经dynamichazard::static_glm在R中实现了这一点,如果您在生存分析中使用的典型停止事件设置中具有初始数据,则可以直接使用R。请注意,所得模型的t统计量没有Shumway(2001)中提到的修正。

此方法不同于带有时间虚拟变量的@ndoogan,因为在所有时间段内,您只会获得一个公共截距dynamichazard::static_glm。但是,您可以通过dynamichazard::get_survival_case_weights_and_data使用参数进行调用来获得每个周期的虚拟对象use_weights = FALSE,将自己的时间虚拟指标添加到返回的对象中data.frame,然后调用eg glm


此外,您可能会对我的包装中的这个小插图感兴趣dynamichazard
本杰明·克里斯托弗森

0

这称为“计数过程”数据。生存软件包具有非常好的tmerge()函数。插入时间相关或累积协变量并相应地划分跟踪时间非常有用。此小插图很好地说明了此过程

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.