使用样条线查找密度函数的局部极值


15

我正在尝试找到概率密度函数的局部最大值(使用R density方法找到)。由于存在大量数据,因此我无法执行一种简单的“环顾四周”方法(即环顾一个点以查看其是否是相对于其邻居的局部最大值)。此外,与使用容错和其他参数构建“环顾四周”相反,使用样条插值法然后找到一阶导数的根似乎更为有效和通用。

所以,我的问题是:

  1. 给定来自的函数splinefun,哪些方法可以找到局部最大值?
  2. 有没有一种简单/标准的方法来查找使用返回的函数的派生形式splinefun
  3. 有没有更好的/标准的方法来找到概率密度函数的局部最大值?

供参考,以下是我的密度函数图。我正在使用的其他密度函数在形式上相似。我应该说我是R的新手,但不是编程的新手,因此可能会有一个标准的库或程序包来实现我所需要的。 密度函数

谢谢你的帮助!!


我不清楚为什么“环顾四周”方法会产生大量数据。density()不估计密度为每一个数据,它估计在密度Ñ值,其中Ñ是具有默认值的用户指定的参数Ñ = 512
一站式

我给这n为2 ^ 15,似乎该数据已在逐点水平有很多差异的。我尝试使用类似于邻域方法(通过msExtrema {msProcess})编写最大/最小查找器,并且只能通过使用公差设置来识别一些最大值,而不是全部。
aaronlevin 2012年

2
看的代码msExtrema,它是一个简单的包装peakssplus2R包,你会更好使用直接,如果你只希望当地的最大值,而不是局部极小。我不明白为什么使用默认span=3不会发现所有的局部最大值。2 ^ 15 = 32768的大小应该不足以使效率成为一个大问题。
2012年

splinefun返回的函数的参数“ deriv”默认为0。将一阶导数设置为deriv = 1。
青色

1
嗯,peaks似乎有问题:它max.col使用默认设置调用ties.method = "random",这不仅会随机打破平局,而且会为宣告平局设置相对容差1e-5。前者令人困惑,后者绝对不是您想要的。peaks()还采用了strict文档记录不充分的参数,并且在查看该函数的代码时,什么也没做。啊,用户提供的软件库的乐趣!尽管您说自己对编程并不
陌生

Answers:


14

您想要做的是在化学计量学中称为峰检测。您可以使用多种方法。我在这里仅演示一种非常简单的方法。

require(graphics)
#some data
d <- density(faithful$eruptions, bw = "sj")

#make it a time series
ts_y<-ts(d$y)

#calculate turning points (extrema)
require(pastecs)
tp<-turnpoints(ts_y)
#plot
plot(d)
points(d$x[tp$tppos],d$y[tp$tppos],col="red")

在所有解决方案中,此方法效果最佳。1.后续问题:是否可以通过转折点切换公差?在密度函数的长尾部分中发现了许多峰谷。2.后续问题2:确定公差的好方法是什么?
aaronlevin 2012年

广告1.我不这么认为。它用于测试时间序列的随机性,因此该功能不需要。您可以尝试自己测试高峰的相关性/重要性。例如,您可以对邻域进行t检验(可以确定邻域应该多大)。或者,您可以在R包中寻找更复杂的功能,以评估来自(质谱)或其他分析化学方法的数据。
罗兰2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.