使用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
相关产品推荐
相关产品推荐

