更新:迄今为止 表现最佳的算法就是这个算法.
该问题探讨了用于检测实时时间序列数据中的突然峰值的稳健算法.
请考虑以下数据集:
p = [1 1 1.1 1 0.9 1 1 1.1 1 0.9 1 1.1 1 1 0.9 1 1 1.1 1 1 1 1 1.1 0.9 1 1.1 1 1 0.9 1, ...
1.1 1 1 1.1 1 0.8 0.9 1 1.2 0.9 1 1 1.1 1.2 1 1.5 1 3 2 5 3 2 1 1 1 0.9 1 1 3, ...
2.6 4 3 3.2 2 1 1 0.8 4 4 …
Run Code Online (Sandbox Code Playgroud) language-agnostic algorithm signal-processing time-series data-analysis
我正在寻找有效的方法来删除数据中的异常值。我尝试了在 StackOverflow 和其他地方找到的几种解决方案,但没有一个对我有用(应该在样本数据中检测并删除 1993 年 6 月、1994 年 8 月和 1995 年 3 月的 4 个高值 21637、19590、21659 和 200000发布在这篇文章的末尾)。任何建议将不胜感激!
这是我到目前为止测试过的:
数据概览
3 个异常值仍然存在,并且时间序列末尾的许多合法高值已被删除。
y <- dat$Value
y_filter <- y[!y %in% boxplot.stats(y)$out]
plot(y_filter)
Run Code Online (Sandbox Code Playgroud)
与第一种方法类似的问题
FindOutliers <- function(data) {
data <- data[!is.na(data)]
lowerq = quantile(data)[2]
upperq = quantile(data)[4]
iqr = upperq - lowerq #Or use IQR(data)
# we identify extreme outliers
extreme.threshold.upper = (iqr * 1.5) + upperq
extreme.threshold.lower = lowerq - (iqr * 1.5)
result <- which(data …
Run Code Online (Sandbox Code Playgroud) 我有一个这样的数据框:
X
Team 01/01/2012 01/02/2012 01/03/2012 01/01/2012 01/04/2012 SD Mean
A 100 50 40 NA 30 60 80
Run Code Online (Sandbox Code Playgroud)
我喜欢对每个单元格进行平均值和sd计算以计算异常值.例如,
abs(x-Mean) > 3*SD
Run Code Online (Sandbox Code Playgroud)
x$count<-c(1)
(如果满足上述条件,则增加该值).
我这样做是为了检查我的数据集中的异常.如果我知道列名称,那么计算会更容易,但列数会有所不同.一些细胞可能含有NA.
我喜欢从每个单元格中减去平均值,我尝试了这个
x$diff<-sweep(x, 1, x$Mean, FUN='-')
Run Code Online (Sandbox Code Playgroud)
似乎没有工作,任何想法?
在A中,boxplot
我设置了outline=FALSE
删除异常值的选项。
现在,我想在方框图中包括points
显示均值的位置。显然,使用计算得出的均值mean
包括离群值。
如何从数据框中删除完全相同的离群值,以使计算出的均值对应于箱图中所示的数据?
我知道如何删除异常值,但是该outline
选项从boxplot
内部使用了哪些设置?不幸的是,该手册未作任何说明。
我正在查看这个数据集:https://archive.ics.uci.edu/ml/machine-learning-databases/credit-screening/crx.data
我对数据进行了预处理:
ca.1<-read.csv("CreditApproval.csv",T,",")
# From http://stackoverflow.com/q/4787332/
remove_outliers <- function(x, na.rm = TRUE, ...) {
qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
H <- 1.5 * IQR(x, na.rm = na.rm)
y <- x
y[x < (qnt[1] - H)] <- NA
y[x > (qnt[2] + H)] <- NA
y
}
ca.1$A2<-remove_outliers(ca$A2)
ca.1$A3<-remove_outliers(ca$A3)
ca.1$A8<-remove_outliers(ca$A8)
ca.1$A11<-remove_outliers(ca$A11)
ca.1$A14<-remove_outliers(ca$A14)
ca.1$A15<-remove_outliers(ca$A15)
ca.1$A2<-discretize(ca.1$A2,"frequency",categories = 6)
ca.1$A3<-discretize(ca.1$A3,"frequency",categories = 6)
ca.1$A8<-discretize(ca.1$A8,"frequency",categories = 6)
ca.1$A11<-discretize(ca.1$A11,"frequency",categories = 6)
ca.1$A14<-discretize(ca.1$A14,"frequency",categories = 6)
ca.1$A15<-discretize(ca.1$A15,"frequency",categories = 6)
ca.1<-na.omit(ca.1)
Run Code Online (Sandbox Code Playgroud)
微调支持、置信度、最小/最大长度后,我仍然得到 65 条规则:
> …
Run Code Online (Sandbox Code Playgroud) 所以,我有一个数据集,知道如何使用summary命令获取五个数字摘要.现在我需要让实例高于Q3 + 1.5IQR或低于Q1 - 1.5IQR,因为这些只是数字 - 我如何从高于数字或低于数字的数据集返回实例?