Eu tenho dados de vendas para uma série de pontos de venda e quero categorizá-los com base no formato de suas curvas ao longo do tempo. Os dados são mais ou menos assim (mas obviamente não são aleatórios e têm alguns dados ausentes):
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)
Gostaria de saber como posso agrupar com base na forma das curvas em R. Eu havia considerado a seguinte abordagem:
- Crie uma nova coluna transformando linearmente var0 de cada loja em um valor entre 0,0 e 1,0 para toda a série temporal.
- Agrupe essas curvas transformadas usando o
kml
pacote em R.
Eu tenho duas perguntas:
- Essa é uma abordagem exploratória razoável?
- Como posso transformar meus dados no formato de dados longitudinal que
kml
entenderá? Qualquer trecho R seria muito apreciado!
r
time-series
clustering
fmark
fonte
fonte
kml
?Respostas:
Várias instruções para a análise de dados longitudinais foram discutidas no link fornecido pelo @Jeromy, por isso sugiro que você os leia com atenção, especialmente aqueles em análise de dados funcionais. Tente pesquisar no "Clustering funcional de dados longitudinais" ou na caixa de ferramentas PACE Matlab, que se preocupa especificamente com o agrupamento baseado em modelo de trajetórias de amostragem irregular (Peng e Müller, agrupamento baseado em distância de processos estocásticos escassamente observados, com aplicativos para leilões on-line , Annals of Applied Statistics 2008 2: 1056). Posso imaginar que possa haver uma boa estrutura estatística para séries temporais financeiras, mas não sei disso.
Ot n i yi=(yi1,yi2,…,yit) d(yi,yj)=t−1∑tk=1(yik−yjk)2−−−−−−−−−−−−−−−−√ . Os dados ausentes são tratados através de uma ligeira modificação da medida de distância anterior (ajuste de Gower) associada a um esquema de imputação semelhante ao vizinho mais próximo (para calcular o critério de Calinski). Como não me represento como seriam seus dados reais, não sei dizer se eles funcionarão. Pelo menos, ele trabalha com curvas de crescimento longitudinais, forma "polinomial", mas duvido que permita detectar padrões muito específicos (como mínimos / máximos locais em momentos específicos com momentos diferentes entre os clusters, por uma tradução para exemplo). Se você estiver interessado em agrupar curvas possivelmente desalinhadas, precisará definitivamente procurar outras soluções; O agrupamento e alinhamento funcionais , de Sangalli et al., E suas referências, podem fornecer um bom ponto de partida.
kml
pacote basicamente se baseia em k-means, trabalhando (por padrão) em distâncias euclidianas entre as medidas observadas em indivíduos. O que é chamado de trajetória é apenas a série de valores observados para indivíduo , , eAbaixo, mostro alguns códigos que podem ajudar a fazer experiências com ele (minha semente geralmente é definida em 101, se você deseja reproduzir os resultados). Basicamente, para usar,t
kml
basta construir umclusterizLongData
objeto (umid
número para a primeira coluna e as medidas nas próximas colunas).As próximas duas figuras são os dados simulados brutos e a solução de cinco clusters (de acordo com o critério Calinski, também usado no pacote fpc ). Eu não mostro a versão em escala .
fonte
kml
dados em execução, mas como você sugeriu, eles são agrupados principalmente com base na magnitude, e não na forma da curva, por isso estou tentando algumas etapas de pré-processamento para ver se posso melhorar. O trabalho de Sangalli et al. parece muito promissor para o que eu quero fazer - no entanto, não consigo encontrar uma implementação da abordagem deles. Provavelmente não tenho tempo para criar minha própria implementação do trabalho deles para este projeto, no entanto. Você conhece alguma implementação de software livre?Uma abordagem alternativa foi publicada por um stats.se regular em Wang, Xiaozhe, Kate Smith e Rob Hyndman.
Eles escrevem:
O código R está disponível no blog de Rob .
fonte
Você pode ver o trabalho de Eamonn Keogh (UC Riverside) no agrupamento de séries temporais. O site dele tem muitos recursos. Eu acho que ele fornece exemplos de código do Matlab, então você teria que traduzir isso para R.
fonte