Cape parrot vocal dialects

Author
Published

August 24, 2026

Code
# set working directory as project directory or one directory above,
knitr::opts_knit$set(root.dir = "..")

Source code and data found at https://github.com/maRce10/cape_parrot_dialects

 

1 Purpose

  • Measure acoustic structure of cape parrot contact calls

  • Compare acoustic dissimilarity between individuals from different localities and regions

 

Load packages

Code
# knitr is require for creating html/pdf/word reports formatR is
# used for soft-wrapping code

# install/ load packages
sketchy::load_packages(packages = c("knitr", "formatR", "viridis",
    "warbleR", github = "maRce10/PhenotypeSpace", "ggplot2", "randomForest",
    "mlbench", "caret", "pbapply", "vegan", "umap", "brms", "brmsish",
    "maRce10/ohun"))
Warning: replacing previous import 'brms::rstudent_t' by 'ggdist::rstudent_t'
when loading 'brmsish'
Warning: replacing previous import 'brms::dstudent_t' by 'ggdist::dstudent_t'
when loading 'brmsish'
Warning: replacing previous import 'brms::qstudent_t' by 'ggdist::qstudent_t'
when loading 'brmsish'
Warning: replacing previous import 'brms::pstudent_t' by 'ggdist::pstudent_t'
when loading 'brmsish'

2 Acoustic analysis

Code
## Format data dat <-
## read.csv('./data/raw/consolidated_sound_files_CPV_contact_calls_USEaug2026
## - UPDATED_USE for analyses.csv')
## names(dat)[grep('Regions..4.', names(dat))] <- 'Regions4'
## nrow(dat)

# all(dat$New_Name %in% st$sound.files) table(dat$Sorted)

# dat <- dat[dat$Sorted != 'delete', ] unique(dat$New_Name)
# ohun::feature_acoustic_data(path =
# './data/raw/consolidated_files') warbleR_options(path =
# './data/raw/consolidated_files') st
# <-selection_table(whole.recs = TRUE) st <- st[st$sound.files
# %in% dat$New_Name, ] nrow(st) nrow(dat) st$sorted <-
# sapply(st$sound.files, function(x) dat$Sorted[dat$New_Name ==
# x][1]) table(st$sorted)

# spectrograms(st, wl = 512, flim = c(0, 10), dest.path =
# './data/processed/spectrograms', pal = viridis, collevels =
# seq(-100, 0, 5)) spectrograms(st[st$sorted == 'unsorted', ],
# wl = 512, flim = c(0, 10), dest.path =
# './data/processed/unsorted_spectrograms', pal = viridis,
# collevels = seq(-100, 0, 5)) tailor_sels(st, auto.next = TRUE,
# flim = c(0, 8), collevels = seq(-100, 0, 5))

2.1 Make selection table

Code
sel_tab <- selection_table(path = "./data/raw/consolidated_files/",
    whole.recs = TRUE)

tailored <- read.csv("./data/raw/consolidated_files/seltailor_output.csv")

tailored <- tailored[tailored$tailored == "y", ]


non_tailored <- sel_tab[!sel_tab$sound.files %in% tailored$sound.files,
    ]
non_tailored$tailored <- "n"


tailored$top.freq[is.na(tailored$bottom.freq)] <- non_tailored$bottom.freq <- min(tailored$bottom.freq,
    na.rm = TRUE)
tailored$top.freq[is.na(tailored$top.freq)] <- non_tailored$top.freq <- max(tailored$top.freq,
    na.rm = TRUE)

comm_names <- intersect(names(tailored), names(non_tailored))

all_sels <- rbind(tailored[, comm_names], non_tailored[, comm_names])

write.csv(all_sels, "./data/processed/selection_table_entire_sound_files.csv",
    row.names = FALSE)

2.2 Run cross-correlation

Code
sel_tab <- read.csv("./data/processed/selection_table_entire_sound_files.csv")

xcorr <- cross_correlation(X = sel_tab, path = "./data/raw/consolidated_files/",
    method = 2, parallel = 1)

rownames(xcorr) <- gsub("-1$", "", rownames(xcorr))

colnames(xcorr) <- gsub("-1$", "", colnames(xcorr))

saveRDS(xcorr, "./data/processed/cross_correlation_matrix.RDS")

# less than 0.1% were undefined
sum(is.infinite(xcorr))/length(xcorr)

# convert infinite to mean xcorr
xcorr[is.infinite(xcorr)] <- mean(xcorr[!is.infinite(xcorr) & xcorr <
    1])

xcorr_mds <- cmdscale(d = as.dist(xcorr), k = 2)

rownames(xcorr_mds) <- gsub("-1$", "", rownames(xcorr_mds))

saveRDS(xcorr_mds, "./data/processed/cross_correlation_MDS.RDS")

3 Data description

Code
# add data from second location
dat <- read.csv("./data/raw/consolidated_sound_files_CPV_contact_calls_USEaug2026 - UPDATED_USE for analyses.csv")


names(dat)[grep("Regions..4.", names(dat))] <- "Regions4"

names(dat) <- gsub("..cluster.", ".for.cluster", names(dat))

dat <- dat[!is.na(dat$Location.for.cluster) & !is.na(dat$Longitude.for.cluster) &
    !is.na(dat$Latitude.for.cluster), ]
  • 6287 calls
  • 14 localities
  • 4 regions
  • Number of localities per region:
Code
agg <- aggregate(Location.for.cluster ~ Regions4, dat, function(x) length(unique(x)))

names(agg) <- c("region", "localities")

agg$calls <- aggregate(Location.for.cluster ~ Regions4, dat, length)[,
    2]

agg$localities <- aggregate(Location.for.cluster ~ Regions4, dat,
    function(x) paste(unique(x), collapse = "-"))[, 2]

agg
region localities calls
central subA Jetty River Lodge-Ntafufu Ecolodge 687
central subB Polela Sawmill-iGxalingenwa Nature Reserve-Marutswa Forest-Salt Spring Farm-Hoha Forest 1082
northern Amorentia 717
southern Hogsback-Schwarzwald Forest-Alice Pecan Orchard-Stutterheim-King William’s Town-Baddaford Farm 3801
  • Region of each locality:
Code
agg <- aggregate(Regions4 ~ Location.for.cluster, dat, function(x) paste(unique(x),
    collapse = "-"))

names(agg) <- c("localities", "region")

agg[order(agg$region), 2:1]
region localities
7 central subA Jetty River Lodge
10 central subA Ntafufu Ecolodge
5 central subB Hoha Forest
6 central subB iGxalingenwa Nature Reserve
9 central subB Marutswa Forest
11 central subB Polela Sawmill
12 central subB Salt Spring Farm
2 northern Amorentia
1 southern Alice Pecan Orchard
3 southern Baddaford Farm
4 southern Hogsback
8 southern King William’s Town
13 southern Schwarzwald Forest
14 southern Stutterheim

4 Statistical analysis

To evaluate whether Cape Parrot contact call structure is better explained by region or by locality, we fitted three competing Bayesian mixed-effects models on pairwise acoustic dissimilarities between recordings, accounting for the non-independence inherent to pairwise distance data.

Model specifications

Three competing models were specified, each sharing the same multi-membership random-effect structure but differing in which fixed effect(s) they include, to test via leave-one-out cross-validation (LOO) whether region, locality, or both best explain acoustic dissimilarity between recordings:

\[ \text{mod\_region}: \quad \text{acoustic dissimilarity}_{ij} \sim \text{same region}_{ij} + (1 \mid \text{mm(recording}_i, \text{recording}_j)) \]

\[ \text{mod\_locality}: \quad \text{acoustic dissimilarity}_{ij} \sim \text{same locality}_{ij} + (1 \mid \text{mm(recording}_i, \text{recording}_j)) \]

\[ \text{mod\_both}: \quad \text{acoustic dissimilarity}_{ij} \sim \text{same region}_{ij} + \text{same locality}_{ij} + (1 \mid \text{mm(recording}_i, \text{recording}_j)) \]

where:

  • \(\text{acoustic dissimilarity}_{ij}\) is the mean pairwise cross-correlation-based dissimilarity (\(1 - r\)) between all calls of recording \(i\) and all calls of recording \(j\).

  • \(\text{same region}_{ij}\) is a binary predictor indicating whether recordings \(i\) and \(j\) come from the same region (1) or different regions (0).

  • \(\text{same locality}_{ij}\) is a binary predictor indicating whether recordings \(i\) and \(j\) come from the same locality (1) or different localities (0).

  • mm(recording\(_i\), recording\(_j\)) is a multi-membership random intercept accounting for the repeated use of the same recordings across pairwise comparisons.

  • The response variable was mean pairwise acoustic dissimilarity (1 - cross-correlation) between recordings, rescaled to the open (0, 1) interval and modeled with a Beta error distribution.

  • The unit of analysis is the recording pair, not the individual call pair: region and locality are properties of the recording, and acoustic dissimilarity was averaged across all call pairs belonging to each pair of recordings.

  • Recording identity was modeled as a multi-membership random intercept, (1 | mm(rec1, rec2)), because each recording contributes to multiple pairwise comparisons and its pairs are not independent.

  • Three fixed-effect specifications, sharing the same multi-membership structure, were compared via leave-one-out cross-validation (LOO) to test whether region, locality, or both best explain acoustic dissimilarity:

    • mod_region: same region only.
    • mod_locality: same locality only.
    • mod_both: same region and same locality together.
  • same_region and same_locality are binary predictors (same vs. different); a negative coefficient indicates that pairs from the same region/locality are acoustically more similar than pairs from different ones.

  • Locality is nested within region, so same_locality implies same_region; in mod_both, the region effect is expected to shrink if locality is doing most of the explanatory work.

  • Mildly regularizing priors were used for all fixed effects and the intercept: Normal(0, 1) and Normal(0, 2), respectively.

  • Models were fitted using Hamiltonian Monte Carlo as implemented in Stan through the cmdstanr backend, with within-chain thread parallelization, 4 chains, 4 cores, and 4,000 iterations per chain.

Code
xcorr <- readRDS("./data/processed/cross_correlation_matrix.RDS")

dat$recording <- substr(dat$Old_Name, 0, 4)

## ---------------------------------------------------------------
## Region vs. locality as predictors of acoustic (dis)similarity
## brms multi-membership model, recording as the mm() grouping
## factor every pairwise combination of the 116 recordings,
## filled with mean acoustic distance across their calls
## ---------------------------------------------------------------
## 2. similarity -> dissimilarity (full matrix, keep symmetric,
## no NAs)
## -----------------------------------------------------------------------

dissim <- 1 - xcorr

## -----------------------------------------------------------------------
## 3. all pairwise combinations of the 116 recordings, filled
## with the mean call-level dissimilarity between the two
## recordings
## -----------------------------------------------------------------------

rec_ids <- dat$recording  # recording id per call, same order as dissim


recordings <- sort(unique(rec_ids))  # 116 unique recordings
n_rec <- length(recordings)


pairs_idx <- t(combn(n_rec, 2))  # 6670 combinations, 116 choose 2

dist_dat <- data.frame(recording.1 = recordings[pairs_idx[, 1]], recording.2 = recordings[pairs_idx[,
    2]], stringsAsFactors = FALSE)



dist_dat$mean_dissim <- sapply(seq_len(nrow(pairs_idx)), function(p) {
    f1 <- dat$New_Name[dat$recording == dist_dat$recording.1[p]]
    f2 <- dat$New_Name[dat$recording == dist_dat$recording.2[p]]

    dists <- as.vector(dissim[rownames(dissim) %in% f1, colnames(dissim) %in%
        f2])

    dists <- dists[!is.infinite(dists)]

    mean(dists, na.rm = TRUE)
})

## -----------------------------------------------------------------------
## 4. attach one locality / region per recording (assumes a
## recording was made at a single site - check this holds in
## your data)
## -----------------------------------------------------------------------

dist_dat$locality.1 <- sapply(dist_dat$recording.1, function(x) unique(dat$Location.for.cluster[dat$recording ==
    x])[1])

dist_dat$locality.2 <- sapply(dist_dat$recording.2, function(x) unique(dat$Location.for.cluster[dat$recording ==
    x])[1])

dist_dat$region.1 <- sapply(dist_dat$recording.1, function(x) unique(dat$Regions4[dat$recording ==
    x])[1])

dist_dat$region.2 <- sapply(dist_dat$recording.2, function(x) unique(dat$Regions4[dat$recording ==
    x])[1])



dist_dat$same_locality <- factor(ifelse(dist_dat$locality.1 == dist_dat$locality.2,
    "same", "different"), levels = c("different", "same"))

dist_dat$same_region <- factor(ifelse(dist_dat$region.1 == dist_dat$region.2,
    "same", "different"), levels = c("different", "same"))

names(dist_dat)[names(dist_dat) %in% c("recording.1", "recording.2")] <- c("rec1",
    "rec2")
# dist_dat$rec1 <- factor(dist_dat$rec1) dist_dat$rec2 <-
# factor(dist_dat$rec2)

## -----------------------------------------------------------------------
## 5. dissimilarity to open (0,1) interval for beta family
## -----------------------------------------------------------------------

rescale01 <- function(x, eps = 1e-04) (x * (1 - 2 * eps)) + eps
dist_dat$dissim_beta <- rescale01(dist_dat$mean_dissim)

## -----------------------------------------------------------------------
## 6. priors
## -----------------------------------------------------------------------

priors <- c(prior(normal(0, 1), class = "b"), prior(normal(0, 2),
    class = "Intercept"))

## -----------------------------------------------------------------------
## 7. competing models: locality vs region, same mm() structure
## -----------------------------------------------------------------------

mod_region <- brm(bf(dissim_beta ~ same_region + (1 | mm(rec1, rec2))),
    data = dist_dat, family = Beta(), prior = priors, chains = 4,
    cores = 4, iter = 4000, warmup = 1000, backend = "cmdstanr", threads = threading(8),
    control = list(adapt_delta = 0.95), seed = 123, file = "./data/processed/brms_model_region")

mod_locality <- brm(bf(dissim_beta ~ same_locality + (1 | mm(rec1,
    rec2))), data = dist_dat, family = Beta(), prior = priors, backend = "cmdstanr",
    threads = threading(8), chains = 4, cores = 4, iter = 4000, warmup = 1000,
    control = list(adapt_delta = 0.95), seed = 123, file = "./data/processed/brms_model_locality")

# full model with both terms - check for
# collinearity/confounding between region and locality before
# trusting this one

mod_both <- brm(bf(dissim_beta ~ same_region + same_locality + (1 |
    mm(rec1, rec2))), data = dist_dat, family = Beta(), prior = priors,
    backend = "cmdstanr", threads = threading(8), chains = 4, cores = 4,
    iter = 4000, warmup = 1000, control = list(adapt_delta = 0.95),
    seed = 123, file = "./data/processed/brms_model_both")


## -----------------------------------------------------------------------
## 8. model comparison
## -----------------------------------------------------------------------

mod_region <- add_criterion(mod_region, "loo")
mod_locality <- add_criterion(mod_locality, "loo")
mod_both <- add_criterion(mod_both, "loo")

The following table ranks models by out-of-sample predictive fit (elpd_loo), with the top model set to elpd_diff = 0 and all others shown as the gap below it, plus a standard error (se_diff) for that gap. mod_both’s difference from mod_region (-0.32, SE 1.35) is well within noise, so locality adds nothing once region is included. mod_locality’s difference (-51.50, SE 12.28) is over 4 SEs from zero — a real, not chance, gap — so region alone predicts acoustic dissimilarity substantially better than locality alone. p_loo (effective parameters, ~118 across models, driven by the recording-level multi-membership term) is comparable throughout, so the fit differences reflect predictive power, not overfitting. mod_region is the best-supported model.

Code
mod_region <- readRDS("./data/processed/brms_model_region.rds")
mod_locality <- readRDS("./data/processed/brms_model_locality.rds")
mod_both <- readRDS("./data/processed/brms_model_both.rds")


loo_comp <- loo_compare(mod_region, mod_locality, mod_both)

kable(as.data.frame(loo_comp), digits = 2)
elpd_diff se_diff elpd_loo se_elpd_loo p_loo se_p_loo looic se_looic
mod_region 0.00 0.00 11107.32 92.08 117.75 3.51 -22214.65 184.16
mod_both -0.32 1.35 11107.01 91.98 118.83 3.52 -22214.01 183.95
mod_locality -51.50 12.28 11055.82 92.22 118.18 3.53 -22111.65 184.44
Code
extended_summary(mod_both, highlight = TRUE)

4.1 mod_both

priors formula iterations chains thinning warmup diverg_transitions rhats > 1.05 min_bulk_ESS min_tail_ESS seed
1 b-normal(0, 1) Intercept-normal(0, 2) phi-gamma(0.01, 0.01) sd-student_t(3, 0, 2.5) dissim_beta ~ same_region + same_locality + (1 | mm(rec1, rec2)) 4000 4 1 1000 0 (0%) 0 215.76 463.087 123
Estimate l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
b_Intercept 0.262 0.193 0.331 1.041 215.760 463.087
b_same_regionsame -0.104 -0.123 -0.085 1 5266.276 7306.824
b_same_localitysame -0.008 -0.022 0.007 1 10168.787 8880.007

Code
# effect on the response scale
conditional_effects(mod_region, effects = "same_region")

Code
conditional_effects(mod_locality, effects = "same_locality")

Takeaways

  • Region is doing essentially all the work. mod_region has the best expected out-of-sample fit; mod_locality is dramatically worse (Δelpd = -51.5, SE = 12.3 — a difference roughly 4 SEs from zero, so not noise).

  • Locality alone is a poor predictor of acoustic dissimilarity compared to region — the “same locality vs. different” split by itself doesn’t capture much of the structure in the data.

  • Adding locality on top of region doesn’t help. mod_both (region + locality) is statistically indistinguishable from mod_region alone (Δelpd = -0.3, SE = 1.3 — well within noise). Locality contributes no additional explanatory power once region is already in the model.

  • Practical conclusion: region is the better (and sufficient) grouping variable for acoustic dissimilarity in this dataset; locality’s effect, to the extent it exists, appears to be entirely absorbed by region rather than adding anything on top. mod_region is the model to report/interpret going forward.


─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.5.2 (2025-10-31)
 os       Ubuntu 22.04.4 LTS
 system   x86_64, linux-gnu
 ui       X11
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       America/Costa_Rica
 date     2026-08-24
 pandoc   3.6.3 @ /usr/lib/rstudio/resources/app/bin/quarto/bin/tools/x86_64/ (via rmarkdown)
 quarto   1.8.25 @ /usr/lib/rstudio/resources/app/bin/quarto/bin/quarto

─ Packages ───────────────────────────────────────────────────────────────────
 package          * version    date (UTC) lib source
 abind              1.4-8      2024-09-12 [1] CRAN (R 4.5.2)
 ape                5.8-1      2024-12-16 [1] CRAN (R 4.5.2)
 arrayhelpers       1.1-0      2020-02-04 [1] CRAN (R 4.5.2)
 askpass            1.2.1      2024-10-04 [1] CRAN (R 4.5.2)
 backports          1.5.1      2026-04-03 [1] CRAN (R 4.5.2)
 bayesplot          1.15.0     2025-12-12 [1] CRAN (R 4.5.2)
 bitops             1.0-9      2024-10-03 [1] CRAN (R 4.5.2)
 boot               1.3-32     2025-08-29 [1] CRAN (R 4.5.2)
 bridgesampling     1.2-1      2025-11-19 [1] CRAN (R 4.5.2)
 brio               1.1.5      2024-04-24 [1] CRAN (R 4.5.2)
 brms             * 2.23.0     2025-09-09 [1] CRAN (R 4.5.2)
 brmsish          * 1.0.0      2026-03-03 [1] Github (maRce10/brmsish@81ab826)
 Brobdingnag        1.2-9      2022-10-19 [1] CRAN (R 4.5.2)
 cachem             1.1.0      2024-05-16 [1] CRAN (R 4.5.2)
 caret            * 7.0-1      2024-12-10 [1] CRAN (R 4.5.2)
 checkmate          2.3.4      2026-02-03 [1] CRAN (R 4.5.2)
 class              7.3-23     2025-01-01 [1] CRAN (R 4.5.2)
 classInt           0.4-11     2025-01-08 [1] CRAN (R 4.5.2)
 cli                3.6.6      2026-04-09 [1] CRAN (R 4.5.2)
 cluster            2.1.8.2    2026-02-05 [1] CRAN (R 4.5.2)
 cmdstanr           0.9.0      2025-03-30 [1] https://stan-dev.r-universe.dev (R 4.5.2)
 coda               0.19-4.1   2024-01-31 [1] CRAN (R 4.5.2)
 codetools          0.2-20     2024-03-31 [1] CRAN (R 4.5.2)
 cowplot            1.2.0      2025-07-07 [1] CRAN (R 4.5.2)
 crayon             1.5.3      2024-06-20 [1] CRAN (R 4.5.2)
 curl               7.1.0      2026-04-22 [1] CRAN (R 4.5.2)
 data.table         1.18.2.1   2026-01-27 [1] CRAN (R 4.5.2)
 DBI                1.3.0      2026-02-25 [1] CRAN (R 4.5.2)
 deldir             2.0-4      2024-02-28 [1] CRAN (R 4.5.2)
 devtools           2.4.6      2025-10-03 [1] CRAN (R 4.5.2)
 digest             0.6.39     2025-11-19 [1] CRAN (R 4.5.2)
 distributional     0.6.0      2026-01-14 [1] CRAN (R 4.5.2)
 dplyr              1.2.1      2026-04-03 [1] CRAN (R 4.5.2)
 dtw                1.23-3     2026-06-09 [1] CRAN (R 4.5.2)
 e1071              1.7-17     2025-12-18 [1] CRAN (R 4.5.2)
 ellipsis           0.3.2      2021-04-29 [3] CRAN (R 4.1.1)
 energy             1.7-12     2024-08-24 [1] CRAN (R 4.5.2)
 evaluate           1.0.5      2025-08-27 [1] CRAN (R 4.5.2)
 farver             2.1.2      2024-05-13 [1] CRAN (R 4.5.2)
 fastmap            1.2.0      2024-05-15 [1] CRAN (R 4.5.2)
 fftw               1.0-9      2024-09-20 [1] CRAN (R 4.5.2)
 foreach            1.5.2      2022-02-02 [3] CRAN (R 4.1.2)
 formatR          * 1.14       2023-01-17 [1] CRAN (R 4.5.2)
 fs                 2.1.0      2026-04-18 [1] CRAN (R 4.5.2)
 future             1.70.0     2026-03-14 [1] CRAN (R 4.5.2)
 future.apply       1.20.2     2026-02-20 [1] CRAN (R 4.5.2)
 generics           0.1.4      2025-05-09 [1] CRAN (R 4.5.2)
 ggdist             3.3.3      2025-04-23 [1] CRAN (R 4.5.2)
 ggplot2          * 4.0.3      2026-04-22 [1] CRAN (R 4.5.2)
 globals            0.19.1     2026-03-13 [1] CRAN (R 4.5.2)
 glue               1.8.1      2026-04-17 [1] CRAN (R 4.5.2)
 goftest            1.2-3      2021-10-07 [3] CRAN (R 4.1.1)
 gower              1.0.2      2024-12-17 [1] CRAN (R 4.5.2)
 gridExtra          2.3.1      2026-06-25 [1] CRAN (R 4.5.2)
 gsl                2.1-9      2025-11-10 [1] CRAN (R 4.5.2)
 gtable             0.3.6      2024-10-25 [1] CRAN (R 4.5.2)
 hardhat            1.4.2      2025-08-20 [1] CRAN (R 4.5.2)
 htmltools          0.5.9      2025-12-04 [1] CRAN (R 4.5.2)
 htmlwidgets        1.6.4      2023-12-06 [1] CRAN (R 4.5.2)
 httr               1.4.8      2026-02-13 [1] CRAN (R 4.5.2)
 igraph             2.3.3      2026-06-26 [1] CRAN (R 4.5.2)
 inline             0.3.21     2025-01-09 [1] CRAN (R 4.5.2)
 ipred              0.9-15     2024-07-18 [1] CRAN (R 4.5.2)
 iterators          1.0.14     2022-02-05 [3] CRAN (R 4.1.2)
 jsonlite           2.0.0      2025-03-27 [1] CRAN (R 4.5.2)
 kableExtra         1.4.0      2024-01-24 [1] CRAN (R 4.5.2)
 KernSmooth         2.23-26    2025-01-01 [1] CRAN (R 4.5.2)
 knitr            * 1.51       2025-12-20 [1] CRAN (R 4.5.2)
 labeling           0.4.3      2023-08-29 [1] CRAN (R 4.5.2)
 lattice          * 0.22-9     2026-02-09 [1] CRAN (R 4.5.2)
 lava               1.9.0      2026-04-05 [1] CRAN (R 4.5.2)
 lifecycle          1.0.5      2026-01-08 [1] CRAN (R 4.5.2)
 listenv            0.10.1     2026-03-10 [1] CRAN (R 4.5.2)
 loo                2.9.0      2025-12-23 [1] CRAN (R 4.5.2)
 lubridate          1.9.5      2026-02-04 [1] CRAN (R 4.5.2)
 magrittr           2.0.5      2026-04-04 [1] CRAN (R 4.5.2)
 MASS               7.3-65     2025-02-28 [1] CRAN (R 4.5.2)
 Matrix             1.7-4      2025-08-28 [1] CRAN (R 4.5.2)
 matrixStats        1.5.0      2025-01-07 [1] CRAN (R 4.5.2)
 memoise            2.0.1      2021-11-26 [3] CRAN (R 4.1.2)
 mgcv               1.9-4      2025-11-07 [1] CRAN (R 4.5.2)
 mlbench          * 2.1-7      2026-02-18 [1] CRAN (R 4.5.2)
 ModelMetrics       1.2.2.2    2020-03-17 [3] CRAN (R 4.0.1)
 mvtnorm            1.3-3      2025-01-10 [1] CRAN (R 4.5.2)
 NatureSounds     * 1.0.5      2025-01-17 [1] CRAN (R 4.5.2)
 nicheROVER         1.1.2      2023-10-13 [1] CRAN (R 4.5.2)
 nlme               3.1-168    2025-03-31 [1] CRAN (R 4.5.2)
 nnet               7.3-20     2025-01-01 [1] CRAN (R 4.5.2)
 ohun             * 1.0.4      2025-10-22 [1] CRAN (R 4.5.2)
 openssl            2.4.2      2026-06-09 [1] CRAN (R 4.5.2)
 otel               0.2.0      2025-08-29 [1] CRAN (R 4.5.2)
 packrat            0.9.3      2025-06-16 [1] CRAN (R 4.5.2)
 parallelly         1.46.1     2026-01-08 [1] CRAN (R 4.5.2)
 pbapply          * 1.7-4      2025-07-20 [1] CRAN (R 4.5.2)
 permute          * 0.9-10     2026-02-06 [1] CRAN (R 4.5.2)
 PhenotypeSpace   * 0.1.1      2026-08-17 [1] CRAN (R 4.5.2)
 pillar             1.11.1     2025-09-17 [1] CRAN (R 4.5.2)
 pkgbuild           1.4.8      2025-05-26 [1] CRAN (R 4.5.2)
 pkgconfig          2.0.3      2019-09-22 [3] CRAN (R 4.0.1)
 pkgload            1.5.3      2026-06-15 [1] CRAN (R 4.5.2)
 plyr               1.8.9      2023-10-02 [1] CRAN (R 4.5.2)
 png                0.1-9      2026-03-15 [1] CRAN (R 4.5.2)
 polyclip           1.10-7     2024-07-23 [1] CRAN (R 4.5.2)
 posterior          1.6.1      2025-02-27 [1] CRAN (R 4.5.2)
 pROC               1.19.0.1   2025-07-31 [1] CRAN (R 4.5.2)
 processx           3.9.0      2026-04-22 [1] CRAN (R 4.5.2)
 prodlim            2026.03.11 2026-03-11 [1] CRAN (R 4.5.2)
 proxy              0.4-29     2025-12-29 [1] CRAN (R 4.5.2)
 ps                 1.9.3      2026-04-20 [1] CRAN (R 4.5.2)
 purrr              1.2.2      2026-04-10 [1] CRAN (R 4.5.2)
 QuickJSR           1.9.0      2026-01-25 [1] CRAN (R 4.5.2)
 R6                 2.6.1      2025-02-15 [1] CRAN (R 4.5.2)
 randomForest     * 4.7-1.2    2024-09-22 [1] CRAN (R 4.5.2)
 raster             3.6-32     2025-03-28 [1] CRAN (R 4.5.2)
 rbibutils          2.4.1      2026-01-21 [1] CRAN (R 4.5.2)
 RColorBrewer       1.1-3      2022-04-03 [1] CRAN (R 4.5.2)
 Rcpp             * 1.1.2      2026-07-05 [1] CRAN (R 4.5.2)
 RcppParallel       5.1.11-2   2026-03-05 [1] CRAN (R 4.5.2)
 RCurl              1.98-1.19  2026-06-03 [1] CRAN (R 4.5.2)
 Rdpack             2.6.6      2026-02-08 [1] CRAN (R 4.5.2)
 recipes            1.3.1      2025-05-21 [1] CRAN (R 4.5.2)
 remotes            2.5.0      2024-03-17 [1] CRAN (R 4.5.2)
 reshape2           1.4.5      2025-11-12 [1] CRAN (R 4.5.2)
 reticulate         1.45.0     2026-02-13 [1] CRAN (R 4.5.2)
 rjson              0.2.23     2024-09-16 [1] CRAN (R 4.5.2)
 rlang              1.3.0      2026-07-05 [1] CRAN (R 4.5.2)
 rmarkdown          2.31       2026-03-26 [1] CRAN (R 4.5.2)
 rpart              4.1.24     2025-01-07 [1] CRAN (R 4.5.2)
 RSpectra           0.16-2     2024-07-18 [1] CRAN (R 4.5.2)
 rstan              2.32.7     2025-03-10 [1] CRAN (R 4.5.2)
 rstantools         2.6.0      2026-01-10 [1] CRAN (R 4.5.2)
 rstudioapi         0.18.0     2026-01-16 [1] CRAN (R 4.5.2)
 S7                 0.2.2      2026-04-22 [1] CRAN (R 4.5.2)
 scales             1.4.0      2025-04-24 [1] CRAN (R 4.5.2)
 seewave          * 2.2.4      2025-08-19 [1] CRAN (R 4.5.2)
 sessioninfo        1.2.3      2025-02-05 [1] CRAN (R 4.5.2)
 sf                 1.1-2      2026-07-23 [1] CRAN (R 4.5.2)
 signal             1.8-1      2024-06-26 [1] CRAN (R 4.5.2)
 sketchy            1.0.7      2026-03-03 [1] CRANs (R 4.5.2)
 sp                 2.2-3      2026-07-19 [1] CRAN (R 4.5.2)
 spatstat.data      3.1-9      2025-10-18 [1] CRAN (R 4.5.2)
 spatstat.explore   3.8-2      2026-07-27 [1] CRAN (R 4.5.2)
 spatstat.geom      3.8-2      2026-07-24 [1] CRAN (R 4.5.2)
 spatstat.random    3.5-1      2026-07-27 [1] CRAN (R 4.5.2)
 spatstat.sparse    3.2-0      2026-05-21 [1] CRAN (R 4.5.2)
 spatstat.univar    3.2-0      2026-05-18 [1] CRAN (R 4.5.2)
 spatstat.utils     3.2-4      2026-07-16 [1] CRAN (R 4.5.2)
 StanHeaders        2.32.10    2024-07-15 [1] CRAN (R 4.5.2)
 stringi            1.8.7      2025-03-27 [1] CRAN (R 4.5.2)
 stringr            1.6.0      2025-11-04 [1] CRAN (R 4.5.2)
 survival           3.8-6      2026-01-16 [1] CRAN (R 4.5.2)
 svglite            2.2.2      2025-10-21 [1] CRAN (R 4.5.2)
 svUnit             1.0.8      2025-08-26 [1] CRAN (R 4.5.2)
 systemfonts        1.3.1      2025-10-01 [1] CRAN (R 4.5.2)
 T4transport        0.1.8      2026-01-11 [1] CRAN (R 4.5.2)
 tensor             1.5.1      2025-06-17 [1] CRAN (R 4.5.2)
 tensorA            0.36.2.1   2023-12-13 [1] CRAN (R 4.5.2)
 terra              1.9-11     2026-03-26 [1] CRAN (R 4.5.2)
 testthat           3.3.2      2026-01-11 [1] CRAN (R 4.5.2)
 textshaping        1.0.4      2025-10-10 [1] CRAN (R 4.5.2)
 tibble             3.3.1      2026-01-11 [1] CRAN (R 4.5.2)
 tidybayes          3.0.7      2024-09-15 [1] CRAN (R 4.5.2)
 tidyr              1.3.2      2025-12-19 [1] CRAN (R 4.5.2)
 tidyselect         1.2.1      2024-03-11 [1] CRAN (R 4.5.2)
 timechange         0.4.0      2026-01-29 [1] CRAN (R 4.5.2)
 timeDate           4052.112   2026-01-28 [1] CRAN (R 4.5.2)
 tuneR            * 1.4.7      2024-04-17 [1] CRAN (R 4.5.2)
 umap             * 0.2.10.0   2023-02-01 [1] CRAN (R 4.5.2)
 units              1.0-1      2026-03-11 [1] CRAN (R 4.5.2)
 usethis            3.2.1      2025-09-06 [1] CRAN (R 4.5.2)
 V8                 8.2.0      2026-04-21 [1] CRAN (R 4.5.2)
 vctrs              0.7.3      2026-04-11 [1] CRAN (R 4.5.2)
 vegan            * 2.7-5      2026-05-25 [1] CRAN (R 4.5.2)
 viridis          * 0.6.5      2024-01-29 [1] CRAN (R 4.5.2)
 viridisLite      * 0.4.3      2026-02-04 [1] CRAN (R 4.5.2)
 warbleR          * 1.1.37     2025-10-22 [1] CRAN (R 4.5.2)
 withr              3.0.3      2026-06-19 [1] CRAN (R 4.5.2)
 xaringanExtra      0.8.0      2024-05-19 [1] CRAN (R 4.5.2)
 xfun               0.60       2026-07-09 [1] CRAN (R 4.5.2)
 xml2               1.5.2      2026-01-17 [1] CRAN (R 4.5.2)
 yaml               2.3.12     2025-12-10 [1] CRAN (R 4.5.2)

 [1] /home/m/R/x86_64-pc-linux-gnu-library/4.5
 [2] /usr/local/lib/R/site-library
 [3] /usr/lib/R/site-library
 [4] /usr/lib/R/library
 * ── Packages attached to the search path.

──────────────────────────────────────────────────────────────────────────────