检测计数数据中的异常值

机器算法验证 异常值 计数数据 配件
2022-01-25 23:17:46

我天真地认为这是一个相当直接的问题,涉及对许多不同的计数数据集进行异常值检测。具体来说,我想确定一系列计数数据中的一个或多个值相对于分布中的其余计数是否高于或低于预期。

令人困惑的因素是我需要对 3,500 个分布执行此操作,其中一些可能适合零膨胀的过度分散泊松,而其他可能最适合负二项式或 ZINB,而还有一些可能是正态分布。出于这个原因,简单的 Z 分数或分布图不适用于大部分数据集。这是我要检测异常值的计数数据示例。

counts1=[1 1 1 0 2 1 1 0 0 1 1 1 1 1 0 0 0 0 1 2 1 1 2 1 1 1 1 0 0 1 0 1 1 1 1 0 
         0 0 0 0 1 2 1 1 1 1 1 1 0 1 1 2 0 0 0 1 0 1 2 1 1 0 2 1 1 1 0 0 1 0 0 0 
         2 0 1 1 0 2 1 0 1 1 0 0 2 1 0 1 1 1 1 2 0 3]
counts2=[0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 
         0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
         0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 
         1 1 0 0 0]
counts3=[14 13 14 14 14 14 13 14 14 14 14 14 15 14 14 14 14 14 14 15 14 13 14 14 
         15 12 13 17 13 14 14 14 14 15 14 14 13 14 13 14 14 14 14 13 14 14 14 15 
         15 14 14 14 14 14 15 14 1414 14 15 14 14 14 14 14 14 14 14 14 14 14 14 13 16]
counts4=[0 3 1.......]
and so on up to counts3500.

最初我认为我需要在 Python 或 R 中编写一个循环,将一组模型应用于每个分布,并根据 AIC 或其他(可能是 R 中的 fitdistrplus?)选择最佳拟合模型。然后我可以问给定分布的极端情况是什么(落在尾部的计数,例如“4”的计数是否会成为上述 counts1 分布中的异常值?)。但是,我不确定这是一个有效的策略,我想到可能有一种简单的方法来确定我不知道的计数数据中的异常值。鉴于我想查看的分布数量,我进行了广泛的搜索,并没有发现任何适合我的问题的东西。

我的最终目标是使用统计上最合适的方法来检测每个计数分布的计数显着增加或减少。

1个回答

您不能使用观测值与数据的经典拟合的距离来可靠地检测异常值,因为您使用的拟合过程本身很容易被拉向异常值(这称为掩蔽效应)。可靠地检测异常值的一种简单方法是使用您建议的一般思想(与拟合的距离),但用更不易受异常值影响的稳健估计器替换经典估计器。下面我将介绍这个想法的一般说明,然后讨论针对您的具体问题的解决方案。

举例说明:考虑从得出的以下 20 个观察值(四舍五入到第二位):N(0,1)

x<-c(-2.21,-1.84,-.95,-.91,-.36,-.19,-.11,-.1,.18,
.3,.31,.43,.51,.64,.67,.72,1.22,1.35,8.1,17.6)

(最后两个确实应该是 0.81 和 1.76,但不小心打错了)。

使用基于比较统计量的异常值检测规则

|xiave(xi)|sd(xi)

到正态分布的分位数永远不会让你怀疑 8.1 是一个异常值,导致你估计“修剪”系列的为 2(为了比较原始的,例如未修剪的,估计 是 4.35)。sdsd

如果您使用了强大的统计数据:

|ximed(xi)|mad(xi)

并将得到的稳健分数与正常的分位数进行比较,您将正确地将最后两个观察值标记为异常值(并正确估计修剪后的系列的为 0.96)。zsd

(为了完整起见,我应该指出,即使在这个时代和今天,有些人更喜欢坚持4.35 的原始 - 未修剪 - 估计,而不是使用基于修剪的更精确的估计,但这对我来说是难以理解的)

对于其他发行版,情况并没有那么不同,只是您必须首先预先转换您的数据。例如,在您的情况下:

假设是您的原始计数数据。一个技巧是使用转换:X

Y=2X

如果(这个规则不是对称的,我会非常谨慎地根据 a 从计数变量的左“尾部”排除观察值基于数据的阈值。显然,负面观察应该很安全地删除)Y>med(Y)+3

这是基于这样的想法,如果是泊松,那么X

YN(med(Y),1)

(泊松分布的参数)大于 3时,这种近似对泊松分布数据相当有效。λ

小于 3 时(或者当控制大部分数据分布的模型具有比泊松更接近 0 的模式时,如 ZINB rv's 中),近似值倾向于在保守方面出错(拒绝较少的数据作为异常值)。λλ=3

要了解为什么这被认为是“保守的”,请考虑在极限情况下(当数据是二项式且非常小时),该规则不会将任何观察标记为异常值,这正是我们想要的行为:导致屏蔽,异常值必须能够将估计的参数任意远离其真实值。当数据来自有界支持的分布(例如二项式)时,这根本不会发生......p