从R中的绘制密度函数(核密度估计)中寻找最大值

时间:2012-06-05 19:45:37

标签: r pdf max kde kernel-density

我有一些数据,我假设我来自一个发行版,我正在尝试估计这个发行版。 现在我正在使用R中的包 KernSmooth 和高斯内核,并使用包的dpik()函数自动选择我的带宽。 (我假设它使用AMISE或排序,如果有更好的自动带宽选择过程,请告诉我) 然而,我感兴趣的是找到与分布中最高峰相对应的x值...这对我来说似乎是一件非常简单的事情,而我之前因为沮丧而放弃了一些琐事,我遇到了一些障碍。 KernSmooth中的bkde()函数传回一组(x,y)坐标,这些坐标映射出算法估计的分布。我知道我可以简单地对数据进行线性搜索以找到最大y值,并且可以简单地获取相应的x值,但是,因为我正在编写一个可以在自动化过程中频繁调用的函数,我觉得它是效率低下。由于bkde()给出了很多价值,因此效率特别低。

我的另一个想法是尝试将曲线拟合到它并采用导数并将其设置为等于零,但听起来它也可能效率低下。 也许density()在这里使用会更好吗?

如果有任何有效的方法,请告诉我......我实际上打算对我找到的发行版进行一些推断。例如找到切断点以切断任一侧尾部的一定百分比(即置信区间)并找到预期值。 我现在模糊的计划是使用一些蒙特卡罗技术或尝试从分布中抽取来获得有关自举技术的区域的想法。 任何有关这些方法的任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

使用:

> require(KernSmooth)
Loading required package: KernSmooth
KernSmooth 2.23 loaded
Copyright M. P. Wand 1997-2009
> mod <- bkde(faithful$waiting)
> str(mod)
List of 2
 $ x: num [1:401] 22.7 23 23.2 23.4 23.7 ...
 $ y: num [1:401] 3.46e-08 1.17e-07 1.40e-07 1.68e-07 2.00e-07 ...

这不够有效吗?

> which(mod$y == max(mod$y))
[1] 245

density()执行类似的操作,但它会以x的512个固定间隔返回512个密度值的值。

在两个函数中,可以控制返回的点数。请参阅gridsize中的参数bkde()n中的density()。当然,该方法的精确度取决于估计KDE的点的密度,因此你赢了;我想把它设置得太低。

我的直觉告诉我,你可能会花费更多的时间来思考并实施一种比使用上述简单解决方案更有效的方法。