Séries temporais 'clustering' em R

38

Eu tenho um conjunto de dados de séries temporais. Cada série cobre o mesmo período, embora as datas reais de cada série cronológica nem sempre sejam exatamente alinhadas.

Ou seja, se as séries temporais fossem lidas em uma matriz 2D, seria algo como isto:

date     T1   T2   T3 .... TN
1/1/01   100  59   42      N/A
2/1/01   120  29   N/A     42.5
3/1/01   110  N/A  12      36.82
4/1/01   N/A  59   40      61.82
5/1/01    05  99   42      23.68
...
31/12/01  100  59   42     N/A

etc 

Quero escrever um script R que separe as séries temporais {T1, T2, ... TN} em 'famílias' em que uma família é definida como um conjunto de séries que "tendem a se solidarizar".

Para a parte 'clustering', precisarei selecionar / definir um tipo de medida de distância. Não tenho muita certeza de como fazer isso, já que estou lidando com séries temporais, e um par de séries que podem se mover em simpatia por um intervalo, pode não fazê-lo em um intervalo subsequente.

Tenho certeza de que há pessoas muito mais experientes / inteligentes do que eu aqui, por isso ficaria grato por todas as sugestões, idéias sobre qual algoritmo / heurística usar para a medida de distância e como usá-lo no agrupamento de séries temporais.

Meu palpite é que NÃO existe um método estatístico robusto estabelecido para fazer isso, então eu ficaria muito interessado em ver como as pessoas abordam / resolvem esse problema - pensando como um estatístico.

morfoso
fonte
1
Você também pode estar interessado nas respostas a esta pergunta: stats.stackexchange.com/q/2777/1036 #
Andy W
1
Existe um método estatístico baseado nos processos Dirichlet, que funciona para conjuntos de dados em que os pontos no tempo não são os mesmos para todas as amostras.
Dario

Respostas:

24

No fluxo de dados e na mineração de bancos de dados de séries temporais, uma abordagem comum é transformar a série em uma representação simbólica e, em seguida, usar uma métrica de similaridade, como a distância euclidiana, para agrupar as séries. As representações mais populares são SAX (Keogh & Lin) ou a mais recente iSAX (Shieh & Keogh):

As páginas acima também contêm referências a métricas de distância e cluster. Keogh e sua equipe estão em pesquisa reproduzível e bastante receptivos a divulgar seu código. Então você pode enviá-los por email e perguntar. Eu acredito que eles tendem a funcionar em MATLAB / C ++.

Houve um esforço recente para produzir uma implementação Java e R:

Não sei até que ponto isso é feito - ele é voltado para a localização de motivos, mas, dependendo de quão longe eles chegaram, ele deve ter os bits necessários para compor algo para suas necessidades (iSAX e métricas de distância: já que essa parte é comum ao agrupamento e localização de motivos).

ars
fonte
1
Parece um bom ponto de partida tratável. obrigado pelos links.
morpheous
4
Caramba, acho que a página SAX é a página mais feia que eu já vi!
precisa saber é o seguinte
18

Outra maneira de dizer "tende a demonstrar simpatia" é "cointegrada".

Existem duas maneiras padrão de calcular a cointegração : o método de Engle-Granger e o procedimento de Johansen. Estes são abordados em "Análise de séries temporais integradas e cointegradas com R" (Pfaff 2008) e o pacote R urca relacionado . Eu recomendo o livro se você quiser seguir esses métodos em R.

Também recomendo que você analise esta questão em séries temporais multivariadas e, em particular, no curso de Ruey Tsay na U. Chicago, que inclui todo o código R necessário.

Shane
fonte
Eu havia entrado em cointegração há alguns anos - mas me pareceu muito complicado (eu não entendi!). Eu estava esperando que seria uma solução menos teórico (ou seja, mais prático) ...
morpheous
3
O método Engle-Granger não é especialmente complicado: você apenas pega os resíduos de uma regressão entre as duas séries e determina se ele tem uma raiz unitária. Isso é certamente prático: é usado regularmente para um amplo espectro de problemas. Dito isto, eu imagino que qualquer resposta à sua pergunta vai exigir algum conhecimento estatístico ... (por exemplo, você deve entender coisas como estacionariedade, independência, etc.)
Shane
existe uma maneira melhor de fazer isso do que testar todas as séries em pares para co-integração (com o mesmo ideal em mente para agrupar séries?) Também essa sugestão não dependeria do fato de que as próprias séries são integradas no início?
Andy W
@ Andy: Tenho certeza de que existe uma maneira melhor, e estou ansioso para ouvir sobre isso. Esta é uma abordagem bastante básica.
Shane
1
> não posso sugerir mais nada, mas a cointegração é ao mesmo tempo muito frágil ('premissas paramétricas' enlouquecidas) e inadequada para a tarefa em mãos: a cada passo, isso significa fazer agrupamentos hierárquicos, no máximo, mesclar dois série para um (a média co-integrada).
usar o seguinte comando
4

As séries temporais de agrupamento são realizadas de maneira bastante comum pelos dinamistas populacionais, particularmente aqueles que estudam insetos para entender tendências em surtos e colapsos. Procure trabalho em mariposa cigana, Spruce budoworm, besouro de pinheiro da montanha e larício budmoth.

Para o agrupamento real, você pode escolher qualquer métrica de distância que desejar, cada uma provavelmente possui suas próprias forças e especificidades em relação ao tipo de dados que estão sendo agrupados, Kaufmann e Rousseeuw, 1990. Localizando grupos nos dados. Uma introdução à análise de cluster é um bom ponto de partida. Lembre-se de que o método de agrupamento não se importa com o fato de você estar usando uma série temporal, apenas analisa os valores medidos no mesmo ponto do tempo. Se suas duas séries temporais não estiverem em sincronia suficiente durante a vida útil, elas não serão agrupadas (e talvez não devam).

Onde você terá problemas é determinar o número de clusters (famílias) a serem usados ​​depois de agrupar a série temporal. Existem várias maneiras de selecionar um corte de clusters informativos, mas aqui a literatura não é tão boa.

Chris
fonte
1
y1,t
1
@ user603 Você pode explicar "Você precisa reconhecer que uma série está altamente correlacionada com seu próprio passado, colocando cada y1, t como uma dimensão própria (por exemplo, resultando em dimensões N * T)", por favor?
B_Miner
2

Veja minha resposta para uma pergunta semelhante aqui . Para encurtar a história, faça uma transformação rápida de Fourier dos dados, descarte frequências redundantes se seus dados de entrada tiverem um valor real, separe as partes reais e imaginárias de cada elemento da transformação rápida de Fourier e use o pacote Mclust em R para fazer modelagem. agrupamento baseado nas partes reais e imaginárias de cada elemento de cada série temporal. O pacote automatiza a otimização sobre o número de clusters e suas densidades.

Equilíbrio Brash
fonte
0

Você também pode usar o pacote clustDDist, que executa o método leader e o método de cluster hierárquico com diferentes medidas de erro:

http://r-forge.r-project.org/projects/clustddist/

d4(x,y)=(x-y)2y
tomaz
fonte