Чи можливо зробити кластеризацію часових рядів на основі форми кривої?


47

У мене є дані про продажі для ряду торгових точок, і я хочу їх класифікувати за формою кривих у часі. Дані виглядають приблизно так (але, очевидно, не є випадковими і мають деякі відсутні дані):

n.quarters <- 100
n.stores <- 20
if (exists("test.data")){
  rm(test.data)
}
for (i in 1:n.stores){
  interval <- runif(1, 1, 200)
  new.df <- data.frame(              
    var0 = interval + c(0, cumsum(runif(49, -5, 5))),
    date = seq.Date(as.Date("1990-03-30"), by="3 month", length.out=n.quarters),
    store = rep(paste("Store", i, sep=""), n.quarters))
  if (exists("test.data")){
    test.data <- rbind(test.data, new.df)    
  } else {
    test.data <- new.df
  }
}
test.data$store <- factor(test.data$store)

Мені хотілося б знати, як я можу кластеризуватись на основі форми кривих у Р. Я розглядав такий підхід:

  1. Створіть новий стовпець, лінійно перетворивши var0 кожного магазину на значення від 0,0 до 1,0 для всього часового ряду.
  2. Кластеруйте ці перетворені криві, використовуючи kmlпакет у Р.

У мене є два питання:

  1. Це розумний дослідницький підхід?
  2. Як я можу перетворити свої дані у формат поздовжніх даних, який kmlзрозуміє? Будь-які фрагменти R були б вдячні!

2
Ви можете отримати кілька ідей із попереднього питання про кластеризацію окремих поздовжніх траєкторій даних stats.stackexchange.com/questions/2777/…
Jeromy Anglim,

1
@Jeromy Anglin Дякую за посилання. Чи пощастило вам kml?
fmark

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


@Rob Це питання, здається, не передбачає нерегулярних часових інтервалів, але вони дійсно близькі один одному (інше питання я не нагадував під час моїх писань).
chl

Відповіді:


26

Кілька напрямків аналізу поздовжніх даних були обговорені у посиланні, наданому @Jeromy, тому я пропоную вам уважно прочитати їх, особливо ті, які стосуються функціонального аналізу даних. Спробуйте googling для "Функціональне кластеризація поздовжніх даних" або панель інструментів PACE Matlab, яка спеціально стосується кластеризації на основі моделей траєкторій з нерегулярною вибіркою (Пенг і Мюллер, кластеризація на основі відстані рідко спостережуваних стохастичних процесів, з додатками до онлайн-аукціонів , Літописи прикладної статистики 2008 р. 2: 1056). Я можу собі уявити, що може бути хороша статистична база для фінансових часових рядів, але я не знаю про це.

В kmlосновному пакет покладається на k-засоби, що працюють (за замовчуванням) на евклідових відстанях між вимірюваннями, що спостерігаються на особин. Що називається траєкторією тільки ряд спостережуваних значень для індивідуального , іtniyi=(yi1,yi2,,yit)d(yi,yj)=t1k=1t(yikyjk)2. Пропущені дані обробляються через незначну модифікацію попередньої міри відстані (коригування Говер), пов’язаної з найближчою сусідською схемою імпутації (для обчислення критерію Калінського). Оскільки я не представляю себе, як виглядатимуть реальні дані, я не можу сказати, чи спрацюють вони. Принаймні, це працює з поздовжніми кривими зростання, "поліноміальної" форми, але я сумніваюсь, це дозволить виявити дуже специфічні закономірності (наприклад, локальні мінімуми / максимуми в конкретних часових точках з часовими точками, що відрізняються між кластерами, перекладом для приклад). Якщо ви зацікавлені в кластеризації можливих нерівних кривих, то вам остаточно потрібно переглянути інші рішення; Функціональна кластеризація та вирівнювання від Sangalli et al. Та посилання на них можуть слугувати хорошою відправною точкою.

Нижче я показую вам якийсь код, який може допомогти експериментувати з ним (моє насіння, як правило, встановлено на 101, якщо ви хочете відтворити результати). В основному, для використання kmlвам просто потрібно побудувати clusterizLongDataоб'єкт ( idчисло для першого стовпця і вимірювання в наступних стовпцях).t

library(lattice)
xyplot(var0 ~ date, data=test.data, groups=store, type=c("l","g"))

tw <- reshape(test.data, timevar="date", idvar="store", direction="wide")
parallel(tw[,-1], horizontal.axis=F, 
         scales=list(x=list(rot=45, 
                            at=seq(1,ncol(tw)-1,by=2), 
                            labels=substr(names(tw[,-1])[seq(1,ncol(tw)-1,by=2)],6,100), 
                            cex=.5)))

library(kml)
names(tw) <- c("id", paste("t", 1:(ncol(tw)-1)))
tw.cld <- as.cld(tw)
cld.res <- kml(tw.cld,nbRedrawing=5)
plot(tw.cld)

Наступні дві фігури - це сирі імітовані дані та рішення із п’яти кластерів (за критерієм Калінського, який також використовується у пакеті fpc ). Я не показую масштабовану версію .

alt текст

alt текст


1
Дякую за дуже детальну відповідь, чи. Я працюю kmlнад своїми даними, але, як ви запропонували, це згрупування здебільшого на основі величини, а не форми кривої, тому я намагаюся виконати кілька етапів попередньої обробки, щоб побачити, чи можу я покращити питання. Робота Сангаллі та ін. виглядає дуже перспективно для того, що я хочу зробити - проте я не можу знайти їхній підхід. Я, мабуть, не встигаю створити власну реалізацію своєї роботи для цього проекту. Чи знаєте ви про будь-які реалізації FOSS?
fmark

@fmark Немає втілення OSS, наскільки мені відомо (робота досить недавня); вони використовують k-засоби та k-медоїди, які доступні в Р. На мою думку, найбільш критичними частинами є генерування кривих шаблонів та реалізація функції деформації. Для цього ви можете знайти додаткові відомості, переглянувши морфометрію / прокрут-аналіз або пошукаючи код набір інструментів Matlab PACE (але це має бути повно EM, або подібні речі). Моя найкраща рекомендація: Попросіть автора про будь-яку безкоштовну реалізацію їх алгоритму.
chl

2
Я звітну, якщо отримаю стверджуюче твердження :) Їхнє паперове k-середнє вирівнювання для кривої кластеризації має ще деякі деталі реалізації, які також можуть бути корисні тим, хто хоче це зробити самостійно.
fmark

1
Чому б просто не зняти середнє значення (і, можливо, розділити за стандартним відхиленням), а потім зробити це? Тоді результати були б набагато більше про форму, а менше - про величину ...
naught101

9

Альтернативний підхід опублікував регулярний stats.se у Вангах, Сяоже, Кейт Сміт та Роб Хайндман.

"Кластеризація на основі характерних даних для даних часових рядів". Обмін даними та відкриття знань 13, вип. 3 (2006): 335–364 .

Вони пишуть:

У цій роботі пропонується метод кластеризації часових рядів на основі їх структурних характеристик. На відміну від інших альтернатив, цей метод не кластеризує значення точок, використовуючи метрику відстані, скоріше він кластеризується на основі глобальних особливостей, витягнутих із часового ряду. Характеристичні показники отримуються з кожного окремого ряду і можуть подаватися в алгоритми довільного кластеризації, включаючи непідтримуваний алгоритм нейронної мережі, самоорганізується карта або алгоритм ієрархальної кластеризації. Глобальні заходи, що описують часові ряди, отримують шляхом застосування статистичних операцій, які найкраще фіксують основні характеристики: тенденція, сезонність, періодичність, послідовна кореляція, спотвореність, куртоз, хаос, нелінійність та самоподібність. Оскільки метод кластеризує витягнуті глобальні заходи, він зменшує розмірність часового ряду і набагато менш чутливий до відсутніх або галасливих даних. Далі ми надаємо механізм пошуку, щоб знайти найкращий вибір з набору функцій, який слід використовувати як вхід для кластеризації.

R-код доступний у блозі Роба .


6

Ви можете подивитися на роботу Еймонна Кеога (UC Riverside) про кластеризацію часових рядів. На його веб-сайті багато ресурсів. Я думаю, що він надає зразки коду Matlab, тому вам доведеться перекласти це на Р.

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