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

使用R检测分组观测数据的不连续性(无需均值/中位数参考)

分组检测数据不连续性(无均值/中位数参考)

问题背景

针对分组数据,需要识别每组内观测值的不连续点,要求检测方法不依赖均值或中位数作为参考基准。

原始数据

id<-c("a","a","a","a","a","a","b","b","b","b","b","b")
d<-c(1,2,3,90,98,100000,4,6,7,8,23,45)
df<-data.frame(id,d)

检测思路

采用相邻差值的分位数异常检测法:不连续性通常表现为相邻观测值的差值突然大幅跃升,我们通过每组内差值的四分位距(IQR)确定异常阈值,识别超出阈值的差值对应的观测点,全程无需用到均值或中位数。

实现代码

library(dplyr)

df_result <- df %>%
  group_by(id) %>%
  mutate(
    # 计算当前观测与前一观测的差值
    diff_d = d - lag(d),
    # 计算差值的四分位距(IQR)
    diff_iqr = IQR(diff_d, na.rm = TRUE),
    # 计算异常差值的阈值:上四分位数 + 1.5倍IQR
    diff_threshold = quantile(diff_d, 0.75, na.rm = TRUE) + 1.5 * diff_iqr,
    # 标记当前观测是否为不连续点
    is_discontinuous = ifelse(diff_d > diff_threshold, TRUE, FALSE)
  ) %>%
  ungroup()

# 输出结果
print(df_result)

结果说明

执行代码后会得到包含标记列is_discontinuous的数据框:

  • id="a"组中,第4个观测(90)、第6个观测(100000)会被标记为TRUE,对应差值87、99902均远超组内差值的异常阈值;
  • id="b"组中,第5个观测(23)会被标记为TRUE,对应差值15超出阈值。

该方法通过分位数定义异常范围,不受极端值干扰,精准定位分组内的突变型不连续点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:25:56