2

不确定这是否应该进行交叉验证,但我们会看到。基本上,我最近从一台仪器获得了数据(化合物的质量从 0 到 630),在绘制直方图之前,我将其分箱到 0.025 个箱中,如下所示:- 在此处输入图像描述

我想识别高频且从背景噪音中脱颖而出的箱(背景噪音随着您在轴上从右向左移动而增加)。想象一下,在几乎模糊在一起的点上绘制一条曲线,形成一个黑色块,然后选择该曲线上方存在的 bin 进行进一步调查,这就是我正在尝试做的事情。我刚刚绘制了一个核密度图,看看是否可以将其覆盖在直方图上并使用它来识别图上方存在的点。然而,密度图在这方面没有任何进展,因为密度值太低(见第二张图)。有没有人对我如何解决这个问题有任何建议?蓝线代表覆盖的密度函数图,红线代表理想的解决方案(需要一种在 R 中以某种方式自动化的方法) 在此处输入图像描述

下面的数据只是我的数据集的一部分,因此它不能很好地代表我的绘图(仅包含大约 300,000 个点),并且由于我的 bin 大小非常小(0.025),因此数据分布非常广泛(总共有 25,000左右垃圾箱)。

df <- read.table(header = TRUE, text = "
   values
1 323.881306
2   1.003373
3  14.982121
4  27.995091
5  28.998639
6  95.983138
7  2.0117459
8  1.9095478
9  1.0072853
10  0.9038475
11  0.0055748
12  7.0964916
13  8.0725191
14  9.0765316
15  14.0102531
16  15.0137390
17  19.7887675
18  25.1072689
19  25.8338140
20  30.0151683
21  34.0635308
22  42.0393751
23  42.0504938
")
bin <- seq(0, 324, by = 0.025)
hist(df$values, breaks = bin, prob=TRUE, col = "grey")
lines(density(df$values), col = "blue")
4

1 回答 1

1

假设您正在处理具有bin.densities每个 bin 的密度的向量,查找异常值的简单方法是:

  1. 查看每个垃圾箱周围的窗口,例如 +- 50 个垃圾箱

    current.bin <- 1

    window.size <- 50

    window <- bin.densities[current.bin-window.size : current.bin+window.size]

  2. 找到 95% 的上下分位数(或者任何你认为有效的值)

    lower.quant <- quantile(window, 0.05)

    upper.quant <- quantile(window, 0.95)

  3. 然后说如果当前 bin 超出您的分位数范围,则它是异常值。

    this.is.too.high <- (bin.densities[current.bin] > upper.quant

    this.is.too.low <- (bin.densities[current.bin] < lower.quant)

    #final result

    this.is.outlier <- this.is.too.high | this.is.too.low

我还没有实际测试过这段代码,但这是我会采取的一般方法。您可以使用窗口大小和分位数百分比,直到结果看起来合理。同样,不是超级复杂的数学,但希望它有所帮助。

于 2015-04-30T00:47:18.023 回答