One row per stage, the lactate taken in the last 30 s. The resting sample is the row with intensity 0.
| intensity | lactate | heart_rate | rpe |
|---|---|---|---|
| 0 | 0.93 | 96 | 6 |
| 50 | 0.98 | 114 | 7 |
| 75 | 1.23 | 134 | 8 |
| … | … | … | … |
| 191 | 8.64 | 198 | 19 |
lactate_tests has 16 more, four sports.Enter its time-weighted intensity: the last completed stage plus the increment × seconds done / seconds of a stage. Or leave it out with max_intensity.
Same diet and training in the 24 to 48 h before, same time of day, stages of 3 min or more, two or three stages below the first rise, the same sampling site, sample type and analyzer every time.
Sources and the strength of each point: the Best practices article.
| sport | Intensity | Also shown |
|---|---|---|
| cycling | W | per kg with a body mass |
| running | km/h | pace, min/km |
| swimming | m/s | pace, min/100 m |
| rowing | W | 500 m split |
results <- lactate_threshold( demo_data, intensity, lactate, heart_rate, rpe_column = rpe, sport = "cycling" )
| Method | What it finds |
|---|---|
| Log-log | Where two lines through log lactate and log intensity cross |
| OBLA 2.0–4.0 | A fixed lactate, 2 to 4 mmol/L |
| Bsln+ 0.5–1.5 | 0.5 to 1.5 mmol/L above the resting value |
| Dmax family | The point furthest below a line to the last stage |
| LTP1, LTP2 | The turn points of three straight segments |
| LTratio, IAT | The lowest lactate / intensity; 1.5 mmol/L above it |
| Keul, Simon | Running only: where the curve rises 1.26 or 1 mmol/L per km/h |
| Stegmann | A tangent from recovery to the curve |
c("Dmax", "LTP")stage_duration, for Stegmann.by = "athlete"autoplot(results) # every method autoplot(results, method = "ModDmax") # one method
One method: the curve, its line, and the threshold at 140 W.
Leave one stage out: red, the threshold rises without that stage; blue, it falls; dark, it rests on it.
zones <- lactate_zones(results, model = 5) ## LT1, LT2: from lactate_threshold(lt1 =, lt2 =)
LT1 and LT2 split the intensities into moderate, heavy and severe; five zones split the outer two. Below, the heart rate of the stages, read at LT1 and LT2. Every zone gets its heart rate and RPE range; heart-rate zones suit steady efforts, as heart rate lags in short intervals.
"relative", "seiler", or your owntraining_load(sessions, zones, column = "power",
measure = "intensity", interval = 1)
| Methods with some support | |
|---|---|
| LT1 | Log-log, Bsln+ 0.5: moderate to heavy domain |
| LT2 | Bsln+ 1.5 (3-min stages), Log-Poly-ModDmax (4-min stages): close to the maximal lactate steady state |
Jamnick et al. 2018 and 2020; few methods have evidence for the heavy to severe boundary. Report the pair you chose.
predict_performance(results) own <- calibrate_performance(lab, "ltp2", "time", method = "LTP2", sport = "running", distance = 10000) predict_performance(results, equation = own)
Race times (running) and 45-min time-trial power (cycling), each with its 95% range, from published equations or your own athletes.
| Sport | From | Source |
|---|---|---|
| Running | IAT: 5 km to marathon; OBLA 4.0: marathon | Röcker 1998; Sjödin 1981 |
| Cycling | Six thresholds: 45-min time trial | Heuberger 2018, refitted |
| Rowing, swimming | Your own equation | calibrate_performance() |
report_start(results) |>
report_header(name = "Ana", lab = "Our lab",
logo = "logo.png") |>
report_summary() |>
report_zones() |>
report_save("ana.html", pdf = TRUE)
dates for the progressThe first page of a report: the two thresholds, what they mean, the zones.
options(lactater.style = "night"), or "journal" for printoptions(lactater.font = "IBM Plex Sans")Every method follows its original paper; the articles explain each one, its evidence, and how to read the checks.