在密度函数中似乎有很多"峰值#34;线程已经,但我没有看到一个具体解决这一点。如果我错过了,请抱歉复制。
我的问题:给定1000个值的矢量(样本附加),我想识别数据的直方图或密度函数中的峰值。从下面的样本数据图像中,我可以在直方图中看到~0,6200和8400处的峰值。但我需要获得这些峰值的精确值,最好是在一个简单的过程中,因为我有几千个这样的向量处理。
我最初开始使用直方图输出本身,但无法使任何峰值查找命令正常工作(例如,根本不工作)。我甚至不确定如何从 splus2R 包中获取 peak()命令来处理直方图对象或密度对象。这仍然是我的偏好,因为我想确定每个峰的最大频率的确切数据值(与密度函数值相反,这稍微不同),但我不能算出一个任
我会自己发布样本数据,但我无法在这里看到这样做的方法(对不起,如果我只是错过了它)。
答案 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"))
这并不完美 - 例如,即使它们相邻,它也会找到最顶部的垃圾箱。也许你可以更准确地定义'峰值'?希望有所帮助。
答案 2 :(得分:0)
发现峰值函数与Finding local maxima and minima有关,在这里您可以找到更多的解决方案。 chthonicdaemon的答案接近峰值,但每个 diff 都将向量长度减少了一个。
"is_paywall"