R:如何检测和修复情节上的异常值?
Posted
技术标签:
【中文标题】R:如何检测和修复情节上的异常值?【英文标题】:R : How to detect and fix abnormal values on plot? 【发布时间】:2017-11-26 13:02:20 【问题描述】:我尝试使用来自https://github.com/twitter/AnomalyDetection 的library(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
这是我的预期结果: 如何检测那些异常数据?
如何通过填充最合适的值来修复这些值?平滑它们以接近它们周围的图案,并且在修复这些值后所有数据的总值仍然相同。
我的额外问题是:你有什么想法找到它的模式吗?我可以给你更多的信息。非常感谢您的帮助。
【问题讨论】:
【参考方案1】:这是一个可能的解决方案。
-
计算每个点周围小窗口的平均值(滚动平均值)
计算实际值与局部平均值之间的差值。
计算步骤 2 中所有差异的标准差。
将与局部平均值相差超过 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 <- df$Val[i + (-2):2]; min(v) == v[3] || max(v) == v[3] )]
以上是关于R:如何检测和修复情节上的异常值?的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用car包的outlierTest函数通过假设检验的方法检测回归模型中的异常值(outlier)输出异常值对应的统计量p值以及Bonferonnii校正p值
R语言基于可视化进行多变量离群(Mulltivariate outliers)点检测识别:散点图可视化多变量离群点模型平滑多变量异常检测使用平行坐标图查看钻石数据集中的异常值