É possível fazer cluster de séries temporais com base no formato da curva?


47

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:

  1. 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.
  2. Agrupe essas curvas transformadas usando o kmlpacote em R.

Eu tenho duas perguntas:

  1. Essa é uma abordagem exploratória razoável?
  2. Como posso transformar meus dados no formato de dados longitudinal que kmlentenderá? Qualquer trecho R seria muito apreciado!

2
você pode obter algumas idéias de uma pergunta anterior sobre o agrupamento de trajetórias longitudinais de dados stats.stackexchange.com/questions/2777/…
Jeromy Anglim

1
Jeremy Anglin Obrigado pelo link. Você teve alguma sorte kml?
Fev

Eu dei uma olhada rápida, mas no momento estou usando uma análise de cluster personalizada com base em recursos selecionados da série temporal individual (por exemplo, média, inicial, final, variabilidade, presença de mudanças bruscas etc.).
21410 Jeremy


@ Rob Esta questão parece não assumir intervalos de tempo irregulares, mas na verdade eles estão próximos um do outro (eu não lembrei da outra pergunta no momento dos meus escritos).
chl

Respostas:


26

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.

O kmlpacote 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 , , etniyi=(yi1,yi2,,yit)d(yi,yj)=t1k=1t(yikyjk)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.

Abaixo, 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, kmlbasta construir um clusterizLongDataobjeto (um idnúmero para a primeira coluna e as medidas nas próximas colunas).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)

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 .

texto alternativo

texto alternativo


1
Obrigado pela sua resposta muito detalhada chi. Tenho kmldados 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?
fmark

@fmark Nenhuma implementação de OSS ao meu conhecimento (embora o trabalho seja bastante recente); eles usam k-means e k-medoids, ambos disponíveis em R. Na minha opinião, as partes mais críticas são gerar curvas de gabarito e implementar a função de distorção. Para isso, você pode encontrar informações adicionais examinando a morfometria / análise de procruste ou pesquisando o código da caixa de ferramentas Matlab PACE (mas isso deve estar cheio de EM ou coisas assim). Minha melhor recomendação seria: peça ao autor qualquer implementação gratuita de seu algoritmo.
7282 chl

2
Se reportar afirmativamente, irei relatar :) O alinhamento k-mean em papel para agrupamento de curvas tem mais alguns detalhes de implementação que também podem ser úteis para alguém que queira fazer isso sozinho.
fmark

1
Por que não apenas remover a média (e talvez dividir pelo desvio padrão) e depois fazer isso? Em seguida, os resultados seriam muito mais sobre a forma, e menos sobre a magnitude ...
naught101

9

Uma abordagem alternativa foi publicada por um stats.se regular em Wang, Xiaozhe, Kate Smith e Rob Hyndman.

'Clustering com base em características para dados de séries temporais'. Mineração de dados e descoberta de conhecimento 13, no. 3 (2006): 335–364 .

Eles escrevem:

Este artigo propõe um método para agrupar séries temporais com base em suas características estruturais. Diferentemente de outras alternativas, esse método não agrupa valores de pontos usando uma métrica de distância, mas agrupa com base em recursos globais extraídos da série temporal. As medidas de recursos são obtidas de cada série individual e podem ser inseridas em algoritmos de agrupamento arbitrários, incluindo um algoritmo de rede neural não supervisionado, mapa de auto-organização ou algoritmo de agrupamento hierárquico. As medidas globais que descrevem as séries temporais são obtidas através da aplicação de operações estatísticas que melhor capturam as características subjacentes: tendência, sazonalidade, periodicidade, correlação serial, assimetria, curtose, caos, não linearidade e auto-similaridade. Como os clusters de métodos que usam medidas globais extraídas, reduz a dimensionalidade da série temporal e é muito menos sensível a dados ausentes ou com ruído. Além disso, fornecemos um mecanismo de pesquisa para encontrar a melhor seleção do conjunto de recursos que deve ser usado como as entradas de cluster.

O código R está disponível no blog de Rob .


6

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.