这次我不会像以前在我的一个问题中那样直接询问如何检测异常值。我确实阅读了一些与此主题相关的帖子,但没有得到我需要的内容。我有一组值,如下所示:
y<-c(0.59, 0.61, 0.59, 1.55, 1.33, 3.50, 1.00, 1.22, 2.50, 3.00, 3.79, 3.98, 4.33, 4.45, 4.59, 4.72, 4.82, 4.90, 4.96, 7.92, 5.01, 5.01, 4.94, 5.05, 5.04, 5.03, 5.06, 5.10, 5.04, 5.06, 7.77, 5.07, 5.08, 5.08, 5.12, 5.12, 5.08, 5.17, 5.18)
现在,大多数研究人员表示异常检测过程不仅取决于数据,还取决于背景。我使用了R中的几个包,如异常值(grubbs test),极值,mvoutlier(pcout方法),但无法找到使用它们的最佳方法。在这种情况下(取决于我的要求),7.77(第31号视网膜),7.92(20视点中的视点)和3.50(视图第6组)是异常值。使用离群值包的grubbs测试我可以检测7.77和7.92作为异常值但不是3.50。我不知道我是否可以在这里发布我的数据图,但是在查看了图或分布上的数据趋势之后,观察No 6将是一个明显的异常值。
我正在尝试将非线性模型拟合到这些数据,但由于这些异常值,我无法找到最佳拟合(最佳拟合不是唯一的要求),无论如何我需要检测这些异常值,因为我将在这些异常值上拟合一个单独的模型。
我的问题非常简单。我是否可以通过一些标准包检测这3个异常值?或者如何使用我的非线性生成模型来帮助检测这些异常值?
祝你好运
沙赫扎德
答案 0 :(得分:5)
只是说我尝试使用上面建议的detectAO()
并且它没有找到任何与我的数据有关的东西(看起来有点类似:短暂的尖峰来自连续趋势)。谷歌搜索后,我发现Hempel过滤器(包hempel()
中的函数pracma
)可以做我需要的。我想我会在这里添加这个以防其他人正在寻找解决方案。
答案 1 :(得分:4)
library(TSA)
ar = TSA::arima(y, c(1,0,0))
detectAO(ar)
确切地显示了这3个点(ind
是可能的异常值的索引):
> detectAO(ar)
[,1] [,2] [,3]
ind 6.000000 20.000000 31.000000
lambda2 4.739695 5.957604 5.490739
但要小心将此方法应用于任何类型的数据。
答案 2 :(得分:0)
install.packages("forecast")
library(forecast)
tsoutliers(data)
R中的这三个代码将回答您的问题。之后tsclean(data)
将清理您的数据。
步骤如下:
install.packages("forecast")
library(forecast)
t_s<- ts(y)
plot(t_s)
tsoutliers(t_s)
t_s_new<-tsclean(t_s)
plot(t_s_new)
如果仍有问题,请回复我。我将提供更复杂的离群检测器。