计算直方图或密度函数中的峰值

时间:2012-10-30 05:41:34

标签: r histogram

在密度函数中似乎有很多"峰值#34;线程已经,但我没有看到一个具体解决这一点。如果我错过了,请抱歉复制。

我的问题:给定1000个值的矢量(样本附加),我想识别数据的直方图或密度函数中的峰值。从下面的样本数据图像中,我可以在直方图中看到~0,6200和8400处的峰值。但我需要获得这些峰值的精确值,最好是在一个简单的过程中,因为我有几千个这样的向量处理。

Hist and Density Function

我最初开始使用直方图输出本身,但无法使任何峰值查找命令正常工作(例如,根本不工作)。我甚至不确定如何从 splus2R 包中获取 peak()命令来处理直方图对象或密度对象。这仍然是我的偏好,因为我想确定每个峰的最大频率的确切数据值(与密度函数值相反,这稍微不同),但我不能算出一个任

我会自己发布样本数据,但我无法在这里看到这样做的方法(对不起,如果我只是错过了它)。

3 个答案:

答案 0 :(得分:6)

如果你的y值是平滑的(比如你的样本图中),这应该可以非常重复地找到峰值:

peakx <- x[which(diff(sign(diff(y)))==-2)]

答案 1 :(得分:2)

既然您正在考虑直方图,也许您应该直接使用直方图输出?

data <- c(rnorm(100,mean=20),rnorm(100,mean=12))

peakfinder <- function(d){
  dh <- hist(d,plot=FALSE)
  ins <- dh[["intensities"]]
  nbins <- length(ins)
  ss <- which(rank(ins)%in%seq(from=nbins-2,to=nbins)) ## pick the top 3 intensities
  dh[["mids"]][ss]
}

peaks <- peakfinder(data)

hist(data)
sapply(peaks,function(x) abline(v=x,col="red"))

这并不完美 - 例如,即使它们相邻,它也会找到最顶部的垃圾箱。也许你可以更准确地定义'峰值'?希望有所帮助。

enter image description here

答案 2 :(得分:0)

如注释中所述,

发现峰值函数Finding local maxima and minima有关,在这里您可以找到更多的解决方案。 chthonicdaemon的答案接近峰值,但每个 diff 都将向量长度减少了一个。

"is_paywall"