Нахождение локальных экстремумов функции плотности с использованием сплайнов

15

Я пытаюсь найти локальные максимумы для функции плотности вероятности (найдены с использованием densityметода R ). Я не могу сделать простой метод «осмотреть соседей» (когда нужно осмотреть точку, чтобы увидеть, является ли это локальным максимумом по отношению к ее соседям), поскольку существует большой объем данных. Кроме того, кажется более эффективным и универсальным использовать что-то вроде сплайн-интерполяции, а затем найти корни 1-й производной, в отличие от построения «осмотра соседей» с отказоустойчивостью и другими параметрами.

Итак, мои вопросы:

  1. При заданной функции от splinefunкаких методов будут найдены локальные максимумы?
  2. Есть ли простой / стандартный способ найти производные функции, возвращаемой с помощью splinefun?
  3. Есть ли лучший / стандартный способ найти локальные максимумы функции плотности вероятности?

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

Спасибо за вашу помощь!!

aaronlevin
источник
Я не понимаю, почему большой объем данных является проблемой для метода «оглядываться вокруг». density()не оценивает плотность для каждого элемента данных, он оценивает плотность по n значениям, где n - это заданный пользователем параметр со значением по умолчанию n = 512.
onestop
Мой n для этого - 2 ^ 15, и кажется, что у данных есть большая разница по точечному уровню. Я попытался написать искатель макс / мин, используя что-то похожее на метод окрестностей (через msExtrema {msProcess}), и смог определить только некоторые из максимумов, но не все, играя с настройками допуска.
Ааронлевин
2
Глядя на код msExtrema, это просто оболочка для peaksиз splus2Rпакета, который вы бы лучше использовать непосредственно , если вы хотите только локальные максимумы , а не локальные минимумы. Я не могу понять, почему использование по умолчанию span=3не может найти все локальные максимумы. И 2 ^ 15 = 32768 не должно быть достаточно большим, чтобы эффективность была серьезной проблемой.
остановка
Функция, возвращаемая splinefun, имеет аргумент «переменная», который по умолчанию равен 0. Установите производную = 1 для первой производной.
Cyan
1
Хм, peaksпохоже, глючит: он вызывает max.colс настройкой по умолчанию ties.method = "random", которая не только случайным образом разрывает связи, но и устанавливает относительный допуск 1e-5 для объявления связи. Первое сбивает с толку, последнее определенно не то, что вы хотите здесь. peaks()также принимает strictпараметр, который плохо документирован и, глядя на код функции, ничего не делает. Ах, радости пользовательских программных библиотек! Вы, возможно, вполне сможете это исправить, так как говорите, что не новичок в программировании,
onetop

Ответы:

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")
Roland
источник
Из всех решений это сработало лучше всего. 1. Дополнительный вопрос: есть ли способ изменить толерантность с помощью контрольных точек? Нашел много пиков и долин в длинном хвосте функции плотности. 2. Дополнительный вопрос № 2: как правильно определить толерантность?
Ааронлевин
Объявление 1. Я так не думаю. Он предназначен для проверки случайности временных рядов, поэтому функция в этом не нуждается. Вы можете попробовать проверить уместность / значимость пика самостоятельно. Например, вы можете провести t-тест по соседству (где вы можете решить, насколько большим должен быть район). Или вы можете искать более мягкую функцию в R-пакетах для оценки данных из (масс) спектрометрии или других методов аналитической химии.
Роланд