Localizando pontos de inflexão em R a partir de dados suavizados

13

Eu tenho alguns dados que eu uso suave loess. Eu gostaria de encontrar os pontos de inflexão da linha suavizada. Isso é possível? Tenho certeza que alguém criou um método sofisticado para resolver isso ... quero dizer ... afinal, é R!

Estou bem com a alteração da função de suavização que uso. Eu apenas usei loessporque era isso que eu era no passado. Mas qualquer função de suavização está correta. Percebo que os pontos de inflexão dependerão da função de suavização que uso. Eu estou bem com isso. Eu gostaria de começar apenas com qualquer função de suavização que possa ajudar a cuspir os pontos de inflexão.

Aqui está o código que eu uso:

x = seq(1,15)
y = c(4,5,6,5,5,6,7,8,7,7,6,6,7,8,9)
plot(x,y,type="l",ylim=c(3,10))
lo <- loess(y~x)
xl <- seq(min(x),max(x), (max(x) - min(x))/1000)
out = predict(lo,xl)
lines(xl, out, col='red', lwd=2)

insira a descrição da imagem aqui

user164846
fonte
3
Talvez você queira dar uma olhada na análise de ponto de mudança .
Nico
Eu achei essa linha de código muito útil: infl <- c (FALSE, diff (diff (out)> 0)! = 0) Mas esse código encontra todos os pontos de virada, independentemente de estar aumentando ou diminuindo. Como posso saber quais pontos dobram e quais dobram em uma série temporal? Por exemplo, trace e pinte o ponto de virada para cima verde e para baixo o vermelho.
user3511894

Respostas:

13

Da perspectiva de usar R para encontrar as inflexões na curva suavizada, você só precisa encontrar os lugares nos valores y suavizados onde a alteração em y muda de sinal.

infl <- c(FALSE, diff(diff(out)>0)!=0)

Em seguida, você pode adicionar pontos ao gráfico onde essas inflexões ocorrem.

points(xl[infl ], out[infl ], col="blue")

Da perspectiva de encontrar pontos de inflexão estatisticamente significativos, concordo com o @nico que você deve analisar a análise de ponto de mudança, às vezes também chamada de regressão segmentada.

Jean V. Adams
fonte
Isso parece fazer o trabalho um pouco bem. Entendo que não é o ideal e o resultado que ele dá certamente não é o ideal. Obrigado pela contribuição. Ele cobre a maioria dos casos, exceto em coisas como uma linha reta.
user164846
3
Não sei se entendi, @ user164846. Uma linha reta não tem pontos de inflexão.
Jean V. Adams
Além disso, você pode dar uma olhada nos smoothers que fornecem imediatamente derivados, por exemplo, filtros Savitzky-Golay. No entanto, a escolha do mais suave deve sempre ser decidida pelos seus dados e aplicação, e não o contrário!
Cbeleites suporta Monica
4

Existem problemas em vários níveis aqui.

Primeiro, o loess é um pouco mais suave e há muitos, muitos por onde escolher. Os otimistas argumentam que praticamente qualquer suavidade razoável encontrará um padrão real e que praticamente todas as suavidades razoáveis ​​concordam com padrões reais. Os pessimistas argumentam que esse é o problema e que "mães razoáveis" e "padrões reais" são aqui definidos em termos um do outro. Ao ponto, por que perder e por que você acha que é uma boa escolha aqui? A escolha não é apenas de uma única suavização ou de uma implementação única de uma suavização (nem tudo o que se passa com o nome de loess ou lowess é idêntico no software), mas também de um único grau de suavização (mesmo que isso seja escolhido pelo rotina para você). Você menciona esse ponto, mas isso não está sendo abordado.

Mais especificamente, como mostra o seu exemplo de brinquedo, recursos básicos como pontos de virada podem não ser facilmente preservados pelo loess (para não destacar o loess). Seu primeiro mínimo local desaparece e seu segundo mínimo local é deslocado pela suavidade específica que você mostra. Inflexões definidas por zeros da segunda derivada, em vez da primeira, podem ser ainda mais volúveis.

Nick Cox
fonte
Eu escolhi loess porque peguei na internet. Eu tenho muita experiência em suavização em geral, então simplesmente peguei o código online. Você tem uma sugestão melhor?
user164846
Desculpe, mas eu não entendo o seu comentário. Se você é muito experiente em suavização, deve ter argumentos sobre quais smoothers melhor preservam inflexões enquanto suprimem o ruído. Esse parece um objetivo contraditório para mim, mas eu ficaria feliz em ouvir argumentos técnicos sobre por que estou errado.
Nick Cox
Desculpe, eu não quero dizer "inexperiente" haha
user164846
1
Entendo. A vida é curta e você não pode tentar todos os métodos possíveis. Não podemos ver seus dados reais, mas seu exemplo de brinquedo enfatiza que a suavização pode remover a estrutura identificável.
Nick Cox
2

Existem várias ótimas abordagens para esse problema. Alguns incluem. (1) - pacote do ponto de mudança (2) - pacote segmentado. Mas você precisa escolher o número de pontos de mudança. (3) MARS conforme implementado no pacote -terro-

Dependendo da troca de desvio / variação, tudo fornecerá informações ligeiramente diferentes. -segmentado- vale a pena dar uma olhada. Um número diferente de modelos de pontos de mudança pode ser comparado com o AIC / BIC

Charles
fonte
1

Talvez você possa usar a biblioteca fda e, depois de estimar uma função contínua apropriada, poderá encontrar facilmente os locais onde a segunda derivada é zero.

CRAN DO FDA

Introdução à FDA

DL Dahly
fonte
Os zeros da primeira derivada definem mínimos e máximos. Eu acho que você quer dizer o segundo. O que é "facilmente", de qualquer maneira? Há mais de uma maneira de diferenciar numericamente.
Nick Cox