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:
- 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.
- Klastry te przekształcone krzywe za pomocą
kml
pakietu w R.
Mam dwa pytania:
- Czy to rozsądne podejście eksploracyjne?
- Jak mogę przekształcić moje dane w format danych podłużnych, który
kml
będzie zrozumiały? Wszelkie fragmenty R byłyby bardzo mile widziane!
r
time-series
clustering
fmark
źródło
źródło
kml
?Odpowiedzi:
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.
kml
Pakiet 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 ) = √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życiat
kml
wystarczy zbudowaćclusterizLongData
obiekt (id
liczba dla pierwszej kolumny, a pomiary w kolejnych kolumnach).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 .
źródło
kml
uruchomione 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?Alternatywne podejście zostało opublikowane przez stats.se regularnie w Wang, Xiaozhe, Kate Smith i Rob Hyndman.
Piszą:
Kod R jest dostępny na blogu Roba .
źródło
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.
źródło