识别数据中的异常值

机器算法验证 r 异常值 杠杆作用 厨师距离
2022-03-23 07:24:08

样本数据

dat <- structure(list(yld.harvest = c(1800, 2400, 2000, 2400, 2160, 
        2400, 2400, 2250, 2400, 2280, 2400, 3120, 3300, 3300,                                     3000, 3000, 2400, 2700, 3000), 
           year = c(1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 
                    2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012, 2013, 
                    2014, 2015)), class = c("tbl_df", "tbl", "data.frame"), 
           row.names = c(NA, -19L))

该数据包括随时间变化的作物产量。我有兴趣识别产量数据中的任何 oultiers。这是我的方法:

sample_size <- nrow(dat)

构建收益率随时间变化的模型

 mod <- lm(dat$yld.harvest ~ dat$year + I(dat$year^2))

检查拟合二次项是否可以

  mod.update <- step(mod, direction = "backward", trace = FALSE)

计算厨师距离

  cooksd <- cooks.distance(mod.update)

找到影响点

  influential <- as.numeric(names(cooksd)[(cooksd > (4/sample_size))])
  # 2, 17  

删除影响点

  dat_screen <- dat[-influential, ]

阴谋

 plot(dat$year, dat$yld.harvest, col = "red", pch = 1, xlab = "", 
   ylab = "Yield (kg/ha)", type = "b", main = mun, ylim = yrange)
 points(dat_screen$year, dat_screen$yld.harvest, pch = 19, col = "blue", type = "b")

在此处输入图像描述

直观地看图,我认为第 2 点和第 17 点不应该是异常值。我做得对吗?

2个回答

方法是正确的。异常值检测的问题是:没有通用的解决方案和真实的阈值。它应该被额外使用,但不是主要用于评估您的数据。你在不同的文献中发现不同的阈值。此方法的发明者建议您使用D > 1 1的阈值。您的方法(4/sample size)是由其他作者2建议的。另一种解决方案4*mean(cooksd)就像在箱线图中(但我没有找到这个的来源)。如果您使用它,则不会从代码中检测到异常值:

具有两个不同阈值的烹饪距离

该方法也适用于回归模型,它的值很少,不太准确,最好使用更大的数据样本。

因此,检测异常值并没有真正完美的解决方案。如果您认为它们不是异常值,那么不删除应该没问题。

PS:我在做研究的时候发现了一个类似的帖子:How to read Cook's distance plots? 那里已经比我自己讨论得更好了。


  1. Cook, RD 和 Weisberg, S. (1984) 回归中的残差和影响。
  2. 博伦,肯尼斯 A.;杰克曼,罗伯特 W. (1990)。福克斯,约翰;长,J.斯科特,编辑。回归诊断:异常值和影响案例的说明性处理。现代数据分析方法。

该方法在这种情况下是正确的,但在一般情况下不正确。您需要一个足够的模型来检测异常(读取底层信号和潜在确定性结构)。

您的方法假设了一种模型,即具有时间和时间版本的模型作为外生预测因子,假设没有脉冲/电平变化/季节性脉冲,并试图找到假设不存在的东西。为什么我的高度多项式回归模型突然不适用于数据?应该审查,尤其是@whuber 评论增量 F 检验中的 p 值是否决定了我期望得到正确的试验次数?反思“将多项式拟合到数据可能是一种看似非常糟糕的方法”

问题或机会是同时识别两者,即使用内存和等待被识别的潜在确定性结构的可能混合模型。

我使用了我最喜欢的时间序列包(在我的帮助下专门编写了这两个包),并在这个微不足道的案例中获得在此处输入图像描述在此处输入图像描述. 它的结论与您对脉冲和电平偏移所做的一样。

总之,噪声模型可以不是白噪声,即在 arima 表示法中不是 (0,0,0)。基线可以在趋势中具有断点,而不仅仅是时间平方等人所暗示的曲率。

检测异常的可靠参考在这里http://docplayer.net/12080848-Outliers-level-shifts-and-variance-changes-in-time-series.html涵盖了错误方差变化的影响,同时在搜索时合并内存对于异常。

标准回归诊断假定不相关的错误,同时试图为异常提供清晰度。如果您有一个白噪声的错误过程,那么更简单的程序通常可以工作,但是当您有时间序列数据时,通常情况并非如此,因此需要更强大/正确/稳健的方法。