Jem Arnold

@jemarnold.bsky.social

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

#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? 🤔

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 😬

Bild

Quick update {mnirs} 🦵🔦 0.6.3 pushed to CRAN Main improvement with plotting lists of data frames as facets, primarily for extracted intervals Here is how you can extract intervals by time values from data processed with #mnirs, for subsequent analysis (kinetics analysis coming soon🤞) #rstats #nirs

A screenshot of code excerpt from {mnirs} README https://github.com/jemarnold/mnirs/ demonstrating how to extract intervals by known time values to a list of data frames, then easily plot those intervals. Figure shows two facets with two muscle oxygen saturation channels each during rapid recover after exercise intervals for reoxygenation kinetics. Code excerpt below:

extract_intervals(): detect events and extract intervals

## return each interval independently with `event_groups = "distinct"`
distinct <- extract_intervals(
    nirs_data,                  ## channels blank for "distinct" grouping
    start = by_time(348, 1064), ## manually identified interval start times
    end = by_time(458, 1174),   ## interval end time (start + 150 sec)
    event_groups = "distinct",  ## return a list of data frames for each (2) event
    span = c(0, 0),             ## no boundary modification
    zero_time = FALSE           ## return original time values
)

plot(distinct, time_labels = TRUE)

Anyone else still use autohotkey shortcuts for writing special symbols? Or do the chatbots do it these days?🤔 I just handed down my old script to my grad student colleagues Works system wide, not just in Word! ΔV̇O₂ ≈ 5 ± 2 (mL·kg⁻¹·min⁻¹) 13°C β₁ ≤ α ≠ 𝜏 (†) ¯\_(ツ)_/¯ #academicsky #rstats

Screenshot of .ahk shortcuts:
; symbol, description, and literal execute string in quotations

:*?:/=::{U+2260}       ; ≠ not equal to "/="
:*?:~=::{U+2248}       ; ≈ approx equal to "~="
:*C?:p=::{U+221D}      ; ∝ proportional to "p="
:o?:<=::{U+2264}       ; ≤ less than or equal to "<="
:o?:>=::{U+2265}       ; ≥ greater than or equal to ">="
:*?:+-::{U+00B1}       ; ± plus minus "+-"
:o?:*::{U+00B7}        ; · multiplication dot "*`"
:o?:%::{U+00F7}        ; ÷ division sign "%`"
:*?:$$::{U+20AC}       ; € euro "$$"
:o?:**::{U+00B0}       ; ° degree "**`"
:oC?:alpha::{U+03B1}   ; α alpha "alpha`"
:oC?:beta::{U+03B2}    ; β beta "beta`"
:oC?:D::{U+0394}       ; Δ delta "D`"
:oC:u::{U+03BC}        ; μ mu "u`"
:oC?:tau::{U+1D70F}    ; 𝜏 tau "tau`"
:*?::``::{U+2234}      ; ∴ therefore ":`"
:*C?:V`*::V{U+0307}    ; dot(V) "V*"
:*C?:Q`*::Q{U+0307}    ; dot(Q) "Q*"
:o?:1::{U+2082}        ; subscript[1] "1`"
:o?:2::{U+2082}        ; subscript[2] "2`"
:o?:-1::⁻¹             ; superscript[-1]

The data speak for themselves but their voices can be soft and sly, especially non-experimental data. That's why our methods have to be cleverer, to find slim signals amidst noisy dross.

Garmin sounds serious about #muscleoxygenation #mnirs. "Muscle Battery" gives me high hopes and cautious expectations 😄 What do you think?🤔 Very interested to see how they solve the hardware distribution problem, and how the model learns from repeated measurements

Garmin Leaks Trademarks - Two New Products highly Likely

Garmin has trademarked Muscle Battery, confirming SmO2 muscle oxygen hardware is coming, and CIRQA, its Whoop competitor. Full analysis of what the filings reveal about both products.

the5krunner.com

Just learned about a fun edge case when reading `hh:mm:ss` format from .xlsx, which Excel in its wisdom apparently stores as fractional numeric, resulting in a bit exaggerated sample rate estimates! Already tested and patched in dev. Should roll out with {mnirs} 0.6.2 by this weekend #rstats #nirs

screenshot of excel spreadsheet and the same spreadsheet read into R. `hh:mm:ss` column in excel shows timestamp values e.g.: "13:52:59", but these are actually fractional numeric values behind the scenes: "0.578". When read by `mnirs::read_mnirs()` this returns an info message declaring "Estimated `sample_rate` = 50000 Hz" which is a few orders of magnitude wrong. Next {mnirs} update will fix this issue!

Really nice #rstats Positron -> Quarto -> .docx workflow this afternoon: Assist from the chatbots to spell & grammar check, pre-format all my V̇O₂s & SmO₂s, and wrap all my {citations} for endnote. Then render to .docx and let Endnote instantly format the references. Worked once, flawlessly👌

Screenshot of manuscript title and subheadings: "mnirs: An R Package for Reading, Processing, and Analysing Muscle Near-Infrared Spectroscopy Data
Jem Arnold
2026-03-31"

Well, thanks for all the good advice #rstats community Because that was a far smoother first-time CRAN review process than you led me to expect 😄 6 days from submission to a nice short approval email. I'm as pleased with this as I was having my first academic paper published!

screenshot of email text reading "Thanks, on its way to CRAN"
Jem Arnold@jemarnold.bsky.social · 5mo ago

Dear #rstats mentors, what advice do you wish someone would have given you before submitting to CRAN for the first time? The obvious, and the less so

Positron Assistant keeps trying to throw code edits inappropriately at the top of my scripts, rather than at the intended lines. Very annoying. Any ideas why or fixes to try? 🤔 #rstats I have to reject and ask it to repeat the operation. Usually gets it right on the second attempt

Screenshot of .R script in Positron IDE with Positron assistant copilot edits suggested at the very top of the script, corrupting the true structure of the script, rather than at the right line location.

(Though I made exactly that same comment about cycling analytics back before any of the current big apps existed: they were diving into a single ride's data when the big potential was looking at trends, patterns, and deviations from pattern across rides).