【发布时间】:2012-12-28 11:52:00
【问题描述】:
我有一堆数据(每个测量系列有 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) 如何可靠地找到分隔这些峰的坑?
【问题讨论】:
-
你如何定义“真正的高峰”?
-
@SvenHohenstein 这是个好问题。我很难从数学上掌握这个概念。峰值周围应该有一个特定的窗口,在该窗口中该峰值是最大值。此外,最小峰值大小的截止值(可能与中位数有关)可能会有所帮助。如果我知道我的数据是双峰的,则应该产生两个具有合理(我承认,这又是模糊的)大窗口的最高峰。如果我事先不知道峰值的数量,可能是最大值的截止值。将峰分开的凹坑的值以及最小值的截止值。峰值会有帮助吗?
-
光谱数据分析(色谱或光度)经常会遇到这个问题,因此您可能会在搜索峰识别时查看是否包含“spectr*”。 @cbeleites 既是 SO 参与者,也参与了积极的 R 包开发。
-
@DWin 感谢您的建议!通过这种方式,我找到了一个名为“PROcess”的 Bioconductor 包,用于光谱处理,似乎可以产生可接受的结果。
-
你应该发布一个简单的工作示例。
标签: r