Recherche de points d'inflexion dans R à partir de données lissées


14

J'ai quelques données que je lisse en utilisant loess. Je voudrais trouver les points d'inflexion de la ligne lissée. Est-ce possible? Je suis sûr que quelqu'un a fait une méthode sophistiquée pour résoudre ce problème ... Je veux dire ... après tout, c'est R!

Je suis d'accord pour changer la fonction de lissage que j'utilise. Je l'ai juste utilisé loessparce que c'est ce que j'ai utilisé dans le passé. Mais toute fonction de lissage est très bien. Je me rends compte que les points d'inflexion dépendront de la fonction de lissage que j'utilise. Je suis d'accord avec ça. J'aimerais commencer par avoir simplement une fonction de lissage qui peut aider à cracher les points d'inflexion.

Voici le code que j'utilise:

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)

entrez la description de l'image ici


3
Vous voulez peut-être jeter un œil à l' analyse des points de changement .
nico

J'ai trouvé cette ligne de code très utile: infl <- c (FALSE, diff (diff (out)> 0)! = 0) Mais ce code trouve tous les points de retournement, qu'il tourne vers le haut ou vers le bas. Comment savoir quels points se plient et quels se plient dans une série temporelle? Par exemple, tracez et coloriez le point tournant vers le haut vert et le rouge vers le bas.
user3511894

Réponses:


14

Du point de vue de l'utilisation de R pour trouver les inflexions dans la courbe lissée, il vous suffit de trouver ces endroits dans les valeurs l lissées où le changement de y change.

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

Ensuite, vous pouvez ajouter des points au graphique où ces inflexions se produisent.

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

Du point de vue de la recherche de points d'inflexion statistiquement significatifs, je suis d'accord avec @nico que vous devriez vous pencher sur l'analyse des points de changement, parfois également appelée régression segmentée.


Cela semble faire assez bien le travail. Je comprends que ce n'est pas idéal et le résultat qu'il donne n'est certainement pas idéal. Merci pour la contribution cependant. Il couvre la plupart des cas, sauf pour des choses comme une ligne droite.
user164846

3
Je ne suis pas sûr de comprendre, @ user164846. Une ligne droite n'a pas de points d'inflexion.
Jean V. Adams du

En outre, vous voudrez peut-être jeter un œil aux lisseurs qui fournissent immédiatement des dérivés, par exemple les filtres Savitzky-Golay. Cependant, le choix du plus lisse doit toujours être décidé par vos données et votre application, et non l'inverse!
cbeleites mécontents de SX le

4

Il y a des problèmes à plusieurs niveaux ici.

Tout d'abord, le loess se trouve être un plus lisse et il y en a beaucoup, beaucoup de choix. Les optimistes soutiennent que presque n'importe quel lisseur raisonnable trouvera un vrai motif et que presque tous les lisseurs raisonnables s'entendent sur de vrais motifs. Les pessimistes soutiennent que tel est le problème et que les "lissoirs raisonnables" et les "modèles réels" sont définis ici en termes les uns par rapport aux autres. Au point, pourquoi loess et pourquoi pensez-vous que c'est un bon choix ici? Le choix n'est pas seulement d'un seul lisseur ou d'une seule implémentation d'un lisseur (tout ce qui porte le nom de loess ou lowess n'est pas identique d'un logiciel à l'autre), mais aussi d'un seul degré de lissage (même si cela est choisi par le routine pour vous). Vous mentionnez ce point, mais cela ne le règle pas.

Plus précisément, comme le montre votre exemple de jouet, les caractéristiques de base telles que les points de retournement peuvent facilement ne pas être préservées par le loess (pas pour distinguer le loess non plus). Votre premier minimum local disparaît et votre deuxième minimum local est déplacé par le lissage particulier que vous montrez. Les inflexions définies par des zéros de la dérivée seconde plutôt que par la première peuvent être encore plus inconstantes.


J'ai choisi Loess parce que je l'ai récupéré sur Internet. Je suis très expérimenté dans le lissage en général, j'ai donc simplement saisi du code en ligne. Avez-vous une meilleure suggestion?
user164846

Désolé, mais je ne comprends pas votre commentaire. Si vous êtes très expérimenté dans le lissage, vous devriez avoir des arguments pour lesquels les lisseurs préservent le mieux les inflexions tout en supprimant le bruit. Cela me semble un objectif contradictoire, mais je serais heureux d'entendre des arguments techniques expliquant pourquoi je me trompe.
Nick Cox

Désolé, je ne veux pas dire "inexpérimenté" haha
user164846

1
Je vois. La vie est courte et vous ne pouvez pas essayer toutes les méthodes possibles. Nous ne pouvons pas voir vos données réelles, mais votre exemple de jouet souligne que le lissage peut supprimer une structure identifiable.
Nick Cox

2

Il existe un tas de grandes approches à ce problème. Certains incluent. (1) - changepoint - package (2) - segmenté - package. Mais vous devez choisir le nombre de points de changement. (3) MARS implémenté dans le paquet -earth-

En fonction de votre compromis biais / variance, tout vous donnera des informations légèrement différentes. -segmenté- vaut bien le détour. Différents modèles de points de changement peuvent être comparés avec AIC / BIC


1

Vous pouvez peut-être utiliser la bibliothèque fda, ​​et une fois que vous avez estimé une fonction continue appropriée, vous pouvez facilement trouver les endroits où la dérivée seconde est nulle.

FDA CRAN

Introduction à la FDA


Les zéros de la première dérivée définissent des minima et des maxima. Je pense que vous voulez dire la seconde. Qu'est-ce que "facilement", de toute façon? Il existe plusieurs façons de différencier numériquement.
Nick Cox

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.