2012-06-05 4 views
0

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

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

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

+0

Я бы рекомендовал книгу 1995 года Wand and Jones «Сглаживание ядра» из Chapman & Hall - книги, на которой основан пакет KernSmooth, - чтобы получить более полное представление о процессах выбора полосы пропускания. – Nan

ответ

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

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

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

+0

Спасибо. Линейный поиск, вероятно, прекрасен ... Я, скорее всего, просто переутомил его и ожидал некоторой магии. Любые советы по тому, как я должен попытаться выполнить выборку ... на самом деле мне, скорее всего, даже не нужно это делать: Для ожидаемого значения я мог бы суммировать по x * y, так как y представляет p (x) здесь и разделите на dx, который в этом случае будет 401. Достаточно приличный? Что касается вычислительных областей вероятности ... Любая встроенная функция или мне нужно делать суммы Riemann вручную или сортировать? – msabin