Sign in

Jem Arnold

@jemarnold.bsky.social
667 followers 382 following 464 posts

PhD candidate & physiotherapist | 🩸Iliac artery endofibrosis / FLIA | Endurance testing & NIRS. Treat declarative statements as questions?

PostsRepliesMedia
Jem Arnold @jemarnold.bsky.social · 26/08/2026
Reallly, I just wanted an excuse to display the mnirs kinetics analysis capabilities I'm working on, and raise some wild speculation while I'm at it 😊 Need to challenge these models on more data when the app is rolled out (soon!)
030
Jem Arnold @jemarnold.bsky.social · 26/08/2026
Muscle oxidative capacity analysis with #mnirs is monoexponential by consensus. But are there secondary drift kinetics hiding in the data and biasing results?🤔 No idea, but could 'slow-component' drift be related to hyperaemia + metabolic rate adjustments as seen here? Thoughts? #rstats
Two-panel figure showing near-infrered spectroscopy slopes collected during repeated occlusions for evaluation of muscle oxidative capacity, modelled as an exponential decay in deoxygenation rates (slopes) over time. Title: mNIRS OxCap Kinetics Analysis. Subplot titles: Monoexponential and Exponential-linear drift models. y-axis: HHb slope (μM/sec). x-axis: Occlusion Times (mm:ss) (time range 0-04:00). monoexp coefs: Trial 1 tau=19.3 sec, k=3.1 /min. Trial 2 tau=15.4 sec, k=3.9 /min. exp-linear drift coefs: Trial 1 tau=24.6 sec k=2.4 min⁻¹ texc=73.7 sec slope=0.0526 /min. Trial 2 tau=19.0 sec k=3.2 min⁻¹ texc=57.1 sec slope=0.0445 /min
131
Reposted by Jem Arnold
Philip Skotzke @philipskotzke.bsky.social · 26/08/2026
New study out on muscle oxygen saturation (SmO₂) breakpoints using NIRS 🎉 First authored by @igfjarillo.bsky.social - I contributed via the statistical analyses. While we present the findings elsewhere, here I focus on what’s new about our approach and why it matters ⬇️🧵 1/8
Photo of the title and author section of the recently published study titled "Visually identified breakpoints in muscle oxygen saturation are not equivalent to ventilatory thresholds in national-level triathletes
133
Jem Arnold @jemarnold.bsky.social · 25/08/2026
Oh yeah I'm going to try this immediately in Positron. Thanks!
110
Reposted by Jem Arnold
Ben Zipperer @benzipperer.org · 25/08/2026
relatedly, you may be interested in my absolute favorite, most-used R package, for inspecting the middle of a piped chain in interactive development
milesmcbain.r-universe.dev
breakerofchains: Break Chained Expressions and Run Them with Printed Output
Run an infix operator expression chain up to the line your cursor is on, printing the output, and ignoring any result assignment step. This facilitates easier interactive debugging of chained code. Co...
121
Jem Arnold @jemarnold.bsky.social · 25/08/2026
Right?! Thought I knew a thing or two. How did I not stumble across this earlier
000
Jem Arnold @jemarnold.bsky.social · 25/08/2026
TIL you can print() intermediate objects in the middle of an #rstats pipeline🤯 ``` df |> print() |> process() |> print() |> plot() ``` Just added `return(invisible(x))` to my own print.generics. Very helpful to print a formatted results table and plot at the same time!
A screenshot from a Quarto document with code snippet:
```
df |>
    analyse_kinetics(
        method = "monoexponential",
        use_TD = FALSE,
        group_intervals = list(trial1 = 1:16, trial2 = 17:32),
        zero_time = TRUE
    ) |>
    print() |> # 😀
    plot()
```

Prints a formatted table of model result coefficients for the two specified "trials", and a plot with two facets showing observed data and modelled monoexponential curves
2162
Jem Arnold @jemarnold.bsky.social · 25/08/2026
Also follow up to 20, whenever my Gen Z colleagues, who were born after this line was uttered, have a good idea: <reluctantly> "do what the kid said"
010
Jem Arnold @jemarnold.bsky.social · 25/08/2026
1. "no no no, dig up stupid" 2. "I gotta go, my damn weiner kids are listening" 3. "That's it! Back to Winnipeg!" [am from Winnipeg, which makes this my favourite line]
110
Reposted by Jem Arnold
Solomon Kurz @solomonkurz.bsky.social · 13/08/2026
But on the upside, the only way I was able to zero in on the mistakes was because the authors shared code. Without that, I would have just been surprised and confused. Share your code! It makes the world a better place.
1264
Jem Arnold @jemarnold.bsky.social · 06/08/2026
5/5 {mnirs} 0.7.0 can be downloaded from CRAN 🧑‍💻: `install.packages("mnirs")` (0.7.1 updated on github because I already found a bug) github.com/jemarnold/mn... More information on the {mnirs} package website: #rstats #nirs #muscleoxygenation
jemarnold.github.io
Muscle Near-Infrared Spectroscopy Processing and Analysis
Read, process, and analyse data from muscle near-infrared spectroscopy (mNIRS) devices. Import raw data from file and return time-series data and metadata. Standardised methods for cleaning, filtering...
000
Jem Arnold @jemarnold.bsky.social · 06/08/2026
4/5 A minor ⚠️ breaking change to `shift_mnirs()`, `replace_mnirs()`, and `extract_intervals()`: `group_channels` arg handles channels `group_intervals` arg handles intervals for `extract_intervals()` Options are “distinct”, “ensemble”, or a custom group list
data_rescaled <- rescale_mnirs(
    data_clean,
    nirs_channels = c(smo2, thb), ## pick the channels
    group_channels = "distinct",  ## how they are grouped
    range = c(0, 100),            ## same range for both channels
)

## `group_intervals replaces `event_groups`
ensemble <- extract_intervals(
    data_rescaled,
    group_intervals = "ensemble",
    start = by_time(124, 486, 848, 1210), ## extract four intervals,
    end = by_time(364, 726, 1088, 1450),  ## return one ensemble-averaged
    span = c(-10, 60)
)

ensemble
#> $ensemble
#> # A tibble: 156 × 3
#>    time  smo2   thb
#>   <dbl> <dbl> <dbl>
#> 1   -10  79.8  28.4
#> 2    -8  77.0  33.3
#> 3    -6  80.5  37.1
#> 4    -4  77.6  37.9
#> 5    -2  72.8  32.8
#> # ℹ 151 more rows

plot(ensemble, time_labels = TRUE)
100
Jem Arnold @jemarnold.bsky.social · 06/08/2026
3/5 {mnirs} 0.7.0 can now process each `nirs_channel` with independent settings: You can `replace_mnirs()` invalid values with different criteria each for “smo2” and “thb” Or `filter_mnirs()` one channel with “moving average” and another with “butterworth”, side by side
data_clean <- replace_mnirs(
    data,
    invalid_above = list(smo2 = 80, thb = 13), ## assign independent values
    invalid_below = list(thb = 10),            ## assign only one channel, ...
    invalid_values = list(smo2 = 0),           ## or the other (with a warning)
    method = "none"                            ## replace with NA
)

## rows where invalid values were replaced
invalid <- data[is.na(data_clean$smo2) | is.na(data_clean$thb), ]

## plot the clean data and overlay replaced invalid values
plot(data_clean, time_labels = TRUE) +
    geom_line(data = data, aes(y = smo2, colour = "smo2"), alpha = 0.2) +
    geom_point(data = invalid, aes(y = smo2, colour = "smo2")) +

    geom_line(data = data, aes(y = thb, colour = "thb"), alpha = 0.2) +
    geom_point(data = invalid, aes(y = thb, colour = "thb"))
100
Jem Arnold @jemarnold.bsky.social · 06/08/2026
2/5 Core processing functions now accept a list of data frames or grouped dfs with `dplyr::group_by()`: You can `filter_mnirs()` over a list of dfs from multiple `read_mnirs()` files Or `extract_intervals()` from a longer session and `rescale_mnirs()` each independently
data_list <- filter_mnirs(
    data = list(df1, df2),
    method = "butterworth",
    type = "low",
    order = 2,
    W = 0.2
)

data_list
#> $interval_1
#> # A tibble: 211 × 2
#>    time  smo2
#>   <dbl> <dbl>
#> 1   -60  54.0
#> 2   -58  53.6
#> 3   -56  53.1
#> 4   -54  52.6
#> 5   -52  52.3
#> # ℹ 206 more rows
#> 
#> $interval_2
#> # A tibble: 211 × 2
#>    time  smo2
#>   <dbl> <dbl>
#> 1   -60  62.5
#> 2   -58  61.9
#> 3   -56  61.1
#> 4   -54  60.5
#> 5   -52  60.4
#> # ℹ 206 more rows

plot(data_list)
110
Jem Arnold @jemarnold.bsky.social · 06/08/2026
{mnirs} R package for reading, processing, analysing muscle near-infrared spectroscopy data🦵🔦 updated to 0.7.0 Mostly internal performance improvements getting ready for `mnirs::analyse_kinetics()` soon! github.com/jemarnold/mn... Here are the key changes: 1/5🧵🔗👇 #rstats #nirs #muscleoxygenation
R package {mnirs} hex logo from https://github.com/jemarnold/mnirs
140
Jem Arnold @jemarnold.bsky.social · 26/07/2026
I'm finding the actual value of #rstats posts here to be overweight compared to other sites, at least
130
Jem Arnold @jemarnold.bsky.social · 25/07/2026
Doctors, surgeons, clinicians, coaches can directly access the clinician questionnaire from the QR code or link here: mmc.myresearchmanager.com/Survey/9h4fm
ARE YOU AN EXPERT IN FLOW LIMITATIONS IN THE ILIAC ARTERY (FLIA)?
HELP IMPROVE TREATMENT AND FOLLOW-UP CARE FOR ATHLETES

We want to hear from you for an international research study.

WHO CAN PARTICIPATE

You can participate if you are:
professionally involved in the diagnosis, treatment and/or follow-up of FLIA

WHAT DOES PARTICIPATION INVOLVE
Online questionnaire
Approximately 15–20 minutes
Completely voluntary

JOIN THE STUDY

Scan the QR code or use the link in the description.

PLEASE SHARE

Do you know other experts who have broad experience with patients with FLIA?
Please send them this study information.

STUDY INFORMATION

The study is conducted by the INSITE group:
INternational Study group for Identification and Treatment of Endofibrosis

Questions: flia@mmc.nl
020
Jem Arnold @jemarnold.bsky.social · 25/07/2026
Another call for input! 📢 CLINICIANS, COACHES, and ATHLETES managing recovery from surgery for flow limitations in the iliac artery FLIA / endofibrosis We'd love to hear your experiences to help improve care for athletes. Please contact email below 👇 #cycling #sportsmedicine #sportmedicine
HAVE YOU HAD SURGERY FOR FLOW LIMITATIONS IN THE ILIAC ARTERY?

HELP IMPROVE FUTURE CARE FOR ATHLETES

We want to hear from you for an international research study

WHO CAN PARTICIPATE

You can participate if you:

are 18 years or older
have had surgery for flow limitations in the iliac artery (FLIA/endofibrosis)
can complete an English questionnaire

WHAT DOES PARTICIPATION INVOLVE

Online questionnaire
Approximately 15–20 minutes
Completely voluntary

JOIN THE STUDY

contact email: flia@mmc.nl

PLEASE SHARE

Do you know other athletes who have had iliac artery surgery?

Please send them this study information

STUDY INFORMATION

The study is conducted by the INSITE group:
International Study group for Identification and Treatment of Endofibrosis

Questions: flia@mmc.nl
162
Jem Arnold @jemarnold.bsky.social · 18/07/2026
Thanks. How do you get them to play nice together? I haven't explored much with subagent orchestration yet
120
Jem Arnold @jemarnold.bsky.social · 18/07/2026
#rstats how are we finding GPT-5.6 vs Fable/Opus for working in R? I don't like the R code it's been giving me so far, but I've spent more time with Claude so maybe I just need to set up better instructions? 🤔
130
Jem Arnold @jemarnold.bsky.social · 03/07/2026
In my brief experience so far, most likely a reversion to Opus 😅 #rstats
Screenshot of warning message from Anthropic Fable during routine R coding assistance: "Fable 5's safeguards flagged this message. The safeguards are intentionally broad right now and may flag safe and routine coding, cybersecurity, or biology work. These measures let us bring you Mythos-level capabilities sooner, and we're working to refine them. Switched to Opus 4.8. Send feedback with /feedback or learn more: https://support.claude.com/en/articles/15363606"
050
Jem Arnold @jemarnold.bsky.social · 27/06/2026
Yeah true, I feel like VO2max prediction equations more often use weight than height? So that probably indicates a stronger relationship with cardiac output & cardiovascular function. Whereas pulmonary function & lung volumes are often predicted based on height
130
Jem Arnold @jemarnold.bsky.social · 27/06/2026
Oops, error in the subtitle coefficient results. Height alone is significant
030
Jem Arnold @jemarnold.bsky.social · 27/06/2026
Ooh, good thought, thanks! Yes in fact weight alone is a slightly better explanatory model at ~42% explained variance Both height and weight together reduce r^2 very slightly to 40%, meaning more of the shared explanatory value is provided by weight alone
140
Jem Arnold @jemarnold.bsky.social · 27/06/2026
Turns out significant between-participant relationship with notable within-participant variation. Height alone explains around 37% of the variation in recirculation time. Adding 'fitness' (% predicted VO2max) is not significant and only adds +1% marginal explained variance to that 🤔
240
Jem Arnold @jemarnold.bsky.social · 26/06/2026
Thanks, yeah that's a great thought. We expect pulmonary & muscle capillaries have the slowest transit time for gas exchange, which could explain such tight between-participant values. Need to look up more historical data on this
010
Jem Arnold @jemarnold.bsky.social · 26/06/2026
Thanks Philip! It's such a clean signal in everyone, and consistently between 9-11 sec in our n=10 sample group Another interesting thought is, I wonder if there is an effect of height as a proxy for circulatory length? 🤔
110
Jem Arnold @jemarnold.bsky.social · 26/06/2026
Also worth noting their sample group was "normal" young individuals, while ours were well-trained competitive cyclists. But still no detectable difference in bulk recirculation time? 🤔 Anyway, data & figures here: github.com/jemarnold/da...
github.com
data-vis-threads/2026-06-25 at main · jemarnold/data-vis-threads
A repo for sharing data visualisation projects. Contribute to jemarnold/data-vis-threads development by creating an account on GitHub.
130
Jem Arnold @jemarnold.bsky.social · 26/06/2026
This paper found similar ~11sec mean recirculation time in females & males treadmill walking at 3 mph (12:25/km) @ 5% grade So already at walking intensity, or cycling near V̇O₂max, bulk blood flow velocity is nearly the same?😮 Chapman & Fraser 1954 doi.org/10.1161/01.C...
Individual data table and representative plot of tracer dye concentration curves in 23 “normal young men” and 11 “normal young women” during rest and exercise (treadmill walking), with per-participant values reported for age, cardiac output, cardiac index, and mean circulation time (highlighted for this post). Plot shows a sample dye tracer accumulation curve in colorimeter density over time, peaking 10-sec after (presumably) injection and recirculation appearing after approx 10-sec during exercise. “TABLE 2.—Cardiac Output, Cardiac Index, and Mean Circulation Time at Rest and during Exercise in 23 Normal Young Men”. “FIG. 1.—Sample dye curves, at rest and during exercise, showing the extrapolated values after the beginning of recirculation.” “TABLE 3.—Cardiac Output, Cardiac Index, and Mean Circulation Time at Rest and during Exercise in 11 Normal Young Women”.
120
Jem Arnold @jemarnold.bsky.social · 26/06/2026
How long does it take for blood to make a full round-trip around the entire body during exercise? 🫁🫀🔁🦵 Only 10-sec! That’s way faster than I intuitively would have expected But we’re just reproducing what’s been known for the last century👇 #science #medicine #rstats #datavis
A figure showing near-infrared spectroscopy (NIRS) tracing over the vastus lateralis quadriceps muscle during a cycling VO2max interval, with indocyanine green (ICG) dye tracer injected into the median cubital vein at time 0:00. As the dye appears with blood flow in the VL under the probe, the optical signal rapidly reaches a peak at ~10-seconds after injection. The concentration briefly decays as the dye tracer flows out of the insonation site, then rises to a second and third peak at ~10-sec intervals, showing net transit time around the entire systemic circulation (from quadriceps, via venous blood back through lungs to heart, and out again via arterial circulation to the quadriceps). Figure title: “NIRS-ICG dye tracer monitored at vastus lateralis during cycling intervals. Systemic blood recirculation time ≈ 10 seconds”. Text label: “Dye concentration peaks under the NIRS probe every ~10-sec”. Caption: “Data: (manuscript in preparation) | Visuals: @jem_arnold”
3224
Jem Arnold @jemarnold.bsky.social · 26/05/2026
yup!
020
Jem Arnold @jemarnold.bsky.social · 26/05/2026
Thanks, hah nothing revolutionary. It was more like "do you think the lines will look like this?" <r goes brrr for a bit> "hey look, they do look like this!" 😄 bsky.app/profile/jema...
010
Jem Arnold @jemarnold.bsky.social · 26/05/2026
We were looking at raw scatterplots and speculated how the relationships would look plotted like this, for my colleagues' thesis
000
Jem Arnold @jemarnold.bsky.social · 26/05/2026
Participant 1RM strength would insignificantly influence SmO2 slope across workload relative to %1RM (top plot) and significantly influence intercept but not slope on abs kg load (bottom plot): Stronger people would have higher SmO2 at the same kg than less strong people. Revolutionary! 😄
m_rel <- lmer(smo2 ~ load * strength + (load | id), data = df)
m_abs <- lmer(smo2 ~ load * strength + (load | id), data = df_abs)
- all loads paired within participant
- smo2 continuous from Train.Red normalised individual physiological range
- load continuous abs (kg) or relative (%1RM) at prescribed workloads seq(0.2, 0.6, 0.2) and c(10, 15, 10) for each participant
- strength continuous 1RM in kg
110
Jem Arnold @jemarnold.bsky.social · 25/05/2026
From whiteboard hypothesis to predictive model supporting H1 in a ~15 min conversation. Very satisfying! #rstats
Picture of whiteboard and screen. Whiteboard shows hand-drawn hypothesised relationship between muscle oxygen saturation and resistance exercise load, for individuals with "high" and "low" strength. Load is plotted as absolute (kg) and relative to one-rep max (%). 

Screen shows resulting plots from modelling the same relationships with linear mixed effects models. Modelled plots mirror the hypothesised relationships on the whiteboard. A satisfying result!
370
Jem Arnold @jemarnold.bsky.social · 25/05/2026
For example, we can also use it to filter BxB data by either time- or breath-averaging, specifying ONE OF either `width` (sample/breath-averaging) or `span` (time-averaging
Screenshot of code demonstrating how to use `mnirs::filter_mnirs()` on metabolic data. Only one of EITHER `width` OR `span` should be specified for respective breath- or time-averaging:

mnirs::filter_mnirs(
    cpet_data,
    nirs_channels = VO2, ## not NIRS data 🤫
    time_channel = TIME,
    width = 5,           ## EITHER width alone is 5-breath averaging
    span = 5,            ## OR span alone is 5-sec time-averaging
    partial = FALSE,     ## exclude partial-length windows
    na.rm = TRUE         ## ignore `NA`s
)
020
Jem Arnold @jemarnold.bsky.social · 25/05/2026
This is how we can resample breath-by-breath metabolic data to 1 Hz using `mnirs::resample_mnirs()` The secret is {mnirs} works on many time series data, not just NIRS 🤫 #rstats #nirs #cpet
Screenshot of code and plot showing how to use mnirs::resample_mnirs() to resample breath-by-breath metabolic data to 1 Hz sample rate. Plot shows BxB data points overlaid on the same interpolated data, showing how the time gaps between samples are filled.

library(mnirs)
library(ggplot2)

## breath-by-breath metabolic data
cpet_data

## resample to 1 Hz and linearly interpolate
cpet_resampled <- resample_mnirs(
    cpet_data,
    time_channel = TIME,
    resample_rate = 1,
    method = "linear"
)
cpet_resampled

ggplot(cpet_data, aes(TIME, VO2)) +
    theme_mnirs() +
    scale_colour_mnirs() +
    geom_point(data = cpet_resampled, aes(colour = "1 Hz")) +
    geom_point(aes(colour = "BxB"))
120
Jem Arnold @jemarnold.bsky.social · 21/05/2026
Prompt: "please complete this task" should be understood to literally mean something more like: "pretend as if you're intelligent to complete this task"
020
Jem Arnold @jemarnold.bsky.social · 19/05/2026
Wow, implementing now. Thanks!
010
Reposted by Jem Arnold
Philip Skotzke @philipskotzke.bsky.social · 19/05/2026
Dear stats people, I'm looking for textbooks or other resources on test design and analysis to establish validity & reliability. Any recommendations & repost appreciated. PS: we have to respond to a reviewer and I want to make sure we're doing the right thing. #rstats #stats #science #AcademicSky
221
Jem Arnold @jemarnold.bsky.social · 18/05/2026
Yeah I don't understand that either. But I didn't look into it very closely
000
Jem Arnold @jemarnold.bsky.social · 16/05/2026
And now I think I need to be accounting for nesting, expecting biological variation, rather than strict repeated measures. Which would reduce the limits of agreement further 🤔. I will have to clarify which is more appropriate Smooth level has greater effect on nested than RM data.
010
Jem Arnold @jemarnold.bsky.social · 16/05/2026
. @fredrikmentzoni.bsky.social here is that sensitivity analysis on smoothing levels for BxB Tymewear vs Parvo respiration rate Methods are un-smoothed; moving-avg by breath; moving-avg by time, and binned by time (reduce to single mean sample per bin)
230
Reposted by Jem Arnold
Cyclingnews @cyclingnews.com · 15/05/2026
'A tough period of racing while searching for answers' –Iliac artery surgery ahead for Neve Bradbury www.cyclingnews.com/pro-cycling/...
061
Jem Arnold @jemarnold.bsky.social · 13/05/2026
Woops! Found a substantial memory allocation issue in my code while trying to process a couple 300k+ row data frames. Think I've got it sorted now. Probably need to push a hotfix for this to CRAN 😬
010
Jem Arnold @jemarnold.bsky.social · 12/05/2026
That's funny. I chose backtick ` for the same reason, before I learned to code. Now I get occasional false positives
000
Jem Arnold @jemarnold.bsky.social · 09/05/2026
speaking of test-retest differences, we compared a few common metrics to give coaches & athletes reference values to use when comparing data day-to-day If we know our uncertainty, we can be *more* confident where we prescribe training targets www.frontiersin.org/journals/spo...
Screenshot of figure for representative trial with cycling workload showing incremental 5-min stages, with muscle oxygen saturation (SmO₂), heart rate (HR), volume of oxygen uptake (V̇O₂), blood lactate ([BLa]), and rating of perceived exertion (RPE) responses as a function of progressive graded intensity accross workloads from 100  to over 300 Watts. RPE, HR, and VO2 mostly respond linearly. BLa rises pseudo-exponentially. SmO2 falls curvilinearly.
010
Jem Arnold @jemarnold.bsky.social · 09/05/2026
Always important to consider how relevant & valid are physiological tests to predict real-world training targets / performance outcome If we want to maximise FatOx in a training session, we can do so in a wide intensity range. FatMax isn't magic 🧙‍♂️ pubmed.ncbi.nlm.nih.gov/24022578/
Screenshot of Abstract:

The intensity that elicits maximal fat oxidation (Fat max ) is recommended for training fat metabolism. However, it remains unclear whether Fat max leads to the highest fat oxidation rates during prolonged exercise. It was hypothesized that there are no differences in fat oxidation rates among 3 different exercise intensities. Therefore, fat metabolism was compared among 1-h constant load tests at Fat max , a higher and a lower intensity. A cohort of 16 male cyclists (28 ± 6 yrs, BMI: 22.5 ± 1.2 kg/m 2 ; n = 8 with maximal oxygen uptake [VO 2max ] of 50–60 ml/min/kg [ET]; n = 8 with VO 2max > 60 ml/min/kg [HET]) completed a maximal incremental cycling test, a submaximal incremental Fat max -test and, thereafter, three 1-h constant-load tests in randomized order at Fat max , one exercise stage below (LOW) and one above (HIGH). LOW, Fat max and HIGH were performed at 52 ± 13, 60 ± 13 and 70 ± 12 % VO 2max . Heart rate and blood lactate were significantly different (p < 0.001). However, the fat oxidation rate showed no difference (p = 0.61). This was also true within each subgroup (ET: p = 0.69, HET p = 0.61). In conclusion, the fat oxidation rate of endurance trained cyclists shows no difference between 1-h constant load exercise bouts at about 50–70 % VO 2max . The precision and necessity of Fat max -tests for controlling the training of fat oxidation are therefore debatable.
120
Jem Arnold @jemarnold.bsky.social · 09/05/2026
@EatsleepfitJeff's excellent modelling paper points to which factors (diet, intensity, fitness, age, etc) explain variability in RER & FatOx Up to 60% variance can be explained by these multiple factors. 30+% variance is attributable to individual diffs pubmed.ncbi.nlm.nih.gov/35829994/
Screenshot of figure: Nine scatterplots showing relationships between respiratory exchange ratio (RER) and nutritional, exercise, and physiological variables. RER shows negative associations with fat intake, fitness level, and type I muscle fibre percentage, and positive associations with carbohydrate intake, glycogen, exercise intensity, and pre-exercise carbohydrate intake. Polynomial or linear trend lines with 95% confidence intervals and reported R2 values are overlaid.

Figure description: Fig. 1 Relationships between respiratory exchange ratio (RER) and factors influencing RER. Best-fit regression lines based on univariable mixed effect models are shown, with fit indicated as R
2
. Best-fit lines using linear regression are shown in green, best-fit lines using polynomial regression are shown in red. Panel (g) is separated by the natural gap in the data of mean age > or <50 years. Shaded areas represent 95% confidence intervals. CHO carbohydrate, DM dry mass.
100
Jem Arnold @jemarnold.bsky.social · 09/05/2026
To add a bit more context, this excellent review summarises all the different operational decisions (methodological differences) that influence results when testing for FatMax under laboratory conditions pubmed.ncbi.nlm.nih.gov/30929281/
Screenshot of text:

5 | CONCLUSIONS

Based on the findings of this systematic review, we suggest that researches measuring MFO and Fatmax using graded exercise protocols by indirect calorimetry should consider some key methodological issues that can considerably affect the accuracy, validity, and reliability of the measurement: (a) ergometer type, (b) metabolic cart used, (c) warm-up protocol (duration and intensity), (d) graded exercise protocol (stage duration and intensities imposed), (e) time interval selected for data analysis, (f) stoichiometric equation selected to estimate fat oxidation, (g) data analysis approach, (h) time of the day when the test was performed, (i) acute nutritional status (fasting time and standard meal conditions established before the incremental graded exercise protocol), and (j) testing days for MFO/Fatmax and VO2max assessment. Likewise, when comparing different studies, it is important to check whether the above-mentioned key methodological issues are similar in such studies to avoid ambiguous and unacceptable comparisons. Further studies are needed to develop a detailed guidelines for MFO and Fatmax assessment using graded exercise protocols by indirect calorimetry.
100