在R中找到局部最大值/最小值

Anj*_*jaM 7 r

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

由于密度估计可能包含非常小的局部变化,我希望有可能调整"灵敏度".到目前为止我能找到的最好的是@Tommy的解决方案:https://stackoverflow.com/a/6836924/1003358 这是一个例子:

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")
Run Code Online (Sandbox Code Playgroud)

识别忠实数据集中的最大值

现在,我的数据噪音很大:

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")
Run Code Online (Sandbox Code Playgroud)

首次尝试在我的数据集中识别最大值

试图调整参数(注意尾部有两个"不需要的"峰值):

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")
Run Code Online (Sandbox Code Playgroud)

第二次尝试检测数据集中的峰值

所以问题是:

1)如何在这样的噪声数据集中自动识别真实峰值?2)如何可靠地找到分离这些峰的凹坑?

Car*_*oft 1

我最喜欢的是pastecs::turnpoints。但你是对的,你必须进行一些主观过滤才能区分尖峰噪声和真实峰值。实现此目的的一种方法是要求原始数据或样条数据对于 N 个连续值保持高于某个阈值。