Нахождение точек перегиба в R по сглаженным данным


14

У меня есть некоторые данные, которые я использую loess. Я хотел бы найти точки перегиба сглаженной линии. Это возможно? Я уверен, что кто-то нашел причудливый метод, чтобы решить эту проблему ... Я имею в виду ... в конце концов, это R!

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

Вот код, который я использую:

x = seq(1,15)
y = c(4,5,6,5,5,6,7,8,7,7,6,6,7,8,9)
plot(x,y,type="l",ylim=c(3,10))
lo <- loess(y~x)
xl <- seq(min(x),max(x), (max(x) - min(x))/1000)
out = predict(lo,xl)
lines(xl, out, col='red', lwd=2)

введите описание изображения здесь


3
Может быть, вы хотите взглянуть на анализ точек изменения .
Нико

Я нашел эту строку кода очень полезной: infl <- c (FALSE, diff (diff (out)> 0)! = 0) Но этот код находит все точки поворота независимо от того, поворачивается он вверх или вниз. Как я могу сказать, какие точки изгибаются, а какие изгибаются во временной серии? Например, нанесите и раскрасьте точку поворота вверх зеленым, а вниз красным.
user3511894

Ответы:


14

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

infl <- c(FALSE, diff(diff(out)>0)!=0)

Затем вы можете добавить точки на график, где происходят эти перегибы.

points(xl[infl ], out[infl ], col="blue")

С точки зрения нахождения статистически значимых точек перегиба, я согласен с @nico, что вам следует изучить анализ точек изменения, иногда также называемый сегментированной регрессией.


Это, кажется, делает работу несколько хорошо. Я понимаю, что это не идеал, и результат, который он дает, конечно, не идеален. Спасибо за вклад, хотя. Он охватывает большинство случаев, за исключением таких вещей, как прямая линия.
user164846

3
Я не уверен, что понимаю, @ user164846. Прямая линия не имеет точек перегиба.
Жан В. Адамс

Кроме того, вы можете взглянуть на сглаживатели, которые сразу же дают производные, например, фильтры Савицкого-Голея. Однако выбор сглаживателя всегда должен определяться вашими данными и приложением, а не наоборот!
cbeleites недоволен SX

4

Здесь есть проблемы на нескольких уровнях.

Во-первых, Лёсс просто оказывается более гладкой, и есть из чего выбирать. Оптимисты утверждают, что практически любой разумный сглаживатель найдет реальную модель, и что почти все разумные сглаживатели согласятся с реальной моделью. Пессимисты утверждают, что это проблема, и что «разумные сглаживатели» и «реальные модели» здесь определены в терминах друг друга. Кстати, почему лесс и почему вы думаете, что хороший выбор здесь? Выбор состоит не только из одного сглаживателя или отдельной реализации сглаживателя (не все, что идет под именем лесс или лоуссес, одинаково для всех программ), но также и с одной степенью сглаживания (даже если это выбрано рутина для вас). Вы упоминаете этот момент, но это не относится к нему.

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


Я выбрал лесс, потому что я взял его из интернета. Я очень опытный в сглаживании в целом, поэтому я просто взял код онлайн. У вас есть лучшее предложение?
user164846

Извините, но я не понимаю ваш комментарий. Если у вас большой опыт сглаживания, у вас должны быть аргументы, для которых сглаживатели лучше всего сохраняют изгибы при подавлении шума. Это кажется противоречивой целью для меня, но я был бы рад услышать технические аргументы, почему я ошибаюсь.
Ник Кокс

Извините, я имею в виду не "неопытного" ха-ха
user164846

1
Понимаю. Жизнь коротка, и вы не можете попробовать все возможные методы. Мы не можем видеть ваши реальные данные, но ваш игрушечный пример подчеркивает, что сглаживание может удалить идентифицируемую структуру.
Ник Кокс

2

Есть множество отличных подходов к этому вопросу. Некоторые включают. (1) - changepoint- package (2) - сегментированный - пакет. Но вы должны выбрать количество точек изменения. (3) MARS, как реализовано в пакете -earth-

В зависимости от вашего компромисса смещения / отклонения, все даст вам немного другую информацию. -сегментированный- стоит посмотреть. Разное количество моделей точек переключения можно сравнить с AIC / BIC


1

Возможно, вы могли бы использовать библиотеку fda, ​​и как только вы оценили подходящую непрерывную функцию, вы можете легко найти места, где вторая производная равна нулю.

FDA CRAN

FDA Intro


Нули первой производной определяют минимумы и максимумы. Я думаю, что вы имеете в виду второе. Что "легко", в любом случае? Существует несколько способов провести численную дифференциацию.
Ник Кокс

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.