Half-marathon wearable sensor data
Authors/Creators
Description
# Breathing pattern, locomotor-respiratory coupling and perceived fatigue during a half-marathon: data and analysis code
Data, analysis code and supplementary information for:
> Harbour E, Kranzinger S, Prigent G, Apte S, Treff G. *Respiratory frequency does not
> track perceived fatigue independently of time-on-task during a half-marathon: a
> wearable-sensor field study.* Submitted to *Scientific Reports*.
Archive DOI: `10.5281/zenodo.XXXXXXX` · Contact: Eric Harbour, eric.harbour@plus.ac.at
## Contents
- **Raw data** (`data/HM_data.mat`): the device recordings of all 15 runners. These are
respiratory inductance plethysmography, trunk acceleration, heart rate, GPS speed and
ratings of fatigue, plus the seated calibration recordings before and after the run.
- **One live script** (`HM_analysis.mlx`): runs the whole analysis, from raw signals to
every number, table and figure in the article and its supplement.
- **Supplementary Information** (`supplementary/HM_Supplementary_Information.docx`): the
supplementary tables and figure of the article.
- **Reference results** (`results/`): the tables, figures and console log from the reference
run, for comparison with your own run.
## Quick start
1. **Get the two algorithm repositories.** Breath segmentation, breathing-pattern metrics
and locomotor-respiratory coupling are maintained on GitHub and are *not* included in
this archive. Clone them into `deps/` at the commits used for the article:
```
git clone https://github.com/eharbss/hexoskin-rip-algorithms deps/hexoskin-rip-algorithms
git -C deps/hexoskin-rip-algorithms checkout d5b289a
git clone https://github.com/eharbss/calc_LRC deps/calc_LRC
git -C deps/calc_LRC checkout 52dcb46
```
Without git, download each repository as a ZIP from GitHub and unpack it into `deps/`
under the folder names above. You can also put the repositories anywhere on your MATLAB
path. If either one is missing, `hm_setup` stops and prints these instructions.
2. **Open `HM_analysis.mlx` in MATLAB and press Run.** The first run reprocesses all raw
signals and caches the result in `results/HM_processed.mat`. It takes about 20 min on a
recent laptop. Later runs start from the cache and take about 11 min, mostly spent on
the classification sensitivity analyses. Set `REPROCESS = true` in section 2 to rebuild
the cache.
3. **Compare** your `results/` with the reference run in this archive. With the same MATLAB
release, the numbers should be identical.
## Requirements
- MATLAB R2026a (tested)
- Signal Processing Toolbox
- Statistics and Machine Learning Toolbox
- [hexoskin-rip-algorithms](https://github.com/eharbss/hexoskin-rip-algorithms), commit
`d5b289a` (MIT licence)
- [calc_LRC](https://github.com/eharbss/calc_LRC) v1.0.0, commit `52dcb46` (MIT licence)
No other toolbox or download is needed. The reference run started from
`restoredefaultpath` with only the two repositories in `deps/`, which confirms that the
archive is self-contained apart from them.
## Layout
```
HM_analysis.mlx main live script - run this
data/
HM_data.mat raw device recordings, one element per participant
code/
hm_setup.m paths, dependency and toolbox checks, EVERY analysis threshold
hm_process.m one participant: raw signals -> breathing pattern + coupling
hm_process_all.m loop over participants
hm_segment.m summaries per ROF prompt and per participant
hm_stats.m raw and time-adjusted associations, linear mixed models
hm_clmm.m ordinal (cumulative-logit) mixed models
hm_classify.m leave-one-participant-out classification of ROF
hm_robustness.m classification and association sensitivity analyses
hm_figures.m all article and supplementary figures
hm_export.m results tables (CSV and one XLSX)
lib/
check_RIP_signal.m flat-signal and gap check of raw RIP channels
hip_SR_Benson.m initial contacts and step rate from trunk acceleration
hm_sampen.m sample entropy
third_party/HRV/ RMSSD and DFA, HRV toolbox by M. Vollmer (MIT, see LICENSE.txt)
tools/
hm_build_data.m provenance only: how HM_data.mat was built from the study files
hm_clmm_simulation.m parameter-recovery check of the ordinal mixed model
deps/ empty: clone the two algorithm repositories here (step 1)
results/ reference run, rewritten by HM_analysis
figures/ PDF (vector), PNG (300 dpi), FIG
tables/ CSV + HM_results.xlsx (one sheet per table)
HM_analysis_log.txt console output of the reference run
supplementary/
HM_Supplementary_Information.docx
docs/
HM_analysis.m plain-text copy of the live script, readable without MATLAB
```
## Data: `data/HM_data.mat`
The file holds `HM`, a 1×15 struct array with one element per enrolled participant
(`HM(k).id = k`), and `info`, a short description. Every timetable uses `duration` row times.
Race recordings are zeroed to the start of the run, and seated recordings to their own start.
| field | content | rate |
|---|---|---|
| `resp` | respiratory inductance plethysmography, `thc` (rib cage) and `abd` (abdomen), arbitrary units. Hexoskin polarity: signal **maximum = end-expiration** | 128 Hz |
| `acc` | trunk accelerometer `accx accy accz` (g), Hexoskin | 64 Hz |
| `hr` | heart rate (bpm), chest strap; incomplete for some runners | 1 Hz |
| `speed` | running speed (m/s), GPS watch, smoothed; incomplete for some runners | 1 Hz |
| `rof` | at each prompt: rating of fatigue `rof` (1–10; Micklewright et al. 2017) and `hr`, the mean HR over the preceding interval (chest strap, or Hexoskin ECG where the strap failed; Prigent et al. 2022) | ~5 min |
| `seated_pre`, `seated_post` | 5-min quiet seated RIP (`thc`, `abd`) before and after the run, used for calibration | 128 Hz |
Participants 2 and 5 have no respiration recording. Participant 13's thoracic channel is
flat, and the pipeline rejects it automatically. Participants 3 and 6 have breathing data
but no usable rating-of-fatigue audio. The analysis therefore includes 12 participants for
breathing and coupling, and 10 for all fatigue analyses.
**De-identification.** Participants are identified only by a number from 1 to 15. The file
contains no names, birth dates, demographic or anthropometric data, calendar dates, clock
times, GPS positions or audio. The ratings of fatigue were transcribed from the spoken
recordings, which are not shared. The study was approved by the EPFL human research ethics
committee (HREC 039-2018).
GPS speed underestimates the known race distance by about a quarter. Average pace is
therefore computed from distance and running time, and speed is only shown relative to each
runner's own mean. Speed is not used in any statistical analysis.
## Algorithms
| step | function | source |
|---|---|---|
| raw-signal check | `check_RIP_signal` | this archive, `code/lib` |
| bandpass, breath segmentation | `rip_bandpass`, `segment_RIP`, `segment_ABD` | hexoskin-rip-algorithms; Harbour et al. (2021) *Sensors* 21:5606 |
| validity gate | `rip_quality` | hexoskin-rip-algorithms |
| calibration (QDC) | `rip_calibrate_K` | hexoskin-rip-algorithms; Sackner et al. (1989) |
| breathing pattern, %RC, TAC | `enrich_BP` | hexoskin-rip-algorithms |
| steps | `hip_SR_Benson` | this archive, `code/lib`; after Benson et al. (2019) *Sensors* 19:1483 |
| coupling, attachment | `calc_LRC`, `circular_coherence` | calc_LRC v1.0.0; Harbour et al. (2023) *Front Sports Act Living* 5 |
| breath-time variability | `RMSSD`, `DFA` | HRV toolbox, M. Vollmer (MIT), `code/third_party/HRV` |
| sample entropy | `hm_sampen` | this archive; Richman & Moorman (2000) |
## Outputs
Figures (`results/figures`):
| file | content |
|---|---|
| `Fig1_signal_example` | RIP and trunk acceleration, participant 11 (Methods figure) |
| `Fig2_ROF_speed` | rating of fatigue and relative speed across the run |
| `Fig3_breathing_pattern` | HR, f<sub>R</sub>, breath depth, Δ%RC, TAC and sample entropy across the run |
| `Fig4_LRC_by_participant` | locomotor-respiratory coupling by runner |
| `Fig5_raw_vs_time_adjusted` | within-runner associations with ROF, raw and adjusted for time-on-task |
| `FigS1_calibration_and_validity` | Supplementary Figure S1 |
The file numbers follow the pipeline, not necessarily the final figure numbers in the article.
Tables (`results/tables`; each is also a sheet of `HM_results.xlsx`):
| file | content |
|---|---|
| `Table_classification` | Table 1: leave-one-runner-out classification of ROF class |
| `Table_participants` | per-runner summary, calibration, signal quality and coupling |
| `Table_rof_observations` | the analysis dataset, one row per rating (172 rows) |
| `Table_group_correlations`, `Table_within_participant_correlations` | raw and time-adjusted Spearman associations, group and per runner; `rho_MDE` is the smallest detectable mean association |
| `Table_mixed_models` | linear mixed models |
| `Table_ordinal_mixed_models` | cumulative-logit mixed models, ROF 1–10 and 3 classes |
| `Table_classification_paired` | paired per-runner differences in accuracy (physiology + time vs time, and each vs the majority-class baseline), for every sensitivity pipeline |
| `Table_classification_by_participant` | accuracy, κ and F1 for every held-out runner and model |
| `Table_classification_confusion`, `Table_classification_recall` | pooled confusion counts, per-class recall and precision |
| `Table_classification_sensitivity`, `_filtering`, `_tuning` | Table 1 with per-fold feature filtering and per-fold hyperparameter tuning; features and settings chosen in every fold |
| `Table_classification_seeds`, `_seeds_summary` | 20 random seeds |
| `Table_classification_rof10` | classification of all ten ROF levels |
| `Table_sensitivity_noP10_correlations`, `_noP10_classification` | without participant 10 |
| `Table_sensitivity_jackknife` | time-adjusted mean ρ leaving out each runner in turn |
## Licence
Code: MIT (see `LICENSE`). Data and supplementary information: CC BY 4.0.
`code/third_party/HRV` keeps its MIT licence (see the `LICENSE.txt` in that folder). The two
algorithm repositories are distributed separately under their own MIT licences.
## How to cite
Please cite the article and this archive (see `CITATION.cff`). If you use the algorithms,
please also cite the two repositories and the papers listed under Algorithms.