У меня есть данные о продажах для ряда торговых точек, и я хочу классифицировать их в зависимости от формы их кривых с течением времени. Данные выглядят примерно так (но, очевидно, не случайны и содержат некоторые пропущенные данные):
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. Я рассмотрел следующий подход:
- Создайте новый столбец путем линейного преобразования var0 каждого магазина в значение от 0,0 до 1,0 для всего временного ряда.
- Сгруппируйте эти преобразованные кривые, используя
kml
пакет в R.
У меня есть два вопроса:
- Это разумный исследовательский подход?
- Как я могу преобразовать мои данные в продольный формат данных, который
kml
будет понятен? Любые фрагменты R будут высоко оценены!
r
time-series
clustering
fmark
источник
источник
kml
?Ответы:
Несколько ссылок для анализа продольных данных обсуждались в ссылке, предоставленной @Jeromy, поэтому я бы посоветовал вам внимательно прочитать их, особенно те, которые касаются функционального анализа данных. Попробуйте поискать в Google «Функциональная кластеризация продольных данных» или набор инструментов PACE Matlab, который конкретно посвящен кластеризации нерегулярных выборок на основе моделей (Пенг и Мюллер, Кластеризация на основе расстояний редко наблюдаемых случайных процессов, с приложениями для онлайн-аукционов , Анналы прикладной статистики 2008 2: 1056). Я могу представить, что может быть хорошая статистическая структура для финансовых временных рядов, но я не знаю об этом.
kml
Пакет в основном зависит от к-средств, работающих (по умолчанию) на евклидовых расстояний между измерений , наблюдаемых на лиц. То, что называется траекторией, является просто серией наблюдаемых значений для отдельных , иНиже я покажу вам некоторый код, который может помочь поэкспериментировать с ним (мое начальное значение обычно устанавливается на 101, если вы хотите воспроизвести результаты). В основном, для использованияt
kml
вам просто нужно построитьclusterizLongData
объект (id
номер для первого столбца и измерений в следующих столбцах).Следующие два рисунка представляют собой необработанные смоделированные данные и пятикластерное решение (согласно критерию Калинского, также используемому в пакете fpc ). Я не показываю уменьшенную версию .
источник
kml
работал с моими данными, но, как вы и предполагали, кластеризация в основном основана на величине, а не на форме кривой, поэтому я пробую несколько шагов предварительной обработки, чтобы посмотреть, смогу ли я улучшить ситуацию. Работа Sangalli et al. выглядит очень многообещающе для того, что я хочу сделать - однако я не могу найти реализацию их подхода. Я, наверное, не успеваю создать собственную реализацию своей работы для этого проекта, однако. Вам известны какие-либо реализации FOSS?Альтернативный подход был опубликован регулярным участником stats.se в Ване, Сяочже, Кейт Смит и Робе Хиндмане.
Они пишут:
R-код доступен в блоге Роба .
источник
Вы можете посмотреть на работу Имонна Кеога (UC Riverside) по кластеризации временных рядов. Его сайт имеет много ресурсов. Я думаю, что он предоставляет примеры кода Matlab, так что вам придется перевести это на R.
источник