You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中基于时间戳重叠条件统计房颤检测方法的真阳性与假阳性?

解决ECG与PPG房颤事件的真阳性/假阳性统计问题

Hi there! No need to apologize at all—everyone starts somewhere, and this is a really practical research question. Let's break down how to solve this step by step using R.

核心思路

我们的目标是:

  • 找出PPG的Afib事件与ECG的Afib事件之间的重叠时间,判断是否≥30秒(真阳性)
  • 统计仅PPG检测到的Afib事件(假阳性)

首先,我们只需要关注两种数据集中的Afib类型事件,噪声事件暂时可以过滤掉。

步骤1:过滤Afib事件

先从原始数据中提取出房颤事件:

# 加载dplyr(如果还没加载)
library(dplyr)

# 过滤ECG和PPG中的Afib事件
ecg_afib <- ecg %>% filter(type == "Afib")
ppg_afib <- ppg %>% filter(type == "Afib")

步骤2:计算事件区间的重叠时间

我们需要一个函数来计算两个时间区间的重叠时长(单位:秒):

# 定义计算重叠时间的函数
calculate_overlap <- function(start1, end1, start2, end2) {
  # 确定重叠区间的起始和结束时间
  overlap_start <- pmax(start1, start2)
  overlap_end <- pmin(end1, end2)
  
  # 计算重叠时长(秒),无重叠则返回0
  overlap_seconds <- as.duration(overlap_end - overlap_start) %>% as.numeric("seconds")
  pmax(overlap_seconds, 0)
}

步骤3:匹配PPG与ECG的重叠事件

这里推荐使用fuzzyjoin包来高效匹配时间区间,它专门处理这种区间重叠的匹配场景:

# 安装并加载fuzzyjoin(如果还没安装)
install.packages("fuzzyjoin")
library(fuzzyjoin)

# 模糊连接PPG和ECG的Afib事件,匹配有重叠的区间
matched_events <- fuzzy_left_join(
  ppg_afib,
  ecg_afib,
  by = c("start" = "end", "end" = "start"),
  match_fun = list(`<=`, `>=`)  # 匹配条件:PPG.start ≤ ECG.end 且 PPG.end ≥ ECG.start
) %>%
  # 计算每对匹配事件的重叠时间
  mutate(overlap_sec = calculate_overlap(start.x, end.x, start.y, end.y)) %>%
  # 按每个PPG事件分组,找出该事件与所有ECG事件的最大重叠时间
  group_by(start.x, end.x) %>%
  summarise(max_overlap = max(overlap_sec, na.rm = TRUE)) %>%
  ungroup() %>%
  # 判断是否为真阳性(最大重叠≥30秒)
  mutate(true_positive = max_overlap >= 30)

步骤4:统计真阳性与假阳性数量

最后统计两类事件的数量:

# 统计真阳性数量
tp_count <- sum(matched_events$true_positive, na.rm = TRUE)
# 统计假阳性数量(PPG Afib事件中未满足真阳性条件的数量)
fp_count <- nrow(matched_events) - tp_count

# 输出结果
cat("真阳性数量:", tp_count, "\n")
cat("假阳性数量:", fp_count, "\n")

关键说明

  • 模糊连接的匹配条件确保我们只找出有重叠的事件对;
  • 按PPG事件分组取最大重叠时间,是因为一个PPG事件可能和多个ECG事件重叠,只要有一个重叠时长≥30秒,就判定为真阳性;
  • 如果某个PPG事件没有匹配到任何ECG事件,max_overlap会返回0(因为na.rm=TRUE),自然会被判定为假阳性,符合我们的需求;
  • 确保你的时间戳时区一致(你之前用tz=Sys.timezone()设置过,这一点做得很好)。

内容的提问来源于stack exchange,提问作者Dorothy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:56:07