Elevate: La tendencia de fitness "Forma" tiene que basarse en "Fitness" y "Fatiga" de ayer

Creado en 23 abr. 2018  ·  18Comentarios  ·  Fuente: thomaschampagne/elevate

Describe tu entorno

  • Versión del complemento: 6.1.2 estable
  • Versión de Chrome / Opera / Chromium: Chrome
  • Versión del sistema operativo: Mac OS

Describe el problema:

En este momento, la forma parece calcularse como la diferencia entre la condición física y la fatiga del mismo día. Sin embargo, puede ser mejor basarlo en el estado físico y la fatiga de ayer. Esto es discutible, por supuesto. Solo puedo sugerir estos dos puntos:
a) me parece más correcto subjetivamente, ya que la fatiga del entrenamiento se siente más al día siguiente
b) TrainingPeaks está haciendo eso (ver aquí , sección "Formulario")

bug major

Comentario más útil

@aprokop ¡ Muchas gracias por este análisis profundo! ¡Es claro, inequívoco!

Todos 18 comentarios

La forma por definición es (TrainingPeaks):
Training Stress Balance (TSB) o Form representa el equilibrio del estrés del entrenamiento.

Forma (TSB) = Fitness de ayer (CTL) - Fatiga de ayer (ATL)

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

@aprokop Sí, debería hacerlo con el modelo matemático utilizado. Las fórmulas están en el ayudante

@thomaschampagne No estoy seguro de entender tu comentario. ¿Estás diciendo que ya está dentro?

@aprokop Sí. Elevate fitness model = modelo de picos de entrenamiento

image

@thomaschampagne No lo creo. El modelo TrainingPeaks es

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

También parece que las otras dos fórmulas no son exactamente correctas y deberían ser

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

Miro mi curva de TrainingPeaks y un gran esfuerzo afecta significativamente tanto la condición física como la fatiga el mismo día y la forma al día siguiente.

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

sí, ese es también mi punto:

@thomaschampagne No lo creo. El modelo TrainingPeaks es

Forma (día + 1) = Fitness (día) - Fatiga (día)

Ok, no entendí. Reabrí el boleto. Gracias por la excavación. El código para su información está aquí: https://github.com/thomaschampagne/elevate/blob/990b5d0fc11113b2c4d120e6aec9f0ba3dc0e844/plugin/app/src/app/fitness-trend/shared/services/fitness.service.ts#L243

¿Hacer un PR es algo posible para ti o lo manejo yo mismo?

Nunca trabajé con este lenguaje de programación, pero podría intentarlo si crees que es lo suficientemente fácil. Supongo que mi principal preocupación es el alcance del código afectado y si requiere alguna reorganización.

@aprokop El alcance debe ser solo ese método https://github.com/thomaschampagne/elevate/blob/990b5d0fc11113b2c4d120e6aec9f0ba3dc0e844/plugin/app/src/app/fitness-trend/shared/services.ts#ness.ser226

Pero no te preocupes, lo haré. Solo necesita su ayuda para probar y validar los cambios.

@aprokop ¿Estás seguro al 100% de esto a continuación?

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

Arreglé el código con sus recomendaciones (a través de commit https://github.com/thomaschampagne/elevate/commit/ec73ee0c5a6d3c78662c41b94a4e090c70a1572b). Para simplificar la implementación en el código existente, implementé sus fórmulas de esta manera:

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

  • ¿También puede probar la siguiente compilación y compararla con TrainingPeaks para asegurarse de que todo esté bien sin regresiones? (La compilación incluye la confirmación https://github.com/thomaschampagne/elevate/commit/ec73ee0c5a6d3c78662c41b94a4e090c70a1572b ofc)

Prueba de compilación: v6.6.0_stable_ec73ee0_2018-10-17-16-05.zip

Gracias por tu ayuda :)

@thomaschampagne

¿Estás seguro al 100% de esto a continuación?

Si y no. Sí, estoy seguro de que está mal en el sentido de que no coincide con TrainingPeaks ya que el esfuerzo en el mismo día no afectaría la condición física / fatiga en el mismo día. Sin duda, es necesario cambiar StressScore (día) a StressScore (día + 1). Sin embargo, no estoy seguro de si esa es la fórmula exacta. Uno podría pensar que la fórmula como

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

también podría tener sentido (entonces habría que resolver Fitness (día + 1)). Pero creo que está bien como está.

La confirmación implementa las fórmulas sugeridas correctamente. Podrías sacar las actualizaciones de prevCtl y amigos de las cláusulas if (isPreStartDay) , pero eso es menor.

Lo probaré por la noche cuando llegue a casa.

Simplemente lo probé y se comporta como se esperaba. La forma bajó al día
screenshot_20181017_202434

@aprokop ¡ Gracias por tus pruebas y revisión! Entonces tenemos 2 fórmulas:

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

Pero creo que tenemos un problema con el primero :) Es extraño calcular Fitness(day+1) si Fitness(day+1) también es parte de la expresión ... Esto es lo que queremos encontrar.

Y si resolvemos expresión, tenemos:

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

... ¡¿Tiene sentido?!

¿Hay alguna forma de exportar datos csv de TrainingPeaks día a día? ¿O obtener más información de la captura de pantalla del gráfico de TrainingPeaks?

En la captura de pantalla del gráfico de TrainingPeaks, ¿los puntos rojos son días de esfuerzo? ¿Confirma que la curva de condición física y fatiga aumenta el día de su esfuerzo?

Gracias por tu ayuda :)

@thomaschampagne Estoy de acuerdo contigo en que Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day+1)) x ... es raro. Solo lo mencioné porque no estoy 100% seguro.

¿Hay alguna forma de exportar datos csv de TrainingPeaks día a día? ¿O obtener más información de la captura de pantalla del gráfico de TrainingPeaks?

Esta es una muy buena idea. Creo que es posible y lo he hecho en el pasado. Déjame intentar obtener los datos recientes.

En la captura de pantalla del gráfico de TrainingPeaks, ¿los puntos rojos son días de esfuerzo? ¿Confirma que la curva de condición física y fatiga aumenta el día de su esfuerzo?

Sí, los puntos rojos son los valores de TSS para cada día y los azules son la intensidad.

¿Confirma que la curva de condición física y fatiga aumenta el día de su esfuerzo?

Si.

Bien, entonces uno puede exportar entrenamientos pero no los valores de la curva. Multa. Vamos a probarlo.

Veamos la dura carrera reciente (marcada como - datos no importantes). Los datos tuvieron que tomarse de un gráfico y TrainingPeaks los redondeó al número entero más cercano.

| | día previo a la carrera | día de la carrera | después del día de la carrera |
| - | - | - | - |
| TSS | - | 395 | - |
| Fatiga | 54 | 102 | - |
| Fitness | 61 | 69 | - |
| Formulario | - | 8 | -33 |

Entonces:

  1. Fatiga (día) - Fitness (día) = 69 - 102 = 33 = Forma (día + 1), por lo que tenemos la fórmula correcta para Forma.
  2. Fatiga (día-1) + (TSS - Fatiga (día-1)) x ... = 54 + (395-54) x (1-e ** (- 1/7)) = 99, entonces aproximadamente 102?
  3. (Fatiga (día-1) + TSS (1-k)) / (2-k) = (54 + 395 (1-k)) / (2-k) = 94, muy lejos. (k = exp (-1/7)). Arreglé los cálculos de la fórmula aquí, ya que el del comentario anterior es incorrecto.
  4. Fitness (día-1) + (TSS - Fitness (día-1) x ... = 61 + (395-61) x (1-e ** (- 1/42) = 69, así que eso es correcto.
  5. (Fitness (día-1) + TSS (1-K)) / (2-K) = (61 + 395 (1-K)) / (2-K) = 69, por lo que también es correcto (aquí, K = exp (-1/42)).

En resumen, estas parecen la mejor opción:

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))

PD: Todavía no entiendo por qué en 2. solo obtenemos 99 y no 102.

Eché un vistazo a

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);

También está esto .

Entonces, creo que estamos bien.

@aprokop ¡ Muchas gracias por este análisis profundo! ¡Es claro, inequívoco!

¿Fue útil esta página
0 / 5 - 0 calificaciones