如何设置数据使用reda包Recur函数研究重复事件并解决报错
问题原因分析
第一个报错:Subjects having events at or after censoring: 1, 2
reda包的Recur函数要求每个个体(此处为Location)的最后一个时间区间必须是截尾记录(event=0),用于明确观察终止节点。但你的数据存在两个问题:
- Location 1的最后一行event=1,意味着该区间内发生故障后无后续截尾记录,系统判定为“截尾后仍有事件”
- Location 2仅包含一段event=1的区间,缺少截尾记录,违反数据结构规则
第二个报错:Error in if (s[length(s)] > 0.5) {: missing value where TRUE/FALSE needed
Location 3存在连续的截尾区间(第7、8行均为event=0),截尾代表观察已终止,后续不应再添加新的观察区间,这种重复截尾的结构不符合Recur的要求。
修正数据并解决问题的步骤
步骤1:清理无效的连续截尾记录
删除Location 3的第三行(多余的截尾区间),因为截尾后观察已结束,无需再添加后续区间:
# 移除Location3的第三段截尾记录 clean_data <- reprex.data[-8,]
步骤2:补全个体的截尾记录
为Location 1和Location 2添加截尾区间,明确观察终止时间(此处假设研究终止时间为现有数据的最大tstop值2790,可根据实际研究周期调整):
# 为Location1添加截尾区间:从最后一次故障时间2790到观察终止时间2790 clean_data <- rbind(clean_data, data.frame(Location=1, tstart=2790, tstop=2790, event=0)) # 为Location2添加截尾区间:从故障时间138到观察终止时间2790 clean_data <- rbind(clean_data, data.frame(Location=2, tstart=138, tstop=2790, event=0)) # 按Location和tstart排序,确保时间顺序正确 clean_data <- clean_data[order(clean_data$Location, clean_data$tstart),]
步骤3:使用修正后的数据调用Recur函数
现在可正常调用Recur并执行summary:
library(reda) # 创建重复事件对象 recur_obj <- with(clean_data, Recur(tstart %to% tstop, id = Location, event = event, check = "hard")) # 查看结果 recur_obj #> [1] 1: (0, 790], (790, 2177], (2177, 2790], (2790, 2790+] #> [2] 2: (0, 138], (138, 2790+] #> [3] 3: (0, 582], (582, 1948+] #> [4] 4: (0, 119], (119, 362], ..., (1174, 2050+] # 执行summary summary(recur_obj)
关键数据规则总结
使用reda::Recur时,重复事件数据必须满足:
- 每个个体的时间区间连续无重叠,从0开始依次推进
- 每个个体的最后一个区间必须是截尾记录(event=0),明确观察终止
- 不允许出现连续的截尾区间,截尾后不应再有后续观察区间
内容的提问来源于stack exchange,提问作者David H
相关产品推荐
相关产品推荐

