根据R中的间隔[start,stop]数据估算密度 描述

根据R中的间隔[start,stop]数据估算密度 描述,r,kernel-density,survival,R,Kernel Density,Survival,这个问题的动机来自临床/流行病学研究,其中的研究通常招收患者,然后跟踪他们不同的时间长度 研究开始时的年龄分布通常令人感兴趣,且易于评估,但在研究期间的任何时候,人们偶尔会对年龄分布感兴趣 我的问题是,是否有一种方法可以根据区间数据(如[age_start,age_stop])估算这样的密度,而无需对以下数据进行扩展?长格式方法似乎不雅观,更不用说它的内存使用了 使用生存包数据的可复制示例 #####准备数据### 图书馆(生存) 图书馆(GG2) 图书馆(dplyr) 数据(冒号,包='sur

这个问题的动机来自临床/流行病学研究,其中的研究通常招收患者,然后跟踪他们不同的时间长度

研究开始时的年龄分布通常令人感兴趣,且易于评估,但在研究期间的任何时候,人们偶尔会对年龄分布感兴趣

我的问题是,是否有一种方法可以根据区间数据(如[age_start,age_stop])估算这样的密度,而无需对以下数据进行扩展?长格式方法似乎不雅观,更不用说它的内存使用了

使用生存包数据的可复制示例
#####准备数据###
图书馆(生存)
图书馆(GG2)
图书馆(dplyr)
数据(冒号,包='survival')
#使用生存包中的冒号数据集的示例
死亡百分比
#使用死亡时间数据(不重复)
过滤器(etype==2)%>%
#随访结束时的年龄(死亡或审查)
变异(年龄=年龄+(时间/365.25))
####单值分布####
#入学年龄
ggplot(死亡,不良事件(x=年龄))+
几何密度()+
实验室(title=“图1”,
x=“入职年龄(年)”,
y=“密度”)
####使用人月级数据####
#创建计数过程/人员时间数据集

ccdeath_cp您只需保存特定年龄段患者数量的累积计数,而不必计算越来越精细的时间间隔

setDT(ccdeath)
x <- rbind(
  ccdeath[, .(age = age, num_patients = 1)],
  ccdeath[, .(age = age_last, num_patients = -1)]
)[, .(num_patients = sum(num_patients)), keyby = age]

cccdeath <- x[x[, .(age = unique(age))], on = 'age']
cccdeath[, num_patients := cumsum(num_patients)]
ggplot(cccdeath, aes(x = age, y = num_patients)) + geom_step()

我将沿着以下思路继续:

如果您有兴趣了解研究中
t
天后的年龄分布,那么年龄将只是注册时的年龄加上
t
天。你需要处理那些已经死亡或被正确审查的人的例外情况。在你的例子中,你似乎在人们离开研究时将他们的年龄“冻结”。就我个人而言,我认为未经审查的幸存者的年龄分布在生存分析中更为有用,但我将坚持你在这个例子中的设置

如果
t
小于随访时间,则每个患者在
t
时的两种可能性是登记时的年龄加上
t
。否则,年龄将为登记时的年龄加上随访时间

如果你将其包装在一个函数中,你可以看到在整个研究过程中年龄分布是如何变化的。为完整起见,我们将始终绘制登记时的年龄密度图,以及一条表示当前平均年龄的线:

年龄分布%
突变(年龄t=age+ifelse(时间>t,t,time)/365.25)%>%
ggplot()+
几何密度(aes(年龄),线型=2,颜色=“灰色50”)+
几何密度(aes(年龄)+
几何线(aes(xintercept=平均值(年龄)),color=“red”,线型=2)+
实验室(x=粘贴(“日龄”,t,“研究范围”),
y=“密度”,
标题=粘贴(“研究中的年龄分布”,t,“天数”))
}
例如:

年龄分布(死亡人数,0)

1年后:

年龄分布(死亡人数,365人)

5年后:

年龄分布(死亡人数,5*365.25)

为了完整性,删除审查/死亡患者的等效功能如下:

年龄分布%
过滤器(时间>t)%>%
突变(年龄t=年龄+t/365.25)%>%
ggplot()+
几何密度(数据=df,aes(年龄),线型=2,颜色=“灰色50”)+
几何密度(aes(年龄)+
几何线(aes(xintercept=平均值(年龄)),color=“red”,线型=2)+
实验室(x=粘贴(“日龄”,t,“研究范围”),
y=“密度”,
标题=粘贴(“研究中的年龄分布”,t,“天数”))
}
因此,我们可以看到在5年的随访后,分布的形状如何变化:

年龄分布(死亡人数,5*365.25)


这更清楚地表明,在最初的队列中,老年人的损失是不成比例的。

虽然这是一个精心设计的问题,但缺乏所使用的数据集或示例数据集。此外,“研究期间任何时间的年龄分布”,这似乎不是您目前正在分析的问题。你现在看到的是年龄分布越来越大。你正在缩短
cut
中的距离,而不是(正如你的问题所暗示的)不同时间间隔中的年龄。@Oliver——你不能重现它吗?当您加载生存库时,冒号数据集应该对您可用。啊,对不起,代码示例中不清楚这一点。在示例开头添加
数据(冒号)
将使每个用户(包括我)都清楚地了解这一点在本例中使用已处理数据的问题是,用于生成数据的日期丢失。由于注册是交错的,并且年龄并非都在同一日历时间收集,因此您无法在任何给定的“实时”时间点准确确定年龄。您只能评估在“合成”时间点(参考神话时间=0)的年龄分布情况。
setDT(ccdeath)
x <- rbind(
  ccdeath[, .(age = age, num_patients = 1)],
  ccdeath[, .(age = age_last, num_patients = -1)]
)[, .(num_patients = sum(num_patients)), keyby = age]

cccdeath <- x[x[, .(age = unique(age))], on = 'age']
cccdeath[, num_patients := cumsum(num_patients)]
ggplot(cccdeath, aes(x = age, y = num_patients)) + geom_step()
smooth_param <- 12
x <- rbindlist(lapply(
  (1:smooth_param-0.5)/smooth_param,
  function(s) {
    rbind(
      ccdeath[, .(age = age+s, num_patients = 1/smooth_param)],
      ccdeath[, .(age = age_last+s, num_patients = -1/smooth_param)]
    )
  }
))[, .(num_patients = sum(num_patients)), keyby = age]

cccdeath <- x[x[, .(age = sort(unique(age)))], on = 'age']
cccdeath[, num_patients := cumsum(num_patients)]
ggplot(cccdeath, aes(x = age, y = num_patients)) + geom_step()