我想提前感谢您考虑我的问题。
我有天真的认为是一个相当直接的问题,涉及许多不同的计数数据集的异常值检测。具体来说,我想确定一系列计数数据中的一个或多个值是否高于或低于预期相对于分布中的其余计数。
混淆因素是我需要为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.......]
依此类推至计数3500。
最初,我认为我需要在Python或R中编写一个循环,将一组模型应用于每个分布,并根据AIC或其他(可能是R中的fitdistrplus)选择最佳拟合模型。然后我可以问一下给定分布的极值是什么(落在尾部的计数,例如" 4"是上面的count1分布中的异常值?)。但是,我不确定这是一个有效的策略,并且我发现可能有一种简单的方法来确定我不知道的计数数据中的异常值。我已经进行了广泛的搜索,并且根据我想要查看的分布数量,发现任何看起来都不适合我的问题。
我的最终目标是使用最具统计学意义的方法检测每次计数分布的计数显着增加或减少。
再一次,谢谢你的时间。
答案 0 :(得分:0)
outliers
包具有良好的此类测试功能。
library(outliers)
x <- c(rep(c(0,1),1000),3)
chisq.test.out(x)
chi-squared test for outlier
data: x
X-squared = 24.6668, p-value = 6.815e-07
alternative hypothesis: highest value 3 is an outlier
> system.time(rep(chisq.out.test(x),3500))
user system elapsed
0.004 0.000 0.002