Question. Barrier Behaviour Analysis (BaBA)
classifies animal–fence encounters into six behaviours (+ an unknown bucket).
How stable are those classifications when the GPS fix interval is coarsened, and
how does that interact with the buffer distance d? This is a sensitivity study
of the method — not a claim that it is flawed.
Data. The pronghorn / muleDeer / fences objects bundled with the BaBA
package (from Xu et al. 2021, J. Appl. Ecol.; CC0). Scope: 2 individuals per
species, one year, native 2 h fixes, UTM 12N. (The full Dryad archive is
gated; I use the package copy — see data/PROVENANCE.md.)
Method. Downsample 2 h → {4, 6, 12} h by elapsed-time target, running every
phase offset per interval (like multiple seeds), swept against d ∈ {50, 110, 200, 300} m, for two BaBA configs kept strictly separate: C (b_time=12,
one config across all intervals) and A (published defaults, only 2 h & 4 h are
even permitted). 120 runs, 23 607 encounters. Config A at d=110/2 h reproduces
the published baseline exactly.
1. BaBA can't run coarser than 4 h at its published settings. The rules
interval ≤ b_time, b_time %% interval == 0, p_time %% interval == 0 mean
that with defaults (b_time=4, p_time=36) and 2 h data, only 2 h and 4 h are
admissible. Have 6 h or 8 h collars? You must redefine the behavioural thresholds
before BaBA will run at all.
2. The downsampling phase moves results as much as the coarsening does. Which fixes you keep (not just how many) can swing a Bounce/Quick_Cross proportion by ~15 points at 12 h — so any single downsampled series can mislead. The band below collapses to a point at 2 h and fans out at 12 h:
3. Encounter detection degrades — but sublinearly. A 6× fix reduction (2 h→12 h)
loses only 3.9× (pronghorn) / 2.8× (mule deer) of encounters at d=110, and less
at larger d:
4. A pre-registered prediction — not supported. Before running the sweep I
recorded a prediction that unknown would rise faster
for mule deer than pronghorn under coarsening, if unknown reflects spurious
apparent crossings. It didn't: unknown is flat-to-falling with interval and
tracks buffer d, not interval. The prediction was on record before any results
existed, and I report it here rather than dropping it.
A correction to my own earlier claim. I first reported "Trapped = 0"; that
holds only at d ≤ 110 — Trapped emerges at larger buffers. I show the revision
rather than quietly fixing it. Full detail + limitations in writeup.qmd.
renv::restore() # exact package versions + BaBA commit, pinned in renv.lock
# then run in order:
source("R/02_data_inspection.R") # inspect + QA/QC
source("R/03_baseline.R") # reference run
source("R/05_sweep.R") # the interval × d × phase-offset sweep
source("R/06_aggregate.R") # tidy summaries -> outputs/*.csv
source("R/07_figures.R") # the two figuresThe full report is writeup.html (open directly) or writeup.qmd
(re-render with Quarto; Quarto is a standalone CLI, not an R
package, so it is not in renv.lock).
R/ 02 inspect/QA · 03 baseline · 04 downsample · 05 sweep · 06 aggregate · 07 figures
outputs/ baseline_classification.csv · sweep_*.csv · figures/*.png (raw .rds regenerable)
data/ PROVENANCE.md (source, license, scope)
analysis/ PREDICTIONS.md (pre-registered)
writeup.qmd full report (question · data · method · results · limitations)
renv.lock pinned environment
Limitations in brief: 2 individuals/species (no species-level claims); a bundled
subset, not the full study; config C is BaBA at b_time=12, not as published;
the data was pre-cleaned so QA/QC shows method, not discovery. See the writeup.
Built in R, developed with AI assistance (Claude Code). All analysis decisions, parameter choices, and interpretations are mine.

