Acoustic adaptation in lekking hermit hummingbirds

Acoustic and statistical analysis

Author
Published

June 28, 2023

1 Purpose

  • Quantify song transmission for 3 hermit species in their own habitats

  • Compare transmission for the interaction between habitats and species

 

2 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", "baRulho",
    "viridis", "warbleR", "Rraven", "brms", "ggplot2", "corrplot",
    "emmeans", "ggsignif"))

3 Create master sound file

Code
sels <- readRDS("./data/raw/extended_selection_table_hummingbirds_swifts_nightjars.RDS")

sels$Species_uscr <- as.character(sels$Species_uscr)

sels <- sels[sels$Species_uscr %in% c("Threnetes_ruckeri", "Phaethornis_longirostris",
    "Phaethornis_striigularis"), ]


table(sels$Species_uscr)

table(sels$Species_uscr)

# individuals per species
table(sels$Species_uscr[!duplicated(attributes(sels)$check.results$orig.sound.files)])


# duplicate
sels_2 <- sels

catalog(sels, flim = c(1, 12), nrow = 10, ncol = 12, fast.spec = TRUE,
    lab.mar = 0.01, wl = 200, same.time.scale = TRUE, gr = FALSE,
    legend = 0, rm.axes = TRUE, box = FALSE, group.tag = "Species_uscr",
    tag.pal = list(magma), width = 20, height = 20, pal = viridis,
    collevels = seq(-100, 0, 5))


reps <- lapply(1:3, function(x) {

    sels_2 <- rename_est_waves(sels_2, new.sound.files = sels_2$sound.files,
        new.selec = x)


})

sels_dup <- reps[[1]]

for (i in 2:length(reps)) sels_dup <- rbind(sels_dup, reps[[i]])

sels_dup <- sels_dup[order(sels_dup$sound.files, sels_dup$song), ]


# randomized position
set.seed(123)
sels_dup <- sels_dup[sample(1:nrow(sels_dup)), ]

saveRDS(sels_dup, "./data/raw/extended_selection_table_randomized_duplicated.RDS")


msf_st <- master_sound_file(X = sels_dup, file.name = "hermit_degradation_master_sound_file.wav",
    dest.path = "./data/processed", gap.duration = 0.1)


write.csv(msf_st, file = "./data/processed/master_sound_files_annotations.csv",
    row.names = FALSE)

4 Time sync all replicates

Code
metadata <- read.csv("./data/raw/hermit_song_transmission_metadata.csv")

master.sf <- read.csv("./data/processed/master_sound_files_annotations.csv")

master.sf$sound.id <- paste(master.sf$orig.sound.file, seq_len(nrow(master.sf)),
    sep = "-")

found.starts <- search_templates(X = master.sf, template.rows = which(master.sf$orig.sound.file ==
    "start_marker"), path = "./data/raw/recordings", parallel = 20)

found.starts

alg.tests <- align_test_files(X = master.sf, Y = found.starts, path = "./data/raw/recordings",
    by.song = FALSE, output = "data.frame")

table(alg.tests$sound.files)

# remove 2 sound files with load singing real hummingbirds
alg.tests <- alg.tests[!alg.tests$sound.files %in% c("ces-t2-10m.WAV",
    "ces-t2-10m.WAV"), ]

exp_raven(alg.tests, path = "./data/raw", file.name = "align_rerecorded",
    sound.file.path = "./data/raw/recordings")

exp_raven(alg.tests, path = "./data/raw", file.name = "align_rerecorded",
    sound.file.path = "./data/raw/recordings")

alg.tests.est <- align_test_files(X = master.sf, Y = found.starts[!found.starts$test.files %in%
    c("ces-t2-10m.WAV", "ces-t2-10m.WAV"), ], path = "./data/raw/recordings",
    by.song = FALSE, output = "est")

# add metadata
alg.tests.est$trail <- substr(alg.tests.est$sound.files, start = 0,
    stop = 3)

alg.tests.est$transect <- substr(alg.tests.est$sound.files, start = 5,
    stop = 6)

alg.tests.est$distance <- substr(alg.tests.est$sound.files, start = 8,
    stop = 10)

alg.tests.est <- alg.tests.est[order(alg.tests.est$sound.files, alg.tests.est$sound.id,
    alg.tests.est$distance), ]

alg.tests.est <- alg.tests.est[grep("marker", alg.tests.est$sound.id,
    invert = TRUE), ]

alg.tests.est <- alg.tests.est[alg.tests.est$distance != 1, ]

saveRDS(alg.tests.est, "./data/raw/extended_selection_table_rerecorded_sounds.RDS")

5 Time sync 1 replicate

Code
metadata <- read.csv("./data/raw/hermit_song_transmission_metadata.csv")

master.sf <- read.csv("./data/processed/master_sound_files_annotations.csv")

# remove replicated
master.sf <- master.sf[!duplicated(master.sf$orig.sound.file), ]

master.sf$sound.id <- paste(master.sf$orig.sound.file, seq_len(nrow(master.sf)),
    sep = "-")

found.starts <- search_templates(X = master.sf, template.rows = which(master.sf$orig.sound.file ==
    "start_marker"), path = "./data/raw/recordings", parallel = 20)

alg.tests.est <- align_test_files(X = master.sf, Y = found.starts[!found.starts$test.files %in%
    c("ces-t2-10m.WAV", "ces-t2-10m.WAV"), ], path = "./data/raw/recordings",
    by.song = FALSE, output = "est", cores = 20)

# add metadata
alg.tests.est$trail <- substr(alg.tests.est$sound.files, start = 0,
    stop = 3)

alg.tests.est$transect <- substr(alg.tests.est$sound.files, start = 5,
    stop = 6)

alg.tests.est$distance <- substr(alg.tests.est$sound.files, start = 8,
    stop = 9)

alg.tests.est$distance <- ifelse(alg.tests.est$distance == "1m", 1,
    as.numeric(alg.tests.est$distance))

alg.tests.est <- alg.tests.est[order(alg.tests.est$sound.files, alg.tests.est$sound.id,
    alg.tests.est$distance), ]

saveRDS(alg.tests.est, "./data/processed/extended_selection_table_rerecorded_sounds_no_duplicates.RDS")

6 PLot catalog

Code
alg.tests.est <- readRDS("./data/raw/extended_selection_table_rerecorded_sounds.RDS")

catalog(alg.tests.est, flim = c(2, 12), nrow = 10, ncol = 12, fast.spec = TRUE,
    lab.mar = 0.01, wl = 200, same.time.scale = TRUE, gr = FALSE,
    legend = 0, rm.axes = TRUE, box = FALSE, group.tag = "sound.files",
    tag.pal = list(magma), width = 20, height = 20, pal = viridis,
    collevels = seq(-100, 0, 5))

7 Measure degradation

Code
alg.tests.est <- readRDS("./data/processed/extended_selection_table_rerecorded_sounds.RDS")

# run blur ratio
br <- blur_ratio(alg.tests.est, method = 1, cores = 20)

# run Spectrum blur ratio
sbr <- spectrum_blur_ratio(alg.tests.est, method = 1, img = FALSE,
    cores = 20)
source("~/Dropbox/R_package_testing/baRulho/R/excess_attenuation.R")
source("~/Dropbox/R_package_testing/baRulho/R/internal_functions.R")
# run envelope correlation
ea <- excess_attenuation(alg.tests.est, method = 1, cores = 20)

# run envelope correlation
ec <- envelope_correlation(alg.tests.est, method = 1, cores = 20)

# run spectrum correlation
sc <- spectrum_correlation(alg.tests.est, method = 1, cores = 20)

# run signal to noise ratio
sa <- signal_to_noise_ratio(alg.tests.est, cores = 20, mar = 0.05)

# run tail to signal ratio
tsr <- tail_to_signal_ratio(alg.tests.est, cores = 20, type = 1, mar = 0.05)

# run tail to noise ratio
tnr <- tail_to_signal_ratio(alg.tests.est, cores = 20, type = 2, mar = 0.05)

# run spcc
spd <- spcc(X = alg.tests.est, method = 1, wl = 512, cores = 20)


alg.tests <- as.data.frame(alg.tests.est)

alg.tests$blur.ratio <- br$blur.ratio
alg.tests$signal.to.noise.ratio <- sa$signal.to.noise.ratio
alg.tests$cross.correlation <- spd$cross.correlation
alg.tests$spectral.blur.ratio <- sbr$spectral.blur.ratio
alg.tests$excess.attenuation <- ea$excess.attenuation
alg.tests$envelope.correlation <- ec$envelope.correlation
alg.tests$spectrum.correlation <- sc$spectrum.correlation
alg.tests$tail.to.signal.ratio <- tsr$tail.to.signal.ratio
alg.tests$tail.to.noise.ratio <- tnr$tail.to.signal.ratio

alg.tests$habitat <- "LBH"
alg.tests$habitat[alg.tests$trail == "ces"] <- "STH"
alg.tests$habitat[alg.tests$trail == "dsa"] <- "BTB"

alg.tests$species <- "LBH"
alg.tests$species[grep("striigularis", alg.tests$sound.id)] <- "STH"
alg.tests$species[grep("ruckeri", alg.tests$sound.id)] <- "BTB"


alg.tests <- alg.tests[grep("marker", alg.tests$sound.files, invert = TRUE),
    ]

write.csv(alg.tests, "./data/processed/degradation_metrics.csv", row.names = FALSE)

8 Stats

8.1 PCA

Code
degrad_df <- read.csv("./data/processed/degradation_metrics.csv")

degrad_params <- c("blur.ratio", "spectral.blur.ratio", "envelope.correlation",
    "signal.to.noise.ratio", "cross.correlation", "tail.to.signal.ratio",
    "tail.to.noise.ratio", "spectrum.correlation")

comp.cases <- complete.cases(degrad_df[, names(degrad_df) %in% degrad_params])

pca <- prcomp(degrad_df[comp.cases, names(degrad_df) %in% degrad_params],
    scale. = TRUE)


# add to data
degrad_df$pc1 <- NA
degrad_df$pc1[comp.cases] <- pca$x[, 1]

degrad_df$transmission <- degrad_df$pc1 * -1

# plot rotation values by PC
pca_rot <- as.data.frame(pca$rotation[, 1:4])

pca_rot_stck <- stack(pca_rot)

pca_rot_stck$variable <- rownames(pca_rot)
pca_rot_stck$Sign <- ifelse(pca_rot_stck$values > 0, "Positive", "Negative")
pca_rot_stck$rotation <- abs(pca_rot_stck$values)

ggplot(pca_rot_stck, aes(x = variable, y = rotation, fill = Sign)) +
    geom_col() + coord_flip() + scale_fill_viridis_d(alpha = 0.7,
    begin = 0.3, end = 0.8) + facet_wrap(~ind)

8.2 Correlation among variables

Code
cormat <- cor(degrad_df[, degrad_params], use = "pairwise.complete.obs")

rownames(cormat) <- colnames(cormat) <- degrad_params

cols_corr <- colorRampPalette(c("white", "white", viridis(4, direction = -1)))(10)

cp <- corrplot.mixed(cormat, tl.cex = 0.7, upper.col = cols_corr,
    lower.col = cols_corr, order = "hclust", lower = "number", upper = "ellipse",
    tl.col = "black")

9 Sampling effort

Sample size: 20079

By species:

  • BTB: band-tailed barbthroat (Threnetes rukeri) (n = 8418)
  • LBH: long-billed hermit (Phaethornis longirostris) (n = 1794)
  • STH: stripe-throated hermit (Phaethornis striigularis) (n = 9867)
Code
aggregate(cbind(sound.id) ~ species + habitat, degrad_df, function(x) length(unique(x)))
species habitat sound.id
BTB BTB 366
LBH BTB 78
STH BTB 429
BTB LBH 366
LBH LBH 78
STH LBH 429
BTB STH 366
LBH STH 78
STH STH 429
Code
aggregate(cbind(sound.id) ~ species + habitat, degrad_df, function(x) length(x))
species habitat sound.id
BTB BTB 2928
LBH BTB 624
STH BTB 3432
BTB LBH 2928
LBH LBH 624
STH LBH 3432
BTB STH 2562
LBH STH 546
STH STH 3003

9.1 Modelling

Code
iter <- 5000
chains <- 4
priors <- c(prior(normal(0, 6), class = "b"))

set.seed(123)

mod_int <- brm(formula = transmission ~ species * habitat + mo(distance),
    data = degrad_df, prior = priors, iter = iter, chains = chains,
    cores = chains, control = list(adapt_delta = 0.99, max_treedepth = 15),
    file = "./data/processed/regression_model_int_all_data.RDS", file_refit = "always")

# fit_parallel <- update(mod_int, chains = 1, cores = 1, backend
# = 'cmdstanr', threads = threading(10), iter = 3000)

# mod <- brm( formula = pc1 | resp_rate(distance) ~
# habitat.structure + frequency + duration +
# frequency.modulation + amplitude.modulation + mo(distance) +
# (1 | location) + (1 | treatment.replicates), family =
# negbinomial(), data = degrad_df, prior = priors, iter = iter,
# chains = chains, cores = chains, control = list(adapt_delta =
# 0.99, max_treedepth = 15), file =
# './data/processed/regression_model.RDS', file_refit = 'always'
# )
Code
my.viridis <- function(...) viridis(alpha = 0.5, begin = 0.3, end = 0.7,
    ...)

source("~/Dropbox/R_package_testing/brmsish/R/extended_summary.R")
source("~/Dropbox/R_package_testing/brmsish/R/helpers.R")

extended_summary(read.file = "./data/processed/regression_model_int_all_data.RDS",
    n.posterior = 1000, fill = viridis(10)[7], trace.palette = my.viridis,
    highlight = TRUE)

9.2 regression_model_int_all_data

priors formula iterations chains thinning warmup diverg_transitions rhats > 1.05 min_bulk_ESS min_tail_ESS seed
1 b-normal(0, 6) Intercept-student_t(3, 0.2, 2.5) sigma-student_t(3, 0, 2.5) simo-dirichlet(1) transmission ~ species * habitat + mo(distance) 5000 4 1 2500 0 0 5011.217 5978.067 981083822
Estimate l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
b_Intercept 1.107 1.054 1.162 1 5489.482 6894.982
b_speciesLBH 0.569 0.447 0.693 1.001 5850.055 6405.334
b_speciesSTH 0.798 0.730 0.867 1 5011.217 6702.676
b_habitatLBH -0.383 -0.454 -0.310 1 5773.508 7233.454
b_habitatSTH -0.997 -1.075 -0.920 1 5273.261 6934.192
b_speciesLBH:habitatLBH -0.651 -0.820 -0.481 1 6212.354 5978.067
b_speciesSTH:habitatLBH -0.803 -0.905 -0.706 1 5458.127 6647.843
b_speciesLBH:habitatSTH -0.188 -0.372 -0.003 1 6401.765 7193.041
b_speciesSTH:habitatSTH -0.120 -0.225 -0.012 1 5213.807 6967.952

9.3 Contrasts

Code
mod <- readRDS("./data/processed/regression_model_int.RDS")


cntrs <- as.data.frame(emmeans(mod, pairwise ~ species * habitat)$contrasts)
names(cntrs)[3:4] <- c("l-95% CI", "u-95% CI")


coef_table <- html_format_coef_table(cntrs, highlight = TRUE, fill = viridis(10)[7])

print(coef_table)
contrast estimate l-95% CI u-95% CI
1 BTB BTB - LBH BTB -0.336 -0.549 -0.131
2 BTB BTB - STH BTB -0.533 -0.653 -0.402
3 BTB BTB - BTB LBH 0.512 0.377 0.637
4 BTB BTB - LBH LBH 0.788 0.570 0.994
5 BTB BTB - STH LBH 0.870 0.750 0.994
6 BTB BTB - BTB STH 1.168 1.033 1.303
7 BTB BTB - LBH STH 0.830 0.601 1.055
8 BTB BTB - STH STH 0.687 0.557 0.814
9 LBH BTB - STH BTB -0.197 -0.399 0.017
10 LBH BTB - BTB LBH 0.846 0.625 1.048
11 LBH BTB - LBH LBH 1.123 0.841 1.378
12 LBH BTB - STH LBH 1.206 0.993 1.410
13 LBH BTB - BTB STH 1.503 1.291 1.720
14 LBH BTB - LBH STH 1.166 0.892 1.452
15 LBH BTB - STH STH 1.022 0.809 1.232
16 STH BTB - BTB LBH 1.044 0.916 1.175
17 STH BTB - LBH LBH 1.320 1.109 1.527
18 STH BTB - STH LBH 1.403 1.284 1.529
19 STH BTB - BTB STH 1.703 1.572 1.834
20 STH BTB - LBH STH 1.364 1.141 1.593
21 STH BTB - STH STH 1.219 1.095 1.346
22 BTB LBH - LBH LBH 0.275 0.052 0.480
23 BTB LBH - STH LBH 0.357 0.235 0.485
24 BTB LBH - BTB STH 0.657 0.521 0.791
25 BTB LBH - LBH STH 0.319 0.090 0.545
26 BTB LBH - STH STH 0.175 0.047 0.305
27 LBH LBH - STH LBH 0.081 -0.126 0.298
28 LBH LBH - BTB STH 0.381 0.170 0.601
29 LBH LBH - LBH STH 0.041 -0.243 0.331
30 LBH LBH - STH STH -0.099 -0.314 0.112
31 STH LBH - BTB STH 0.300 0.167 0.426
32 STH LBH - LBH STH -0.038 -0.258 0.193
33 STH LBH - STH STH -0.182 -0.307 -0.059
34 BTB STH - LBH STH -0.339 -0.580 -0.110
35 BTB STH - STH STH -0.482 -0.609 -0.342
36 LBH STH - STH STH -0.144 -0.373 0.086
Code
ggplot(degrad_df, aes(y = transmission, x = habitat, fill = species)) +
    geom_boxplot(outlier.alpha = 0.2) + scale_fill_viridis_d(alpha = 0.4) +
    facet_wrap(~distance) + theme_classic(base_size = 25)

9.4 Only at 20 m

Code
cntrs$first <- sapply(strsplit(cntrs$contrast, " - "), "[[", 1)
cntrs$first.sp <- sapply(strsplit(cntrs$first, " "), "[[", 1)
cntrs$first.hab <- sapply(strsplit(cntrs$first, " "), "[[", 2)
cntrs$second <- sapply(strsplit(cntrs$contrast, " - "), "[[", 2)
cntrs$second.sp <- sapply(strsplit(cntrs$second, " "), "[[", 1)
cntrs$second.hab <- sapply(strsplit(cntrs$second, " "), "[[", 2)

cntrs$signif <- ifelse(cntrs$`l-95% CI` * cntrs$`u-95% CI` > 0, "*",
    "ns")

cntrs <- cntrs[order(cntrs$first.hab, cntrs$first.sp), ]

# base plot
gg <- ggplot(degrad_df[degrad_df$distance == 20, ], aes(y = transmission,
    x = habitat, fill = species)) + geom_boxplot(outlier.alpha = 0.2) +
    scale_fill_viridis_d(alpha = 0.4, end = 0.8) + theme_classic(base_size = 25) +
    labs(x = "Habitat", y = "Transmission") + theme(legend.position = c(0.94,
    0.73))

# add multiple comparison (contrasts) annotations
spp <- unique(cntrs$first.sp)
diff <- 0.25

# add contrasts between species within habitats
for (i in 1:3) gg <- gg + geom_signif(y_position = c(4.4, 6.3, 5),
    xmin = c(i - diff, i - diff, i), xmax = c(i, i + diff, i + diff),
    annotation = cntrs$signif[cntrs$first.hab == spp[i] & cntrs$second.hab ==
        spp[i]], tip_length = 0.02, textsize = 7, size = 0.4, color = "gray40")

# add contrasts within species between habitats
diffs <- c(1, 1 + diff, 1 + (diff * 2))

for (i in 1:3) gg <- gg + geom_signif(y_position = c(0.4, 2.5, 1) -
    7 + (17 * diffs[i]), xmin = c(diffs[i] - diff, diffs[i] - diff,
    diffs[i] - diff + 1), xmax = c(diffs[i] - diff + 1, diffs[i] -
    diff + 2, diffs[i] - diff + 2), annotation = cntrs$signif[cntrs$first.sp ==
    spp[i] & cntrs$second.sp == spp[i]], tip_length = 0.02, textsize = 7,
    size = 1, col = viridis(3, alpha = 0.4, end = 0.8)[i])

gg

10 Takeaways

  • LBH and STH songs always transmitted better than BTB songs across the 3 habitats

  • All 3 species showed better transmission at the BTB habitat

  • STH and BTB showed better transmission in LBH habitat compared to STH habitat

 


11 Simulate data for graphical predictions

Code
sp <- paste("sp", LETTERS[1:3])
hab <- paste("sp", LETTERS[1:3])

dat <- expand.grid(sp = sp, hab = hab)


dat$hyp1 <- ifelse(dat$sp == dat$hab, 3, 1)

dat$hyp2 <- (as.numeric(as.factor(dat$sp)) * -1) + as.numeric(as.factor(dat$hab))


out <- lapply(1:nrow(dat), function(x) {

    sub_dat <- dat[x, ]
    out <- data.frame(sub_dat, trans1 = rnorm(n = 100, mean = sub_dat$hyp1,
        sd = 1), row.names = 1:100)
    out$trans2 <- rnorm(n = 100, mean = sub_dat$hyp2, sd = 1)

    return(out)
})

sim_dat <- do.call(rbind, out)

11.1 Acoustic specialization

Code
ggplot(sim_dat, aes(y = trans1, x = hab, fill = sp)) + geom_boxplot(outlier.alpha = 0.2) +
    scale_fill_viridis_d(alpha = 0.4) + labs(x = "Habitat", y = "Transmission",
    fill = "Species") + theme_classic(base_size = 25) + theme(axis.text.y = element_blank())

11.2 Acoustic winner

Code
ggplot(sim_dat, aes(y = trans2, x = hab, fill = sp)) + geom_boxplot(outlier.alpha = 0.2) +
    scale_fill_viridis_d(alpha = 0.4) + labs(x = "Habitat", y = "Transmission",
    fill = "Species") + theme_classic(base_size = 25) + theme(axis.text.y = element_blank())

11.3 Dynamic spectrogram

Code
wav <- read_wave("./data/processed/hermit_degradation_master_sound_file.wav",
    from = 0, to = 20)

scrolling_spectro(wave = wav, wl = 300, t.display = 1.3, pal = viridis,
    grid = FALSE, flim = c(1, 11), width = 1000, height = 400, res = 120,
    file.name = "./scripts/master2.mp4", parallel = 4, collevels = seq(-100,
        0, 5))

12 Spectrograms

12.1 Striped-throated hermit

Code
stri <- read_wave("./data/raw/examples/Phaethornis_striigularis-ML80981.wav",
    from = 49.3, to = 52.7)

spectro(stri, wl = 1400, ovlp = 95, scale = FALSE, grid = FALSE, palette = viridis,
    collevels = seq(-120, 0, 5), flim = c(3, 11))

12.2 Band-tailed barbthroat

Code
tr <- read_wave("./data/raw/examples/Threnetes_ruckeri-ML46239581.wav",
    from = 1, to = 4.6)

spectro(tr, wl = 1400, ovlp = 95, scale = FALSE, grid = FALSE, palette = viridis,
    collevels = seq(-120, 0, 5), flim = c(3, 11))

12.3 Long-billed hermit

Code
data("Phae.long2")

spectro(Phae.long2, wl = 200, ovlp = 95, scale = FALSE, grid = FALSE,
    palette = viridis, collevels = seq(-120, 0, 5), flim = c(2, 11),
    tlim = c(0, 0.5))


 

Session information

R version 4.1.0 (2021-05-18)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 20.04.2 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/atlas/libblas.so.3.10.3
LAPACK: /usr/lib/x86_64-linux-gnu/atlas/liblapack.so.3.10.3

locale:
 [1] LC_CTYPE=pt_BR.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=es_CR.UTF-8        LC_COLLATE=pt_BR.UTF-8    
 [5] LC_MONETARY=es_CR.UTF-8    LC_MESSAGES=pt_BR.UTF-8   
 [7] LC_PAPER=es_CR.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=es_CR.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] ggsignif_0.6.2     emmeans_1.8.1-1    corrplot_0.90      ggplot2_3.4.0     
 [5] brms_2.18.0        Rcpp_1.0.10        Rraven_1.0.13      viridis_0.6.2     
 [9] viridisLite_0.4.1  baRulho_1.0.7      warbleR_1.1.28     NatureSounds_1.0.4
[13] seewave_2.2.0      tuneR_1.4.4        formatR_1.11       knitr_1.43        

loaded via a namespace (and not attached):
  [1] backports_1.4.1      systemfonts_1.0.4    plyr_1.8.7          
  [4] igraph_1.4.3         splines_4.1.0        crosstalk_1.2.0     
  [7] TH.data_1.1-0        rstantools_2.2.0     inline_0.3.19       
 [10] digest_0.6.31        htmltools_0.5.5      fansi_1.0.4         
 [13] magrittr_2.0.3       checkmate_2.1.0      remotes_2.4.2       
 [16] RcppParallel_5.1.5   matrixStats_0.62.0   svglite_2.1.0       
 [19] xts_0.12.2           sandwich_3.0-1       prettyunits_1.1.1   
 [22] colorspace_2.0-3     rvest_1.0.3          signal_0.7-7        
 [25] ggdist_3.2.0         xfun_0.39            dplyr_1.0.10        
 [28] callr_3.7.3          crayon_1.5.2         RCurl_1.98-1.12     
 [31] jsonlite_1.8.5       lme4_1.1-27.1        survival_3.2-11     
 [34] zoo_1.8-11           glue_1.6.2           kableExtra_1.3.4    
 [37] gtable_0.3.1         webshot_0.5.4        distributional_0.3.1
 [40] pkgbuild_1.4.0       rstan_2.21.7         abind_1.4-5         
 [43] scales_1.2.1         mvtnorm_1.1-3        DBI_1.1.3           
 [46] xaringanExtra_0.7.0  miniUI_0.1.1.1       dtw_1.23-1          
 [49] xtable_1.8-4         proxy_0.4-27         stats4_4.1.0        
 [52] StanHeaders_2.21.0-7 DT_0.26              httr_1.4.4          
 [55] htmlwidgets_1.5.4    threejs_0.3.3        posterior_1.3.1     
 [58] ellipsis_0.3.2       pkgconfig_2.0.3      loo_2.4.1.9000      
 [61] farver_2.1.1         utf8_1.2.3           labeling_0.4.2      
 [64] tidyselect_1.2.0     rlang_1.1.1          reshape2_1.4.4      
 [67] later_1.3.0          munsell_0.5.0        tools_4.1.0         
 [70] cli_3.6.1            generics_0.1.3       ggridges_0.5.4      
 [73] evaluate_0.21        stringr_1.5.0        fastmap_1.1.1       
 [76] yaml_2.3.7           processx_3.8.1       packrat_0.9.0       
 [79] pbapply_1.7-0        nlme_3.1-152         mime_0.12           
 [82] projpred_2.0.2       xml2_1.3.3           brio_1.1.3          
 [85] compiler_4.1.0       bayesplot_1.9.0      shinythemes_1.2.0   
 [88] rstudioapi_0.14      gamm4_0.2-6          png_0.1-7           
 [91] testthat_3.1.8       sketchy_1.0.2        tibble_3.2.1        
 [94] stringi_1.7.12       ps_1.7.5             Brobdingnag_1.2-9   
 [97] lattice_0.20-44      Matrix_1.5-1         nloptr_1.2.2.2      
[100] markdown_1.3         shinyjs_2.1.0        fftw_1.0-7          
[103] tensorA_0.36.2       vctrs_0.6.2          pillar_1.9.0        
[106] lifecycle_1.0.3      bridgesampling_1.1-2 estimability_1.4.1  
[109] cowplot_1.1.1        bitops_1.0-7         Sim.DiffProc_4.8    
[112] httpuv_1.6.6         R6_2.5.1             promises_1.2.0.1    
[115] gridExtra_2.3        codetools_0.2-18     boot_1.3-28         
[118] colourpicker_1.2.0   MASS_7.3-54          gtools_3.9.3        
[121] assertthat_0.2.1     rjson_0.2.21         withr_2.5.0         
[124] shinystan_2.6.0      Deriv_4.1.3          multcomp_1.4-17     
[127] mgcv_1.8-36          parallel_4.1.0       grid_4.1.0          
[130] coda_0.19-4          minqa_1.2.4          rmarkdown_2.20      
[133] shiny_1.7.3          base64enc_0.1-3      dygraphs_1.1.1.6