Code
# set working directory as project directory or one directory above,
knitr::opts_knit$set(root.dir = "..")Cape parrot vocal dialects
# 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
Measure acoustic structure of cape parrot contact calls
Compare acoustic dissimilarity between individuals from different localities and regions
# 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'
## 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))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)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")# 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), ]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 |
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 |
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.
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.
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 |
extended_summary(mod_both, highlight = TRUE)| 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 |
# effect on the response scale
conditional_effects(mod_region, effects = "same_region")conditional_effects(mod_locality, effects = "same_locality")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.
──────────────────────────────────────────────────────────────────────────────