---
title: Stats
subtitle: Vocal activity and noise in birds of Santa Rosa NP
author: <a href="http://researcher.website.com/">Researcher name</a>
date: "`r Sys.Date()`"
toc: true
toc-depth: 2
toc-location: left
number-sections: true
highlight-style: pygments
format:
html:
df-print: kable
code-fold: true
code-tools: true
css: qmd.css
editor_options:
chunk_output_type: console
---
```{r set root directory}
#| eval: true
#| echo: false
# set working directory
knitr:: opts_knit$ set (root.dir = ".." )
```
```{r add link to github repo}
#| eval: true
#| output: asis
# print link to github repo if any
if (file.exists ("./.git/config" )){
config <- readLines ("./.git/config" )
url <- grep ("url" , config, value = TRUE )
url <- gsub (" \\ turl = |.git$" , "" , url)
cat (" \n Source code and data found at [" , url, "](" , url, ")" , sep = "" )
}
```
```{r setup style}
#| message: false
#| warning: false
# options to customize chunk outputs
knitr:: opts_chunk$ set (
tidy.opts = list (width.cutoff = 65 ),
tidy = TRUE ,
message = FALSE ,
warning = FALSE
)
```
# Custom functions
```{r}
brms_summary <- function (...){
extended_summary ( ...,
highlight = TRUE ,
remove.intercepts = TRUE ,
trace.palette = viridis:: mako,
fill = "#54C9ADFF"
)
}
```
<!-- skyblue box -->
::: {.alert .alert-info}
# Purpose {.unnumbered .unlisted}
- Fit regression models
:::
# Load packages {.unnumbered .unlisted}
```{r load packages}
# 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" , "brms" , "ggplot2" , "readxl" , github = "maRce10/brmsish" , "viridis" ))
```
```{r}
dat <- read_excel ("./data/raw/MS_Chaves-Acuñaetal_AvesStaRosa_julio2025_revWCA.xlsx" ,sheet = "datos_largos" , na = "N/A" )
dat <- dat[, 1 : which (names (dat) == "numero_cantos" )]
n_sp <- table (dat$ ` Especie Ave ` )
n_sp <- sort (n_sp, decreasing = T)
# select those spp with more than 100 records
dat <- dat[dat$ ` Especie Ave ` %in% names (n_sp)[n_sp > 100 ], ]
dat$ traslape_frecuencia <- ifelse (dat$ traslape_frecuencia == "Antrofonía" , "antrofonia" , "biofonia" )
dat$ traslape_frecuencia_bn <- ifelse (dat$ traslape_frecuencia == dat$ tipo_ruido, "si" , "no" )
dat$ especie <- dat$ ` Especie Ave `
```
# Regression models
## Overlap
```{r}
#make dat == 0 a bit above 0
dat$ prop_traslape[dat$ prop_traslape == 0 ] <- 0.0001
# combine duration and frequency overlap
dat$ duracion_traslape <- ifelse (dat$ traslape_frecuencia_bn == "si" , dat$ duracion_tratamiento, 0 )
dat$ duracion_traslape <- scale (dat$ duracion_traslape)
# scale duration of treatment and song duration
dat$ duracion_tratamiento <- scale (dat$ duracion_tratamiento)
# dat$duracion_canto <- scale(dat$duracion_canto)
cores <- chains <- 4
iter <- 2000
# proporcion de traslape
proporcion_simple <- brm (
prop_traslape ~ traslape_frecuencia_bn + tipo_ruido + (1 |
Sitio / Punto) + (1 | especie),
data = dat,
iter = iter,
cores = cores,
chains = chains,
family = Beta (link = "logit" , link_phi = "log" ),
backend = "cmdstanr" ,
prior = c (prior (normal (0 , 5 ), "b" ), prior (normal (0 , 24 ), "Intercept" )),
control = list (adapt_delta = 0.99 , max_treedepth = 15 ),
file = "./data/processed/proporcion_simple.rds" ,
file_refit = "on_change"
)
proporcion_interaccion_duracion_tratamiento <- brm (
prop_traslape ~ traslape_frecuencia_bn + tipo_ruido * duracion_tratamiento + (1 |
Sitio / Punto) + (1 | especie),
data = dat,
iter = iter,
cores = cores,
chains = chains,
family = Beta (link = "logit" , link_phi = "log" ),
backend = "cmdstanr" ,
prior = c (prior (normal (0 , 5 ), "b" ), prior (normal (0 , 24 ), "Intercept" )),
control = list (adapt_delta = 0.99 , max_treedepth = 15 ),
file = "./data/processed/proporcion_interaccion_duracion_tratamiento.rds" ,
file_refit = "on_change"
)
proporcion_interaccion_traslape <- brm (
prop_traslape ~ traslape_frecuencia_bn * tipo_ruido + duracion_tratamiento + (1 |
Sitio / Punto) + (1 | especie),
data = dat,
iter = iter,
cores = cores,
chains = chains,
family = Beta (link = "logit" , link_phi = "log" ),
backend = "cmdstanr" ,
prior = c (prior (normal (0 , 5 ), "b" ), prior (normal (0 , 24 ), "Intercept" )),
control = list (adapt_delta = 0.99 , max_treedepth = 15 ),
file = "./data/processed/proporcion_interaccion_traslape.rds" ,
file_refit = "on_change"
)
proporcion_interaccion_duracion_traslape <- brm (
prop_traslape ~ traslape_frecuencia_bn * tipo_ruido * duracion_tratamiento + (1 |
Sitio / Punto) + (1 | especie),
data = dat,
iter = iter,
cores = cores,
chains = chains,
family = Beta (link = "logit" , link_phi = "log" ),
backend = "cmdstanr" ,
prior = c (prior (normal (0 , 5 ), "b" ), prior (normal (0 , 24 ), "Intercept" )),
control = list (adapt_delta = 0.99 , max_treedepth = 15 ),
file = "./data/processed/proporcion_interaccion_duracion_traslape.rds" ,
file_refit = "on_change"
)
proporcion_duracion_traslape <- brm (
prop_traslape ~ tipo_ruido + duracion_traslape + (1 |
Sitio / Punto) + (1 | especie),
data = dat,
iter = iter,
cores = cores,
chains = chains,
family = Beta (link = "logit" , link_phi = "log" ),
backend = "cmdstanr" ,
prior = c (prior (normal (0 , 5 ), "b" ), prior (normal (0 , 24 ), "Intercept" )),
control = list (adapt_delta = 0.99 , max_treedepth = 15 ),
file = "./data/processed/proporcion_duracion_traslape.rds" ,
file_refit = "on_change"
)
proporcion_duracion_traslape_interaccion <- brm (
prop_traslape ~ tipo_ruido * duracion_traslape + (1 |
Sitio / Punto) + (1 | especie),
data = dat,
iter = iter,
cores = cores,
chains = chains,
family = Beta (link = "logit" , link_phi = "log" ),
backend = "cmdstanr" ,
prior = c (prior (normal (0 , 5 ), "b" ), prior (normal (0 , 24 ), "Intercept" )),
control = list (adapt_delta = 0.99 , max_treedepth = 15 ),
file = "./data/processed/proporcion_duracion_traslape_interaccion.rds" ,
file_refit = "on_change"
)
proporcion_interaccion_nulo <- brm (
prop_traslape ~ 1 + (1 | Sitio / Punto) + (1 | especie),
data = dat,
iter = iter,
cores = cores,
chains = chains,
family = Beta (link = "logit" , link_phi = "log" ),
backend = "cmdstanr" ,
prior = c (prior (normal (0 , 24 ), "Intercept" )),
control = list (adapt_delta = 0.99 , max_treedepth = 15 ),
file = "./data/processed/proporcion_interaccion_nulo.rds" ,
file_refit = "on_change"
)
```
### Compare models
```{r}
mod_list <- list (
proporcion_simple = proporcion_simple,
proporcion_interaccion_duracion_tratamiento = proporcion_interaccion_duracion_tratamiento,
proporcion_interaccion_traslape = proporcion_interaccion_traslape,
proporcion_interaccion_duracion_traslape = proporcion_interaccion_duracion_traslape,
proporcion_interaccion_nulo = proporcion_interaccion_nulo,
proporcion_duracion_traslape = proporcion_duracion_traslape,
proporcion_duracion_traslape_interaccion = proporcion_duracion_traslape_interaccion
)
mod_loo <- lapply (mod_list, loo)
loo_comparison <- loo:: loo_compare (mod_loo)
loo_comparison
```
#### Best model
```{r}
#| output: asis
best_mod <- mod_list[[which (names (mod_list) == rownames (loo_comparison)[1 ])]]
brms_summary (best_mod, gsub.pattern = c ("b_treatment|b_" ,"tipo_ruido" ),
gsub.replacement = c ("" , "antropof_" ))
```
##### Marginal effect plots
```{r}
conditions <- make_conditions (best_mod, "tipo_ruido" )
conditional_effects (best_mod, "duracion_tratamiento" , conditions = conditions)
conditional_effects (best_mod, "traslape_frecuencia_bn" , conditions = conditions)
conditional_effects (best_mod, "traslape_frecuencia_bn:tipo_ruido" , conditions = conditions)
conditions <- make_conditions (best_mod, "duracion_tratamiento" )
conditional_effects (best_mod, "traslape_frecuencia_bn" , conditions = conditions)
conditional_effects (best_mod, "tipo_ruido" , conditions = conditions)
conditional_effects (best_mod, "traslape_frecuencia_bn:tipo_ruido" , conditions = conditions)
conditions <- make_conditions (best_mod, "traslape_frecuencia_bn" )
conditional_effects (best_mod, "duracion_tratamiento" , conditions = conditions)
conditional_effects (best_mod, "tipo_ruido" , conditions = conditions)
conditional_effects (best_mod, "duracion_tratamiento:tipo_ruido" , conditions = conditions)
```
## Duration
```{r}
#make duracion_canto == 0 a bit above 0
dat$ duracion_canto[dat$ duracion_canto == 0 ] <- 0.0001
# duracion del canto
duracion_canto_simple <- brm (duracion_canto ~ traslape_frecuencia_bn + tipo_ruido + (1 | Sitio / Punto) + (1 | especie),
data = dat,
iter = iter,
cores = cores,
chains = chains,
family = Gamma (link = "log" ),
backend = "cmdstanr" ,
prior = c (prior (normal (0 , 5 ), "b" ), prior (normal (0 , 24 ), "Intercept" )),
control = list (adapt_delta = 0.99 , max_treedepth = 15 ),
file = "./data/processed/duracion_canto_simple.rds" ,
file_refit = "on_change" )
duracion_canto_interaccion_duracion_tratamiento <- brm (duracion_canto ~ traslape_frecuencia_bn + tipo_ruido * duracion_tratamiento + (1 | Sitio / Punto) + (1 | especie),
data = dat,
iter = iter,
cores = cores,
chains = chains,
family = Gamma (link = "log" ),
backend = "cmdstanr" ,
prior = c (prior (normal (0 , 5 ), "b" ), prior (normal (0 , 24 ), "Intercept" )),
control = list (adapt_delta = 0.99 , max_treedepth = 15 ),
file = "./data/processed/duracion_canto_interaccion_duracion_tratamiento.rds" ,
file_refit = "on_change" )
duracion_canto_interaccion_traslape <- brm (duracion_canto ~ traslape_frecuencia_bn * tipo_ruido + duracion_tratamiento + (1 | Sitio / Punto) + (1 | especie),
data = dat,
iter = iter,
cores = cores,
chains = chains,
family = Gamma (link = "log" ),
backend = "cmdstanr" ,
prior = c (prior (normal (0 , 5 ), "b" ), prior (normal (0 , 24 ), "Intercept" )),
control = list (adapt_delta = 0.99 , max_treedepth = 15 ),
file = "./data/processed/duracion_canto_interaccion_traslape.rds" ,
file_refit = "on_change" )
duracion_canto_interaccion_duracion_traslape <- brm (duracion_canto ~ traslape_frecuencia_bn * tipo_ruido * duracion_tratamiento + (1 | Sitio / Punto) + (1 | especie),
data = dat,
iter = iter,
cores = cores,
chains = chains,
family = Gamma (link = "log" ),
backend = "cmdstanr" ,
prior = c (prior (normal (0 , 5 ), "b" ), prior (normal (0 , 24 ), "Intercept" )),
control = list (adapt_delta = 0.99 , max_treedepth = 15 ),
file = "./data/processed/duracion_canto_interaccion_duracion_traslape.rds" ,
file_refit = "on_change" )
duracion_canto_nulo <- brm (duracion_canto ~ 1 + (1 | Sitio / Punto) + (1 | especie),
data = dat,
iter = iter,
cores = cores,
chains = chains,
family = Gamma (link = "log" ),
backend = "cmdstanr" ,
prior = c (prior (normal (0 , 24 ), "Intercept" )),
control = list (adapt_delta = 0.99 , max_treedepth = 15 ),
file = "./data/processed/duracion_canto_nulo.rds" ,
file_refit = "on_change" )
duracion_canto_proporcion_duracion_traslape <- brm (
duracion_canto ~ tipo_ruido + duracion_traslape + (1 |
Sitio / Punto) + (1 | especie),
data = dat,
iter = iter,
cores = cores,
chains = chains,
family = Gamma (link = "log" ),
backend = "cmdstanr" ,
prior = c (prior (normal (0 , 5 ), "b" ), prior (normal (0 , 24 ), "Intercept" )),
control = list (adapt_delta = 0.99 , max_treedepth = 15 ),
file = "./data/processed/duracion_canto_proporcion_duracion_traslape.rds" ,
file_refit = "on_change"
)
duracion_canto_proporcion_duracion_traslape_interaccion <- brm (
duracion_canto ~ tipo_ruido * duracion_traslape + (1 |
Sitio / Punto) + (1 | especie),
data = dat,
iter = iter,
cores = cores,
chains = chains,
family = Gamma (link = "log" ),
backend = "cmdstanr" ,
prior = c (prior (normal (0 , 5 ), "b" ), prior (normal (0 , 24 ), "Intercept" )),
control = list (adapt_delta = 0.99 , max_treedepth = 15 ),
file = "./data/processed/duracion_canto_proporcion_duracion_traslape_interaccion.rds" ,
file_refit = "on_change"
)
```
### Compare models
```{r}
mod_list <- list (
duracion_canto_simple = duracion_canto_simple,
duracion_canto_interaccion_duracion_tratamiento = duracion_canto_interaccion_duracion_tratamiento,
duracion_canto_interaccion_traslape = duracion_canto_interaccion_traslape,
duracion_canto_interaccion_duracion_traslape = duracion_canto_interaccion_duracion_traslape,
duracion_canto_nulo = duracion_canto_nulo,
duracion_canto_proporcion_duracion_traslape_interaccion = duracion_canto_proporcion_duracion_traslape_interaccion,
duracion_canto_proporcion_duracion_traslape = duracion_canto_proporcion_duracion_traslape
)
mod_loo <- lapply (mod_list, loo)
loo_comparison <- loo:: loo_compare (mod_loo)
loo_comparison
```
#### Best model
```{r}
#| output: asis
best_mod <- mod_list[[which (names (mod_list) == rownames (loo_comparison)[1 ])]]
brms_summary (best_mod, gsub.pattern = c ("b_treatment|b_" ,"tipo_ruido" ),
gsub.replacement = c ("" , "antropof_" ))
```
##### Marginal effect plots
```{r}
conditions <- make_conditions (best_mod, "tipo_ruido" )
conditional_effects (best_mod, "duracion_tratamiento" , conditions = conditions)
conditional_effects (best_mod, "traslape_frecuencia_bn" , conditions = conditions)
conditional_effects (best_mod, "traslape_frecuencia_bn:tipo_ruido" , conditions = conditions)
conditions <- make_conditions (best_mod, "duracion_tratamiento" )
conditional_effects (best_mod, "traslape_frecuencia_bn" , conditions = conditions)
conditional_effects (best_mod, "tipo_ruido" , conditions = conditions)
conditional_effects (best_mod, "traslape_frecuencia_bn:tipo_ruido" , conditions = conditions)
conditions <- make_conditions (best_mod, "traslape_frecuencia_bn" )
conditional_effects (best_mod, "duracion_tratamiento" , conditions = conditions)
conditional_effects (best_mod, "tipo_ruido" , conditions = conditions)
conditional_effects (best_mod, "duracion_tratamiento:tipo_ruido" , conditions = conditions)
```
# Questions
- Que quiere decir "ninguna" en la columna `Especie Ave` ?
::: {.alert .alert-success}
# Takeaways {.unnumbered .unlisted}
:::
<!-- '---' adds a gray vertical line -->
---
<!-- add packages used, system details and versions -->
# Session information {.unnumbered .unlisted}
```{r session info, echo=F}
sessionInfo ()
```