Можно ли выполнять кластеризацию временных рядов на основе формы кривой?


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)

Я хотел бы знать, как я могу кластеризовать на основе формы кривых в R. Я рассмотрел следующий подход:

  1. Создайте новый столбец путем линейного преобразования var0 каждого магазина в значение от 0,0 до 1,0 для всего временного ряда.
  2. Сгруппируйте эти преобразованные кривые, используя kmlпакет в R.

У меня есть два вопроса:

  1. Это разумный исследовательский подход?
  2. Как я могу преобразовать мои данные в продольный формат данных, который kmlбудет понятен? Любые фрагменты R будут высоко оценены!

2
Вы можете получить несколько идей из предыдущего вопроса о кластеризации отдельных продольных траекторий данных stats.stackexchange.com/questions/2777/…
Jeromy Anglim

1
@Jeromy Anglin Спасибо за ссылку. У тебя была удача kml?
Fmark

Я быстро посмотрел, но на данный момент я использую специализированный кластерный анализ, основанный на выбранных особенностях отдельных временных рядов (например, среднее, начальное, конечное, изменчивость, наличие резких изменений и т. Д.).
Jeromy Anglim


@Rob Этот вопрос, кажется, не предполагает нерегулярных временных интервалов, но на самом деле они близки друг к другу (я не напомнил о другом вопросе во время моих работ).
ЧЛ

Ответы:


26

Несколько ссылок для анализа продольных данных обсуждались в ссылке, предоставленной @Jeromy, поэтому я бы посоветовал вам внимательно прочитать их, особенно те, которые касаются функционального анализа данных. Попробуйте поискать в Google «Функциональная кластеризация продольных данных» или набор инструментов PACE Matlab, который конкретно посвящен кластеризации нерегулярных выборок на основе моделей (Пенг и Мюллер, Кластеризация на основе расстояний редко наблюдаемых случайных процессов, с приложениями для онлайн-аукционов , Анналы прикладной статистики 2008 2: 1056). Я могу представить, что может быть хорошая статистическая структура для финансовых временных рядов, но я не знаю об этом.

kmlПакет в основном зависит от к-средств, работающих (по умолчанию) на евклидовых расстояний между измерений , наблюдаемых на лиц. То, что называется траекторией, является просто серией наблюдаемых значений для отдельных , и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 ). Я не показываю уменьшенную версию .

альтернативный текст

альтернативный текст


1
Спасибо за ваш очень подробный ответ чи. Я kmlработал с моими данными, но, как вы и предполагали, кластеризация в основном основана на величине, а не на форме кривой, поэтому я пробую несколько шагов предварительной обработки, чтобы посмотреть, смогу ли я улучшить ситуацию. Работа Sangalli et al. выглядит очень многообещающе для того, что я хочу сделать - однако я не могу найти реализацию их подхода. Я, наверное, не успеваю создать собственную реализацию своей работы для этого проекта, однако. Вам известны какие-либо реализации FOSS?
Fmark

@fmark Насколько мне известно, реализации OSS нет (работа совсем недавняя); они используют k-means и k-medoids, которые доступны в R. По моему мнению, наиболее важными являются генерация шаблонных кривых и реализация функции деформации. Для этого вы можете найти дополнительную информацию, посмотрев анализ морфометрии / прокруста или поиск кода в наборе инструментов Matlab PACE (но он должен быть полон EM или чего-то подобного). Моя лучшая рекомендация: спросите у автора о бесплатной реализации их алгоритма.
ЧЛ

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

1
Почему бы просто не удалить среднее (и, возможно, разделить на стандартное отклонение), а затем сделать это? Тогда результаты будут намного больше о форме, а не о величине ...
naught101

9

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

«Кластеризация на основе признаков для данных временных рядов». Data Mining and Knowledge Discovery 13, нет. 3 (2006): 335–364 .

Они пишут:

В данной статье предлагается метод кластеризации временных рядов на основе их структурных характеристик. В отличие от других альтернатив, этот метод не группирует значения точек с использованием метрики расстояния, а скорее кластеризует на основе глобальных признаков, извлеченных из временных рядов. Показатели характеристик получены из каждого отдельного ряда и могут быть использованы в произвольных алгоритмах кластеризации, включая алгоритм нейронной сети без контроля, самоорганизующуюся карту или алгоритм иерархической кластеризации. Глобальные показатели, описывающие временные ряды, получают путем применения статистических операций, которые наилучшим образом отражают основные характеристики: тренд, сезонность, периодичность, последовательная корреляция, асимметрия, эксцесс, хаос, нелинейность и самоподобие. Поскольку метод кластеров с использованием извлеченных глобальных мер, это уменьшает размерность временного ряда и намного менее чувствительно к отсутствующим или шумным данным. Мы также предоставляем механизм поиска, чтобы найти лучший выбор из набора функций, который должен использоваться в качестве входных данных кластеризации.

R-код доступен в блоге Роба .


6

Вы можете посмотреть на работу Имонна Кеога (UC Riverside) по кластеризации временных рядов. Его сайт имеет много ресурсов. Я думаю, что он предоставляет примеры кода Matlab, так что вам придется перевести это на R.

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