Zplitz.

Uitleg

Welke metrics gebruikt deze tool, en waarom.

Hieronder staat per metric: wat het is, hoe wij het uit jouw data berekenen, en hoe het doorwerkt in de planner. Alle berekeningen zijn deterministisch, geen black-box, geen ML.

VDOT, actuele fitness

VDOT is Jack Daniels' VO₂max-equivalent: een getal (~30–85) dat aangeeft hoe snel je nu bent over een race-inspanning. Het is de centrale fitness-as in de hele tool.

VO₂(v) = -4.60 + 0.182258·v + 0.000104·v²     (v in m/min)
%VO₂max(t) = 0.8 + 0.1894·e^(-0.0128·t) + 0.2990·e^(-0.1933·t)     (t in min)
VDOT = VO₂(v) / %VO₂max(t)

Hoe wij hem schatten: per run berekenen we een race-equivalent VDOT via Daniels-formule, met een correctie voor klimmen (+6 s/km per 1% gemiddeld stijgingspercentage). We nemen vervolgens de rollende 90-dagen-best van alle runs ≥ 3 km, dat filtert easy runs eruit en pakt je piekrace-vorm.

Trend: we fitten een lineaire regressie op de laatste 24 maanden van die VDOT-tijdreeks. De helling (vdot_slope_per_year) bepaalt hoeveel je waarschijnlijk groeit tot race-datum.

Doorwerking:

  • Bepaalt al je tempo-zones (Easy/Marathon/T/I/R).
  • Wordt geprojecteerd naar race-datum (max ±4 VDOT-punten over een blok).
  • De inverse-functie (race_time_from_vdot) levert het voorgestelde doel.

Tempo-zones (Daniels)

Pace-zones worden volledig afgeleid uit VDOT, niet uit hartslag, niet uit RPE. We berekenen v_vo2 (snelheid bij 100% VO₂max) door de VO₂-polynomiaal te inverteren, en schalen die met vaste percentages:

Easy (E)        70–65 % van v_vo2
Marathon (M)        84 % van v_vo2
Threshold (T)       88 % van v_vo2     ← lactaat-drempel
Interval (I)        98 % van v_vo2     ← VO₂max-stimulatie
Repetition (R)     105 % van v_vo2     ← neuromusculair / snelheid

Dit zijn de tempo's die op je /profile en in elke workout-pill van het schema verschijnen.

Volume, acuut, chronisch & ACWR

We tellen alle hardloopkilometers per ISO-week (maandag-zondag). Daaruit volgen drie afgeleiden:

  • Acute load (7d), som van de laatste 7 dagen. Wat je net aan het doen bent.
  • Chronische load (28d / 4-wk gemiddelde), wat je consistente basis is. Dit getal vult de planner als "huidige weekkilometers".
  • ACWR (Acute:Chronic Workload Ratio) = acute / chronic. Sportwetenschap (Gabbett 2016) wijst de "sweet spot" 0.8–1.3 aan; ≥ 1.5 markeren we als blessurerisico (rode toon op het dashboard).

Chronische trend: 8-weekse rolling average van weekvolume, maandelijks gesampled (laatste 36 maanden). Dit is de blauwe lijn in de trend-grafiek.

Historische piek (peak_cap_km): hoogste 4-weeks gemiddelde dat je ooit haalde, fungeert als veilig plafond voor het piekvolume in de planner.

Persoonlijke ramp (ramp_pct_per_week): mediaan van je historische week-over-week groei in 6-wekenvensters waarin je ≥ 25 km/wk draaide, geclamped op 4–15%. Dit is jouw eigen "veilige opbouwsnelheid", niet de generieke 10%-regel.

Trainability, kun je nu een blok aan?

Een samengestelde score op 4 axes die antwoord geeft op: "is dit een goed moment om een planning te starten?"

  • Consistency, % van laatste 12 weken met ≥ 3 runs.
  • ACWR-band, straft uitschieters (acute load > 1.5× chronic).
  • Setback-vrij, kijkt naar onverklaarbare dips ≥ 40% in weekvolume; recente dip = score omlaag.
  • Long-run consistency, typische long-run aanwezig + percentage van de weken.

De gemiddelde score (0–100) verschijnt als "Trainability" op je profielpagina. Hoog = klaar voor structurele opbouw; laag = eerst basis herstellen.

Hartslag, zones & aerobic efficiency

Alleen runs met opgenomen hartslag tellen mee. We halen HRmax niet uit een formule (220-leeftijd is onnauwkeurig) maar uit jouw eigen data: gemiddelde van de top-2% hoogste max-heart-rates over alle runs. Robuust tegen uitschieters.

Z1 (Recovery)      60–70 % HRmax
Z2 (Aerobic)       70–80 % HRmax     ← langste deel easy runs
Z3 (Tempo)         80–87 % HRmax
Z4 (Threshold)     87–93 % HRmax
Z5 (VO₂max)        93–100 % HRmax
  • Avg HR recent (8wk), gemiddelde van avg_heart_rate van runs uit de laatste 8 weken (gewogen op duur).
  • Easy-run HR compliance, % van easy-pace runs uit de laatste 12 weken (≥ 3 km, pace > threshold + 30 s/km) waar de gem. HR ≤ 78% HRmax bleef. Hoog = goede aerobic-discipline; laag = je easy runs zijn eigenlijk moderate.
  • Aerobic efficiency trend, lineaire regressie van (snelheid m/min ÷ avg HR) door de tijd. Positief = je wordt zuiniger bij dezelfde inspanning. Sanity-bounds: 0.5 < eff < 4.0, HR ∈ [100, 210].

Growth outlook, hoe snel kun je nog groeien?

Op basis van vier factoren wijzen we een readiness-bucket toe:

  • Rebuilding, chronisch < 15 km/wk. Eerst basis opbouwen.
  • Developing, 15–25 km/wk, weinig recente blokken.
  • Fit / Active, 25–45 km/wk, consistent.
  • High volume, > 45 km/wk; marginale gains in plaats van grote sprongen.

De bucket bepaalt een basis-range voor verwachte VDOT-winst over 12 weken (low–high), die we dan aanpassen op:

  • Experience (jaren consistent gedraaid).
  • Recente VDOT-slope (positief = upgrade, dalend = downgrade).
  • Setback-aanwezigheid in laatste 12 weken (volume-dip ≥ 40%).

De projectie wordt vertaald naar concrete winst (sec/km) op een 10k via race_time_from_vdot, en gerendered als de "Realistisch alternatief" tegel op de plan-pagina.

Suggested goal time, hoe komt de tool aan het voorstel?

Op de planner-pagina, zodra afstand + race-datum bekend zijn, doen we dit:

weeks = (race_date − today) / 7
gain = clamp(vdot_slope_per_year × weeks/52, −4, +4)
projected_vdot = current_vdot + gain
suggested_time_s = race_time_from_vdot(distance_m, projected_vdot)

De drie chips zijn afgeleid van die projectie:

  • Behoudend = projectie × 1.03 (3% trager dan projectie)
  • Projectie = exact de tijd uit bovenstaande formule
  • Stretch = projectie × 0.97 (3% sneller, vereist optimale uitvoering)

Feasibility, is dit doel realistisch?

Nadat je een doeltijd hebt ingevuld toetsen we het op twee axes:

  • VDOT-as: required = VDOT die de doeltijd vraagt; projected = wat we voor race-datum verwachten op basis van slope.
  • Volume-as: required = piekvolume nodig voor de afstand; projected = wat je vanuit chronisch + persoonlijke ramp kunt halen in de beschikbare weken, geclamped op je historische piek.

Per as: comfortable (≤ 0 delta) / stretching (≤ ~5%) / ambitious (≤ ~12%) / unrealistic (> 12%). De overall verdict is de slechtste van de twee.

Schema-opbouw

Vanuit huidige weekkilometers naar piek, dan taper:

  • Ramp, wekelijkse stijging = ramp_pct_per_week (jouw eigen, niet generieke 10%). Elke 4e week een cut-back (−25%).
  • Piek, heuristiek per afstand (10k ~70 km, HM ~90 km, marathon ~110 km), maar geclamped op peak_cap_km (historische piek).
  • Taper, 2 weken voor marathon, 1 week voor kortere afstanden.
  • Wekelijkse blokken, verdeeld over days_per_week: 1 long, 1 quality (T/I/R afhankelijk van afstand), rest easy.
  • Niveau-classificatie, gebaseerd op jouw huidige VDOT (niet die van je doel). Een beginner met een ambitieus doel krijgt dus geen advanced-workouts.
  • Long-run floor, in de eerste base-weken wordt de long-run niet onder je bestaande typical_long_run_km gezet (gecapt op 45% van het weekvolume, zodat de rest van de week niet uitgeperst wordt).
  • Setback-modus, als last_setback_days_ago < 60: startvolume ×0.85, ramp ×0.7. Conservatief opbouwen na onderbreking.

Wat we (nog) niet doen — eerlijk:

  • Feasibility-verdict wordt getoond, maar (nog) niet teruggevoerd in het schema. Een "unrealistic" doel krijgt nu hetzelfde plan.
  • VDOT-trend (vdot_slope_per_year) zit in de haalbaarheidscheck, maar stuurt de intensiteitsverdeling nog niet bij.
  • Archetype-personalisatie (Sprinter / Endurance / Hybrid) kleurt de UI, maar past nog geen workout-mix aan. Staat op de roadmap.
  • Easy-pace HR-compliance meten we, maar gebruiken we nog niet om je easy-tempo aan te scherpen.

Welke ruwe data gebruiken we?

Per activiteit slaan we deze velden op (uit GPX/FIT/Strava-API):

start_time, duration_s, distance_m, elevation_gain_m,
avg_pace_s_per_km, avg_hr, max_hr (uit raw),
sport, source, external_id, raw (volledige payload)

Bij Strava-bulk-exports verrijken we elke activiteit met velden uit activities.csv (opgeslagen onder raw.csv):

  • Gear name (schoenmodel)
  • Calories
  • GAP distance (grade-adjusted)
  • Weer: temperatuur, gevoelstemperatuur, vochtigheid, wind, neerslag, bewolking, UV
  • Perceived effort + equivalent effort

Wat we niet gebruiken: leeftijd, geslacht, gewicht (we kennen ze niet), subjectieve self-reports, social signals.