3

我尝试使用AnomalyDetectionTs()来自https://github.com/twitter/AnomalyDetectionhttps://www.r-bloggers.com/anomaly-detection-in-r/library(AnomalyDetection)的 数据。在我的示例数据中,有非常摆动的值在图上没有下降曲线(或像模式一样缓慢下降)而不是它应该从它的模式。这个功能对我不起作用。该函数检测到的所有异常点都是正确的和正常的值。

这是函数的结果:在此处输入图像描述

我的示例数据:https ://raw.githubusercontent.com/ieatbaozi/R-Practicing/master/example.csv

df <- read.csv(url("https://raw.githubusercontent.com/ieatbaozi/R-Practicing/master/example.csv"),header = TRUE,stringsAsFactors = FALSE)
df$DateTime <- as.POSIXct(df$DateTime)

library(AnomalyDetection)
ADtest <- AnomalyDetectionTs(df, max_anoms=0.1, direction='both', plot=TRUE)
ADtest$plot

这是我的预期结果: 在此处输入图像描述 如何检测那些异常数据?

如何通过填充最合适的值来修复这些值?平滑它们以接近它们周围的图案,并且在修复这些值后,所有数据的总值仍然相同。

我的额外问题是:你有什么想法找到它的模式吗?我可以给你更多的信息。非常感谢你的帮助。

4

1 回答 1

2

这是一个可能的解决方案。

  1. 计算每个点周围小窗口的平均值(滚动平均值)
  2. 计算实际值与局部平均值之间的差值。
  3. 计算步骤 2 中所有差异的标准差。
  4. 将那些与局部平均值的标准差超过 X 的点标记为异常值。

使用这种方法,我得到了您正在寻找的点以及其他一些点 - 从非常低的值过渡到非常高的值的点。您也许可以过滤掉那些。

代码

library(zoo)        ## For rolling mean function

WindowSize = 5
HalfWidth = (WindowSize-1)/2

SD = sqrt(mean((rollmean(df$Val, WindowSize ) - 
    df$Val[-c(1:HalfWidth, (nrow(df)+1-(1:HalfWidth)))])^2))
Out = which(abs(rollmean(df$Val, WindowSize ) - 
    df$Val[-c(1:HalfWidth, (nrow(df)+1-(1:HalfWidth)))]) > 2.95*SD) + 2

plot(df, type="l")
points(df[Out,], pch=16, col="red")

时间序列图

于 2017-08-28T00:36:27.223 回答