Нахождение максимального значения из построенной функции плотности (оценка плотности ядра) в R

У меня есть некоторые данные, которые, как я предполагаю, исходят из распределения, и я пытаюсь оценить это распределение. Прямо сейчас я использую пакет KernSmooth в R с ядром Gaussian и использую функцию пакета dpik() для автоматического выбора пропускной способности. (Я предполагаю, что он использует AMISE или сортировку, пожалуйста, дайте мне знать, есть ли лучший процесс автоматического выбора полосы пропускания) Однако меня интересует нахождение значения x, которое соответствует самому высокому пику в распределении. ..Это кажется мне очень простой вещью, и что-то, что я раньше откладывал как тривиальное, но, к моему разочарованию, я натыкаюсь на некоторые препятствия. Функция bkde() в KernSmooth возвращает набор координат (x,y), которые отображают распределение, оцененное алгоритмом. Я знаю, что мог бы просто выполнить линейный поиск по данным, чтобы найти максимальное значение y, и мог бы просто получить соответствующее значение x, но, поскольку я пишу функцию, которая может часто вызываться в автоматизированном процессе, я чувствую, что это неэффективный. Особенно неэффективно, так как bkde() возвращает много значений.

Моя другая идея заключалась в том, чтобы попытаться подобрать к ней кривую, взять производную и установить ее равной нулю, но это звучит так, как будто это может быть неэффективно. Может быть, здесь лучше использовать функцию density()?

Пожалуйста, дайте мне знать, есть ли какой-либо эффективный способ для этого... На самом деле я планирую сделать небольшой вывод о дистрибутивах, которые я нахожу. Например, найти точки отсечки, чтобы отрезать определенный процент хвоста с обеих сторон (т.е. доверительные интервалы) и найти ожидаемое значение. Мой смутный план сейчас состоит в том, чтобы использовать некоторые методы Монте-Карло или попытаться извлечь из дистрибутива, чтобы получить представление о областях с методами начальной загрузки. Мы будем очень признательны за любую помощь в любых методах выполнения любого из этих действий.


person msabin    schedule 05.06.2012    source источник
comment
Я бы порекомендовал книгу Ванда и Джонса «Сглаживание ядра» 1995 года от Chapman & Hall — книгу, на которой основан пакет KernSmooth, — чтобы получить более полное представление о реализуемых процессах выбора полосы пропускания.   -  person Nan    schedule 19.09.2012


Ответы (1)


С использованием:

> 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() делает что-то подобное, но возвращает 512 значений плотности через 512 регулярных интервалов x.

В обеих функциях можно контролировать количество возвращаемых баллов. См. аргумент gridsize в bkde() и n в density(). Конечно, точность подхода зависит от плотности точек, по которым оценивается KDE, так что не стоит задавать слишком низкое значение.

Моя интуиция подсказывает мне, что вы можете потратить намного больше времени на обдумывание и реализацию более эффективного подхода, чем на простое решение, описанное выше.

person Gavin Simpson    schedule 05.06.2012
comment
Спасибо. Линейный поиск, вероятно, в порядке ... Я, скорее всего, просто слишком много думал и ожидал от него какой-то магии. Любые советы о том, как я должен попытаться сделать выборку из него... на самом деле мне, скорее всего, даже не нужно этого делать: для ожидаемого значения я мог бы просуммировать x * y, поскольку y представляет здесь p (x) и разделить на dx что в данном случае будет 401. Достаточно прилично? Что касается вычисления областей вероятности ... Любая встроенная функция или мне нужно делать суммы Римана вручную или сортировать? - person msabin; 06.06.2012