【问题标题】:Identifying data points amongst background noise for binned data R识别分箱数据 R 的背景噪声中的数据点
【发布时间】:2015-07-09 11:25:55
【问题描述】:

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

我想识别频率高且在背景噪声中突出的 bin(当您在轴上从右向左移动时,背景噪声会增加)。想象一下,在几乎已经模糊在一起的点上绘制一条曲线,形成一个黑色块,然后选择该曲线上方存在的 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")

【问题讨论】:

  • 制作一个(可能是模拟的)随机示例将大大有助于让人们帮助您——当然还有共享代码。内核密度似乎是一个很好的方法,你使用了什么带宽?如果您提供一个起点,我会尝试一些东西并寻找解决方案。
  • :p 将在一秒钟内更新我的帖子。我没有设置任何特定的带宽c我只是使用默认设置
  • 到目前为止我所做的非常基本。最初试图用 ggplot 来做,但因为我的 bin 尺寸很小,所以它不会飞
  • 抱歉,使用的默认带宽是 8.28(这里是凌晨 1 点,有点累了)
  • 我了解您在两个网站之间做出选择时会遇到困难:是信号处理/编程问题(例如,操纵带宽参数),还是统计问题?我认为是后者,因为您说方差(噪声)是 X 轴的函数,一旦我读到,我就开始考虑一个模型来描述这种行为。我首先将您的“数据”视为直方图中使用的一组 x 和 y 值——每个 bin 中的 bin 范围和频率(不是原始数据)。然后我会将数据视为时间序列,使用样条或卡尔曼滤波器

标签: r histogram density-plot


【解决方案1】:

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

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

    current.bin &lt;- 1

    window.size &lt;- 50

    window &lt;- bin.densities[current.bin-window.size : current.bin+window.size]

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

    lower.quant &lt;- quantile(window, 0.05)

    upper.quant &lt;- quantile(window, 0.95)

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

    this.is.too.high &lt;- (bin.densities[current.bin] &gt; upper.quant

    this.is.too.low &lt;- (bin.densities[current.bin] &lt; lower.quant)

    #final result

    this.is.outlier &lt;- this.is.too.high | this.is.too.low

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

【讨论】:

  • 看起来很有趣,我现在就试试
  • 嗯,目前在获取 bin.densities 的向量时遇到了麻烦。只是目前正在尝试找到一种计算方法
  • 如果您将直方图分配给如下变量:bin.hist &lt;- hist(df$values, breaks = bin, prob=TRUE, col = "grey"),那么您可以使用bin.hist$counts 作为您的bin.densities
猜你喜欢
  • 2015-04-17
  • 1970-01-01
  • 2022-01-26
  • 2021-12-28
  • 2014-08-13
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
相关资源
最近更新 更多