如果我有密度函数并且我用特定带宽绘制它,我直观地确定有7个局部最大值。我想知道如何在同一个图上绘制特定最大值的单独分布。 另外,如果可以通过运行一些代码确切地知道最大值出现在哪里?我可以使用情节进行球场评估但是有一个R函数可以用来获得确切的分数吗?我想知道我已经确定的7个密度的均值和方差。 具体来说,我有以下内容:
plot(density(stamp, bw=0.0013,kernel = "gaussian"))
答案 0 :(得分:1)
确定核心密度估计中哪些模式是真实的,这取决于您选择使用哪种带宽。这是一个复杂的事情,我不建议选择一个带宽,因为即使是不同的最佳经验法则也可以给你不同的答案。通常,kde的模式的数量小于过冲的情况下的基础密度的数量,并且在欠平滑的情况下更多。有很多论文涵盖了这个主题,并为您提供了许多选项来帮助确定模式的准确性。例如,查看Silverman对高斯核的模式测试,Friedman和Fisher的prim算法,Marron的siZer,以及Minnotte和Scott的模式树是很好的起点。
你可以做一件天真的事情,只要有一个KDE选择的带宽就可以检查运行长度。
事实上,通过您选择的带宽,我找到了9种模式。只需计算系列中差异的符号变化,并计算运行的累积长度以便找到这些点。每个其他点都将是模式或反模式,具体取决于首先出现的模式。 (您可以检查标志以确定这一点)
library(BSDA)
dstamp <- density(Stamp$thickness, bw=0.0013, kernel = "gaussian")
chng <- cumsum(rle(sign(diff(dstamp$y)))$lengths)
plot(dstamp)
abline(v = dstamp$x[chng[seq(1,length(chng),2)]])
答案 1 :(得分:0)
由于我只需要一些东西就可以得到最强的模式,所以我创建了一种简单的算法,可以通过调整密度样本的数量(降低局部噪声)并设置一个与最大比例成正比的最小密度阈值来提高灵敏度。密度(以减少整体噪声)。
find_posterior_modes <- function(x, n.samples = 100, filter = .1) {
d <- density(x, n = n.samples)
x <- with(d, sapply(2:(n.samples - 1), function(i) if (y[i] > y[i - 1] & y[i] > y[i + 1] & y[i] > max(y) * filter) x[i]))
unlist(x)
}