There is a newer version of the record available.

Published October 29, 2026 | Version v3
Dataset Restricted

Half-marathon wearable sensor data

  • 1. ROR icon University of Salzburg
  • 2. Salzburg Research Forschungsgesellschaft mbH
  • 3. ROR icon Vienna University of Economics and Business
  • 4. ROR icon École Polytechnique Fédérale de Lausanne
  • 5. ROR icon Paracelsus Medical University

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.

Files

Restricted

The record is publicly accessible, but files are restricted. Log in to check if you have access.