Como encontro picos em um conjunto de dados?


47

Se eu tiver um conjunto de dados que produza um gráfico como o seguinte, como determinaria algoritmicamente os valores x dos picos mostrados (neste caso, três deles):

insira a descrição da imagem aqui


13
Eu vejo seis máximos locais. A que três você está se referindo? :-). (É claro que é óbvio - o impulso da minha observação é encorajá-lo a definir um "pico" mais precisamente, porque essa é a chave para criar um bom algoritmo.)
whuber

3
Se os dados forem uma série temporal puramente periódica com algum componente de ruído aleatório adicionado, você poderá ajustar uma função de regressão harmônica em que período e amplitude são parâmetros estimados a partir dos dados. O modelo resultante seria uma função periódica suave (ou seja, uma função de alguns senos e cossenos) e, portanto, terá pontos de tempo identificáveis ​​exclusivamente quando a primeira derivada for zero e a segunda derivada for negativa. Esses seriam os picos. Os locais onde a primeira derivada é zero e a segunda derivada é positiva serão o que chamamos de vales.
Michael Chernick 14/09/12

2
Eu adicionei a tag mode, confira algumas dessas perguntas, elas terão respostas de interesse.
Andy W

Obrigado a todos por suas respostas e comentários, é muito apreciado! Levarei algum tempo para entender e implementar os algoritmos sugeridos no que se refere aos meus dados, mas assegurarei a atualização mais tarde com feedback.
Nonaxiomatic

Talvez seja porque meus dados são realmente barulhentos, mas não obtive sucesso com a resposta abaixo. Embora, eu tive sucesso com esta resposta: stackoverflow.com/a/16350373/84873
Daniel

Respostas:


35

Uma abordagem geral é suavizar os dados e encontrar picos, comparando um filtro máximo local ao suave . Em R:

argmax <- function(x, y, w=1, ...) {
  require(zoo)
  n <- length(y)
  y.smooth <- loess(y ~ x, ...)$fitted
  y.max <- rollapply(zoo(y.smooth), 2*w+1, max, align="center")
  delta <- y.max - y.smooth[-c(1:w, n+1-1:w)]
  i.max <- which(delta <= 0) + w
  list(x=x[i.max], i=i.max, y.hat=y.smooth)
}

Seu valor de retorno inclui os argumentos do máximo local ( x) - que responde à pergunta - e os índices nas matrizes x e y onde esses máximos locais ocorrem ( i).

Existem dois parâmetros a serem ajustados às circunstâncias: w é a meia largura da janela usada para calcular o máximo local. (Seu valor deve ser substancialmente menor que a metade do comprimento da matriz de dados.) Valores pequenos captarão pequenos saliências locais, enquanto valores maiores passarão sobre eles. Outro - não explícito neste código - é o spanargumento do loessmais suave. (Geralmente, está entre zero e um; reflete a largura da janela como uma proporção do intervalo de valores x.) Valores maiores suavizam os dados de maneira mais agressiva, fazendo com que os solavancos locais desapareçam completamente.

Para ver esse ajuste em vigor, vamos criar uma pequena função de teste para plotar os resultados:

test <- function(w, span) {
  peaks <- argmax(x, y, w=w, span=span)

  plot(x, y, cex=0.75, col="Gray", main=paste("w = ", w, ", span = ", span, sep=""))
  lines(x, peaks$y.hat,  lwd=2) #$
  y.min <- min(y)
  sapply(peaks$i, function(i) lines(c(x[i],x[i]), c(y.min, peaks$y.hat[i]),
         col="Red", lty=2))
  points(x[peaks$i], peaks$y.hat[peaks$i], col="Red", pch=19, cex=1.25)
}

Aqui estão algumas experiências aplicadas a alguns dados sintéticos e levemente barulhentos.

x <- 1:1000 / 100 - 5
y <- exp(abs(x)/20) * sin(2 * x + (x/5)^2) + cos(10*x) / 5 + rnorm(length(x), sd=0.05)
par(mfrow=c(3,1))
test(2, 0.05)
test(30, 0.05)
test(2, 0.2)

Parcelas

Uma janela larga (plotagem do meio) ou suave mais agressivo (plotagem inferior) elimina os máximos locais detectados na plotagem superior. A melhor combinação aqui é provavelmente uma janela larga e apenas suavização suave, porque a suavização agressiva parece alterar esses picos (consulte os pontos médio e direito no gráfico inferior e compare sua localização com os picos aparentes dos dados brutos). Neste exemplo, w=50e span=0.05faz um ótimo trabalho (não mostrado).

Observe que os máximos locais nos pontos de extremidade não são detectados. Estes podem ser inspecionados separadamente. (Para suportar isso, argmaxretorna os valores y suavizados.)


Essa abordagem tem várias vantagens sobre a modelagem mais formal para trabalhos de uso geral:

  • Não adota nenhum modelo pré-concebido dos dados.

  • Pode ser adaptado às características dos dados.

  • Pode ser adaptado para detectar os tipos de picos nos quais está interessado.


3
Pelo contrário, @ Michael: Não presumo nada sobre periodicidade. De fato, o exemplo parece periódico, mas não é: observe o termo quadrático. A regressão harmônica falhará com este exemplo (e com muitas outras séries). Além disso, não seleciono nada "visualmente": tudo é feito com o algoritmo. (Por que eu recebo uma forte impressão de que você não tenha realmente ler esta resposta?)
whuber

1
Eu posso encontrar os picos algoritmicamente através do primeiro e do segundo teste de derivadas, enquanto você precisa usar outros meios (talvez algo como uma pesquisa numérica). Meu argumento não era tentar afirmar que uma abordagem era melhor que a outra, nem estava criticando sua resposta. Eu vejo muitas semelhanças e algumas diferenças e estava tentando entender melhor como você identifica seus picos.
Michael Chernick 14/09/12

3
@ Michael Os picos são locais que não excedem um máximo em movimento; isso os torna rápidos e fáceis de calcular: não há pesquisa numérica, apenas uma simples digitalização de . A vantagem de usar uma suavização diferenciável é que ele pode interpolar picos entre os valores x determinados: isso é útil para resoluções x grosseiras ou desiguais. O(n)
whuber

4
@ Michael, se você "não tiver tempo" para ler uma resposta / comentário, considere se abster de responder a / fazer afirmações sobre a publicação. Isso é algo que você fez repetidamente e geralmente leva a trocas não-construtivas e / ou a fazer declarações incorretas que você retrai posteriormente. Parece um desperdício de seu tempo e dos outros em que você se envolve nessas conversas. Por exemplo, todo esse tópico de comentários certamente levou mais tempo do que apenas ler a resposta para começar. Por que você escolhe usar o site dessa maneira continua me intrigando. Não vejo como isso faz bem a alguém.
Macro

2
Obrigado pela abordagem interessante. Acho que também entendi o ponto que Michael estava alcançando: você precisava visualizar os gráficos para decidir os melhores valores para we span, e também descobrir que valores mais altos spanestavam mudando os picos. Parece que mesmo essas etapas podem ser automatizadas. Por exemplo, para a primeira edição, se pudéssemos avaliar a qualidade dos picos descobertos, poderíamos executar optimizeos parâmetros! Para a segunda questão, por exemplo, escolha uma janela em ambos os lados do pico descoberto e procure valores mais altos.
Darren Cozinhe

1

Como mencionei no comentário, se a série temporal parece ser periódica, um modelo de regressão harmônica fornece uma maneira de suavizar a função e identificar o pico aplicando o primeiro e o segundo testes derivados. Huber apontou um teste não paramétrico que apresenta vantagens quando há vários picos e a função não é necessariamente periódica. Mas não há almoço grátis. Embora haja vantagens no método que ele menciona, pode haver desvantagens se um modelo paramétrico for apropriado. Esse é sempre o outro lado do uso de técnicas não paramétricas. Embora evite suposições paramétricas, a abordagem paramétrica é melhor quando as suposições paramétricas são apropriadas. Seu procedimento também não tira o máximo proveito da estrutura de séries temporais nos dados.

Penso que, embora seja apropriado apontar vantagens de um procedimento sugerido, também é importante apontar as possíveis desvantagens. Tanto minha abordagem quanto a de Huber encontram os picos de maneira eficiente. No entanto, acho que o procedimento dele exige um pouco mais de trabalho quando um máximo local é menor que o pico mais alto determinado anteriormente.


2
Você poderia demonstrar a "maneira eficiente" de sua abordagem? Parte do desafio é criar um algoritmo para encontrar vários picos - o que, no seu caso, significa encontrar todos os zeros de um derivado (computado de forma cara), não apenas um zero - e ser explícito sobre qual desses pontos críticos você classificará. como "picos" e quais não. Além disso, algum suporte ou ampliação de sua afirmação de que "a abordagem paramétrica é melhor quando as suposições paramétricas são apropriadas" seria bom, pois, como todos sabemos, as suposições paramétricas nunca são exatamente corretas.
whuber

@whuber Eu disse que você se encaixaria no modelo, já que o modelo é uma soma de senos e cossenos, a função é periódica, os picos ocorrem quando a primeira derivada é zero e a segunda derivada no ponto zero está diminuindo. Foi isso que eu quis dizer quando disse que você faz o primeiro e o segundo testes de derivada. Agora você pode resolver para encontrar todas as soluções, mas se você tem um pico, os outros ficam a um período e vários períodos da solução que você possui. Meu argumento não é reivindicar qualquer superioridade do método. Eu só quero ressaltar que não há almoço grátis.
Michael Chernick 17/09/12

Métodos não paramétricos têm a vantagem de não exigir suposição de modelagem, neste caso nenhuma suposição de periodicidade. Minha afirmação sobre abordagens paramétricas serem melhores do que abordagens não paramétricas quando as premissas de modelagem são válidas deve ser muito familiar para você. Não preciso discutir sobre suposições paramétricas que nunca se sustentam exatamente. Essa é uma opinião com a qual basicamente concordo. Mas estou falando de algo como a eficiência de Pitman. As estimativas não paramétricas não são tão eficientes quanto as estimativas paramétricas quando o modelo está "correto".
Michael Chernick 17/09/12

Isso é teoria. Na prática, modelos paramétricos podem ser boas aproximações da realidade. Nesse caso, a estimativa paramétrica (digamos mle) é mais eficiente que a estimativa não paramétrica. Além disso, os intervalos de confiança paramétricos serão melhores porque serão mais apertados. Mas muitas vezes você não sabe o quão bom é o modelo paramétrico para o seu exemplo. Nesses casos, você deve decidir entre conservadorismo (estar seguro) com a abordagem não paramétrica ou ousado (e possivelmente errado) usando a abordagem paramétrica.
Michael Chernick 17/09/12

1
O que estou tentando sugerir, Michael, é que, neste caso, a abordagem não paramétrica provavelmente será muito melhor do que qualquer abordagem paramétrica, exceto quando os dados se apegam especialmente ao modelo - e mesmo assim terão um bom desempenho. Supondo que a periodicidade seja um ótimo exemplo: seu algoritmo cometerá erros da mesma ordem de magnitude que os desvios da periodicidade nos dados. A possibilidade de cometer tais erros anula quaisquer vantagens conferidas por uma maior eficiência assintótica. Usar esse procedimento sem realizar testes extensivos de GoF primeiro seria uma má idéia.
whuber

1

Uma abordagem clássica de detecção de pico no processamento de sinal é a seguinte:

  1. Filtre o sinal para uma faixa razoável razoável, dependendo da taxa de amostragem e das propriedades do sinal, por exemplo, para ECG, um filtro passa-banda IIR a 0,5-20Hz, um filtro de fase zero garantirá que nenhuma mudança de fase (e atraso de tempo associado) seja introduzida
  2. Uma transformação de hilbert ou uma abordagem wavelet pode então ser usada para enfatizar os picos
  3. Um limite estático ou dinâmico pode ser aplicado, onde todas as amostras acima do limite são consideradas picos. No caso de um limite dinâmico, geralmente é definido como um desvio padrão do limite N acima ou abaixo de uma estimativa da média móvel da média.

Outra abordagem que funciona é comparar um sinal filtrado de alta precisão com um filtro altamente suavizado (filtro passa-baixo ou mediano) e aplicar a etapa 3.

Espero que isto ajude.

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.