我有一堆数据(每个测量系列有 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")
现在,我的数据更加嘈杂:
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")
所以问题是:
1)如何在这样一个嘈杂的数据集中自动识别真正的峰值?2)如何可靠地找到分隔这些峰的坑?