Временной ряд «кластеризация» в R


38

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

То есть, если бы временной ряд читался в двухмерной матрице, он бы выглядел примерно так:

date     T1   T2   T3 .... TN
1/1/01   100  59   42      N/A
2/1/01   120  29   N/A     42.5
3/1/01   110  N/A  12      36.82
4/1/01   N/A  59   40      61.82
5/1/01    05  99   42      23.68
...
31/12/01  100  59   42     N/A

etc 

Я хочу написать сценарий R, который будет разделять временные ряды {T1, T2, ... TN} на «семейства», где семья определяется как набор рядов, которые «имеют тенденцию двигаться в согласии» друг с другом.

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

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

Я предполагаю, что для этого НЕ существует надежного статистического метода, поэтому мне было бы очень интересно посмотреть, как люди подходят к этой проблеме и решают ее - думая как статистик.


1
Вы также можете быть заинтересованы в ответах на этот вопрос, stats.stackexchange.com/q/2777/1036
Энди W


1
Существует статистический метод, основанный на процессах Дирихле, который работает для наборов данных, где временные точки не одинаковы для всех выборок.
Дарио

Ответы:


24

При потоковой передаче данных и извлечении баз данных временных рядов общий подход заключается в преобразовании ряда в символическое представление, а затем в метрике ряда с использованием метрики сходства, например евклидова расстояния. Наиболее популярными являются SAX (Keogh & Lin) или более новый iSAX (Shieh & Keogh):

Страницы выше также содержат ссылки на метрики расстояния и кластеризацию. Кео и его команда занимаются воспроизводимыми исследованиями и довольно восприимчивы к выпуску своего кода. Так что вы можете написать им и спросить. Я считаю, что они, как правило, работают в MATLAB / C ++.

Недавно была предпринята попытка создать реализацию на Java и R:

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


1
Это похоже на хорошую, послушную отправную точку. спасибо за ссылки.
Morpheous

4
Черт возьми, я думаю, что SAX-страница - самая уродливая веб-страница, которую я когда-либо видел!
naught101

18

Другой способ сказать «склонен двигаться с сочувствием» - это «объединяться».

Существует два стандартных способа вычисления коинтеграции : метод Энгла-Грейнджера и метод Йохансена. Они описаны в «Анализе интегрированных и коинтегрированных временных рядов с помощью R» (Pfaff 2008) и соответствующего пакета R urca . Я очень рекомендую книгу, если вы хотите использовать эти методы в R.

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


Я столкнулся с коинтеграцией несколько лет назад, но мне это казалось очень сложным (я этого не понимал!). Я надеялся, что будет менее теоретическое (то есть более практичное) решение ...
Morpheous 1.10.10

3
Метод Энгла-Грейнджера не особенно сложен: вы просто берете остатки регрессии между двумя рядами и определяете, имеет ли он единичный корень. Это, безусловно, практично: его регулярно используют для решения широкого спектра проблем. Тем не менее, я полагаю, что любой ответ на ваш вопрос потребует некоторых статистических знаний (например, вы должны понимать такие вещи, как стационарность, независимость и т. Д.) ...
Шейн

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

@ Энди: Я уверен, что есть лучший способ, и я с нетерпением жду, чтобы услышать об этом. Это довольно простой подход.
Шейн

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

4

Временные ряды кластеризации довольно часто проводятся популяционными динамиками, особенно теми, которые изучают насекомых, чтобы понять тенденции вспышек и коллапса. Ищите работу на цыганском моли, еловом будоорме, горном кедре и лиственнице.

Для фактической кластеризации вы можете выбрать любую метрику расстояния, которая вам нравится, у каждой, вероятно, есть свои сильные и слабые стороны в зависимости от типа кластеризованных данных, Кауфманн и Руссее, 1990. Поиск групп в данных. Введение в кластерный анализ - это хорошее место для начала. Помните, что метод кластеризации не заботится о том, что вы используете временной ряд, он только смотрит на значения, измеренные в один и тот же момент времени. Если ваши два временных ряда недостаточно синхронизированы по продолжительности их жизни, они не будут (и, возможно, не должны) объединяться.

У вас будут проблемы с определением количества кластеров (семейств), которые будут использоваться после кластеризации временных рядов. Существуют различные способы выбора отрезка информационных кластеров, но здесь литература не так хороша.


1
Крис, регулярная кластеризация не поможет. Вы также должны признать, что серия тесно связана со своим прошлым, поставив каждыйY1,Tкак собственное измерение (т. е. приводящее к измерениям N * T), или вы объединяете все измерения вместе, но тогда (с учетом высокой корреляции внутри ряда) у вас всегда будет один кластер. Кроме того, большинство методов кластеризации плохо подходят / рекомендуются для сильно коррелированных переменных (существует более или менее изгибное предположение о сферических кластерах).
user603

1
@ user603 Можете ли вы объяснить, «Вы должны либо признать, что ряд сильно коррелирует с собственным прошлым, указав каждый y1, t как свое собственное измерение (т. е. приводящее к измерениям N * T)»?
B_Miner

2

See my answer to a similar question here. Long story short, do a fast Fourier transform of the data, discard redundant frequencies if your input data was real valued, separate the real and imaginary parts for each element of the fast Fourier transform, and use the Mclust package in R to do model-based clustering on the real and imaginary parts of each element of each time series. The package automates optimization over number of clusters and their densities.


0

You could also use the package clustDDist, which performs the leaders method and the hierarchical clustering method with different error measures:

http://r-forge.r-project.org/projects/clustddist/

The squared Euclidean distance favors patterns of distributions that have one steep high peak and therefore measure

d4(x,y)=(xy)2y
is sometimes preferred.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.