Я пытаюсь найти локальные максимумы для функции плотности вероятности (найдены с использованием density
метода R ). Я не могу сделать простой метод «осмотреть соседей» (когда нужно осмотреть точку, чтобы увидеть, является ли это локальным максимумом по отношению к ее соседям), поскольку существует большой объем данных. Кроме того, кажется более эффективным и универсальным использовать что-то вроде сплайн-интерполяции, а затем найти корни 1-й производной, в отличие от построения «осмотра соседей» с отказоустойчивостью и другими параметрами.
Итак, мои вопросы:
- При заданной функции от
splinefun
каких методов будут найдены локальные максимумы? - Есть ли простой / стандартный способ найти производные функции, возвращаемой с помощью
splinefun
? - Есть ли лучший / стандартный способ найти локальные максимумы функции плотности вероятности?
Для справки ниже приведен график моей функции плотности. Другие функции плотности, с которыми я работаю, похожи по форме. Я должен сказать, что я новичок в R, но не новичок в программировании, поэтому может быть стандартная библиотека или пакет для достижения того, что мне нужно.
Спасибо за вашу помощь!!
density()
не оценивает плотность для каждого элемента данных, он оценивает плотность по n значениям, где n - это заданный пользователем параметр со значением по умолчанию n = 512.msExtrema {msProcess}
), и смог определить только некоторые из максимумов, но не все, играя с настройками допуска.msExtrema
, это просто оболочка дляpeaks
изsplus2R
пакета, который вы бы лучше использовать непосредственно , если вы хотите только локальные максимумы , а не локальные минимумы. Я не могу понять, почему использование по умолчаниюspan=3
не может найти все локальные максимумы. И 2 ^ 15 = 32768 не должно быть достаточно большим, чтобы эффективность была серьезной проблемой.peaks
похоже, глючит: он вызываетmax.col
с настройкой по умолчаниюties.method = "random"
, которая не только случайным образом разрывает связи, но и устанавливает относительный допуск 1e-5 для объявления связи. Первое сбивает с толку, последнее определенно не то, что вы хотите здесь.peaks()
также принимаетstrict
параметр, который плохо документирован и, глядя на код функции, ничего не делает. Ах, радости пользовательских программных библиотек! Вы, возможно, вполне сможете это исправить, так как говорите, что не новичок в программировании,Ответы:
То, что вы хотите сделать, называется обнаружением пиков в хемометрике. Существуют различные методы, которые вы можете использовать для этого. Здесь я демонстрирую только очень простой подход.
источник