VDOT — VO₂max Daniels
Estimation de VO₂max en course à pied à partir d'une performance.
À quoi ça sert
Le VDOT est l'estimation du VO₂max fonctionnel de Jack Daniels, calculée à partir d'une performance de course réelle (distance + temps). Elle permet d'estimer ton niveau aérobie sans test laboratoire et surtout d'en déduire tes allures d'entraînement optimales (cf. allures-daniels).
Une source pure par sport (Bloc 84) : EnduranceHub impose une méthodologie unique par discipline — plus de mélange Firstbeat / Daniels / Coggan dans une même courbe.
- Running — priorité Firstbeat Garmin (source device, champ WellnessDay.vo2max). Fallback automatique sur Daniels VDOT calculé depuis les activités course (Activity.vo2max_daniels, filtre ≥ 3 km / ≥ 15 min / capteur FC) si aucun point Firstbeat n'est disponible sur la période.
- Cycling — formule Coggan & Allen 2010 (Activity.vo2max_coggan), une valeur par activité cycliste éligible (NP > 0, ≥ 20 min, poids athlète connu, et effort proche du seuil — IF = NP/FTP ≥ 0,85 : une sortie facile/endurance ne produit pas de point, sinon le VO₂max serait sous-estimé).
- Saisie manuelle — si SportSettings.vo2max_source == 'manual', aucune tendance n'est calculée, la valeur saisie est affichée telle quelle et n'est jamais écrasée par l'auto-calibration post-sync.
- Garde-fous : le running (Daniels) rejette toute valeur hors de [20, 90] mL/kg/min (plancher à 20 = vitesse de marche), le cycling (Coggan) rejette hors de [15, 90] mL/kg/min (filtrage des artefacts sur efforts maximaux isolés ou FTP aberrante).
Interprétation
Un VDOT à 45 correspond grossièrement à un 10 km en 44 min ou un marathon en 3h30 pour un homme entraîné. Un VDOT > 60 est un niveau élite régional.
Débutant
≈ 30 mL/kg/min — reprise ou sédentaire actif
Intermédiaire
≈ 40 mL/kg/min — 3-4 séances/sem régulières
Entraîné
≈ 50 mL/kg/min — compétiteur amateur régulier
Confirmé
≈ 60 mL/kg/min — régional fort / marathonien 3h
Élite
70+ mL/kg/min — national / international
Évolution
Le VDOT évolue lentement, sur des cycles de 8 à 12 semaines. Les gains typiques sont de 1 à 3 points par an chez un athlète intermédiaire. Un gain rapide signale souvent une meilleure exécution du test plus qu'un gain physiologique réel.
Pipeline Bloc 84 : à chaque synchronisation, metric_computation.compute_all_metrics recalcule les colonnes dédiées Activity.vo2max_daniels (course) et Activity.vo2max_coggan (vélo) pour toute activité éligible. L'agrégation sur 90 j est ensuite assurée par services/analytics/vo2max_trend.py. Un backfill admin (POST /api/admin/backfill/vo2max-per-activity) permet de recalculer l'historique complet en cas de changement de formule ou de données.
Delta « sur N j » robuste : le chiffre de tendance affiché compare la médiane des premiers points à la médiane des derniers (pas un simple dernier − premier), ce qui rejette une mesure isolée aberrante (ex. une estimation Garmin erratique). Il n'apparaît que si la fenêtre contient assez de points sur au moins 14 jours — sinon « Pas assez de points pour un delta ». Un −20 ml/min/kg en 3 mois n'est pas physiologique : c'est presque toujours un point aberrant, désormais filtré.
Formule
Running — la 2ème équation donne le pourcentage de VO₂max soutenable pour la durée t (min), la 3ème le coût énergétique en mL/kg/min pour une vitesse v (m/min). Le résultat est stocké par activité dans Activity.vo2max_daniels et agrégé sur 90 j pour la tendance.
Cycling — formule Coggan & Allen (2010, *Training and Racing with a Power Meter*, 2e éd.) : VO₂max = (FTP_W / poids_kg × 10.8) + 7. La FTP est l'entrée directe (estimée ailleurs depuis le NP 20 min ≈ 0.95 × NP). Stockée dans Activity.vo2max_coggan. Nécessite un capteur de puissance et un poids athlète à jour.
Garde-fous : running rejeté hors de [20, 90] mL/kg/min, cycling rejeté hors de [15, 90].
Source : Daniels (2005) — backend/app/utils/vdot.py:13-42 (compute_vdot) · Coggan & Allen (2010) — backend/app/services/fitlab_metrics/sport_specific.py:204-231 (compute_vo2max_cycling) · Pipeline per-activity : backend/app/services/import_helpers/metric_computation.py:compute_all_metrics (colonnes Activity.vo2max_daniels + Activity.vo2max_coggan) · Agrégation tendance : backend/app/services/analytics/vo2max_trend.py · Orchestration sport settings : backend/app/services/zone_calibration.py:compute_vo2max_all_sports
Limites
- Firstbeat Garmin (course) : ne couvre que le running et nécessite un device compatible (Fenix, Forerunner 245+, Venu 2…). Absent des wearables non-Garmin et des montres entrée de gamme.
- Running (Daniels fallback) : valable sur plat. Sous-estime les spécialistes des courses longues (> marathon) et surestime les spécialistes de demi-fond.
- Running : très sensible à la qualité des activités prises en compte (dénivelé, vent, température). Le filtre ≥ 3 km / ≥ 15 min limite les faux positifs mais ne les élimine pas.
- IMC > 30 (obésité) : VDOT non validé sur cette population. La courbe Daniels a été calibrée sur coureurs entraînés (IMC 19–24). Le VDOT sous-estime la VO₂max réelle en cas de surcharge pondérale.
- Coureurs débutants (< 6 mois d'entraînement structuré) : corrélation VDOT ↔ VO₂max dégradée — économie de course instable, mauvaise gestion d'allure en test. L'écart attendu est plus large qu'un coureur confirmé.
- Écart vs laboratoire : jusqu'à ±5 mL/kg/min selon Daniels lui-même. Le VDOT reste une estimation de performance, pas une mesure médicale.
- Cycling (Coggan) : nécessite un capteur de puissance + poids athlète à jour + NP ≥ 20 min. Dans le cas contraire, aucune valeur n'est calculée. Une FTP obsolète fausse également la comparaison entre périodes.
- Saisie manuelle : désactive le calcul automatique. Tant qu'une valeur manuelle est active pour un sport, la tendance n'est pas affichée — repasser la source en
autopour réactiver l'agrégation. - Pas de mélange cross-sport : la courbe Run et la courbe Ride sont toujours distinctes (couleurs séparées quand sport=Tous). Comparer les niveaux Run vs Ride bruts n'a pas de sens (la musculature sollicitée diffère).
- Garde-fous : le running (Daniels) plafonne le plancher à 20 mL/kg/min (record 5000 m ≈ VDOT 85) et le cycling (Coggan) à 15 ; les deux rejettent au-dessus de 90. Une valeur extrême réelle (ex. athlète élite > 90) sera rejetée — saisir alors la valeur manuellement (source =
manual), elle ne sera pas écrasée. - Ne remplace pas un test VO₂max en laboratoire pour des décisions médicales.