Acoustic adaptation in lekking hermit hummingbirds
Acoustic and statistical analysis
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
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)
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 |
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
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 |
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
11.2 Acoustic winner
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
12.2 Band-tailed barbthroat
12.3 Long-billed hermit
Code
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