Elevate: La tendance de remise en forme "Forme" doit être basée sur les "Fitness" et "Fatigue" d'hier

Créé le 23 avr. 2018  ·  18Commentaires  ·  Source: thomaschampagne/elevate

Décrivez votre environnement

  • Version du plugin: 6.1.2 stable
  • Version Chrome / Opera / Chromium: Chrome
  • Version du système d'exploitation: Mac OS

Décris le problème:

À l'heure actuelle, le formulaire semble être calculé comme la différence entre la forme physique et la fatigue du même jour. Cependant, il peut être préférable de le baser sur la condition physique et la fatigue d'hier. Ceci est discutable, bien sûr. Je ne peux que suggérer ces deux points:
a) cela me semble plus correct subjectivement, car la fatigue d'entraînement se fait davantage sentir le lendemain
b) TrainingPeaks fait cela (voir ici , section "Formulaire")

bug major

Commentaire le plus utile

@aprokop Merci beaucoup pour cette analyse approfondie! C'est clair, sans ambiguïté!

Tous les 18 commentaires

La forme par définition est (TrainingPeaks):
Training Stress Balance (TSB) ou Form représente l'équilibre du stress d'entraînement.

Forme (TSB) = Fitness d'hier (CTL) - Fatigue d'hier (ATL)

https://help.trainingpeaks.com/hc/en-us/articles/204071764-Form-TSB-

@aprokop Oui, il devrait avec le modèle mathématique utilisé. Les formules sont dans l'aide

@thomaschampagne Je ne suis pas sûr de comprendre votre commentaire. Êtes-vous en train de dire que c'est déjà fait

@aprokop Oui. Modèle de fitness élevé = modèle de pics d'entraînement

image

@thomaschampagne Je ne pense pas. Le modèle TrainingPeaks est

Form(day+1) = Fitness(day) - Fatigue(day)

Il semble également que les deux autres formules ne soient pas tout à fait exactes et devraient être

Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day)) x ...
Fatigue(day+1) = Fatigue(day) + (StressScore(day+1)-Fatigue(day)) x ...

Je regarde ma courbe TrainingPeaks, et un effort majeur affecte de manière significative à la fois la forme physique et la fatigue le même jour, et la forme le lendemain.

screen shot 2018-10-16 at 9 33 13 am

yupp c'est aussi mon point:

@thomaschampagne Je ne pense pas. Le modèle TrainingPeaks est

Forme (jour + 1) = Fitness (jour) - Fatigue (jour)

Faire un PR est quelque chose de possible pour vous ou je le gère moi-même?

Je n'ai jamais travaillé avec ce langage de programmation, mais je pourrais essayer si vous pensez que c'est assez facile. Je suppose que ma principale préoccupation est la portée du code affecté et s'il nécessite une réorganisation.

@aprokop La portée ne devrait être que cette méthode https://github.com/thomaschampagne/elevate/blob/990b5d0fc11113b2c4d120e6aec9f0ba3dc0e844/plugin/app/src/app/fitness-trend/shared/services/fitness.shared/services.fitness.

Mais ne t'inquiète pas, je vais le faire. Vous avez juste besoin de votre aide pour tester et valider les modifications.

@aprokop Êtes-vous sûr à 100% de cela ci-dessous?

Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day)) x ...
Fatigue(day+1) = Fatigue(day) + (StressScore(day+1)-Fatigue(day)) x ...

J'ai corrigé le code avec vos recommandations (via commit https://github.com/thomaschampagne/elevate/commit/ec73ee0c5a6d3c78662c41b94a4e090c70a1572b). Pour simplifier l'implémentation dans le code existant, j'ai implémenté vos formules comme ceci:

Fitness(day) = Fitness(day-1) + (StressScore(day)-Fitness(day-1)) x ...
Fatigue(day) = Fatigue(day-1) + (StressScore(day)-Fatigue(day-1)) x ...
Form(day) = Fitness(day-1) - Fatigue(day-1)

@aprokop @ jayti74

  • Pouvez-vous également tester la version ci-dessous et la comparer avec vos TrainingPeaks pour vous assurer que tout va bien sans régressions? (La version comprend commit https://github.com/thomaschampagne/elevate/commit/ec73ee0c5a6d3c78662c41b94a4e090c70a1572b ofc)

Version du test:

Merci pour ton aide :)

@thomaschampagne

Êtes-vous sûr à 100% de cela ci-dessous?

Oui et non. Oui, je suis sûr que c'est faux dans le sens où cela ne correspond pas à TrainingPeaks car l'effort du même jour n'affecterait pas la forme physique / la fatigue le même jour. Il est certainement nécessaire de changer StressScore (jour) en StressScore (jour + 1). Cependant, je ne suis pas sûr que ce soit la formule exacte. On pourrait penser que cette formule comme

Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day+1)) x ...

pourrait également avoir un sens (il faudrait alors résoudre pour Fitness (jour + 1)). Mais je pense que c'est bien comme ça.

Le commit implémente correctement les formules suggérées. Vous pouvez supprimer les mises à jour de prevCtl et les amis des clauses if (isPreStartDay) , mais c'est mineur.

Je vais le tester le soir en rentrant chez moi.

Je viens de l'essayer, et il se comporte comme prévu. La forme a chuté le lendemain, tandis que la condition physique et la fatigue ont augmenté le même jour. Donc, je pense que tout va bien maintenant.
screenshot_20181017_202434

@aprokop Merci pour vos tests et avis! Nous avons donc 2 formules:

Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day+1)) x ...
-- or --
Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day)) x ...

Mais je pense que nous avons un problème avec le premier :) C'est étrange de calculer Fitness(day+1) si Fitness(day+1) fait également partie de l'expression ... C'est ce que nous voulons trouver.

Et si nous résolvons l'expression, nous avons:

Fitness(day+1) = (Fitness(day) - k * StressScore(day+1)) /(1 - k)  where k = exp(-1/42)

... Cela a-t-il du sens?!

Existe-t-il un moyen d'exporter les données csv de TrainingPeaks au jour le jour? Ou obtenir plus d'informations à partir de votre capture d'écran graphique TrainingPeaks?

Sur la capture d'écran de votre graphique TrainingPeaks, les points rouges sont des jours d'effort (s)? Confirmez-vous que la courbe de forme et de fatigue augmente le jour de votre effort?

Merci pour ton aide :)

@thomaschampagne Je suis d'accord avec vous que Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day+1)) x ... est étrange. Je ne l'ai mentionné que parce que je ne suis pas sûr à 100%.

Existe-t-il un moyen d'exporter les données csv de TrainingPeaks au jour le jour? Ou obtenir plus d'informations à partir de votre capture d'écran graphique TrainingPeaks?

C'est une très bonne idée. Je pense que c'est possible, et je l'ai fait dans le passé. Laissez-moi essayer d'obtenir les données récentes.

Sur la capture d'écran de votre graphique TrainingPeaks, les points rouges sont des jours d'effort (s)? Confirmez-vous que la courbe de forme et de fatigue augmente le jour de votre effort?

Oui, les points rouges sont les valeurs de TSS pour chaque jour et les bleus sont l'intensité.

Confirmez-vous que la courbe de forme et de fatigue augmente le jour de votre effort?

Oui.

OK, donc on peut exporter les entraînements mais pas les valeurs de la courbe. Bien. Testons-le.

Regardons la course difficile récente (marquant comme - données non importantes). Les données devaient être extraites d'un graphique et arrondies à l'entier le plus proche par TrainingPeaks.

| | jour avant la course | jour de course | après le jour de la course |
| - | - | - | - |
| TSS | - | 395 | - |
| Fatigue | 54 | 102 | - |
| Fitness | 61 | 69 | - |
| Formulaire | - | 8 | -33 |

Donc:

  1. Fatigue (jour) - Fitness (jour) = 69-102 = 33 = Forme (jour + 1), nous avons donc la bonne formule pour Forme.
  2. Fatigue (jour-1) + (TSS - Fatigue (jour-1)) x ... = 54 + (395-54) x (1-e ** (- 1/7)) = 99, donc environ 102?
  3. (Fatigue (jour-1) + TSS (1-k)) / (2-k) = (54 + 395 (1-k)) / (2-k) = 94, donc loin. (k = exp (-1/7)). J'ai corrigé les calculs de fomula ici, car celui du commentaire précédent est faux.
  4. Fitness (day-1) + (TSS - Fitness (day-1) x ... = 61 + (395-61) x (1-e ** (- 1/42) = 69, donc c'est exact.
  5. (Fitness (day-1) + TSS (1-K)) / (2-K) = (61 + 395 (1-K)) / (2-K) = 69, donc c'est aussi à peu près juste (ici, K = exp (-1/42)).

En résumé, cela semble la meilleure option:

Form(day) = Fitness(day-1) - Fatigue(day-1)
Fitness(day) = Fitness(day-1) + (StressScore(day)-Fitness(day-1)) x (1-exp(-1/42))
Fatigue(day) = Fatigue(day-1) + (StressScore(day)-Fatigue(day-1)) x (1-exp(-1/7))

PS Je ne comprends toujours pas pourquoi en 2. nous n'obtenons que 99 et non 102.

J'ai jeté un coup d'œil à GoldenCheetah :

double lte = (double)exp(-1.0/ltsDays_);
double ste = (double)exp(-1.0/stsDays_);
 ...
// LTS
if (day) lastLTS = lts_[day-1];
lts_[day] = (stress_[day] * (1.0 - lte)) + (lastLTS * lte);

// STS
if (day) lastSTS = sts_[day-1];
sts_[day] = (stress_[day] * (1.0 - ste)) + (lastSTS * ste);

Il y a aussi ceci .

Donc, je pense que nous sommes bons.

@aprokop Merci beaucoup pour cette analyse approfondie! C'est clair, sans ambiguïté!

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

MCO7 picture MCO7  ·  29Commentaires

ndaman picture ndaman  ·  14Commentaires

rex4539 picture rex4539  ·  4Commentaires

alexisrosuel picture alexisrosuel  ·  5Commentaires

SpaceCowboy-71 picture SpaceCowboy-71  ·  49Commentaires