Avaliação de picos em séries temporais de dados de sinal de célula

9

Estou medindo a existência de resposta nas medições de sinais celulares. O que fiz foi primeiro aplicar um algoritmo de suavização (Hanning) às séries temporais de dados e depois detectar picos. O que eu recebo é o seguinte: série temporal da resposta do sinal celular

Se eu quisesse tornar a detecção da resposta um pouco mais objetiva do que "sim, você vê um aumento na queda contínua", qual seria a melhor abordagem? É para obter a distância dos picos de uma linha de base determinada por regressão linear?

(Eu sou um codificador python e quase não tenho entendimento de estatística)

Obrigado

Radek
fonte
4
Eu não acho que exista "a melhor abordagem". Existem várias maneiras de analisar ou reportar picos em séries temporais. Sua pergunta não dá pista para entender o que você pode estar procurando. Talvez você consulte artigos em seu campo, para obter dicas ou referências.
ttnphns
Não sei quais informações fornecer para fornecer as pistas. Basicamente, você tem um gráfico que tem uma tendência de queda (você obtém menos resposta de uma célula com o passar do tempo) e, em algum lugar no meio, pode ver um aumento na produção. É isso. Você acha que basicamente cabe a mim dizer subjetivamente que digamos um aumento de 10% na resposta = o que estou procurando?
Radek
11
Supondo que você às vezes veja o comportamento como mostrado, e às vezes apenas diminua continuamente (aproximadamente), você terá chances muito melhores de obter uma resposta razoável aqui se substituir um gráfico grande por 6 a 10 pequenos, em que metade esse aumento e a outra metade não.
AVB
Ele pode ter mais de um máximo local (bump)?
Emre
11
por que você não publica seus dados e eu farei uma rachadura nisso. A filtragem presuntiva sugerida por você e outras pessoas tem efeitos colaterais. Se você quiser uma maneira objetiva de lidar com isso, talvez eu possa lhe dar algumas dicas. Mas tudo começa com os dados, não com presunção!
precisa saber é o seguinte

Respostas:

2

Parece que, a partir do seu comentário de 25 de outubro, você está interessado em encontrar e caracterizar algoritmicamente dois recursos principais: o decaimento da resposta inicial seguido por um ciclo de maior resposta e o decaimento subsequente. Presumo que os dados sejam observados em intervalos de tempo discretos.

Aqui está o que eu tentaria:

  1. Use uma rotina como numpy.ma.polyfit para ajustar, por exemplo, um polinômio de quarto grau aos seus dados. Isso deve explicar a queda inicial seguida pela elevação / queda, mas suavizar as numerosas, porém pequenas flutuações. Esperamos que esse grau de polinômio seja flexível o suficiente para caber bem a outras séries semelhantes. O principal objetivo que eu acho seria obter uma função que responda pelo padrão principal que você está procurando.
  2. Use rotinas Python para calcular a derivada da função polinomial ajustada aos dados. As rotinas de exemplo são scipy.misc.derivative e numpy.diff. Você está procurando os valores de tempo em que a 1ª derivada é zero, indicando um possível mínimo ou máximo local da função. Um segundo teste de derivada pode ser usado para confirmar qual ponto corresponde a um mínimo ou máximo. Presumivelmente, você terá três pontos se o gráfico que você mostrou é representativo. Observe que o projeto sábio pode ser muito valioso aqui.
  3. Nesse ponto, você terá os valores de tempo associados a

    uma. o início da decadência inicial

    b. o início da ascensão

    c. o início da segunda decadência

Você pode fazer o que deseja analiticamente para avaliar as alterações.

Pode ser melhor deixar os dados falarem por si mesmos: em várias séries, quando você aplica esse método, qual é a mudança típica de tamanho na alta, quando ocorre normalmente no período de decaimento e quanto tempo dura? E como é a distribuição desse aumento em termos de onde, quão grande e quanto tempo? Conhecendo essas estatísticas, é possível caracterizar melhor uma recuperação específica como estando dentro da tolerância, com relação ao local em que ocorre, assim como seu tamanho e duração. A chave do meu entendimento seria identificar facilmente onde essas mudanças estão ocorrendo. O restante do que descrevi é simples de calcular.

Josh Hemann
fonte
4
Os polinômios não funcionarão com esses dados, a menos que você tenha um diploma tão grande que eles ameacem introduzir picos espúrios.
whuber
Talvez eu deva esclarecer minha resposta de que ele ainda deve aplicar a função Hanning e depois fazer o ajuste polinomial. A janela Hanning pode ter que ser alterada para obter uma função mais suave. Ou você está dizendo que um polinômio de baixo grau não funcionará para os dados suavizados?
28411 Josh Hemann
5
Um polinômio de baixo grau definitivamente não funcionará, Josh. Você precisa de um local mais suave - pense em um kernel suave ou em certos tipos de splines - e ele não precisa ser um polinômio, com propriedades terríveis. (Polinômios pode introduzir espúrias, enormes picos entre o que de outro modo parecem ser série de dados bem-comportados.)
whuber
@whuber, embora eu concorde que ajustar um polinômio globalmente provavelmente seria uma má idéia, a expansão de Taylor de uma função em torno de um ponto é um polinômio de baixo grau e, portanto, os coeficientes de um ajuste quadrático local devem corresponder à estimativa da primeira derivada. Portanto, a regressão quadrática local não seria o caminho mais direto, senão o "melhor"? f(x)=f(x0)+(xx0)f(x0)+(xx0)22!f(x0)+...
Sameer
3
Obrigado por esclarecer esse ponto, @Sameer. Concordo que um ajuste polinomial de baixo grau local poderia ser eficaz e não pretendi sugerir o contrário no meu comentário anterior (que pretendia que "polinomial" fosse entendido como um ajuste global ). Quanto a ser "melhor", porém, tenho que concordar com um comentário de ttnphns à pergunta original: tudo depende. Eu esperaria que ajustes quadráticos locais com séries densas de dados se aproximasem suavemente do kernel gaussiano, o que nos dá uma abordagem. Outro sentido de "melhor" é o BLUP de krigagem, que pode ser semelhante a spline.
whuber
1

Aqui estão algumas idéias, mas eu de cabeça para baixo que podem funcionar ...

Derivadas: se você pegar seu array e subtrair os elementos um do outro para obter um array com menos um ponto, mas essa é a primeira derivada. Se você agora suavizar isso e procurar a mudança de sinal, isso poderá detectar seu impacto.

Médias móveis: talvez o uso de 2 médias móveis atrasadas (exponencial ou em janelas) possa revelar o solavanco grande e ignorar o menor. Basicamente, a largura da média móvel da janela menor deve ser maior que a largura dos solavancos que você deseja ignorar. A EMA mais ampla deve ser mais larga, mas não muito larga para detectar o solavanco.

Você procura quando eles cruzam e subtraem o atraso (janela / 2) e essa é uma estimativa onde está o seu impacto. http://www.stockopedia.com/content/trading-the-golden-cross-does-it-really-work-69694/

Modelos lineares: faça uma série de modelos lineares de largura suficiente com várias saliências, digamos 100 pontos. Agora faça um loop no conjunto de dados, gerando regressões lineares na variável X. Basta olhar para o coeficiente de X e ver onde a grande mudança de sinal aconteceu. Essa é uma grande colisão.

O exposto acima é apenas conjectura da minha parte e provavelmente existem maneiras melhores de fazê-lo.

Chris
fonte