flowchart A[Time sync files] --> B(Measure degradation) B --> C(Regression models) C --> D(Model selection) style A fill:#44015466 style B fill:#3E4A894D style C fill:#26828E4D style D fill:#6DCD594D
Degradation statistics
Sex-dependent signal propagation in L. palavanensis
Source code and data found at https://github.com/maRce10/call_degradation_l_palavanensis
Purpose
Measure degradation on re-recorded files
Run stats
Analysis flowchart
Load packages
Code
# knitr is require for creating html/pdf/word reports formatR is
# used for soft-wrapping code
# install/ load packages
::load_packages(packages = c("knitr", "formatR", "baRulho",
sketchy"viridis", "warbleR", "Rraven", "brms", "ggplot2", "corrplot",
"emmeans", "ggsignif", "lme4", "brmsish"))
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'
1 Time sync all replicates
1.1 Females
Code
<- read.csv("./data/raw/master_l.palavanensis_males_annotations.csv")
master_annotations_males
<- rbind(master_annotations_females, master_annotations_males)
master_annotations
exp_raven(master_annotations, path = "./data/raw", file.name = "pooled_master_annotations",
sound.file.path = "./data/raw/recordings")
<- list.files("./data/raw/recordings", pattern = "_F_")
female_files
<- find_markers(X = master_annotations_females, markers = c("start_marker",
female_starts "end_marker"), path = "./data/raw/recordings", cores = 3, test.files = female_files)
$start[female_starts$sound.files == "PB_Lpa_0016_T1_Ashton_F_16m.wav" &
female_starts$marker == "start_marker"] <- 0.8659
female_starts$end[female_starts$sound.files == "PB_Lpa_0016_T1_Ashton_F_16m.wav" &
female_starts$marker == "start_marker"] <- 1.8659
female_starts$scores[female_starts$sound.files == "PB_Lpa_0016_T1_Ashton_F_16m.wav" &
female_starts$marker == "start_marker"] <- 1
female_starts
$start[female_starts$sound.files == "PB_Lpa_0062_T1_Ashton_F_20m.wav" &
female_starts$marker == "start_marker"] <- 1.6465
female_starts$end[female_starts$sound.files == "PB_Lpa_0062_T1_Ashton_F_20m.wav" &
female_starts$marker == "start_marker"] <- 2.6465
female_starts$scores[female_starts$sound.files == "PB_Lpa_0062_T1_Ashton_F_20m.wav" &
female_starts$marker == "start_marker"] <- 1
female_starts
# female_starts$sound.files[(abs(female_starts$time.mismatch) >
# 1) & !is.na(female_starts$time.mismatch)]
::info_sound_files("./data/raw/recordings")
warbleR
<- align_test_files(X = master_annotations_females, Y = female_starts,
alg_females path = "./data/raw/recordings", by.song = FALSE)
$row <- 1:nrow(alg_females)
alg_females
exp_raven(alg_females, path = "./data/processed", file.name = "check_alignment_females",
sound.file.path = "./data/raw/recordings", single.file = TRUE)
# getOption('baRulho')$files_to_check_align_test_files
<- check_sels(alg_females, path = "./data/raw/recordings")
cs
<- manual_realign(X = alg_females, Y = master_annotations_females,
alg_females path = "./data/raw/recordings", flim = c(0, 6), marker = "end_marker")
1.2 Males
Code
<- read.csv("./data/raw/master_l.palavanensis_males_annotations.csv")
master_annotations_males
<- list.files("./data/raw/recordings", pattern = "_M_")
male_files
<- find_markers(X = master_annotations_males, markers = c("start_marker",
male_starts "end_marker"), path = "./data/raw/recordings", cores = 3, test.files = male_files)
# male_starts$start[male_starts$sound.files ==
# 'PB_Lpa_0019_T1_Apan_M_1m.wav' & male_starts$marker ==
# 'start_marker'] <- 2.8459
# male_starts$end[male_starts$sound.files ==
# 'PB_Lpa_0019_T1_Apan_M_1m.wav' & male_starts$marker ==
# 'start_marker'] <- 3.8459
# male_starts$scores[male_starts$sound.files ==
# 'PB_Lpa_0019_T1_Apan_M_1m.wav' & male_starts$marker ==
# 'start_marker'] <- 1
# male_starts[(abs(male_starts$time.mismatch) > 1) &
# !is.na(male_starts$time.mismatch),]
<- align_test_files(X = master_annotations_males, Y = male_starts,
alg_males path = "./data/raw/recordings", by.song = FALSE)
$row <- 1:nrow(alg_females)
alg_females
exp_raven(alg_males, path = "./data/processed", file.name = "check_alignment_males",
sound.file.path = "./data/raw/recordings", single.file = TRUE)
# getOption('baRulho')$files_to_check_align_test_files
<- check_sels(alg_females, path = "./data/raw/recordings")
cs
<- manual_realign(X = alg_males, Y = master_annotations_males,
alg_males path = "./data/raw/recordings", flim = c(0, 6), marker = "end_marker")
$sex <- "females"
alg_females$row <- NULL
alg_females$sex <- "males"
alg_males
<- rbind(alg_females, alg_males)
alg_anns
$distance <- sapply(strsplit(alg_anns$sound.files, "_"), "[[",
alg_anns7)
$distance <- gsub(".wav", "", alg_anns$distance)
alg_anns<- alg_anns[alg_anns$distance != "10m", ]
alg_anns
$site <- sapply(strsplit(alg_anns$sound.files, "_"), "[[",
alg_anns5)
$transect <- sapply(strsplit(alg_anns$sound.files, "_"), "[[",
alg_anns4)
$transect <- sapply(strsplit(alg_anns$sound.files, "_"), "[[",
alg_anns4)
# keep only 1 reference
<- alg_anns[!(alg_anns$distance == "1m" & alg_anns$site ==
alg_anns "Apan"), ]
table(alg_anns$distance, alg_anns$transect, alg_anns$sex)
<- alg_anns[grep("marker", alg_anns$sound.id, invert = TRUE),
alg_anns
]
write.csv(alg_anns, "./data/processed/pooled_aligned_annotations.csv",
row.names = FALSE)
<- selection_table(alg_anns, path = "./data/raw/recordings",
alg_anns_est extended = TRUE)
<- resample_est(alg_anns_est, samp.rate = 22.05)
alg_anns_est
saveRDS(alg_anns_est, "./data/raw/extended_selection_table_rerecorded_sounds.RDS")
2 Measure degradation
2.1 Measure
Code
<- readRDS("../data/processed/extended_selection_table_rerecorded_sounds.RDS")
alg_anns_est
table(alg_anns_est$sound.id)
table(alg_anns_est$distance)
$distance <- as.numeric(gsub("m", "", alg_anns_est$distance))
alg_anns_est<- 3
cores
<- set_reference_sounds(alg_anns_est)
alg_anns_est
# run blur ratio
<- blur_ratio(alg_anns_est, cores = cores)
alg_anns_est
# run Spectrum blur ratio
<- spectrum_blur_ratio(alg_anns_est, cores = cores)
alg_anns_est
# run envelope correlation
<- excess_attenuation(alg_anns_est, cores = cores)
alg_anns_est
# run envelope correlation
<- envelope_correlation(alg_anns_est, cores = cores)
alg_anns_est
# run spectrum correlation
<- spectrum_correlation(alg_anns_est, cores = cores)
alg_anns_est
# run signal to noise ratio
<- signal_to_noise_ratio(alg_anns_est, cores = cores,
alg_anns_est mar = 0.03)
# run tail to noise ratio
<- tail_to_signal_ratio(alg_anns_est, cores = cores,
alg_anns_est tsr.formula = 2, mar = 0.03)
names(alg_anns_est)[ncol(alg_anns_est)] <- "tail.to.noise.ratio"
# run tail to signal ratio
<- tail_to_signal_ratio(alg_anns_est, cores = cores,
alg_anns_est tsr.formula = 1, mar = 0.03)
# run spcc
source("~/Dropbox/R_package_testing/baRulho/R/spcc.R")
source("~/Dropbox/R_package_testing/warbleR/R/cross_correlation.R")
source("~/Dropbox/R_package_testing/warbleR/R/internal_functions.R")
<- spcc(X = alg_anns_est, cores = cores)
alg_anns_est
<- alg_anns_est[alg_anns_est$distance != 1, ]
alg_anns_est
<- as.data.frame(alg_anns_est)
alg.tests
write.csv(alg.tests, "./data/processed/degradation_metrics.csv", row.names = FALSE)
3 Stats
Code
<- read.csv("./data/processed/degradation_metrics.csv")
degrad_dat
<- c("blur.ratio", "spectrum.blur.ratio", "excess.attenuation",
degrad_measures "envelope.correlation", "spectrum.correlation", "signal.to.noise.ratio",
"tail.to.noise.ratio", "tail.to.signal.ratio", "cross.correlation")
<- prcomp(degrad_dat[, degrad_measures], scale = TRUE)
pca
pcasummary(pca)
$degrad.pc1 <- pca$x[, 1]
degrad_dat$original.sound.file <- sapply(strsplit(degrad_dat$sound.id,
degrad_dat".WAV"), "[[", 1)
$distance_f <- factor(degrad_dat$distance, ordered = TRUE)
degrad_dat
library(lmerTest)
<- lmer(degrad.pc1 ~ sex * site + (1 | transect) + (1 | original.sound.file) +
int_mod 1 | distance_f), data = degrad_dat)
(
summary(int_mod)
<- lmer(degrad.pc1 ~ sex * site + distance_f + (1 | transect) +
int_mod2 1 | original.sound.file), data = degrad_dat)
(
summary(int_mod2)
<- 5000
iter <- 4
chains <- c(prior(normal(0, 6), class = "b"))
priors
<- brm(degrad.pc1 ~ sex * site + mo(distance_f) + (1 | transect) +
mod 1 | original.sound.file), data = degrad_dat, prior = priors,
(iter = iter, chains = chains, cores = chains, control = list(adapt_delta = 0.99,
max_treedepth = 15), file = "./data/processed/interaction_model.RDS",
file_refit = "always", seed = 123)
Code
<- readRDS("./data/processed/interaction_model.RDS")
mod
extended_summary(mod, trace.palette = mako, highlight = TRUE, remove.intercepts = TRUE)
3.1 mod
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.3, 2.9) sd-student_t(3, 0, 2.9) sigma-student_t(3, 0, 2.9) simo-dirichlet(1) | degrad.pc1 ~ sex * site + mo(distance_f) + (1 | transect) + (1 | original.sound.file) | 5000 | 4 | 1 | 2500 | 0 (0%) | 0 | 1995.689 | 3336.118 | 123 |
Estimate | l-95% CI | u-95% CI | Rhat | Bulk_ESS | Tail_ESS | |
---|---|---|---|---|---|---|
b_sexmales | -0.498 | -0.795 | -0.196 | 1 | 1995.689 | 3336.118 |
b_siteAshton | 0.088 | 0.010 | 0.164 | 1 | 7268.361 | 6994.519 |
b_sexmales:siteAshton | 0.105 | -0.010 | 0.218 | 1 | 7194.042 | 7474.724 |
3.1.1 Descriptive stats
Code
# Total test sounds: `r nrow(degrad_dat)`
<- aggregate(selec ~ habitat.type + distance, degrad_dat, length)
agg
$bytran <- round(agg$selec/3, 0)
agg
names(agg) <- c("habitat type", "distance", "total test sounds", "sounds per transect")
agg
Takeaways
Session information
R version 4.3.2 (2023-10-31)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 22.04.2 LTS
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.10.0
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
time zone: America/Costa_Rica
tzcode source: system (glibc)
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] brmsish_1.0.0 lme4_1.1-35.3 Matrix_1.6-5 ggsignif_0.6.4
[5] emmeans_1.9.0 corrplot_0.92 ggplot2_3.5.1 brms_2.21.0
[9] Rcpp_1.0.12 Rraven_1.0.13 viridis_0.6.5 viridisLite_0.4.2
[13] baRulho_2.1.1 ohun_1.0.2 warbleR_1.1.30 NatureSounds_1.0.4
[17] seewave_2.2.3 tuneR_1.4.7 formatR_1.14 knitr_1.48
loaded via a namespace (and not attached):
[1] tensorA_0.36.2.1 rstudioapi_0.16.0 jsonlite_1.8.8
[4] magrittr_2.0.3 TH.data_1.1-2 sketchy_1.0.3
[7] estimability_1.4.1 farver_2.1.2 nloptr_2.0.3
[10] rmarkdown_2.27 vctrs_0.6.5 minqa_1.2.7
[13] RCurl_1.98-1.14 htmltools_0.5.8.1 distributional_0.4.0
[16] curl_5.2.0 tidybayes_3.0.6 signal_1.8-1
[19] StanHeaders_2.32.9 KernSmooth_2.23-20 htmlwidgets_1.6.4
[22] plyr_1.8.9 sandwich_3.1-0 testthat_3.2.1.1
[25] zoo_1.8-12 igraph_2.0.3 lifecycle_1.0.4
[28] pkgconfig_2.0.3 R6_2.5.1 fastmap_1.2.0
[31] digest_0.6.36 colorspace_2.1-0 labeling_0.4.3
[34] fansi_1.0.6 abind_1.4-5 compiler_4.3.2
[37] proxy_0.4-27 remotes_2.5.0 withr_3.0.0
[40] backports_1.5.0 inline_0.3.19 DBI_1.2.3
[43] QuickJSR_1.2.2 pkgbuild_1.4.4 MASS_7.3-55
[46] rjson_0.2.21 classInt_0.4-10 loo_2.7.0
[49] tools_4.3.2 units_0.8-5 ape_5.8
[52] fftw_1.0-8 glue_1.7.0 nlme_3.1-155
[55] grid_4.3.2 sf_1.0-16 checkmate_2.3.1
[58] reshape2_1.4.4 generics_0.1.3 gtable_0.3.5
[61] class_7.3-20 tidyr_1.3.1 xml2_1.3.6
[64] Deriv_4.1.3 utf8_1.2.4 pillar_1.9.0
[67] ggdist_3.3.2 stringr_1.5.1 posterior_1.5.0
[70] splines_4.3.2 dplyr_1.1.4 lattice_0.20-45
[73] survival_3.2-13 tidyselect_1.2.1 pbapply_1.7-2
[76] arrayhelpers_1.1-0 gridExtra_2.3 V8_4.4.2
[79] svglite_2.1.3 stats4_4.3.2 xfun_0.45
[82] bridgesampling_1.1-2 brio_1.1.5 matrixStats_1.3.0
[85] rstan_2.32.6 stringi_1.8.4 yaml_2.3.9
[88] boot_1.3-28 kableExtra_1.4.0 xaringanExtra_0.7.0
[91] evaluate_0.24.0 codetools_0.2-18 dtw_1.23-1
[94] tibble_3.2.1 cli_3.6.3 RcppParallel_5.1.7
[97] xtable_1.8-4 Sim.DiffProc_4.9 systemfonts_1.1.0
[100] munsell_0.5.1 coda_0.19-4.1 png_0.1-8
[103] svUnit_1.0.6 parallel_4.3.2 rstantools_2.4.0
[106] bayesplot_1.11.1 Brobdingnag_1.2-9 bitops_1.0-7
[109] mvtnorm_1.2-5 scales_1.3.0 e1071_1.7-14
[112] packrat_0.9.2 purrr_1.0.2 crayon_1.5.3
[115] rlang_1.1.4 cowplot_1.1.3 multcomp_1.4-25