2012-11-11 120 views
7

这次我不会问如何检测异常值的直接问题,就像我之前在其中一个问题中所做的那样。我确实读过一些与这个主题相关的帖子,但没有得到我所需要的。我有一组值被如下:单变量异常值检测

现在大多数研究人员说,异常检测过程不仅依赖于数据,还上下文
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测试),extremevalues,mvoutlier(pcout方法),但无法找到使用它们的最佳方式。在这种情况下(取决于我的要求),7.77(观察31),7.92(观察20)和3.50(观察6)是异常值。使用outliers包的grubbs测试,我可以将7.77和7.92检测为异常值,但不是3.50。我不知道我是否可以在这里张贴我的数据图,但是在查看了图上的数据趋势或分布后,观察No 6将作为异常值显而易见。

我想将非线性模型拟合到这个数据中,但由于这些异常值,我无法找到最佳拟合(最佳拟合不是唯一的要求),而且我需要检测这些异常值,因为我会在这些异常值上拟合单独的模型。

我的问题很简单。是否有可能我可以通过一些标准包检测这3个异常值,或者如何使用非线性生成的模型来帮助检测这些异常值?

问候

沙赫扎德

enter image description here

+0

您是否考虑在MASS包中使用rlm来进行强健的线性回归? – tcash21

+1

@ tcash21是的,我用它和它的线性回归。我也有nlrob(稳健的非线性回归),但是找不到用生成的模型检测异常值的方法。 – Shahzad

回答

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 

但要注意应用此处理任何类型的数据。

+0

谢谢。常规的华丽订单(如这里的1,0,0)是否取决于数据? – Shahzad

+0

我的意思是你应该了解你的数据的性质。 – redmode

+0

例如:'forecast'库中的'auto.arima()'函数在模型类中搜索最佳ARIMA模型。但是使用这样的估计,只要这些点将被视为典型数据,而不是异常值,那么您将无法检测异常值。 – redmode

5

只是说我尝试使用detectAO()就像上面所建议的那样,它没有发现任何与我的数据有关的东西(看起来有点类似:短暂的尖峰来自持续的趋势)。在Google搜索后,我发现Hempel过滤器(功能hempel()来自包pracma)可以做我所需要的。我想我会在这里添加这个以防别人正在寻找解决方案。

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) 

如果仍然存在问题,拿回来给我。我会提供更复杂的异常值检测器。

+1

你应该详细解释和解释你的答案 – avcajaraville