【问题标题】:R : How to detect and fix abnormal values on plot?R:如何检测和修复情节上的异常值?
【发布时间】:2017-11-26 13:02:20
【问题描述】:

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

这是函数的结果:

我的示例数据: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

这是我的预期结果: 如何检测那些异常数据?

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

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

【问题讨论】:

    标签: r plot anomaly-detection


    【解决方案1】:

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

    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")
    

    【讨论】:

    • 也许用这个来进一步过滤Out:Out[sapply(Out, function(i) { v &lt;- df$Val[i + (-2):2]; min(v) == v[3] || max(v) == v[3] })]
    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 2021-03-08
    • 1970-01-01
    • 2020-02-23
    • 2018-10-08
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    相关资源
    最近更新 更多