0
votes

R Tidy: Seuil séquentiel dynamique

J'essaie de trouver une voie bien rangée pour ajuster dynamiquement un seuil comme je "déplacer" à travers un tibble à l'aide de la bibliothèque (Tairyverse) Code>. Par exemple, imaginez une tibble contenant des observations séquentielles: xxx pré>

J'essaie de calculer un seuil qui commence par la valeur initiale (2) et les incréments d'un montant préspécifié (dans ce cas, 1 ) Sauf si l'observation actuelle est supérieure à celle de ce seuil auquel cas l'observation actuelle em> devient le seuil de référence et d'autres seuils d'incrément de celui-ci. Voici ce que le Tibble final ressemblerait à: p> xxx pré>

Je cherche la meilleure façon de le faire en utilisant dplyr / rangé. Toute aide est appréciée! P>

EDIT: P>

Les réponses jusqu'à présent sont très proches, mais manquez dans le cas où les valeurs observées abandonnent et augmentent à nouveau. Par exemple, considérez le même treibble que exemple code> ci-dessus, mais avec un 4 code> au lieu d'un 3 code> pour l'observation finale: p>

example %>%
  group_by(gr = cumsum(c(TRUE, diff(observed) > thresh))) %>%
  mutate(thresold = first(observed) + row_number() - 1) %>%
  ungroup %>%
  select(-gr)

A tibble: 11 x 2
   observed thresold
      <dbl>    <dbl>
 1        2        2
 2        1        3
 3        1        4
 4        2        5
 5        2        6
 6        4        4
 7       10       10
 8        4       11
 9        2       12
10        2       13
11        4        4


7 commentaires

Pouvez-vous vérifier les valeurs entre 5 et 6. il est supérieur à 1


@akrun - Il n'y a pas de stipulation que les valeurs observées doivent être <= 1 sur des mesures séquentielles


Votre 6ème rangée ne s'aligne pas avec le seuil


Il est correct tel quel, le seuil devrait continuer à incrémenter sauf si la valeur observée n'est supérieure au seuil.


La partie continue d'incrémenter sauf si la valeur observée est supérieure au seuil n'est pas clair pour moi. Le seuil est 1


En regardant mon Analyse d'origine Tibble, AVIS Lorsque vous déplacez le TIBble, le seuil La valeur incrémente par 1 (2,3,4, ...) < / code>. La ligne numéro 7 aurait une valeur seuil de 8 , mais puisque la valeur observée de 10 est supérieure à 8 le seuil hérite du 10 . Le seuil continue ensuite d'incrémenter de 10 à la fin du Tibble (11,12,13,14) .


Vous pouvez vérifier ma mise à jour


3 Réponses :


1
votes

Vous pouvez utiliser diff code> pour créer des groupes et ajouter un numéro de ligne dans le groupe à la valeur code> code>. XXX PRE>


Pour comprendre comment les groupes sont créés ici sont les étapes détaillées: p>

Nous calculons d'abord la différence entre les valeurs consécutives P> xxx pré>

Notez que Diff donne la sortie de la longueur 1 inférieure à la longueur réelle. p>

Nous la comparons avec orthèse code> qui donne true code> pour chaque fois que nous avons une valeur supérieure au seuil p> xxx pré >

maintenant puisque la sortie de diff code> a une valeur moins que nous ajoutons une valeur que true code> p> xxx pré>

puis Enfin, prenez cumsum code> pour créer des groupes utilisés dans group_by code>. p> xxx pré>


edit fort> p>

pour la question mise à jour, nous pouvons ajouter une autre condition à la vérification de la valeur précédente est supérieure au nombre actuel et mettez à jour les valeurs en conséquence. P>

example %>%
  group_by(gr = cumsum(c(TRUE, diff(observed) > thresh) & 
                observed > first(observed) + row_number())) %>%
  mutate(thresold = first(observed) + row_number() - 1) %>%
  ungroup() %>%
  select(-gr)

# A tibble: 11 x 2
#   observed thresold
#      <dbl>    <dbl>
# 1        2        2
# 2        1        3
# 3        1        4
# 4        2        5
# 5        2        6
# 6        4        7
# 7       10       10
# 8        4       11
# 9        2       12
#10        2       13
#11        4       14


6 commentaires

Cela semble fournir exactement le résultat que je veux. J'ai du mal à comprendre exactement ce que le cumsum (c (vrai, diff (observé)> bath)) fait, cependant. Avez-vous un lien que vous pourriez partager cela peut l'expliquer?


@Colton J'ai ajouté des explications sur cette ligne.


Je ne suis pas sûr que cela résout le problème. Par exemple, considérons si la dernière valeur observée est un 4 au lieu d'un 3. Le seuil finit par diminuer au lieu d'incrémenter sur la dernière valeur. J'ai mis à jour ma description pour inclure cet exemple.


@Colton Si la dernière valeur est 4, la différence est supérieure au seuil d'où un nouveau groupe est créé à partir de là. La valeur seuil de chaque groupe est la première valeur du numéro de groupe +. Quelle sortie attendriez-vous dans ce cas?


Le seuil ne devrait jamais diminuer car les observations se poursuivent, comme indiqué dans ma réponse originale Tibble. Le seuil augmente continuellement par la quantité préspécifiée (1), sauf si une valeur observée n'est plus importante auquel cas le seuil augmente à cette valeur observée.


@Colton Pouvez-vous vérifier ma réponse mise à jour après Modifier ?



1
votes

Nous pouvons créer la variable de regroupement avec lag de la différence de colonne xxx


1 commentaires

Cette réponse semble très proche, mais échoue dans le cas, par exemple, que la valeur finale observée est un 4 plutôt qu'un 3 . (Il trouve le seuil final comme 12 plutôt que 14 ).



0
votes

Je pense que j'ai trouvé un moyen de faire cela, en utilisant zoo :: LOCF (bien que je ne suis pas sûr que cette partie soit vraiment nécessaire).

Créez d'abord le plus difficile des deux exemples que j'ai répertorié dans ma description: xxx

résultat: xxx

Je préférerais certainement une solution plus élégante si quelqu'un en trouve un .


0 commentaires