"Кластеризація" часових рядів в R


38

У мене є набір даних часових рядів. Кожна серія охоплює один і той же період, хоча фактичні дати в кожному часовому ряді можуть не всі «точно вирівнюватися».

Тобто, якби серія «Час» читалася у 2D матриці, вона виглядала б приблизно так:

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
Andy W


1
Існує статистичний метод, заснований на процесах Діріхле, який працює для наборів даних, де часові точки не однакові для всіх зразків.
Даріо

Відповіді:


24

У потоковому потоці даних та майнінгу баз даних часових рядів загальним підходом є перетворення ряду в символічне зображення, а потім використання метрики подібності, наприклад, евклідової відстані, для кластеризації серії. Найпопулярніші представництва - SAX (Keogh & Lin) або новіший iSAX (Shieh & Keogh):

На наведених вище сторінках також містяться посилання на метрику відстаней та кластеризацію. Кео і екіпаж займаються відтворюваними дослідженнями і досить сприйнятливі до випуску свого коду. Тож ви можете їм надіслати електронною поштою і запитати. Я вважаю, що вони, як правило, працюють у MATLAB / C ++.

Нещодавно були спроби створити реалізацію Java та R:

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


1
Це виглядає як гарна, відмітна відправна точка. дякую за посилання.
мертвий

4
Боже, дерьмо, я думаю, що SAX-сторінка - найгірша веб-сторінка, яку я коли-небудь бачив!
naught101

18

Інший спосіб сказати, "як правило, рухаються в симпатії", є "спільним інтеграцією".

Існує два стандартних способи обчислення коінтеграції : метод Енгл-Грейнджера та процедура Йохансена. Вони висвітлюються в "Аналізі інтегрованих та коінтегрованих часових рядів з R" (Pfaff 2008) та пов'язаному з ними пакетом R urca . Я дуже рекомендую книгу, якщо ви хочете скористатися цими методами в Р.

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


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

3
Метод Енгл-Грейнджера не особливо складний: ви просто забираєте залишки регресії між двома серіями і визначаєте, чи має він одиничний корінь. Це, безумовно, практично: його регулярно використовують для широкого спектру проблем. З цього приводу я думаю, що будь-яка відповідь на ваше запитання потребуватиме статистичних знань (наприклад, ви повинні розуміти такі речі, як стаціонарність, незалежність тощо) ...
Shane

чи є кращий спосіб зробити це, ніж протестувати всі парні серії на спільну інтеграцію (маючи такий самий ідеал на увазі, щоб згрупувати серії разом?) Чи не було б це пропозиція залежати від того, що самі серії інтегруються на наступ?
Енді Ш

@Andy: Я впевнений, що є кращий спосіб, і я з нетерпінням чекаю чути про це. Це досить базовий підхід.
Шейн

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

4

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

Для фактичного кластеризації ви можете вибрати будь-яку метрику відстані, яка вам подобається, кожна, ймовірно, має власні сильні сторони та тижневики щодо типу кластеризованих даних, Kaufmann та Rousseeuw 1990. Пошук груп даних. Вступ до кластерного аналізу - хороше місце для початку. Пам’ятайте, що метод кластеризації не «небайдужий», що ви використовуєте часовий ряд, він розглядає лише значення, виміряні в той самий момент часу. Якщо ваші два часові ряди недостатньо синхронізовані протягом їхнього життя, вони не будуть (а може і не повинні) кластеризуватися.

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


1
у1,т

1
@ user603 Чи можете ви пояснити "Ви або повинні визнати, що серія сильно співвідноситься з її власним минулим, поставивши кожну y1, t як свій власний вимір (тобто в результаті виходить N * T розмірів)" будь ласка?
B_Miner

2

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


0

Ви також можете використовувати пакет clustDDist, який виконує метод лідерів та метод ієрархічної кластеризації з різними заходами помилок:

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

г4(х,у)=(х-у)2у
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.