根据R中的间隔[开始,停止]数据估算密度

如何解决根据R中的间隔[开始,停止]数据估算密度

说明

这个问题的动机来自于临床/流行病学研究,其中的研究通常招募患者,然后随访患者不同的时间长度。

进入研究时的年龄分布通常是令人感兴趣的,并且易于评估,但是偶尔有兴趣在研究过程中的任何时间年龄分布

我的问题是,是否有一种方法可以从间隔数据(例如[age_start,age_stop])中估算出这样的密度,而不会按如下所示扩展数据?长格式方法似乎不太美观,更不用说它的内存使用了!

使用生存包中数据的可复制示例

#### Prep Data ###
library(survival)
library(ggplot2)
library(dplyr)

data(colon,package = 'survival')
# example using the colon dataset from the survival package
ccdeath <- colon %>%
  # use data on time to death (not recurrence)
  filter(etype == 2) %>%
  # age at end of follow-up (death or censoring)
  mutate(age_last = age + (time / 365.25))

#### Distribution Using Single Value ####
# age at study entry
ggplot(ccdeath,aes(x = age)) +
  geom_density() +
  labs(title = "Fig 1.",x = "Age at Entry (years)",y = "Density")

#### Using Person-Month Level Data ####
# create counting-process/person-time dataset
ccdeath_cp <- survSplit(Surv(age,age_last,status) ~ .,data = ccdeath,cut = seq(from = floor(min(ccdeath$age)),to = ceiling(max(ccdeath$age_last)),by = 1/12))

nrow(ccdeath_cp) # over 50,000 rows

# distribution of age at person-month level
ggplot(ccdeath_cp,aes(x = age)) +
  geom_density() +
  labs(title = "Figure 2: Density based on approximate person-months",x = "Age (years)",y = "Density")

#### Using Person-Day Level Data ####
# create counting-process/person-time dataset
ccdeath_cp <- survSplit(Surv(age,by = 1/365.25))

nrow(ccdeath_cp) # over 1.5 million rows!

# distribution of age at person-month level
ggplot(ccdeath_cp,aes(x = age)) +
  geom_density() +
  labs(title = "Figure 3: Density based on person-days",y = "Density")

Figure 1

Figure 2

Figure 3

注意:虽然我将这个问题标记为“生存”是因为我认为它会吸引熟悉该领域的人们,但我对这里的活动时间不感兴趣,而只是对所有学习时间的总体年龄分布感兴趣。 / p>

解决方法

可以计算特定年龄的患者人数的累积计数,而不必计算越来越精细的时间间隔

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()

enter image description here

锯齿模式是因为假定每个患者都始于整数年龄。对如何使它变得平滑并提出了这个想法有一些想法-给给定的ageage+1之间的一组均匀间隔的年龄分配相等的概率。你得到这样的东西,

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)],.(age = age_last+s,num_patients = -1/smooth_param)]
    )
  }
))[,.(age = sort(unique(age)))],y = num_patients)) + geom_step()

enter image description here

,

我将遵循以下原则:

如果您有兴趣了解研究中t天之后的年龄分布,则该年龄就是入学年龄加上t天。您需要处理那些已去世或已被右删截的例外。在您的示例中,您似乎在人们离开研究之时就“冻结了”年龄。我个人认为,未经审查的幸存者的年龄分布在生存分析中更为有用,但在本例中,我将坚持您的设置。

然后,在t时每个患者的两种可能性是,如果t小于随访时间,则在入组时要加上年龄t。否则,年龄将为入学年龄加上随访时间。

如果将其包装在函数中,则可以查看整个研究中年龄分布的变化。为了完整起见,我们将始终在注册时绘制微弱的年龄密度,并用一条线表示当前的平均年龄:

age_distribution <- function(df,t = 0)
{
  df %>% 
    mutate(age_at_t = age + ifelse(time > t,t,time) / 365.25) %>%
    ggplot() +
    geom_density(aes(age),linetype = 2,colour = "gray50") +
    geom_density(aes(age_at_t)) +
    geom_vline(aes(xintercept = mean(age_at_t)),color = "red",linetype = 2) +
    labs(x = paste("Age at day","of study"),y = "Density",title = paste("Age distribution after","days in study"))
}

例如,

age_distribution(ccdeath,0)

enter image description here

一年后:

age_distribution(ccdeath,365)

enter image description here

5年后:

age_distribution(ccdeath,5 * 365.25)

enter image description here

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

age_distribution <- function(df,t = 0)
{
  df %>% 
    filter(time > t) %>%
    mutate(age_at_t = age + t / 365.25) %>%
    ggplot() +
    geom_density(data = df,aes(age),"days in study"))
}

所以我们可以看到5年的随访后分布的形状如何变化:

age_distribution(ccdeath,5 * 365.25)

enter image description here

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res