Methods

One screen. The analysis code that reads the restricted dataset is released separately.

Data

mcPHASES v1.0.0 on PhysioNet, restricted access under the PhysioNet Restricted Health Data License. Interval 2022: 42 participants in Toronto, about three months each, with a Fitbit Sense (nightly wrist temperature, resting heart rate, HRV, sleep breathing rate, sleep), a Dexcom G6 continuous glucose monitor, Mira urinary LH and E3G with a four-phase label per day, and a daily symptom diary on a 0–5 scale. The 2024 return interval is held out and has not been used.

Citations, as PhysioNet asks: the dataset record, Lin, B., Li, J. Y., Kalani, K., Truong, K., & Mariakakis, A. (2025). mcPHASES: A Dataset of Physiological, Hormonal, and Self-reported Events and Symptoms for Menstrual Health Tracking with Wearables (version 1.0.0). PhysioNet. doi:10.13026/zx6a-2c81; the platform, Pollard, T., et al. (2026). PhysioNet as a global platform for biomedical research. Nature Health. doi:10.1038/s44360-026-00096-z; and the descriptor, Lin et al. 2026, Scientific Data.

From rows to contrasts

flowchart LR
    R[Raw tables<br/>2022 rows only] --> Q[QC<br/>one value per participant-day;<br/>resting heart rate and breathing rate 0 = missing;<br/>glucose units by participant median;<br/>temperature nights ≥ 30 °C and ≥ 120 samples]
    Q --> M[Per participant and phase<br/>mean over labelled days, ≥ 3 days]
    M --> P[Paired within participant<br/>Menstrual, Fertility, Luteal − Follicular]
    P --> E[Paired mean difference and Hedges' g<br/>95 % BCa, 5,000 participant resamples]
    Q --> C[Closed cycles from menstrual onsets<br/>in the phase labels, 10–60 days]
    C --> A[Three-level REML model of daily values<br/>person, cycle and day components of the luteal contrast]
    C --> V[One luteal − follicular vector per cycle<br/>five device metrics, total-SD units]
    V --> D[Distance-based repeatability R_vec]

Statistics

  • Cohort shifts. DABEST paired mean difference and Hedges’ g with 95 % bias-corrected and accelerated bootstrap intervals over participants (5,000 resamples). Native units are primary; g only to compare cells across metrics.
  • Persistence of a person’s contrast. Per device metric, a linear mixed model of daily values fitted by REML (statsmodels): fixed luteal indicator; participant random intercept and luteal slope (correlated); cycle-within-participant intercept and luteal-slope variance components; day residuals. The between-person SD of the luteal slope is the quantity of interest: repeatability of a random slope in the sense of Araya-Ajoy et al. (2015) and Schielzeth & Nakagawa (2022), within the general repeatability framework of Nakagawa & Schielzeth (2010). Fits whose person intercept–slope correlation is ±1 are reported as singular and uninformative. Bootstrap intervals for the variance components are withheld because a variance at its boundary makes them invalid; calibrated inference by simulating the null on the same design, after Crainiceanu & Ruppert (2004), is in progress.
  • Vector repeatability. Each closed cycle’s five-metric contrast is divided per metric by the total SD of cycle contrasts; R_vec = 1 − mean squared within-person distance / mean squared between-person distance over the 22 participants with two or more cycles. This is the distance-based ICC of Xu, Reiss & Cribben (2021), equivalent for Euclidean distances to I2C2 (Shou et al. 2013).
  • Earlier check. The same question over 17 features on the between-person scale, with ICC(1) per feature, BCa intervals from 5,000 participant resamples.
  • No hypothesis tests and no multiplicity adjustment for the cohort contrasts. Estimates come with intervals except where an interval is known to be miscalibrated, which is stated where it happens.
  • Figures. DABEST forest plots draw each contrast’s bootstrap as a half-violin with the estimate and its 95 % BCa interval. The whorlmap draws the bootstrap of Hedges’ g inside each cell of the feature × contrast grid, the outer ring being the tail nearest zero and the centre the far tail. Colour and axis ranges are set from the plotted values so that no cell saturates, and the range is printed on the figure. Device metrics are blue, symptoms orange, throughout.

Disclosure

  • Every figure and table pools at least five participants; most pool 24 to 42.
  • No participant-level value, identifier, calendar date or free-text entry appears in this repository or on this site.
  • The repeatability and comparison figures are drawn from the cohort-level tables in tables/ by scripts/make_figures.py; the cohort-shift figures are the analysis run’s own, every element a cohort bootstrap. The code that reads the restricted dataset is released from a separate repository after review, as the data licence asks of code behind publications.

Software

Python 3.12, pandas 2.2, numpy 2.1, DABEST 2025.10.20, statsmodels 0.14.6, matplotlib 3.10; Quarto 1.8 for this site.