Я не знаю много о том, как кластеризовать временные ряды, но я попробовал метод, представленный в примере OP, на временных рядах неравной длины, и он, кажется, работает нормально ... и он должен: согласно авторамdtw
пакет,
Функция выполняет динамическую деформацию времени (DTW) и вычисляет оптимальное выравнивание между двумя временными рядами x и y, заданными в виде числовых векторов. «Оптимальное» выравнивание минимизирует сумму расстояний между выровненными элементами. Длины x и y могут различаться .
Сначала загрузите библиотеки
library(dtw); library(ggplot2)
, затем создайте временной ряд
xlist <- list(x1 = c(7.4, 8.1, 8.5, 9.1, 9.6, 10.2, 10.7, 11.3, 11.9)
x2 = c(7.3, 7.6, 7.9, 8.2, 8.5, 8.8, 9.1, 9.4, 9.7, 10.1,
10.4, 10.7, 11.5)
x3 = c(7.6, 8.1, 8.6, 9.1, 9.6, 10.2, 10.7, 11.8)
x4 = c(7.4, 7.8, 8.4, 8.9, 9.4, 10, 10.5, 11.1, 11.6, 12.3,
12.8, 13.4, 13.5, 13.9, 14.4, 14.9, 15.4))
... которые выглядят так
df <- stack(xlist)
df$i <- unlist(lapply(xlist, seq_along))
ggplot(df, aes(i, values, color = ind)) + geom_point() +
geom_line() + theme_bw() + facet_wrap(.~ind, nrow = 2) +
labs(x="", y="", color = "Time series")
Тот же код, что и код, используемый ОП для временных рядов равной длины, работает нормально.
dm <- dist(xlist, method= "DTW")
hc <- hclust(dm, method="average")
plot(as.dendrogram(hc), hang = -1)
rect.hclust(hc, k = 2)