Trail running durability ventilation dataset
Abstract
# Ventilatory durability during prolonged running — data and analysis code Breath-by-breath breathing pattern (breathing frequency, tidal volume, minute ventilation, inspiratory and expiratory time, duty cycle) and locomotor–respiratory coupling in 23 trained runners across three hours of treadmill running with repeated uphill time trials. **Authors:** Eric Harbour (Paris Lodron University of Salzburg), Diego Jaén-Carrillo (Universität Innsbruck) and colleagues.**Associated article: not yet **Contact:** Eric Harbour, eric.harbour@plus.ac.at --- ## Protocol in brief Each participant completed two laboratory sessions on a motorised treadmill. | session | content | file ||---|---|---|| Control | one 12-min self-paced uphill time trial (12 % grade, maximal distance) | `PTxx_TimeTrial.mat` || Main test | three 60-min steady-state blocks at 85 % of the speed at LT1 + 0.5 mmol·L⁻¹, each followed by a 12-min uphill time trial | `PTxx_MainTest.mat` | Breathing was sampled through a mouthpiece for about 3 min at the 5-, 35- and 50-min marks of each block and continuously through each time trial: 13 epochs per participant. | epoch label | meaning ||---|---|| `TT0` | control time trial (separate day) || `S1_min5`, `S1_min35`, `S1_min50` … `S3_min50` | steady-state block 1–3, window at minute 5 / 35 / 50 || `TT1`, `TT2`, `TT3` | time trial after block 1 / 2 / 3 | Recording: ADInstruments ML206 gas analyser with two unidirectional heated Hans Rudolph pneumotachs on a two-way valve and an MLA246 mixing chamber, LabChart 8. External load from a Stryd foot pod (1 Hz). ## Contents ```code/ durability_analysis.mlx Live script: the whole analysis, step by step (start here) durability_analysis.m Same script as plain text pipeline/ The functions it calls (21 files, listed below)data/ raw/ 47 LabChart recordings, MATLAB .mat, flow and CO2 channels only tables/ Durability_lab_summary.xlsx Metabolic-cart values per epoch (laboratory summary sheet) Stryd_Durability.xlsx Stryd power, speed and cadence, 1 Hz perceptual_hr_windows.csv Heart rate and RPE per rating tt_distance.csv Distance covered and mean speed in each 12-min time trialresults/ pipeline/ Per-participant breath tables, QC sheets, model-ready tables figures/ The paper figures (.png and .fig) results_tables.xlsx Every model and table reported in the paper``` ## Running the analysis 1. Install calc_LRC v1.0.0 (Harbour, MIT licence; https://github.com/eharbss/calc_LRC, archived on Zenodo) and either add it to the MATLAB path or set `CALC_LRC_DIR` in the Settings section. It is needed only for the coupling step; everything else runs without it.2. Open `code/durability_analysis.mlx` and run it. With the defaults (`RUN_EXTRACT = false`) it replays from `results/pipeline` in under a minute and rewrites `results/results_tables.xlsx` and `results/figures/`.3. To reproduce everything from the raw recordings, set `RUN_EXTRACT = true` (about 30 min). This regenerates `results/pipeline/` from `data/raw/`, including the coupling table. Requirements: MATLAB R2023b or later, Statistics and Machine Learning Toolbox, Signal Processing Toolbox. Tested on R2026a (macOS). ### ExclusionThe third main-test time trial of PT07 (`TT3`) is excluded from every analysis as an outlier on all data streams. The rule is defined once, in the Settings section of the live script (`isExcl`), and applied after the model-ready tables are built; the breath tables in `results/pipeline` still contain it. ## Data ### Pseudonymisation and data minimisation- Participants are identified only by codes PT01–PT23. The key linking codes to the study's internal identifiers is held by the authors and is not part of this record.- Recordings contain no names, dates or times of day. LabChart file names were replaced by the participant code and session.- Only the channels the analysis reads are included. The original recordings also carried femoral-nerve stimulation and knee-extensor force data (reported elsewhere), heart rate trigger, ECG and unused channels; all were removed.- Spreadsheets contain only the columns the code reads, and only the 23 participants who completed the study. Body mass and sex are retained because the analysis uses them (power normalisation; exploratory sex models).- LabChart operator comments are kept in full because the epoch boundaries are read from them; they contain protocol notes only. ### `data/raw/PTxx_ .mat`One file per LabChart document. `PT03_MainTest_Recovered.mat` and `PT03_MainTest_FinalTT.mat` are one main test saved in two parts after a software crash. Variables: | variable | content ||---|---|| `data` | {nRecords × nChannels} cell, each a 1 × N double vector || `channel_names` | `Resp. flow_Ins`, `Resp. flow_Exp` (two-limb sessions only), `CO2_Expired` || `fs_hz` | sampling rate per record and channel (400 Hz) || `units` | units per record and channel || `n_channels`, `n_records` | sizes || `comment_text`, `comment_record`, `comment_time_s`, `comment_tick`, `comment_channel` | LabChart comments; epoch markers are parsed from these (`lc_epochs.m`) || `source_file` | pseudonymised document name | Flow is in **volts**, not L/s. The pneumotach calibration lived in the LabChart Metabolic Module and is not stored in the file. The analysis is built to be independent of it: outcomes are modelled on the log scale, where a per-session gain becomes a constant absorbed by the participant random intercept, and absolute volumes are scaled to the laboratory summary sheet (`kMode = 'sheet'`). Expired CO2 comes from a mixing chamber, so it is not resolved per breath; it is used only to check which limb a flow channel belongs to. Two layouts occur. *Two-limb* sessions have both flow channels. *Single-limb* sessions have the inspiratory pneumotach only; breathing frequency, timing and inspired tidal volume are still available. PT03 and PT13 changed layout between their two sessions. ### `data/tables/Durability_lab_summary.xlsx`One row per participant and epoch: breathing frequency, tidal volume, V̇E (BTPS), V̇O2, V̇CO2, relative V̇O2 and RER as reported by the metabolic cart. `timepoint` uses the laboratory's labels (`Hour 1 - 5min` = `S1_min5`, `Control TT` = `TT0`). ### `data/tables/Stryd_Durability.xlsx`Two sheets, 1 Hz: `Participants_TimeTrials` (column `TimeTrial`: control, T1–T3) and `Participants_SteadyState` (column `Block`). Columns: ID, Sex, body mass (kg), power (W), speed (km/h), cadence (steps/min). LabChart and Stryd were started together by hand, with no shared electronic marker, so alignment is per epoch and good to seconds, not steps. ### `data/tables/perceptual_hr_windows.csv`Heart rate (bpm) and RPE (Borg 6–20). Steady-state blocks: one rating at minutes 20, 40 and 60, paired in `epoch` with the preceding breathing window (5, 35, 50). Time trials: one rating per trial. Transcribed from the study's session sheets. ### `data/tables/tt_distance.csv`Distance covered (m) and mean speed (km/h) in each 12-min self-paced time trial (TT0 = control, TT1–TT3 after 1–3 h), from the parent study's session records. This is the time-trial performance (durability) outcome; Stryd power is used only as the matched-load covariate. ### `results/pipeline/`| file | content ||---|---|| `PTxx_breaths.csv` | one row per breath: Ti, Te, Ttot, fR, VT, VE, duty cycle, mean inspiratory flow, epoch, accepted flag || `PTxx_epochs.csv` | per-epoch medians and IQRs; `fR_rate` and `VE_rate` are the metabolic-cart conventions || `PTxx_bins.csv` | per-minute drift within each epoch || `PTxx_vs_sheet.csv` | agreement with the laboratory summary sheet || `PTxx_QC.png`, `QC_index.html`, `QC_summary.csv` | the per-participant review sheets || `analysis_bins.csv` | model-ready table: 30-s bins with Stryd covariates || `analysis_epochs.csv` | the same at epoch level || `analysis_lrc.csv` | percent attached and dominant step:breath ratio per epoch | ## Code: `code/pipeline/` | function | role ||---|---|| `lc_paths` | package folder layout || `lc_load` | read one recording || `lc_epochaudit`, `lc_epochs` | parse the LabChart comments into epochs || `lc_breaths` | breath segmentation on the inspiratory limb and volumes || `lc_limbcheck`, `lc_layout` | channel-layout diagnostics || `pilot_n1`, `pilot_figures` | one participant end to end || `qc_sheet`, `qc_all` | QC sheets for the cohort || `build_analysis_table` | breaths → 30-s bins + Stryd → `analysis_bins.csv` || `lrc_inputs`, `lrc_analysis`, `lrc_all` | coupling via calc_LRC → `analysis_lrc.csv` || `dur_models` | primary linear mixed models (fitlme) || `dur_secondary` | HR, RPE, gas exchange, sex, sensitivity, descriptives with CI || `dur_reliability` | typical error and minimal detectable change || `dur_rmcorr` | repeated-measures correlation || `dur_figures`, `dur_palette` | the paper figures | ## Licence*data under CC BY 4.0, code under MIT