单变量异常值检测

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中的几个包,如outliers(grubbs测试),extremevalues,mvoutlier(pcout方法),但无法找到最佳使用方法。在这种情况下(根据我的要求),7.77(obs no 31),7.92(obs on 20)和3.50(obs no 6)是异常值。使用outliers包的grubbs测试,我可以将7.77和7.92检测为异常值,但不能检测3.50。我不知道是否可以在此处发布我的数据图,但在查看数据趋势或分布后,观察编号6显然是一个离群值。
我正在尝试将非线性模型拟合到这些数据中,但由于这些异常值,我无法找到最佳拟合(最佳拟合不是唯一的要求),无论如何,我需要检测这些异常值,因为我将在这些异常值上拟合单独的模型。
我的问题很简单。是否有可能使用某些标准包来检测这3个离群值,或者如何使用我的非线性生成模型来帮助检测这些离群值?
此致
Shahzad

你是否考虑使用MASS包中的rlm进行鲁棒线性回归呢? - tcash21
1
@tcash21 是的,我用过它,它是一个线性回归。我还使用了nlrob(鲁棒非线性回归),但无法找到一种方法来检测生成模型中的异常值。 - Shahzad
3个回答

5

只是想说我尝试使用上面建议的 detectAO(),但是在我的数据中没有发现任何问题(看起来有点类似:短暂的尖峰与持续趋势相连)。在搜索后,我发现 Hempel 滤波器(来自 pracma 包的函数 hempel())可以解决我的问题。我想在这里添加这个解决方案,以防其他人正在寻找解决方法。


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

但是请注意,将此方法应用于任何类型的数据时要小心。


谢谢。常规的ARIMA阶数(如此处的1,0,0)是否取决于数据? - Shahzad
我的意思是你应该了解你的数据性质。 - redmode
例如:forecast 库中的 auto.arima() 函数在模型类别中进行最佳 ARIMA 模型搜索。但是,使用这种估计方法,您将无法检测到异常值,因为这些点将被视为应该与模型拟合的典型数据,而不是异常值。 - redmode

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)

如果问题仍然存在,请回到我这里。我将提供更复杂的异常检测器。

2
你应该详细阐述并解释你的答案。 - avcajaraville

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接