Пошук локальних екстремумів функції щільності за допомогою сплайнів


15

Я намагаюся знайти локальні максимуми для функції щільності ймовірності (знайденої за допомогою densityметоду R ). Я не можу простий метод "озирнутися навколо сусідів" (де можна оглянути точку, щоб побачити, чи це локальний максимум щодо своїх сусідів), оскільки є великий об'єм даних. Крім того, здається більш ефективним і загальним використовувати щось на зразок інтерполяції Spline, а потім знайти коріння 1-ї похідної, на відміну від побудови "озирнусь навколо сусідів" з відмовою та іншими параметрами.

Отже, мої запитання:

  1. З огляду на функцію від splinefun, за якими методами можна знайти локальні максимуми?
  2. Чи є простий / стандартний спосіб знайти похідні функції, повернуті за допомогою splinefun?
  3. Чи існує кращий / стандартний спосіб знайти локальні максимуми функції щільності ймовірності?

Для довідки, нижче - графік моєї функції щільності. Інші функції щільності, з якими я працюю, схожі за формою. Я повинен сказати, що я новачок у R, але не новачок у програмуванні, тому може бути стандартна бібліотека чи пакет для досягнення того, що мені потрібно. функція щільності

Спасибі за вашу допомогу!!


Мені не зрозуміло, чому великий об'єм даних є проблемою для методу "озирнутися навколо сусідів". density()не оцінює щільність для кожної дати, вона оцінює щільність за n значень, де n - визначений користувачем параметр зі значенням за замовчуванням n = 512.
onestop

Мій п для цього дорівнює 2 ^ 15, і, здається, що дані мають велику дисперсію на рівні «точка-точка». Я спробував написати max / min finder, використовуючи щось подібне до методу мікрорайонів (через msExtrema {msProcess}), і змог визначити лише кілька максимумів, ніколи не всі, граючи з налаштуваннями допуску.
aaronlevin

2
Дивлячись на код msExtrema, це просто оболонка для peaksз splus2Rпакета, який ви б краще використовувати безпосередньо , якщо ви хочете тільки локальні максимуми , а не локальні мінімуми. Я не можу зрозуміти, чому за допомогою типових параметрів span=3не знайдуться всі локальні максимуми. І 2 ^ 15 = 32768 не повинно бути достатньо великим, щоб ефективність викликала великі проблеми.
onestop

Функція, повернута splinefun, має аргумент "deriv", який за замовчуванням дорівнює 0. Встановіть похідне = 1 для першої похідної.
Cyan

1
Хм, peaksздається, баггі: він дзвонить max.colіз налаштуваннями за замовчуванням ties.method = "random", що не лише розриває зв’язки навмання, але й встановлює відносний допуск 1e-5 для оголошення краватки. Перше заплутане, друге - це точно не те, що ви хочете тут. peaks()також приймає strictпараметр, який погано зафіксований і, дивлячись на код функції, нічого не робить. Ах, радості бібліотек програмного забезпечення, що надаються користувачем! Ви, можливо, зможете це виправити, хоча, як ви говорите, ви не новачок у програмуванні
onestop

Відповіді:


14

Те, що ви хочете зробити, в хіміометрії називають піковим виявленням. Для цього можна використовувати різні методи. Я демонструю тут дуже простий підхід.

require(graphics)
#some data
d <- density(faithful$eruptions, bw = "sj")

#make it a time series
ts_y<-ts(d$y)

#calculate turning points (extrema)
require(pastecs)
tp<-turnpoints(ts_y)
#plot
plot(d)
points(d$x[tp$tppos],d$y[tp$tppos],col="red")

З усіх рішень це найкраще працювало. 1. Подальше запитання: чи можна змінити толерантність за допомогою поворотних точок? Знайдено багато піків і долин у довгохвістовій частині функції густини. 2. Подальше запитання №2: що є хорошим способом визначення толерантності?
aaronlevin

оголошення 1. Я не думаю, що так. Він призначений для перевірки випадковості часових рядів, тому функція цього не потребує. Ви можете спробувати перевірити релевантність / значимість піку самостійно. Наприклад, ви могли б зробити t-тест проти мікрорайону (де ви можете вирішити, якою має бути велика околиця). Або ви можете шукати більш гнучку функцію в пакетах R для оцінки даних із (масової) спектрометрії чи інших методів аналітичної хімії.
Роланд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.