求R中的局部极大值/极小值

求R中的局部极大值/极小值,r,R,我有一大堆数据(每个系列的测量值为10000-50000),我感兴趣的是从这些值分布的密度估计中自动识别局部最大值/最小值。事实上,我假设通常应该有两个峰,由一个坑隔开,我想找到一个坑,它将两个峰彼此分开,以便将数据分成两部分进行进一步处理。如果可能的话,我还想知道山峰的位置 由于密度估计可能包含非常小的局部变化,我希望能够调整“灵敏度”。到目前为止,我能找到的最好的解决方案是@Tommy:下面是一个例子: library(ggplot2) d <- density(faithful$e

我有一大堆数据(每个系列的测量值为10000-50000),我感兴趣的是从这些值分布的密度估计中自动识别局部最大值/最小值。事实上,我假设通常应该有两个峰,由一个坑隔开,我想找到一个坑,它将两个峰彼此分开,以便将数据分成两部分进行进一步处理。如果可能的话,我还想知道山峰的位置

由于密度估计可能包含非常小的局部变化,我希望能够调整“灵敏度”。到目前为止,我能找到的最好的解决方案是@Tommy:下面是一个例子:

library(ggplot2)

d <- density(faithful$eruptions, bw = "sj")
loc.max <- d$x[localMaxima(d$y)]

ggplot(faithful, aes(eruptions)) + geom_density(adjust=1/2) +
  geom_vline(x=loc.max, col="red") +
  xlab("Measured values")
库(ggplot2)

d我最喜欢的是
pastecs::turnpoints
。但你是对的,你必须做一些主观过滤来区分尖峰噪声和真实峰值。一种方法是要求原始或样条数据在N个连续值中保持在某个阈值以上。

如何定义“真实峰值”?@SvenHohenstein这是个好问题。我很难从数学上理解这个概念。在峰值周围应有一个特定的窗口,在该窗口内,该峰值为最大值。此外,最小峰值大小的截止值(可能与中值有关)可能会有所帮助。如果我知道我的数据是双峰的,两个最高的峰值应该有一个合理的(我承认,这也是模糊的)大窗口。如果我事先不知道峰的数量,也许用一个最大值的分界点来分隔峰,再加上一个最小值的分界点会有所帮助?光谱数据分析(色谱或光度法)经常会遇到这个问题,所以你可能会看到在搜索峰识别时是否包括“spectr*”@cbeleites既是一个SO参与者,也参与了积极的R包开发。@DWin感谢您的建议!通过这种方式,我发现了一个名为“过程”的用于光谱处理的生物导体包,似乎可以产生可接受的结果。你应该发布一个简单的工作示例。谢谢你的建议
pastecs::turnpoints
似乎不提供定义跨度/窗口的可能性,因此我再次面临与上述方法相同的问题。我不知道如何实施你的建议来定义这样一个门槛。另外,据我所知,它不能区分峰和坑,是吗?哦,对不起,我刚刚注意到,您可以使用
extract()
方法区分峰和坑。我肯定会仔细看看这个函数。但我仍然想知道过滤这些值的最佳方法是什么。
d <- density(my.df$Values, bw = "sj")
loc.max <- d$x[localMaxima(d$y)]

ggplot(my.df, aes(Values)) + geom_density(adjust=1/2) +
  geom_vline(x=loc.max, col="red") +
  xlab("Measured values")
d <- density(my.df$Values, bw="nrd", adjust=1.2)
loc.max <- d$x[localMaxima(d$y)]

ggplot(my.df, aes(Values)) + geom_density(adjust=1/2) +
  geom_vline(x=loc.max, col="red") +
  xlab("Measured values")