Czy możliwe jest grupowanie szeregów czasowych na podstawie kształtu krzywej?


47

Mam dane dotyczące sprzedaży dla szeregu punktów sprzedaży i chcę je kategoryzować na podstawie kształtu ich krzywych w czasie. Dane wyglądają mniej więcej tak (ale oczywiście nie są losowe i brakuje niektórych danych):

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)

Chciałbym wiedzieć, jak mogę grupować w oparciu o kształt krzywych w R. Rozważyłem następujące podejście:

  1. Utwórz nową kolumnę, przekształcając liniowo wartość var0 każdego sklepu na wartość z zakresu od 0,0 do 1,0 dla całego szeregu czasowego.
  2. Klastry te przekształcone krzywe za pomocą kmlpakietu w R.

Mam dwa pytania:

  1. Czy to rozsądne podejście eksploracyjne?
  2. Jak mogę przekształcić moje dane w format danych podłużnych, który kmlbędzie zrozumiały? Wszelkie fragmenty R byłyby bardzo mile widziane!

2
możesz uzyskać kilka pomysłów z wcześniejszego pytania dotyczącego grupowania indywidualnych trajektorii danych podłużnych stats.stackexchange.com/questions/2777/…
Anglim,

1
@Jeromy Anglin Dzięki za link. Czy miałeś jakieś szczęście kml?
fmark

Rzuciłem okiem, ale na razie korzystam z niestandardowej analizy skupień opartej na wybranych cechach poszczególnych szeregów czasowych (np. Średnia, początkowa, końcowa, zmienność, obecność nagłych zmian itp.).
Jeromy Anglim


@Rob To pytanie nie wydaje się zakładać nieregularnych przedziałów czasowych, ale w rzeczywistości są one blisko siebie (nie przypominałem sobie drugiego pytania w czasie moich pism).
chl

Odpowiedzi:


26

Kilka kierunków analizy danych podłużnych omówiono w linku dostarczonym przez @Jeromy, więc sugeruję, abyś je uważnie przeczytał, szczególnie te dotyczące analizy danych funkcjonalnych. Spróbuj googling dla „Funkcjonalnego grupowania danych podłużnych” lub zestawu narzędzi PACE Matlab, który dotyczy w szczególności klastrowania modelowego nieregularnie trajektorii (Peng i Müller, klastrowanie na podstawie odległości rzadko obserwowanych procesów stochastycznych, z zastosowaniem do aukcji internetowych , Annals of Applied Statistics 2008 2: 1056). Mogę sobie wyobrazić, że mogą istnieć dobre ramy statystyczne dla finansowych szeregów czasowych, ale nie wiem o tym.

kmlPakiet w zasadzie opiera się na k-średnich, praca (domyślnie) na euklidesowej odległości między pomiarów obserwowanych na osobników. To, co nazywa się trajektorią, jest po prostu serią obserwowanych wartości dla poszczególnych , in i y i = ( y i 1 , y i 2 , , y i t ) d ( y i , y j ) = tniyi=(yi1,yi2,,yit)d(yi,yj)=t1k=1t(yikyjk)2. Brakujące dane są przetwarzane przez niewielką modyfikację poprzedniej miary odległości (korekta Gowera) związanej z najbliższym sąsiedzkim schematem imputacji (do obliczenia kryterium Kalinskiego). Ponieważ nie reprezentuję siebie, jak wyglądałyby Twoje rzeczywiste dane, nie mogę powiedzieć, czy to zadziała. Przynajmniej działa z krzywymi wzrostu podłużnego, kształtem „wielomianowym”, ale wątpię, że pozwoli ci to wykryć bardzo specyficzne wzorce (takie jak lokalne minima / maksima w określonych punktach czasowych z punktami czasowymi różniącymi się między klastrami, przez tłumaczenie dla przykład). Jeśli interesuje Cię grupowanie potencjalnie niedopasowanych krzywych, to zdecydowanie musisz spojrzeć na inne rozwiązania; Funkcjonalne grupowanie i wyrównywanie , od Sangalli i wsp., Oraz odnośniki tam zawarte mogą stanowić dobry punkt wyjścia.

Poniżej pokazuję kod, który może pomóc w eksperymentowaniu z nim (moje ziarno jest zwykle ustawione na 101, jeśli chcesz odtworzyć wyniki). Zasadniczo do użycia kmlwystarczy zbudować clusterizLongDataobiekt ( idliczba dla pierwszej kolumny, a pomiary w kolejnych kolumnach).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)

Kolejne dwie liczby to surowe dane symulowane i rozwiązanie pięcioklastrowe (zgodnie z kryterium Kalińskiego, również stosowanym w pakiecie fpc ). Nie pokazuję skalowanej wersji .

alternatywny tekst

alternatywny tekst


1
Dzięki za bardzo szczegółową odpowiedź chi. Mam już kmluruchomione moje dane, ale jak sugerowałeś, grupowanie odbywa się głównie na podstawie wielkości, a nie kształtu krzywej, dlatego próbuję wykonać kilka kroków wstępnego przetwarzania, aby sprawdzić, czy mogę coś poprawić. Praca Sangalli i in. wygląda bardzo obiecująco na to, co chcę zrobić - nie mogę jednak znaleźć wdrożenia ich podejścia. Prawdopodobnie nie mam czasu, aby stworzyć własną implementację ich pracy dla tego projektu, jednak. Czy znasz jakieś implementacje FOSS?
fmark

@fmark O ile mi wiadomo, brak implementacji OSS (praca jest jednak całkiem nowa); używają k-średnich i k-medoidów, które są dostępne w R. Moim zdaniem najbardziej krytyczne części to generowanie krzywych szablonów i implementacja funkcji wypaczania. W tym celu można znaleźć dodatkowe informacje, patrząc na analizę morfometrii / procruste, lub poszukać kodu w zestawie narzędzi Matlab PACE (ale powinno to być pełne EM lub czegoś podobnego). Moja najlepsza rekomendacja to: Poproś autora o dowolną bezpłatną implementację ich algorytmu.
chl

2
Prześlę raport, jeśli dostanę twierdzącą :) Ich papierowe wyrównanie średniej k dla grupowania krzywych zawiera więcej szczegółów implementacji, które mogą być również przydatne dla kogoś, kto chce to zrobić sami.
fmark

1
Dlaczego nie po prostu usunąć średnią (a może podzielić przez standardowe dewiacje), a następnie zrobić to? Wtedy wyniki byłyby o wiele bardziej związane z kształtem, a mniej z wielkością ...
naught101

9

Alternatywne podejście zostało opublikowane przez stats.se regularnie w Wang, Xiaozhe, Kate Smith i Rob Hyndman.

„Klastrowanie oparte na charakterystyce dla danych szeregów czasowych”. Eksploracja danych i odkrywanie wiedzy 13, no. 3 (2006): 335–364 .

Piszą:

W artykule zaproponowano metodę grupowania szeregów czasowych w oparciu o ich cechy strukturalne. W przeciwieństwie do innych alternatyw, ta metoda nie grupuje wartości punktów za pomocą metryki odległości, a raczej skupia się w oparciu o globalne cechy wyodrębnione z szeregów czasowych. Miary cech są uzyskiwane z każdej indywidualnej serii i mogą być wprowadzane do dowolnych algorytmów klastrowania, w tym algorytmu bez nadzoru sieci neuronowej, mapy samoorganizującej się lub algorytmu hierarchicznego klastrowania. Globalne miary opisujące szeregi czasowe uzyskuje się poprzez zastosowanie operacji statystycznych, które najlepiej oddają podstawowe cechy: trend, sezonowość, okresowość, korelację szeregową, skośność, kurtozę, chaos, nieliniowość i samopodobieństwo. Ponieważ metoda grupuje za pomocą wyodrębnionych miar globalnych, zmniejsza wymiar szeregu czasowego i jest znacznie mniej wrażliwy na brakujące lub zaszumione dane. Ponadto zapewniamy mechanizm wyszukiwania, aby znaleźć najlepszy wybór z zestawu funkcji, który powinien być używany jako dane wejściowe do grupowania.

Kod R jest dostępny na blogu Roba .


6

Możesz przyjrzeć się pracy Eamonn Keogh (UC Riverside) nad grupowaniem szeregów czasowych. Jego strona internetowa ma wiele zasobów. Myślę, że dostarcza próbki kodu Matlaba, więc musiałbyś przetłumaczyć to na R.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.