【问题标题】:Determine mode locations of the kernel density estimate of multimodal univariate data确定多峰单变量数据的核密度估计的众数位置
【发布时间】:2017-03-05 01:34:05
【问题描述】:

如果我有一个密度函数并用特定的带宽绘制它,我可以直观地确定有 7 个局部最大值。我只想知道如何在同一个图上绘制特定最大值的单独分布。 另外,是否可以通过运行一些代码来准确知道最大值出现在哪里?我可以使用该图进行大致估计,但是否有一个 R 函数可以用来获得确切的点?我想知道我已经确定的 7 个密度的均值和方差。 具体来说,我有以下几点:

plot(density(stamp, bw=0.0013,kernel = "gaussian"))  

【问题讨论】:

    标签: r plot statistics kernel-density


    【解决方案1】:

    确定内核密度估计中哪些模式是实数取决于您选择使用哪种带宽。这是一件复杂的事情,我不建议只选择一个带宽,因为即使是不同的最佳经验法则也会给你不同的答案。通常,kde 的模式数小于过平滑情况下的基础密度数,在欠平滑情况下更是如此。有许多论文涵盖了这个主题,并为您提供了许多选项来帮助确定模式的准确性。例如,查看 Silverman 的高斯核模式测试、Friedman 和 Fisher 的 prim 算法、Marron 的 siZer 以及 Minnotte 和 Scott 的模式树都是不错的起点。

    你可以做的一件很天真的事情,给定一个单一的 KDE 带宽选择是检查运行长度。

    事实上,根据您选择的带宽,我找到了 9 种模式。只需计算序列中差异的符号变化,并计算运行的累积长度即可找到点。每隔一个点将是一个模式或一个反模式,这取决于哪个先出现。 (您可以检查标志来确定这一点)

    library(BSDA)
    dstamp <- density(Stamp$thickness, bw=0.0013, kernel = "gaussian")
    chng <- cumsum(rle(sign(diff(dstamp$y)))$lengths)
    plot(dstamp)
    abline(v = dstamp$x[chng[seq(1,length(chng),2)]])
    

    【讨论】:

    • 感谢您的回答。如何找出您确定的 9 种模式的方法?
    • 另外,有没有办法准确找出 7 种模式?我以为我的带宽给了我 7,但结果是 9
    • 你可以分别使用meansort
    【解决方案2】:

    因为我需要一些东西来获得最强的模式,所以我创建了一个非常简单的算法,允许您通过调整密度样本的数量(以减少局部噪声)来提高灵敏度,并设置一个与最大值成比例的最小密度阈值密度(以减少全局噪声)。

    find_posterior_modes <- function(x, n.samples = 100, filter = .1) {
        d <- density(x, n = n.samples)
        x <- with(d, sapply(2:(n.samples - 1), function(i) if (y[i] > y[i - 1] & y[i] > y[i + 1] & y[i] > max(y) * filter) x[i]))
        unlist(x)
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-21
      • 2014-03-22
      • 2010-11-06
      • 2015-06-09
      • 2018-10-06
      • 2015-06-30
      • 2012-01-06
      • 2015-10-04
      • 2015-08-22
      相关资源
      最近更新 更多