Superposition de cycles

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Miles François
Messages : 11
Enregistré le : 08 Mar 2019, 12:41

Superposition de cycles

Messagepar Miles François » 17 Avr 2019, 15:28

Bonjour,
je travaille actuellement sur un jeu de données plutôt volumineux.
J'avais déjà posé une question sur le forum pour ce même jeu de données:
viewtopic.php?f=3&t=9570

J'ai donc réussi à supprimer le "bruit". Et j'obtiens alors ce graphique :
https://www.casimages.com/i/190417051436974902.png.html

Le graphique ne représente que les 300 première lignes.
On observe des variations : pic puis baisse ...

Ma question est la suivante : Est-il possible de découper ce graphique en "cycle" ?
Avec un "pic" par cycle. Pour ensuite les superposer.
Mais un problème se pose, on observe au fur à mesure un léger décalage par rapport aux pics.
La distance séparant les pics n'est pas toujours la même.

Je vous remercie par avance pour votre réponse.

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Superposition de cycles

Messagepar François Bonnot » 18 Avr 2019, 06:21

Bonjour,
Le plus simple est que vous postiez (avec dput) les 300 points correspondant au graphique.
François

Miles François
Messages : 11
Enregistré le : 08 Mar 2019, 12:41

Re: Superposition de cycles

Messagepar Miles François » 18 Avr 2019, 13:35

Je n'avais jamais utilisé la fonction dput() auparavant.
Ci-dessous les 300 premiers points du graphique.

c(0.096, 0.088, 0.082, 0.078, 0.06, 0.057, 0.048, 0.047, 0.044,
0.044, 0.039, 0.038, 0.037, 0.037, 0.035, 0.035, 0.034, 0.034,
0.033, 0.033, 0.032, 0.032, 0.031, 0.031, 0.031, 0.031, 0.03,
0.03, 0.03, 0.03, 0.03, 0.029, 0.029, 0.029, 0.029, 0.2, 1100,
1100, 27, 15, 3.2, 2.2, 1, 0.65, 0.37, 0.3, 0.19, 0.16, 0.12,
0.12, 0.099, 0.096, 0.085, 0.082, 0.064, 0.06, 0.051, 0.05, 0.046,
0.045, 0.041, 0.041, 0.039, 0.038, 0.037, 0.036, 0.035, 0.035,
0.034, 0.033, 0.032, 0.032, 0.032, 0.031, 0.031, 0.031, 0.03,
0.03, 0.03, 0.03, 0.029, 0.029, 0.029, 0.029, 0.029, 0.028, 0.028,
0.028, 4.4, 1100, 1100, 120, 21, 9.4, 3.1, 1.6, 0.85, 0.51, 0.33,
0.23, 0.18, 0.18, 0.13, 0.11, 0.1, 0.092, 0.085, 0.077, 0.065,
0.058, 0.053, 0.05, 0.047, 0.045, 0.043, 0.042, 0.039, 0.038,
0.037, 0.036, 0.035, 0.035, 0.034, 0.033, 0.033, 0.032, 0.031,
0.031, 0.031, 0.03, 0.03, 0.03, 0.029, 0.029, 0.029, 0.029, 0.028,
0.028, 0.028, 0.028, 0.028, 37, 1100, 98, 17, 6.2, 2.7, 1.3,
1, 0.47, 0.31, 0.23, 0.16, 0.14, 0.11, 0.1, 0.093, 0.087, 0.079,
0.066, 0.057, 0.053, 0.049, 0.046, 0.044, 0.041, 0.04, 0.037,
0.036, 0.035, 0.035, 0.033, 0.033, 0.032, 0.032, 0.031, 0.031,
0.03, 0.03, 0.029, 0.029, 0.029, 0.029, 0.028, 0.028, 0.028,
0.027, 0.027, 0.027, 0.026, 0.026, 0.026, 2.6, 1100, 1100, 190,
22, 7.8, 3.2, 2.2, 0.91, 0.51, 0.37, 0.23, 0.18, 0.14, 0.12,
0.11, 0.098, 0.09, 0.085, 0.071, 0.061, 0.055, 0.051, 0.049,
0.045, 0.043, 0.04, 0.039, 0.037, 0.036, 0.035, 0.034, 0.033,
0.032, 0.032, 0.031, 0.031, 0.03, 0.03, 0.03, 0.029, 0.029, 0.028,
0.028, 0.028, 0.027, 0.027, 0.027, 0.026, 0.026, 0.026, 0.026,
0.026, 8.8, 1100, 160, 21, 7.5, 3.4, 1.6, 0.89, 0.52, 0.33, 0.23,
0.17, 0.14, 0.13, 0.1, 0.094, 0.087, 0.078, 0.065, 0.056, 0.051,
0.049, 0.045, 0.043, 0.039, 0.039, 0.036, 0.035, 0.034, 0.033,
0.032, 0.032, 0.031, 0.03, 0.03, 0.03, 0.029, 0.029, 0.028, 0.028,
0.027, 0.027, 0.026, 0.026, 0.026, 0.026, 0.025, 0.025, 0.025,
0.025, 0.025, 0.025, 13, 1100, 170)

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Superposition de cycles

Messagepar Mickael Canouil » 18 Avr 2019, 14:03

Bonjour,

voici une proposition (à adapter au besoin)

Code : Tout sélectionner

library(tidyverse)

.data <- tibble(
  y = c(
    0.096, 0.088, 0.082, 0.078, 0.06, 0.057, 0.048, 0.047, 0.044,
    0.044, 0.039, 0.038, 0.037, 0.037, 0.035, 0.035, 0.034, 0.034,
    0.033, 0.033, 0.032, 0.032, 0.031, 0.031, 0.031, 0.031, 0.03,
    0.03, 0.03, 0.03, 0.03, 0.029, 0.029, 0.029, 0.029, 0.2, 1100,
    1100, 27, 15, 3.2, 2.2, 1, 0.65, 0.37, 0.3, 0.19, 0.16, 0.12,
    0.12, 0.099, 0.096, 0.085, 0.082, 0.064, 0.06, 0.051, 0.05, 0.046,
    0.045, 0.041, 0.041, 0.039, 0.038, 0.037, 0.036, 0.035, 0.035,
    0.034, 0.033, 0.032, 0.032, 0.032, 0.031, 0.031, 0.031, 0.03,
    0.03, 0.03, 0.03, 0.029, 0.029, 0.029, 0.029, 0.029, 0.028, 0.028,
    0.028, 4.4, 1100, 1100, 120, 21, 9.4, 3.1, 1.6, 0.85, 0.51, 0.33,
    0.23, 0.18, 0.18, 0.13, 0.11, 0.1, 0.092, 0.085, 0.077, 0.065,
    0.058, 0.053, 0.05, 0.047, 0.045, 0.043, 0.042, 0.039, 0.038,
    0.037, 0.036, 0.035, 0.035, 0.034, 0.033, 0.033, 0.032, 0.031,
    0.031, 0.031, 0.03, 0.03, 0.03, 0.029, 0.029, 0.029, 0.029, 0.028,
    0.028, 0.028, 0.028, 0.028, 37, 1100, 98, 17, 6.2, 2.7, 1.3,
    1, 0.47, 0.31, 0.23, 0.16, 0.14, 0.11, 0.1, 0.093, 0.087, 0.079,
    0.066, 0.057, 0.053, 0.049, 0.046, 0.044, 0.041, 0.04, 0.037,
    0.036, 0.035, 0.035, 0.033, 0.033, 0.032, 0.032, 0.031, 0.031,
    0.03, 0.03, 0.029, 0.029, 0.029, 0.029, 0.028, 0.028, 0.028,
    0.027, 0.027, 0.027, 0.026, 0.026, 0.026, 2.6, 1100, 1100, 190,
    22, 7.8, 3.2, 2.2, 0.91, 0.51, 0.37, 0.23, 0.18, 0.14, 0.12,
    0.11, 0.098, 0.09, 0.085, 0.071, 0.061, 0.055, 0.051, 0.049,
    0.045, 0.043, 0.04, 0.039, 0.037, 0.036, 0.035, 0.034, 0.033,
    0.032, 0.032, 0.031, 0.031, 0.03, 0.03, 0.03, 0.029, 0.029, 0.028,
    0.028, 0.028, 0.027, 0.027, 0.027, 0.026, 0.026, 0.026, 0.026,
    0.026, 8.8, 1100, 160, 21, 7.5, 3.4, 1.6, 0.89, 0.52, 0.33, 0.23,
    0.17, 0.14, 0.13, 0.1, 0.094, 0.087, 0.078, 0.065, 0.056, 0.051,
    0.049, 0.045, 0.043, 0.039, 0.039, 0.036, 0.035, 0.034, 0.033,
    0.032, 0.032, 0.031, 0.03, 0.03, 0.03, 0.029, 0.029, 0.028, 0.028,
    0.027, 0.027, 0.026, 0.026, 0.026, 0.026, 0.025, 0.025, 0.025,
    0.025, 0.025, 0.025, 13, 1100, 170
  ),
  x = seq(y)
)

ggplot(data = .data, mapping = aes(x = x, y = y)) +
  geom_point() +
  geom_line(colour = "red")


Image

Code : Tout sélectionner

find_cycle <- function(x, y) {
  dy <- diff(c(0, y))
  cut(
    x = x,
    breaks = c(min(x), which(dy > mean(dy) + 3 * sd(dy)), max(x)),
    include.lowest = TRUE,
    right = FALSE
  )
}
.data <- .data %>%
  mutate(cycle = find_cycle(x, y)) %>%
  group_by(cycle) %>%
  mutate(x_cycle = 1:n()) %>%
  ungroup()

p <- ggplot(data = .data, mapping = aes(x = x_cycle, y = y, colour = cycle)) +
  geom_point() +
  geom_line()

p

Image

Code : Tout sélectionner

p +
  facet_grid(rows = vars(cycle))

Image


EDIT: petite variante

Code : Tout sélectionner

find_cycle <- function(x, y) {
  dy <- diff(c(0, y))
  cut(
    x = x,
    breaks = unique(c(min(x), which(dy < mean(dy) - 3 * sd(dy)) + 1)),
    include.lowest = TRUE,
    right = FALSE
  )
}
.data <- .data %>%
  mutate(cycle = find_cycle(x, y)) %>%
  group_by(cycle) %>%
  mutate(x_cycle = 1:n()) %>%
  ungroup()

p <- ggplot(data = .data, mapping = aes(x = x_cycle, y = y, colour = cycle)) +
  geom_point() +
  geom_line()

p +
  facet_grid(rows = vars(cycle))

Image

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Miles François
Messages : 11
Enregistré le : 08 Mar 2019, 12:41

Re: Superposition de cycles

Messagepar Miles François » 18 Avr 2019, 16:16

Bonjour, je vous remercie pour votre réponse.
Il s'avère que votre code fonctionne correctement.
Cependant, j'ai un petit problème lorsque je l'applique a l'ensemble des données.
J'obtiens le graphique suivant :
[img]
https://nsa40.casimages.com/img/2019/04 ... 126859.png
[/img]
Il y a un léger décalage pour certains "pics".
Je ne vois pas comment modifier le code pour obtenir une seule superposition de tous les "pics".

Si ce n'est pas faisable, tant pis. En revanche, pensez-vous qu'il est possible de récupérer les valeurs maximales pour chaque "pic".

Merci par avance.

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Superposition de cycles

Messagepar Mickael Canouil » 19 Avr 2019, 09:08

Pour identifier les "pics":
1/ je calcule la différence successives entre les points. => diff(c(0, y))
2/ je cherche les différences les plus grandes (positive = "début du pic" et négative = "fin du pic") => "which(dy > mean(dy) + 3 * sd(dy))"
3/ je découpe le jeu de donnée (la variable) en fonction des positions de ces pics. => "cut(...)"

Problème, si le pic n'est pas qu'un seul point, cette algorithme ne fonctionne pas de façon très optimale.

Faute d'avoir, les données correspondant aux "dysfonctionnements", ce sera difficile d'aller plus loin.
Mickaël
mickael.canouil.fr | rlille.fr

Miles François
Messages : 11
Enregistré le : 08 Mar 2019, 12:41

Re: Superposition de cycles

Messagepar Miles François » 19 Avr 2019, 15:23

Bonjour.
je vous remercie pour votre réponse.
Pensez-vous qu'il est tout de même possible de récupérer les valeurs de ces "pics" ?
J'aimerais oberserver la variabilité de ces valeurs.

Merci par avance.

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Superposition de cycles

Messagepar Mickael Canouil » 19 Avr 2019, 15:52

Miles François a écrit :Pensez-vous qu'il est tout de même possible de récupérer les valeurs de ces "pics" ?

Oui, il "suffit" de définir/changer la façon de détecter les pics.
Mickaël
mickael.canouil.fr | rlille.fr

Miles François
Messages : 11
Enregistré le : 08 Mar 2019, 12:41

Re: Superposition de cycles

Messagepar Miles François » 19 Avr 2019, 17:24

Je ne vois pas comment m'y prendre.
Auriez-vous un exemple ?

Merci par avance.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité