使用Anomalize包检测异常时遇Date索引周期限制错误求助
解决Anomalize包中Date索引的周期参数错误问题
我来帮你拆解这个问题并给出可行的修复方案:
错误原因分析
报错信息Only year, quarter, month, week, and day periods are allowed for an index of class Date很明确:当时间索引是Date类型时,time_decompose的trend参数只能传入单一的周期单位(比如"month"),不能用"2 months"这种带数字前缀的格式。你原本想指定2个月的趋势窗口,但用错了参数形式。
另外,你的数据是按date和acc_id聚合的多组时间序列(每个acc_id对应一条独立的时间线),直接全局处理会把所有组的数据混在一起,必须按acc_id分组后逐个处理才合理。
修正后的代码方案
1. 基础修复(分组处理+参数修正)
library(tidyverse) library(tibbletime) library(anomalize) # 先按acc_id和date排序,保证时间序列的顺序正确 x <- x %>% arrange(acc_id, date) # 按acc_id分组,对每个用户的时间序列单独执行异常检测 x_anomalized <- x %>% group_by(acc_id) %>% # 用trend指定周期单位为"month",trend_window设置窗口大小为2 time_decompose(count, method = "twitter", trend = "month", trend_window = 2) %>% anomalize(remainder, method = "gesd") %>% time_recompose() %>% ungroup() # 按acc_id分面绘制异常检测结果 x_anomalized %>% plot_anomalies(time_recomposed = TRUE, facet_vars = acc_id)
2. 可选:补全缺失日期(优化时间序列规则性)
如果部分acc_id存在日期缺失的情况,建议先补全时间序列,避免分解过程出现异常:
x <- x %>% group_by(acc_id) %>% # 按天补全缺失的日期 pad_by_time(date, .by = "day") %>% # 将缺失的count值替换为0(可根据业务需求调整) mutate(count = replace_na(count, 0)) %>% ungroup()
关键说明
trend参数:仅用于指定周期单位(year/quarter/month/week/day),不能带数字;trend_window参数:专门用来设置趋势窗口的大小,trend_window = 2就对应你需要的2个月窗口;- 多组时间序列必须按分组字段(这里是
acc_id)拆分处理,否则会破坏每组时间序列的独立性。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

