Music exposure reduces anxiety- and depression-like behavior in rodents: a systematic review and multilevel meta-analysis
  • OSF
  • Paper
  1. Uni-moderators
  • Online supplementary
  • Effect size calculation
  • Overall effects
  • Uni-moderators
  • Publication bias
  • Leave-one-out
  • Code for figures
  • Alluvial plot

Table of contents

  • Outcome type
    • lnCVR
  • Behavioral assay
    • lnCVR
  • Behavioral mechanism
    • lnCVR
  • Lifestage of exposure
    • lnCVR
  • Control conditions
    • lnCVR
  • Relative timing

Uni-moderators

  • Show All Code
  • Hide All Code

  • View Source

We fit uni-moderator multilevel meta-regressions to test whether study characteristics predict differences in:

  • the mean response (lnRR),

  • absolute variability (lnVR),

  • relative variability (lnCVR).

Each moderator is analysed separately (uni-moderator), using the same random-effects structure (Study_ID, ES_ID, Strain`) and a cohort-level VCV matrix (rho = 0.5). For categorical moderators, we drop levels with fewer than five effect sizes (k < 5) within each effect size metric, and subset the corresponding VCV matrix accordingly.

pacman::p_load(
  DT, dtplyr, here, knitr, tidyverse, patchwork, metafor, orchaRd, multcomp
)

db_all <- readr::read_csv(here("..","data","db_effect_sizes.csv")) %>%
  mutate(across(where(is.character), as.factor)) %>%
  mutate(across(c(lnRR, lnRR_var, lnVR, lnVR_var, lnCVR, lnCVR_var), as.numeric))%>%
  mutate(
    Control_conditions = as.character(Control_conditions),
    Control_conditions = dplyr::recode(
      Control_conditions,
      "ambiet sound" = "Ambient sound",
      "white noise"  = "White noise"
    ),
    Control_conditions = factor(Control_conditions)
  )

# Per-metric datasets
db_rr  <- db_all %>% filter(!is.na(lnRR),  !is.na(lnRR_var))
db_vr  <- db_all %>% filter(!is.na(lnVR),  !is.na(lnVR_var))
db_cvr <- db_all %>% filter(!is.na(lnCVR), !is.na(lnCVR_var))

# Per-metric VCV matrices (rho = 0.5)
VCV_rr <- metafor::vcalc(vi = lnRR_var,  cluster = Cohort_ID, obs = ES_ID, rho = 0.5, data = db_rr)
VCV_vr <- metafor::vcalc(vi = lnVR_var,  cluster = Cohort_ID, obs = ES_ID, rho = 0.5, data = db_vr)
VCV_cvr<- metafor::vcalc(vi = lnCVR_var, cluster = Cohort_ID, obs = ES_ID, rho = 0.5, data = db_cvr)
NoteHelper functions

Filter to common moderator levels (k ≥ 5 in each metric)

Code
filter_low_k_single <- function(dat, V, moderator, min_k = 5) {
  mod_chr <- moderator
  # If moderator is not a factor, just return as-is
  if (!is.factor(dat[[mod_chr]])) {
    return(list(data = dat, V = V, keep_levels = NULL, k = NULL))
  }

  k_counts <- dat %>%
    count(.data[[mod_chr]], name = "k_es")

  keep_levels <- k_counts %>%
    filter(k_es >= min_k) %>%
    pull(.data[[mod_chr]])

  dat_f <- dat %>% filter(.data[[mod_chr]] %in% keep_levels)
  idx   <- which(dat[[mod_chr]] %in% keep_levels)
  V_f   <- V[idx, idx, drop = FALSE]

  list(data = dat_f, V = V_f, keep_levels = keep_levels, k = k_counts)
}

Fit one uni-moderator model + plot

Code
fit_unimod <- function(dat, V, yi, mods_formula, mod_name, xlab_expr) {

  # Guard: if nothing left after filtering
  if (nrow(dat) < 2) return(NULL)

  mod <- metafor::rma.mv(
    yi = dat[[yi]],
    V  = V,
    mods = as.formula(mods_formula),
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain),
    test = "t",
    method = "REML",
    sparse = TRUE,
    data = dat
  )

  list(
    data  = dat,
    model = mod,
    r2    = round(orchaRd::r2_ml(mod), 4),
    i2    = orchaRd::i2_ml(mod),
    plot  = orchard_plot(
      mod,
      mod   = mod_name,       
      group = "Study_ID",
      xlab  = xlab_expr,
      flip  = TRUE,
      legend.pos  = "top.left",
      trunk.size  = 0.3,
      branch.size = 2,
      alpha       = 0.3
    ) +
      scale_colour_brewer(palette = "Set1") +
      scale_fill_brewer(palette = "Dark2") +
      theme(legend.direction = "vertical")
  )
}

Optional Tukey contrasts

Code
maybe_tukey <- function(dat, V, yi, moderator, min_k = 3) {

  dat <- dat %>%
    mutate("{moderator}" := droplevels(as.factor(.data[[moderator]])))

  k <- nlevels(dat[[moderator]])
  if (is.na(k) || k < min_k) return(NULL)

  # Fit without intercept so coef = one per level
  mods_formula <- as.formula(paste0("~ ", moderator, " - 1"))

  m <- metafor::rma.mv(
    yi = dat[[yi]],
    V  = V,
    mods = mods_formula,
    random = list(~1 | Study_ID,
                  ~1 | ES_ID,
                  ~1 | Strain),
    test = "t",
    method = "REML",
    sparse = TRUE,
    data = dat
  )

  cn <- names(coef(m))
  K <- multcomp::contrMat(rep(1, k), type = "Tukey")
  colnames(K) <- cn

  g <- multcomp::glht(m, linfct = K)

 
  base::summary(g, test = multcomp::adjusted("none"))
}

Outcome type

MOD  <- "Outcome_type"
MODS <- "~ Outcome_type"

f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)

res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))

lnRR

summary(res_rr$model)

Multivariate Meta-Analysis Model (k = 295; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-241.0967   482.1933   492.1933   510.5942   492.4024   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0495  0.2225     20     no  Study_ID 
sigma^2.2  0.2333  0.4830    295     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 293) = 5690.1059, p-val < .0001

Test of Moderators (coefficient 2):
F(df1 = 1, df2 = 293) = 0.0236, p-val = 0.8781

Model Results:

                        estimate      se     tval   df    pval    ci.lb 
intrcpt                  -0.2158  0.0710  -3.0389  293  0.0026  -0.3555 
Outcome_typeDepression    0.0139  0.0907   0.1535  293  0.8781  -0.1645 
                          ci.ub     
intrcpt                 -0.0760  ** 
Outcome_typeDepression   0.1923     

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rr$r2
   R2_marginal R2_conditional 
        0.0001         0.1752 
res_rr$plot

lnVR

summary(res_vr$model)

Multivariate Meta-Analysis Model (k = 219; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-339.3184   678.6368   688.6368   705.5363   688.9211   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.1310  0.3620     16     no  Study_ID 
sigma^2.2  1.1825  1.0874    219     no     ES_ID 
sigma^2.3  0.0000  0.0001      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 217) = 4218.8132, p-val < .0001

Test of Moderators (coefficient 2):
F(df1 = 1, df2 = 217) = 8.3073, p-val = 0.0043

Model Results:

                        estimate      se     tval   df    pval    ci.lb 
intrcpt                   0.3112  0.1520   2.0473  217  0.0418   0.0116 
Outcome_typeDepression   -0.6401  0.2221  -2.8822  217  0.0043  -1.0779 
                          ci.ub     
intrcpt                  0.6107   * 
Outcome_typeDepression  -0.2024  ** 

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_vr$r2
   R2_marginal R2_conditional 
        0.0537         0.1481 
res_vr$plot

lnCVR

summary(res_cvr$model)

Multivariate Meta-Analysis Model (k = 219; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-279.5331   559.0662   569.0662   585.9656   569.3505   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.1050  0.3240     16     no  Study_ID 
sigma^2.2  0.5956  0.7718    219     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 217) = 1576.9857, p-val < .0001

Test of Moderators (coefficient 2):
F(df1 = 1, df2 = 217) = 1.1590, p-val = 0.2829

Model Results:

                        estimate      se     tval   df    pval    ci.lb   ci.ub 
intrcpt                   0.0615  0.1339   0.4590  217  0.6467  -0.2025  0.3255 
Outcome_typeDepression   -0.1830  0.1700  -1.0766  217  0.2829  -0.5180  0.1520 
                          
intrcpt                   
Outcome_typeDepression    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_cvr$r2
   R2_marginal R2_conditional 
        0.0086         0.1572 
res_cvr$plot

Behavioral assay

MOD  <- "Assay_type"
MODS <- "~ Assay_type - 1"


assay_labels <- c(
  "Elevated Plus Maze" = "EPM",
  "Open Field Test" = "OFT",
  "Light-Dark Box" = "LDB",
  "Forced Swim Test (FST)" = "FST",
  "Tail Suspension Test (TST)" = "TST",
  "Sucrose Preference Test (SPT)" = "SPT"
)


# 1) Filter each effect-size dataset (and subset the VCV accordingly)
f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)
# 2) Fit the three unimoderator models (same moderator, different yi/vi)
res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))

# 2b) Relabel x-axis in the orchard plots (so EPM/OFT/etc. show)
res_rr$plot  <- res_rr$plot  + scale_x_discrete(labels = assay_labels)
res_vr$plot  <- res_vr$plot  + scale_x_discrete(labels = assay_labels)
res_cvr$plot <- res_cvr$plot + scale_x_discrete(labels = assay_labels)

# 3) Tukey contrasts (use the filtered data + matched VCV for each dataset)

tuk_rr  <- maybe_tukey(dat = f_rr$data,  V = f_rr$V,  yi = "lnRR",  moderator = MOD)
tuk_vr  <- maybe_tukey(dat = f_vr$data,  V = f_vr$V,  yi = "lnVR",  moderator = MOD)
tuk_cvr <- maybe_tukey(dat = f_cvr$data, V = f_cvr$V, yi = "lnCVR", moderator = MOD)

lnRR

summary(res_rr$model)

Multivariate Meta-Analysis Model (k = 289; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-227.2656   454.5311   472.5311   505.3401   473.1904   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0311  0.1763     20     no  Study_ID 
sigma^2.2  0.2267  0.4762    289     no     ES_ID 
sigma^2.3  0.0043  0.0654      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 283) = 5482.7134, p-val < .0001

Test of Moderators (coefficients 1:6):
F(df1 = 6, df2 = 283) = 3.8229, p-val = 0.0011

Model Results:

                                         estimate      se     tval   df    pval 
Assay_typeElevated Plus Maze              -0.2884  0.0805  -3.5807  283  0.0004 
Assay_typeForced Swim Test (FST)          -0.3122  0.1127  -2.7713  283  0.0060 
Assay_typeLight-Dark Box                  -0.5634  0.1518  -3.7114  283  0.0002 
Assay_typeOpen Field Test                 -0.0699  0.0844  -0.8280  283  0.4084 
Assay_typeSucrose Preference Test (SPT)   -0.0715  0.1574  -0.4542  283  0.6500 
Assay_typeTail Suspension Test (TST)      -0.0926  0.2025  -0.4571  283  0.6480 
                                           ci.lb    ci.ub      
Assay_typeElevated Plus Maze             -0.4469  -0.1298  *** 
Assay_typeForced Swim Test (FST)         -0.5339  -0.0905   ** 
Assay_typeLight-Dark Box                 -0.8622  -0.2646  *** 
Assay_typeOpen Field Test                -0.2360   0.0963      
Assay_typeSucrose Preference Test (SPT)  -0.3813   0.2383      
Assay_typeTail Suspension Test (TST)     -0.4912   0.3061      

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rr$r2
   R2_marginal R2_conditional 
        0.0709         0.1963 
res_rr$plot

tuk_rr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
            Estimate Std. Error z value Pr(>|z|)   
2 - 1 == 0 -0.023825   0.112008  -0.213  0.83155   
3 - 1 == 0 -0.275002   0.136691  -2.012  0.04424 * 
4 - 1 == 0  0.218483   0.083046   2.631  0.00852 **
5 - 1 == 0  0.216889   0.162745   1.333  0.18263   
6 - 1 == 0  0.195807   0.207107   0.945  0.34443   
3 - 2 == 0 -0.251177   0.172914  -1.453  0.14633   
4 - 2 == 0  0.242308   0.119213   2.033  0.04210 * 
5 - 2 == 0  0.240714   0.179481   1.341  0.17987   
6 - 2 == 0  0.219632   0.221942   0.990  0.32237   
4 - 3 == 0  0.493485   0.153496   3.215  0.00130 **
5 - 3 == 0  0.491891   0.208187   2.363  0.01814 * 
6 - 3 == 0  0.470809   0.244179   1.928  0.05384 . 
5 - 4 == 0 -0.001594   0.163517  -0.010  0.99222   
6 - 4 == 0 -0.022676   0.206881  -0.110  0.91272   
6 - 5 == 0 -0.021082   0.243796  -0.086  0.93109   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Adjusted p values reported -- none method)

lnVR

summary(res_vr$model)

Multivariate Meta-Analysis Model (k = 213; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-321.7773   643.5546   659.5546   686.2549   660.2783   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.1545  0.3931     16     no  Study_ID 
sigma^2.2  1.1373  1.0665    213     no     ES_ID 
sigma^2.3  0.0000  0.0001      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 208) = 3885.5939, p-val < .0001

Test of Moderators (coefficients 1:5):
F(df1 = 5, df2 = 208) = 4.4278, p-val = 0.0007

Model Results:

                                      estimate      se     tval   df    pval 
Assay_typeElevated Plus Maze            0.7333  0.1947   3.7653  208  0.0002 
Assay_typeForced Swim Test (FST)       -0.1735  0.2472  -0.7019  208  0.4835 
Assay_typeLight-Dark Box                0.1806  0.3190   0.5659  208  0.5720 
Assay_typeOpen Field Test              -0.0219  0.1924  -0.1138  208  0.9095 
Assay_typeTail Suspension Test (TST)   -0.5177  0.4369  -1.1850  208  0.2374 
                                        ci.lb   ci.ub      
Assay_typeElevated Plus Maze           0.3493  1.1172  *** 
Assay_typeForced Swim Test (FST)      -0.6609  0.3139      
Assay_typeLight-Dark Box              -0.4484  0.8095      
Assay_typeOpen Field Test             -0.4011  0.3573      
Assay_typeTail Suspension Test (TST)  -1.3789  0.3436      

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_vr$r2
   R2_marginal R2_conditional 
        0.1119         0.2181 
res_vr$plot

tuk_vr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)    
2 - 1 == 0  -0.9068     0.2687  -3.375 0.000739 ***
3 - 1 == 0  -0.5527     0.2909  -1.900 0.057391 .  
4 - 1 == 0  -0.7552     0.2241  -3.369 0.000754 ***
5 - 1 == 0  -1.2510     0.4611  -2.713 0.006670 ** 
3 - 2 == 0   0.3541     0.3775   0.938 0.348283    
4 - 2 == 0   0.1516     0.2743   0.553 0.580379    
5 - 2 == 0  -0.3442     0.4877  -0.706 0.480382    
4 - 3 == 0  -0.2024     0.3416  -0.593 0.553443    
5 - 3 == 0  -0.6982     0.5292  -1.319 0.187032    
5 - 4 == 0  -0.4958     0.4573  -1.084 0.278306    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Adjusted p values reported -- none method)

lnCVR

summary(res_cvr$model)

Multivariate Meta-Analysis Model (k = 213; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-267.8978   535.7956   551.7956   578.4959   552.5192   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.1244  0.3526     16     no  Study_ID 
sigma^2.2  0.5920  0.7694    213     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 208) = 1504.7562, p-val < .0001

Test of Moderators (coefficients 1:5):
F(df1 = 5, df2 = 208) = 1.1484, p-val = 0.3360

Model Results:

                                      estimate      se     tval   df    pval 
Assay_typeElevated Plus Maze            0.2586  0.1667   1.5511  208  0.1224 
Assay_typeForced Swim Test (FST)       -0.0550  0.2029  -0.2709  208  0.7867 
Assay_typeLight-Dark Box                0.1576  0.2660   0.5924  208  0.5543 
Assay_typeOpen Field Test              -0.1324  0.1622  -0.8164  208  0.4152 
Assay_typeTail Suspension Test (TST)   -0.1191  0.3430  -0.3473  208  0.7287 
                                        ci.lb   ci.ub    
Assay_typeElevated Plus Maze          -0.0701  0.5872    
Assay_typeForced Swim Test (FST)      -0.4550  0.3451    
Assay_typeLight-Dark Box              -0.3669  0.6820    
Assay_typeOpen Field Test             -0.4521  0.1873    
Assay_typeTail Suspension Test (TST)  -0.7953  0.5571    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_cvr$r2
   R2_marginal R2_conditional 
        0.0405         0.2070 
res_cvr$plot

tuk_cvr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)  
2 - 1 == 0 -0.31354    0.20741  -1.512   0.1306  
3 - 1 == 0 -0.10099    0.22731  -0.444   0.6568  
4 - 1 == 0 -0.39097    0.17392  -2.248   0.0246 *
5 - 1 == 0 -0.37769    0.35917  -1.052   0.2930  
3 - 2 == 0  0.21255    0.29885   0.711   0.4769  
4 - 2 == 0 -0.07743    0.21225  -0.365   0.7153  
5 - 2 == 0 -0.06415    0.37941  -0.169   0.8657  
4 - 3 == 0 -0.28998    0.27232  -1.065   0.2869  
5 - 3 == 0 -0.27670    0.41692  -0.664   0.5069  
5 - 4 == 0  0.01329    0.35474   0.037   0.9701  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Adjusted p values reported -- none method)

Behavioral mechanism

MOD  <- "Induced behaviour"
MODS <- "~ `Induced behaviour`"

f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)

res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))

lnRR

summary(res_rr$model)

Multivariate Meta-Analysis Model (k = 298; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-238.1126   476.2252   486.2252   504.6770   486.4321   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0484  0.2199     20     no  Study_ID 
sigma^2.2  0.2228  0.4720    298     no     ES_ID 
sigma^2.3  0.0000  0.0001      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 296) = 5461.1248, p-val < .0001

Test of Moderators (coefficient 2):
F(df1 = 1, df2 = 296) = 8.4650, p-val = 0.0039

Model Results:

                           estimate      se     tval   df    pval    ci.lb 
intrcpt                     -0.4579  0.1072  -4.2731  296  <.0001  -0.6688 
`Induced behaviour`Innate    0.3222  0.1107   2.9095  296  0.0039   0.1043 
                             ci.ub      
intrcpt                    -0.2470  *** 
`Induced behaviour`Innate   0.5401   ** 

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rr$r2
   R2_marginal R2_conditional 
        0.0524         0.2214 
res_rr$plot

lnVR

summary(res_vr$model)

Multivariate Meta-Analysis Model (k = 222; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-346.5856   693.1713   703.1713   720.1394   703.4517   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0926  0.3043     16     no  Study_ID 
sigma^2.2  1.2261  1.1073    222     no     ES_ID 
sigma^2.3  0.0000  0.0001      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 220) = 4389.9716, p-val < .0001

Test of Moderators (coefficient 2):
F(df1 = 1, df2 = 220) = 0.2942, p-val = 0.5881

Model Results:

                           estimate      se     tval   df    pval    ci.lb 
intrcpt                      0.2494  0.2478   1.0064  220  0.3153  -0.2390 
`Induced behaviour`Innate   -0.1461  0.2694  -0.5424  220  0.5881  -0.6771 
                            ci.ub    
intrcpt                    0.7378    
`Induced behaviour`Innate  0.3848    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_vr$r2
   R2_marginal R2_conditional 
        0.0022         0.0723 
res_vr$plot

lnCVR

summary(res_cvr$model)

Multivariate Meta-Analysis Model (k = 222; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-282.2780   564.5560   574.5560   591.5241   574.8364   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0766  0.2768     16     no  Study_ID 
sigma^2.2  0.5953  0.7715    222     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 220) = 1588.3881, p-val < .0001

Test of Moderators (coefficient 2):
F(df1 = 1, df2 = 220) = 0.5346, p-val = 0.4655

Model Results:

                           estimate      se     tval   df    pval    ci.lb 
intrcpt                      0.1362  0.2021   0.6741  220  0.5010  -0.2621 
`Induced behaviour`Innate   -0.1563  0.2138  -0.7311  220  0.4655  -0.5777 
                            ci.ub    
intrcpt                    0.5345    
`Induced behaviour`Innate  0.2651    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_cvr$r2
   R2_marginal R2_conditional 
        0.0049         0.1184 
res_cvr$plot

Lifestage of exposure

MOD  <- "Lifestage_exposure"
MODS <- "~ Lifestage_exposure -1"


lifestage_labels <- c(
  "Adolescent"  = "Adol.",
  "Adult"       = "Adult",
  "Juvenile"    = "Juv.",
  "Young adult" = "Y. adult",
  "Mixed"       = "Mixed",
  "Unclear"     = "Unclear"
)



# 1) Filter each effect-size dataset (and subset the VCV accordingly)
f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)



# 2) Fit the three unimoderator models (same moderator, different yi/vi)
res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))

# 2b) Relabel x-axis in the orchard plots (so EPM/OFT/etc. show)
res_rr$plot  <- res_rr$plot  + scale_x_discrete(labels = lifestage_labels)
res_vr$plot  <- res_vr$plot  + scale_x_discrete(labels = lifestage_labels)
res_cvr$plot <- res_cvr$plot + scale_x_discrete(labels = lifestage_labels)

# 3) Tukey contrasts (use the filtered data + matched VCV for each dataset)

tuk_rr  <- maybe_tukey(dat = f_rr$data,  V = f_rr$V,  yi = "lnRR",  moderator = MOD)
tuk_vr  <- maybe_tukey(dat = f_vr$data,  V = f_vr$V,  yi = "lnVR",  moderator = MOD)
tuk_cvr <- maybe_tukey(dat = f_cvr$data, V = f_cvr$V, yi = "lnCVR", moderator = MOD)

lnRR

summary(res_rr$model)

Multivariate Meta-Analysis Model (k = 298; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-238.0800   476.1601   494.1601   527.2508   494.7983   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0390  0.1974     20     no  Study_ID 
sigma^2.2  0.2333  0.4830    298     no     ES_ID 
sigma^2.3  0.0045  0.0670      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 292) = 5634.2828, p-val < .0001

Test of Moderators (coefficients 1:6):
F(df1 = 6, df2 = 292) = 2.0555, p-val = 0.0585

Model Results:

                               estimate      se     tval   df    pval    ci.lb 
Lifestage_exposureAdolescent    -0.2269  0.1630  -1.3921  292  0.1650  -0.5476 
Lifestage_exposureAdult         -0.1332  0.1448  -0.9199  292  0.3584  -0.4182 
Lifestage_exposureJuvenile      -0.1303  0.1946  -0.6698  292  0.5035  -0.5134 
Lifestage_exposureMixed         -0.0596  0.1184  -0.5034  292  0.6151  -0.2927 
Lifestage_exposureUnclear       -0.3490  0.1678  -2.0800  292  0.0384  -0.6793 
Lifestage_exposureYoung adult   -0.3083  0.0909  -3.3914  292  0.0008  -0.4873 
                                 ci.ub      
Lifestage_exposureAdolescent    0.0939      
Lifestage_exposureAdult         0.1518      
Lifestage_exposureJuvenile      0.2527      
Lifestage_exposureMixed         0.1735      
Lifestage_exposureUnclear      -0.0188    * 
Lifestage_exposureYoung adult  -0.1294  *** 

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rr$r2
   R2_marginal R2_conditional 
        0.0415         0.1920 
res_rr$plot

tuk_rr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
            Estimate Std. Error z value Pr(>|z|)  
2 - 1 == 0  0.093666   0.186134   0.503   0.6148  
3 - 1 == 0  0.096523   0.208702   0.462   0.6437  
4 - 1 == 0  0.167255   0.197336   0.848   0.3967  
5 - 1 == 0 -0.122164   0.220161  -0.555   0.5790  
6 - 1 == 0 -0.081458   0.166351  -0.490   0.6244  
3 - 2 == 0  0.002857   0.206027   0.014   0.9889  
4 - 2 == 0  0.073588   0.180845   0.407   0.6841  
5 - 2 == 0 -0.215830   0.209449  -1.030   0.3028  
6 - 2 == 0 -0.175125   0.152363  -1.149   0.2504  
4 - 3 == 0  0.070731   0.223106   0.317   0.7512  
5 - 3 == 0 -0.218687   0.241529  -0.905   0.3652  
6 - 3 == 0 -0.177982   0.193208  -0.921   0.3569  
5 - 4 == 0 -0.289418   0.201759  -1.434   0.1514  
6 - 4 == 0 -0.248713   0.143526  -1.733   0.0831 .
6 - 5 == 0  0.040705   0.148271   0.275   0.7837  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Adjusted p values reported -- none method)

lnVR

summary(res_vr$model)

Multivariate Meta-Analysis Model (k = 222; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-339.3525   678.7050   696.7050   727.0825   697.5788   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0263  0.1621     16     no  Study_ID 
sigma^2.2  1.2491  1.1176    222     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 216) = 4359.9557, p-val < .0001

Test of Moderators (coefficients 1:6):
F(df1 = 6, df2 = 216) = 1.1160, p-val = 0.3539

Model Results:

                               estimate      se     tval   df    pval    ci.lb 
Lifestage_exposureAdolescent     0.7391  0.3236   2.2844  216  0.0233   0.1014 
Lifestage_exposureAdult         -0.0508  0.2667  -0.1903  216  0.8492  -0.5764 
Lifestage_exposureJuvenile       0.0347  0.5057   0.0685  216  0.9454  -0.9621 
Lifestage_exposureMixed         -0.1120  0.2389  -0.4687  216  0.6398  -0.5829 
Lifestage_exposureUnclear        0.1922  0.3773   0.5094  216  0.6110  -0.5515 
Lifestage_exposureYoung adult    0.1715  0.1561   1.0988  216  0.2731  -0.1361 
                                ci.ub    
Lifestage_exposureAdolescent   1.3768  * 
Lifestage_exposureAdult        0.4749    
Lifestage_exposureJuvenile     1.0315    
Lifestage_exposureMixed        0.3589    
Lifestage_exposureUnclear      0.9359    
Lifestage_exposureYoung adult  0.4791    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_vr$r2
   R2_marginal R2_conditional 
        0.0388         0.0586 
res_vr$plot

tuk_vr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)  
2 - 1 == 0 -0.78987    0.40549  -1.948   0.0514 .
3 - 1 == 0 -0.70446    0.56920  -1.238   0.2159  
4 - 1 == 0 -0.85110    0.40220  -2.116   0.0343 *
5 - 1 == 0 -0.54692    0.49456  -1.106   0.2688  
6 - 1 == 0 -0.56763    0.35356  -1.605   0.1084  
3 - 2 == 0  0.08541    0.54910   0.156   0.8764  
4 - 2 == 0 -0.06122    0.35804  -0.171   0.8642  
5 - 2 == 0  0.24296    0.46018   0.528   0.5975  
6 - 2 == 0  0.22225    0.30441   0.730   0.4653  
4 - 3 == 0 -0.14663    0.55932  -0.262   0.7932  
5 - 3 == 0  0.15754    0.62662   0.251   0.8015  
6 - 3 == 0  0.13683    0.52068   0.263   0.7927  
5 - 4 == 0  0.30418    0.44658   0.681   0.4958  
6 - 4 == 0  0.28347    0.28538   0.993   0.3206  
6 - 5 == 0 -0.02071    0.37038  -0.056   0.9554  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Adjusted p values reported -- none method)

lnCVR

summary(res_cvr$model)

Multivariate Meta-Analysis Model (k = 222; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-275.4287   550.8573   568.8573   599.2348   569.7311   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0914  0.3023     16     no  Study_ID 
sigma^2.2  0.5881  0.7669    222     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 216) = 1529.9807, p-val < .0001

Test of Moderators (coefficients 1:6):
F(df1 = 6, df2 = 216) = 0.8899, p-val = 0.5031

Model Results:

                               estimate      se     tval   df    pval    ci.lb 
Lifestage_exposureAdolescent     0.2796  0.3072   0.9103  216  0.3637  -0.3258 
Lifestage_exposureAdult         -0.1264  0.2565  -0.4929  216  0.6226  -0.6319 
Lifestage_exposureJuvenile      -0.0182  0.3922  -0.0464  216  0.9631  -0.7913 
Lifestage_exposureMixed         -0.2921  0.2504  -1.1668  216  0.2446  -0.7856 
Lifestage_exposureUnclear       -0.1622  0.3034  -0.5346  216  0.5935  -0.7601 
Lifestage_exposureYoung adult    0.1846  0.1625   1.1359  216  0.2573  -0.1357 
                                ci.ub    
Lifestage_exposureAdolescent   0.8851    
Lifestage_exposureAdult        0.3791    
Lifestage_exposureJuvenile     0.7549    
Lifestage_exposureMixed        0.2014    
Lifestage_exposureUnclear      0.4358    
Lifestage_exposureYoung adult  0.5048    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_cvr$r2
   R2_marginal R2_conditional 
        0.0607         0.1871 
res_cvr$plot

tuk_cvr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)
2 - 1 == 0 -0.40605    0.35824  -1.133    0.257
3 - 1 == 0 -0.29783    0.43007  -0.693    0.489
4 - 1 == 0 -0.57177    0.39630  -1.443    0.149
5 - 1 == 0 -0.44183    0.41766  -1.058    0.290
6 - 1 == 0 -0.09509    0.32661  -0.291    0.771
3 - 2 == 0  0.10822    0.41552   0.260    0.795
4 - 2 == 0 -0.16572    0.35841  -0.462    0.644
5 - 2 == 0 -0.03579    0.38591  -0.093    0.926
6 - 2 == 0  0.31096    0.28585   1.088    0.277
4 - 3 == 0 -0.27394    0.46532  -0.589    0.556
5 - 3 == 0 -0.14400    0.47772  -0.301    0.763
6 - 3 == 0  0.20274    0.39930   0.508    0.612
5 - 4 == 0  0.12994    0.39335   0.330    0.741
6 - 4 == 0  0.47668    0.29847   1.597    0.110
6 - 5 == 0  0.34674    0.27131   1.278    0.201
(Adjusted p values reported -- none method)

Control conditions

MOD  <- "Control_conditions"
MODS <- "~ `Control_conditions`"

f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)

res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))

lnRR

summary(res_rr$model)

Multivariate Meta-Analysis Model (k = 298; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-239.1884   478.3768   488.3768   506.8286   488.5837   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0454  0.2131     20     no  Study_ID 
sigma^2.2  0.2260  0.4754    298     no     ES_ID 
sigma^2.3  0.0000  0.0001      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 296) = 5396.0343, p-val < .0001

Test of Moderators (coefficient 2):
F(df1 = 1, df2 = 296) = 6.5356, p-val = 0.0111

Model Results:

                               estimate      se     tval   df    pval    ci.lb 
intrcpt                         -0.1871  0.0650  -2.8775  296  0.0043  -0.3151 
Control_conditionsWhite noise   -0.2618  0.1024  -2.5565  296  0.0111  -0.4634 
                                 ci.ub     
intrcpt                        -0.0591  ** 
Control_conditionsWhite noise  -0.0603   * 

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rr$r2
   R2_marginal R2_conditional 
        0.0315         0.1936 
res_rr$plot

lnVR

summary(res_vr$model)

Multivariate Meta-Analysis Model (k = 222; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-346.6305   693.2609   703.2609   720.2291   703.5413   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0857  0.2927     16     no  Study_ID 
sigma^2.2  1.2273  1.1078    222     no     ES_ID 
sigma^2.3  0.0000  0.0001      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 220) = 4380.6933, p-val < .0001

Test of Moderators (coefficient 2):
F(df1 = 1, df2 = 220) = 0.3657, p-val = 0.5460

Model Results:

                               estimate      se     tval   df    pval    ci.lb 
intrcpt                          0.1497  0.1311   1.1415  220  0.2549  -0.1087 
Control_conditionsWhite noise   -0.1533  0.2535  -0.6047  220  0.5460  -0.6530 
                                ci.ub    
intrcpt                        0.4081    
Control_conditionsWhite noise  0.3463    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_vr$r2
   R2_marginal R2_conditional 
        0.0023         0.0674 
res_vr$plot

lnCVR

summary(res_cvr$model)

Multivariate Meta-Analysis Model (k = 222; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-281.7941   563.5883   573.5883   590.5564   573.8687   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0789  0.2808     16     no  Study_ID 
sigma^2.2  0.5915  0.7691    222     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 220) = 1585.5877, p-val < .0001

Test of Moderators (coefficient 2):
F(df1 = 1, df2 = 220) = 1.7612, p-val = 0.1859

Model Results:

                               estimate      se     tval   df    pval    ci.lb 
intrcpt                          0.0380  0.1192   0.3187  220  0.7503  -0.1969 
Control_conditionsWhite noise   -0.2540  0.1914  -1.3271  220  0.1859  -0.6313 
                                ci.ub    
intrcpt                        0.2729    
Control_conditionsWhite noise  0.1232    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_cvr$r2
   R2_marginal R2_conditional 
        0.0124         0.1286 
res_cvr$plot

Relative timing

MOD  <- "Relative_timing"
MODS <- "~ Relative_timing -1"





# 1) Filter each effect-size dataset (and subset the VCV accordingly)
f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)



# 2) Fit the three unimoderator models (same moderator, different yi/vi)
res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))



# 3) Tukey contrasts (use the filtered data + matched VCV for each dataset)

tuk_rr  <- maybe_tukey(dat = f_rr$data,  V = f_rr$V,  yi = "lnRR",  moderator = MOD)
tuk_vr  <- maybe_tukey(dat = f_vr$data,  V = f_vr$V,  yi = "lnVR",  moderator = MOD)
tuk_cvr <- maybe_tukey(dat = f_cvr$data, V = f_cvr$V, yi = "lnCVR", moderator = MOD)

lnRR

summary(res_rr$model)

Multivariate Meta-Analysis Model (k = 298; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-238.8518   477.7036   489.7036   511.8254   489.9953   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0495  0.2225     20     no  Study_ID 
sigma^2.2  0.2274  0.4768    298     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 295) = 5723.3737, p-val < .0001

Test of Moderators (coefficients 1:3):
F(df1 = 3, df2 = 295) = 5.1666, p-val = 0.0017

Model Results:

                           estimate      se     tval   df    pval    ci.lb 
Relative_timingBefore       -0.2276  0.0721  -3.1590  295  0.0017  -0.3695 
Relative_timingBoth         -0.1965  0.1394  -1.4096  295  0.1597  -0.4707 
Relative_timingConcurrent    0.3328  0.2469   1.3475  295  0.1788  -0.1532 
                             ci.ub     
Relative_timingBefore      -0.0858  ** 
Relative_timingBoth         0.0778     
Relative_timingConcurrent   0.8188     

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rr$r2
   R2_marginal R2_conditional 
        0.0220         0.1969 
res_rr$plot

tuk_rr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)  
2 - 1 == 0  0.03119    0.15099   0.207   0.8364  
3 - 1 == 0  0.56041    0.24810   2.259   0.0239 *
3 - 2 == 0  0.52922    0.25511   2.074   0.0380 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Adjusted p values reported -- none method)

lnVR

summary(res_vr$model)

Multivariate Meta-Analysis Model (k = 222; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-345.0522   690.1044   702.1044   722.4389   702.5006   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0962  0.3102     16     no  Study_ID 
sigma^2.2  1.2301  1.1091    222     no     ES_ID 
sigma^2.3  0.0000  0.0001      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 219) = 4389.4876, p-val < .0001

Test of Moderators (coefficients 1:3):
F(df1 = 3, df2 = 219) = 0.4882, p-val = 0.6908

Model Results:

                           estimate      se     tval   df    pval    ci.lb 
Relative_timingBefore        0.1733  0.1445   1.1996  219  0.2316  -0.1114 
Relative_timingBoth         -0.0209  0.2902  -0.0721  219  0.9426  -0.5928 
Relative_timingConcurrent    0.0074  0.5409   0.0136  219  0.9891  -1.0587 
                            ci.ub    
Relative_timingBefore      0.4581    
Relative_timingBoth        0.5509    
Relative_timingConcurrent  1.0735    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_vr$r2
   R2_marginal R2_conditional 
        0.0055         0.0776 
res_vr$plot

tuk_vr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)
2 - 1 == 0 -0.19425    0.31647  -0.614    0.539
3 - 1 == 0 -0.16596    0.54716  -0.303    0.762
3 - 2 == 0  0.02829    0.56931   0.050    0.960
(Adjusted p values reported -- none method)

lnCVR

summary(res_cvr$model)

Multivariate Meta-Analysis Model (k = 222; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-281.1298   562.2596   574.2596   594.5940   574.6558   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.1051  0.3241     16     no  Study_ID 
sigma^2.2  0.5934  0.7703    222     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 219) = 1587.2641, p-val < .0001

Test of Moderators (coefficients 1:3):
F(df1 = 3, df2 = 219) = 0.0805, p-val = 0.9706

Model Results:

                           estimate      se     tval   df    pval    ci.lb 
Relative_timingBefore        0.0414  0.1351   0.3062  219  0.7598  -0.2248 
Relative_timingBoth         -0.0876  0.2642  -0.3316  219  0.7405  -0.6082 
Relative_timingConcurrent   -0.0583  0.4153  -0.1405  219  0.8884  -0.8768 
                            ci.ub    
Relative_timingBefore      0.3075    
Relative_timingBoth        0.4330    
Relative_timingConcurrent  0.7601    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_cvr$r2
   R2_marginal R2_conditional 
        0.0045         0.1543 
res_cvr$plot

tuk_cvr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)
2 - 1 == 0 -0.12894    0.28206  -0.457    0.648
3 - 1 == 0 -0.09969    0.41646  -0.239    0.811
3 - 2 == 0  0.02925    0.43058   0.068    0.946
(Adjusted p values reported -- none method)

Music genre

MOD  <- "Meta_genre"
MODS <- "~ Meta_genre -1"


genre_labels <- c(
  "Mixed"  = "Mixed",
  "Popular Contemporary Music"       = "Contemporary",
  "Traditional Music / Folk / World"    = "World",
  "Western Art Music / Orchestral" = "Orchestral"
)



# 1) Filter each effect-size dataset (and subset the VCV accordingly)
f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)



# 2) Fit the three unimoderator models (same moderator, different yi/vi)
res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))



# 2b) Relabel x-axis in the orchard plots (so EPM/OFT/etc. show)
res_rr$plot  <- res_rr$plot  + scale_x_discrete(labels = genre_labels)
res_vr$plot  <- res_vr$plot  + scale_x_discrete(labels = genre_labels)
res_cvr$plot <- res_cvr$plot + scale_x_discrete(labels = genre_labels)





# 3) Tukey contrasts (use the filtered data + matched VCV for each dataset)

tuk_rr  <- maybe_tukey(dat = f_rr$data,  V = f_rr$V,  yi = "lnRR",  moderator = MOD)
tuk_vr  <- maybe_tukey(dat = f_vr$data,  V = f_vr$V,  yi = "lnVR",  moderator = MOD)
tuk_cvr <- maybe_tukey(dat = f_cvr$data, V = f_cvr$V, yi = "lnCVR", moderator = MOD)

lnRR

summary(res_rr$model)

Multivariate Meta-Analysis Model (k = 298; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-239.2750   478.5500   492.5500   518.3351   492.9416   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0497  0.2230     20     no  Study_ID 
sigma^2.2  0.2304  0.4800    298     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 294) = 5718.2060, p-val < .0001

Test of Moderators (coefficients 1:4):
F(df1 = 4, df2 = 294) = 3.2258, p-val = 0.0130

Model Results:

                                            estimate      se     tval   df 
Meta_genreMixed                              -0.2143  0.1467  -1.4605  294 
Meta_genrePopular Contemporary Music         -0.1015  0.1917  -0.5297  294 
Meta_genreTraditional Music / Folk / World   -0.5983  0.2594  -2.3068  294 
Meta_genreWestern Art Music / Orchestral     -0.1902  0.0766  -2.4812  294 
                                              pval    ci.lb    ci.ub    
Meta_genreMixed                             0.1452  -0.5030   0.0745    
Meta_genrePopular Contemporary Music        0.5968  -0.4787   0.2757    
Meta_genreTraditional Music / Folk / World  0.0218  -1.1088  -0.0878  * 
Meta_genreWestern Art Music / Orchestral    0.0137  -0.3410  -0.0393  * 

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rr$r2
   R2_marginal R2_conditional 
        0.0232         0.1966 
res_rr$plot

tuk_rr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)
2 - 1 == 0  0.11277    0.22999   0.490    0.624
3 - 1 == 0 -0.38403    0.29750  -1.291    0.197
4 - 1 == 0  0.02413    0.16005   0.151    0.880
3 - 2 == 0 -0.49680    0.31754  -1.565    0.118
4 - 2 == 0 -0.08864    0.19863  -0.446    0.655
4 - 3 == 0  0.40816    0.26934   1.515    0.130
(Adjusted p values reported -- none method)

lnVR

summary(res_vr$model)

Multivariate Meta-Analysis Model (k = 222; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-338.3565   676.7131   690.7131   714.4045   691.2464   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0000  0.0000     16     no  Study_ID 
sigma^2.2  1.2200  1.1045    222     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 218) = 4375.2042, p-val < .0001

Test of Moderators (coefficients 1:4):
F(df1 = 4, df2 = 218) = 3.7277, p-val = 0.0059

Model Results:

                                            estimate      se     tval   df 
Meta_genreMixed                              -0.0639  0.2850  -0.2243  218 
Meta_genrePopular Contemporary Music          0.9563  0.3203   2.9859  218 
Meta_genreTraditional Music / Folk / World    1.1263  0.4627   2.4341  218 
Meta_genreWestern Art Music / Orchestral     -0.0212  0.1180  -0.1793  218 
                                              pval    ci.lb   ci.ub     
Meta_genreMixed                             0.8228  -0.6256  0.4978     
Meta_genrePopular Contemporary Music        0.0032   0.3251  1.5876  ** 
Meta_genreTraditional Music / Folk / World  0.0157   0.2143  2.0383   * 
Meta_genreWestern Art Music / Orchestral    0.8579  -0.2538  0.2115     

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_vr$r2
   R2_marginal R2_conditional 
        0.0841         0.0841 
res_vr$plot

tuk_vr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)   
2 - 1 == 0  1.02023    0.42497   2.401   0.0164 * 
3 - 1 == 0  1.19024    0.54342   2.190   0.0285 * 
4 - 1 == 0  0.04276    0.30703   0.139   0.8892   
3 - 2 == 0  0.17001    0.56173   0.303   0.7622   
4 - 2 == 0 -0.97748    0.33961  -2.878   0.0040 **
4 - 3 == 0 -1.14749    0.47737  -2.404   0.0162 * 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Adjusted p values reported -- none method)

lnCVR

summary(res_cvr$model)

Multivariate Meta-Analysis Model (k = 222; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-273.3294   546.6587   560.6587   584.3502   561.1921   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0000  0.0000     16     no  Study_ID 
sigma^2.2  0.5893  0.7676    222     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 218) = 1563.1637, p-val < .0001

Test of Moderators (coefficients 1:4):
F(df1 = 4, df2 = 218) = 3.9471, p-val = 0.0041

Model Results:

                                            estimate      se     tval   df 
Meta_genreMixed                              -0.0789  0.2334  -0.3381  218 
Meta_genrePopular Contemporary Music          0.4492  0.2853   1.5742  218 
Meta_genreTraditional Music / Folk / World    1.3149  0.3865   3.4019  218 
Meta_genreWestern Art Music / Orchestral     -0.1322  0.1071  -1.2342  218 
                                              pval    ci.lb   ci.ub      
Meta_genreMixed                             0.7356  -0.5390  0.3812      
Meta_genrePopular Contemporary Music        0.1169  -0.1132  1.0116      
Meta_genreTraditional Music / Folk / World  0.0008   0.5531  2.0767  *** 
Meta_genreWestern Art Music / Orchestral    0.2185  -0.3433  0.0789      

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_cvr$r2
   R2_marginal R2_conditional 
        0.1359         0.1359 
res_cvr$plot

tuk_cvr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)    
2 - 1 == 0  0.52809    0.36032   1.466 0.142754    
3 - 1 == 0  1.39383    0.45139   3.088 0.002016 ** 
4 - 1 == 0 -0.05327    0.25340  -0.210 0.833498    
3 - 2 == 0  0.86574    0.47712   1.815 0.069597 .  
4 - 2 == 0 -0.58136    0.30018  -1.937 0.052781 .  
4 - 3 == 0 -1.44710    0.40050  -3.613 0.000302 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Adjusted p values reported -- none method)

Experimental design

MOD  <- "Experimental_design"
MODS <- "~ Experimental_design -1"


design_labels<-c(
  "Factorial"="Factorial",
  "Posttest-Only Control Group"="Posttest",
  "Repeated Measures"="Repeated"
  
)



# 1) Filter each effect-size dataset (and subset the VCV accordingly)
f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)



# 2) Fit the three unimoderator models (same moderator, different yi/vi)
res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))



# 2b) Relabel x-axis in the orchard plots (so EPM/OFT/etc. show)
res_rr$plot  <- res_rr$plot  + scale_x_discrete(labels = design_labels)
res_vr$plot  <- res_vr$plot  + scale_x_discrete(labels = design_labels)
res_cvr$plot <- res_cvr$plot + scale_x_discrete(labels = design_labels)





# 3) Tukey contrasts (use the filtered data + matched VCV for each dataset)

tuk_rr  <- maybe_tukey(dat = f_rr$data,  V = f_rr$V,  yi = "lnRR",  moderator = MOD)
tuk_vr  <- maybe_tukey(dat = f_vr$data,  V = f_vr$V,  yi = "lnVR",  moderator = MOD)
tuk_cvr <- maybe_tukey(dat = f_cvr$data, V = f_cvr$V, yi = "lnCVR", moderator = MOD)

lnRR

summary(res_rr$model)

Multivariate Meta-Analysis Model (k = 298; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-239.2296   478.4593   490.4593   512.5811   490.7509   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0442  0.2102     20     no  Study_ID 
sigma^2.2  0.2297  0.4793    298     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 295) = 5684.0603, p-val < .0001

Test of Moderators (coefficients 1:3):
F(df1 = 3, df2 = 295) = 5.0020, p-val = 0.0021

Model Results:

                                                estimate      se     tval   df 
Experimental_designFactorial                     -0.1772  0.0704  -2.5178  295 
Experimental_designPosttest-Only Control Group   -0.3808  0.1066  -3.5735  295 
Experimental_designRepeated Measures             -0.1624  0.2051  -0.7915  295 
                                                  pval    ci.lb    ci.ub      
Experimental_designFactorial                    0.0123  -0.3157  -0.0387    * 
Experimental_designPosttest-Only Control Group  0.0004  -0.5905  -0.1711  *** 
Experimental_designRepeated Measures            0.4293  -0.5660   0.2413      

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rr$r2
   R2_marginal R2_conditional 
        0.0224         0.1801 
res_rr$plot

tuk_rr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)  
2 - 1 == 0 -0.20356    0.10332  -1.970   0.0488 *
3 - 1 == 0  0.01485    0.21686   0.068   0.9454  
3 - 2 == 0  0.21841    0.23115   0.945   0.3447  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Adjusted p values reported -- none method)

lnVR

summary(res_vr$model)

Multivariate Meta-Analysis Model (k = 222; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-341.4846   682.9693   694.9693   715.3037   695.3655   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0000  0.0001     16     no  Study_ID 
sigma^2.2  1.2318  1.1099    222     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 219) = 4376.1207, p-val < .0001

Test of Moderators (coefficients 1:3):
F(df1 = 3, df2 = 219) = 3.6274, p-val = 0.0138

Model Results:

                                                estimate      se     tval   df 
Experimental_designFactorial                      0.0225  0.1185   0.1899  219 
Experimental_designPosttest-Only Control Group    0.6459  0.2007   3.2188  219 
Experimental_designRepeated Measures             -0.2031  0.3078  -0.6598  219 
                                                  pval    ci.lb   ci.ub     
Experimental_designFactorial                    0.8496  -0.2110  0.2560     
Experimental_designPosttest-Only Control Group  0.0015   0.2504  1.0414  ** 
Experimental_designRepeated Measures            0.5101  -0.8097  0.4035     

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_vr$r2
   R2_marginal R2_conditional 
         0.056          0.056 
res_vr$plot

tuk_vr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)   
2 - 1 == 0   0.6234     0.2173   2.869  0.00412 **
3 - 1 == 0  -0.2256     0.3298  -0.684  0.49399   
3 - 2 == 0  -0.8490     0.3674  -2.311  0.02085 * 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Adjusted p values reported -- none method)

lnCVR

summary(res_cvr$model)

Multivariate Meta-Analysis Model (k = 222; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-280.1420   560.2840   572.2840   592.6184   572.6802   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0560  0.2366     16     no  Study_ID 
sigma^2.2  0.5990  0.7739    222     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 219) = 1585.4977, p-val < .0001

Test of Moderators (coefficients 1:3):
F(df1 = 3, df2 = 219) = 0.7164, p-val = 0.5431

Model Results:

                                                estimate      se     tval   df 
Experimental_designFactorial                     -0.0239  0.1243  -0.1926  219 
Experimental_designPosttest-Only Control Group    0.2250  0.1831   1.2286  219 
Experimental_designRepeated Measures             -0.1655  0.3664  -0.4516  219 
                                                  pval    ci.lb   ci.ub    
Experimental_designFactorial                    0.8475  -0.2689  0.2210    
Experimental_designPosttest-Only Control Group  0.2205  -0.1359  0.5859    
Experimental_designRepeated Measures            0.6520  -0.8876  0.5567    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_cvr$r2
   R2_marginal R2_conditional 
        0.0200         0.1038 
res_cvr$plot

tuk_cvr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)
2 - 1 == 0   0.2489     0.1821   1.367    0.172
3 - 1 == 0  -0.1415     0.3869  -0.366    0.715
3 - 2 == 0  -0.3904     0.4096  -0.953    0.341
(Adjusted p values reported -- none method)

Sex

MOD  <- "Sex"
MODS <- "~ Sex"

f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)

res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))

lnRR

summary(res_rr$model)

Multivariate Meta-Analysis Model (k = 295; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-238.9455   477.8911   487.8911   506.2920   488.1002   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0420  0.2050     19     no  Study_ID 
sigma^2.2  0.2300  0.4796    295     no     ES_ID 
sigma^2.3  0.0096  0.0981      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 293) = 5730.3718, p-val < .0001

Test of Moderators (coefficient 2):
F(df1 = 1, df2 = 293) = 2.7371, p-val = 0.0991

Model Results:

         estimate      se     tval   df    pval    ci.lb    ci.ub     
intrcpt   -0.3100  0.1015  -3.0543  293  0.0025  -0.5098  -0.1103  ** 
SexMale    0.1529  0.0924   1.6544  293  0.0991  -0.0290   0.3348   . 

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rr$r2
   R2_marginal R2_conditional 
        0.0194         0.1993 
res_rr$plot

lnVR

summary(res_vr$model)

Multivariate Meta-Analysis Model (k = 219; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-342.8395   685.6790   695.6790   712.5785   695.9634   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0900  0.3001     15     no  Study_ID 
sigma^2.2  1.2406  1.1138    219     no     ES_ID 
sigma^2.3  0.0000  0.0001      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 217) = 4383.5230, p-val < .0001

Test of Moderators (coefficient 2):
F(df1 = 1, df2 = 217) = 0.3114, p-val = 0.5774

Model Results:

         estimate      se    tval   df    pval    ci.lb   ci.ub    
intrcpt    0.0666  0.2034  0.3275  217  0.7436  -0.3342  0.4675    
SexMale    0.1276  0.2287  0.5580  217  0.5774  -0.3232  0.5784    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_vr$r2
   R2_marginal R2_conditional 
        0.0030         0.0704 
res_vr$plot

lnCVR

summary(res_cvr$model)

Multivariate Meta-Analysis Model (k = 219; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-278.1954   556.3907   566.3907   583.2902   566.6751   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0692  0.2630     15     no  Study_ID 
sigma^2.2  0.5972  0.7728    219     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 217) = 1572.7582, p-val < .0001

Test of Moderators (coefficient 2):
F(df1 = 1, df2 = 217) = 2.0491, p-val = 0.1537

Model Results:

         estimate      se     tval   df    pval    ci.lb   ci.ub    
intrcpt   -0.1386  0.1715  -0.8083  217  0.4198  -0.4766  0.1994    
SexMale    0.2616  0.1827   1.4315  217  0.1537  -0.0986  0.6217    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_cvr$r2
   R2_marginal R2_conditional 
        0.0244         0.1256 
res_cvr$plot

Exposure duration

Music_exposure_duration

MOD  <- "Music_exposure_duration"
MODS <- "~ Music_exposure_duration -1"





# 1) Filter each effect-size dataset (and subset the VCV accordingly)
f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)



# 2) Fit the three unimoderator models (same moderator, different yi/vi)
res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))







# 3) Tukey contrasts (use the filtered data + matched VCV for each dataset)

tuk_rr  <- maybe_tukey(dat = f_rr$data,  V = f_rr$V,  yi = "lnRR",  moderator = MOD)
tuk_vr  <- maybe_tukey(dat = f_vr$data,  V = f_vr$V,  yi = "lnVR",  moderator = MOD)
tuk_cvr <- maybe_tukey(dat = f_cvr$data, V = f_cvr$V, yi = "lnCVR", moderator = MOD)

lnRR

summary(res_rr$model)

Multivariate Meta-Analysis Model (k = 297; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-239.5997   479.1994   491.1994   513.3009   491.4921   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0512  0.2263     20     no  Study_ID 
sigma^2.2  0.2319  0.4816    297     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 294) = 5777.2420, p-val < .0001

Test of Moderators (coefficients 1:3):
F(df1 = 3, df2 = 294) = 3.8341, p-val = 0.0102

Model Results:

                               estimate      se     tval   df    pval    ci.lb 
Music_exposure_durationAcute    -0.2660  0.1118  -2.3798  294  0.0180  -0.4860 
Music_exposure_durationMedium   -0.0642  0.1396  -0.4599  294  0.6459  -0.3389 
Music_exposure_durationShort    -0.2495  0.1052  -2.3722  294  0.0183  -0.4566 
                                 ci.ub    
Music_exposure_durationAcute   -0.0460  * 
Music_exposure_durationMedium   0.2105    
Music_exposure_durationShort   -0.0425  * 

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rr$r2
   R2_marginal R2_conditional 
        0.0216         0.1986 
res_rr$plot

tuk_rr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)
2 - 1 == 0  0.20184    0.17884   1.129    0.259
3 - 1 == 0  0.01649    0.15350   0.107    0.914
3 - 2 == 0 -0.18535    0.17479  -1.060    0.289
(Adjusted p values reported -- none method)

lnVR

summary(res_vr$model)

Multivariate Meta-Analysis Model (k = 222; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-344.5642   689.1285   701.1285   721.4629   701.5247   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.1181  0.3437     16     no  Study_ID 
sigma^2.2  1.2224  1.1056    222     no     ES_ID 
sigma^2.3  0.0000  0.0001      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 219) = 4390.2022, p-val < .0001

Test of Moderators (coefficients 1:3):
F(df1 = 3, df2 = 219) = 0.5542, p-val = 0.6458

Model Results:

                               estimate      se    tval   df    pval    ci.lb 
Music_exposure_durationAcute     0.2718  0.2202  1.2345  219  0.2183  -0.1621 
Music_exposure_durationMedium    0.0052  0.2628  0.0198  219  0.9843  -0.5127 
Music_exposure_durationShort     0.0873  0.2348  0.3717  219  0.7105  -0.3754 
                                ci.ub    
Music_exposure_durationAcute   0.7057    
Music_exposure_durationMedium  0.5231    
Music_exposure_durationShort   0.5499    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_vr$r2
   R2_marginal R2_conditional 
        0.0101         0.0973 
res_vr$plot

tuk_vr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)
2 - 1 == 0 -0.26659    0.34281  -0.778    0.437
3 - 1 == 0 -0.18452    0.32184  -0.573    0.566
3 - 2 == 0  0.08207    0.35236   0.233    0.816
(Adjusted p values reported -- none method)

lnCVR

summary(res_cvr$model)

Multivariate Meta-Analysis Model (k = 222; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-280.5247   561.0493   573.0493   593.3838   573.4456   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.1365  0.3695     16     no  Study_ID 
sigma^2.2  0.5889  0.7674    222     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 219) = 1588.0953, p-val < .0001

Test of Moderators (coefficients 1:3):
F(df1 = 3, df2 = 219) = 0.0367, p-val = 0.9906

Model Results:

                               estimate      se     tval   df    pval    ci.lb 
Music_exposure_durationAcute     0.0200  0.2204   0.0907  219  0.9278  -0.4143 
Music_exposure_durationMedium   -0.0405  0.2568  -0.1579  219  0.8747  -0.5466 
Music_exposure_durationShort     0.0610  0.2200   0.2771  219  0.7820  -0.3726 
                                ci.ub    
Music_exposure_durationAcute   0.4543    
Music_exposure_durationMedium  0.4655    
Music_exposure_durationShort   0.4945    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_cvr$r2
   R2_marginal R2_conditional 
        0.0018         0.1897 
res_cvr$plot

tuk_cvr

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: metafor::rma.mv(yi = dat[[yi]], V = V, mods = mods_formula, data = dat, 
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", 
    test = "t", sparse = TRUE)

Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)
2 - 1 == 0 -0.06054    0.33837  -0.179    0.858
3 - 1 == 0  0.04097    0.31138   0.132    0.895
3 - 2 == 0  0.10151    0.33811   0.300    0.764
(Adjusted p values reported -- none method)

Experimental procedure

MOD  <- "Experimental_procedures"
MODS <- "~ Experimental_procedures"

f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)

res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))

lnRR

summary(res_rr$model)

Multivariate Meta-Analysis Model (k = 298; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-241.9324   483.8649   493.8649   512.3167   494.0718   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0546  0.2337     20     no  Study_ID 
sigma^2.2  0.2291  0.4786    298     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 296) = 5737.2572, p-val < .0001

Test of Moderators (coefficient 2):
F(df1 = 1, df2 = 296) = 0.6644, p-val = 0.4157

Model Results:

                             estimate      se     tval   df    pval    ci.lb 
intrcpt                       -0.2227  0.0696  -3.1977  296  0.0015  -0.3597 
Experimental_proceduresSham    0.0892  0.1094   0.8151  296  0.4157  -0.1262 
                               ci.ub     
intrcpt                      -0.0856  ** 
Experimental_proceduresSham   0.3045     

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rr$r2
   R2_marginal R2_conditional 
        0.0045         0.1961 
res_rr$plot

lnVR

summary(res_vr$model)

Multivariate Meta-Analysis Model (k = 222; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-346.5640   693.1281   703.1281   720.0962   703.4085   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0901  0.3001     16     no  Study_ID 
sigma^2.2  1.2265  1.1075    222     no     ES_ID 
sigma^2.3  0.0000  0.0001      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 220) = 4386.6575, p-val < .0001

Test of Moderators (coefficient 2):
F(df1 = 1, df2 = 220) = 0.2591, p-val = 0.6112

Model Results:

                             estimate      se     tval   df    pval    ci.lb 
intrcpt                        0.1558  0.1362   1.1438  220  0.2539  -0.1126 
Experimental_proceduresSham   -0.1239  0.2434  -0.5090  220  0.6112  -0.6036 
                              ci.ub    
intrcpt                      0.4242    
Experimental_proceduresSham  0.3558    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_vr$r2
   R2_marginal R2_conditional 
        0.0021         0.0704 
res_vr$plot

lnCVR

summary(res_cvr$model)

Multivariate Meta-Analysis Model (k = 222; method: REML)

   logLik   Deviance        AIC        BIC       AICc   
-282.4682   564.9365   574.9365   591.9046   575.2168   

Variance Components:

            estim    sqrt  nlvls  fixed    factor 
sigma^2.1  0.0911  0.3019     16     no  Study_ID 
sigma^2.2  0.5936  0.7705    222     no     ES_ID 
sigma^2.3  0.0000  0.0000      6     no    Strain 

Test for Residual Heterogeneity:
QE(df = 220) = 1584.4200, p-val < .0001

Test of Moderators (coefficient 2):
F(df1 = 1, df2 = 220) = 0.0651, p-val = 0.7989

Model Results:

                             estimate      se     tval   df    pval    ci.lb 
intrcpt                        0.0246  0.1252   0.1963  220  0.8446  -0.2221 
Experimental_proceduresSham   -0.0492  0.1927  -0.2551  220  0.7989  -0.4289 
                              ci.ub    
intrcpt                      0.2712    
Experimental_proceduresSham  0.3306    

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_cvr$r2
   R2_marginal R2_conditional 
        0.0006         0.1336 
res_cvr$plot

Note
sessionInfo()
R version 4.5.2 (2025-10-31 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26200)

Matrix products: default
  LAPACK version 3.12.1

locale:
[1] LC_COLLATE=English_Guernsey.utf8  LC_CTYPE=English_Guernsey.utf8   
[3] LC_MONETARY=English_Guernsey.utf8 LC_NUMERIC=C                     
[5] LC_TIME=English_Guernsey.utf8    

time zone: America/Edmonton
tzcode source: internal

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

other attached packages:
 [1] multcomp_1.4-29     TH.data_1.1-5       MASS_7.3-65        
 [4] survival_3.8-6      mvtnorm_1.3-3       orchaRd_2.1.3      
 [7] metafor_4.8-0       numDeriv_2016.8-1.1 metadat_1.4-0      
[10] Matrix_1.7-4        patchwork_1.3.2     lubridate_1.9.4    
[13] forcats_1.0.1       stringr_1.6.0       dplyr_1.1.4        
[16] purrr_1.2.1         readr_2.1.6         tidyr_1.3.2        
[19] tibble_3.3.1        ggplot2_4.0.1       tidyverse_2.0.0    
[22] knitr_1.51          here_1.0.2          dtplyr_1.3.2       
[25] DT_0.34.0          

loaded via a namespace (and not attached):
 [1] beeswarm_0.4.0      gtable_0.3.6        xfun_0.56          
 [4] htmlwidgets_1.6.4   lattice_0.22-7      mathjaxr_2.0-0     
 [7] tzdb_0.5.0          vctrs_0.7.1         tools_4.5.2        
[10] generics_0.1.4      parallel_4.5.2      sandwich_3.1-1     
[13] pacman_0.5.1        pkgconfig_2.0.3     data.table_1.18.2.1
[16] RColorBrewer_1.1-3  S7_0.2.1            lifecycle_1.0.5    
[19] compiler_4.5.2      farver_2.1.2        codetools_0.2-20   
[22] vipor_0.4.7         htmltools_0.5.9     yaml_2.3.12        
[25] crayon_1.5.3        pillar_1.11.1       nlme_3.1-168       
[28] tidyselect_1.2.1    digest_0.6.39       stringi_1.8.7      
[31] labeling_0.4.3      splines_4.5.2       latex2exp_0.9.8    
[34] rprojroot_2.1.1     fastmap_1.2.0       grid_4.5.2         
[37] cli_3.6.5           magrittr_2.0.4      withr_3.0.2        
[40] scales_1.4.0        bit64_4.6.0-1       ggbeeswarm_0.7.3   
[43] estimability_1.5.1  timechange_0.3.0    rmarkdown_2.30     
[46] emmeans_2.0.1       bit_4.6.0           otel_0.2.0         
[49] zoo_1.8-15          hms_1.1.4           coda_0.19-4.1      
[52] evaluate_1.0.5      rlang_1.1.7         xtable_1.8-4       
[55] glue_1.8.0          rstudioapi_0.18.0   vroom_1.7.0        
[58] jsonlite_2.0.0      R6_2.6.1           
Overall effects
Publication bias
Source Code
---
title: "Uni-moderators"
---


We fit uni-moderator multilevel meta-regressions to test whether study characteristics predict differences in:

- the mean response (lnRR),

- absolute variability (lnVR),

- relative variability (lnCVR).

Each moderator is analysed separately (uni-moderator), using the same random-effects structure (`Study_ID`, `ES_ID`, Strain`) and a cohort-level VCV matrix (rho = 0.5). For categorical moderators, we drop levels with fewer than five effect sizes (k < 5) within each effect size metric, and subset the corresponding VCV matrix accordingly.





```{r}
#| label: setup_unimoderators

pacman::p_load(
  DT, dtplyr, here, knitr, tidyverse, patchwork, metafor, orchaRd, multcomp
)

db_all <- readr::read_csv(here("..","data","db_effect_sizes.csv")) %>%
  mutate(across(where(is.character), as.factor)) %>%
  mutate(across(c(lnRR, lnRR_var, lnVR, lnVR_var, lnCVR, lnCVR_var), as.numeric))%>%
  mutate(
    Control_conditions = as.character(Control_conditions),
    Control_conditions = dplyr::recode(
      Control_conditions,
      "ambiet sound" = "Ambient sound",
      "white noise"  = "White noise"
    ),
    Control_conditions = factor(Control_conditions)
  )

# Per-metric datasets
db_rr  <- db_all %>% filter(!is.na(lnRR),  !is.na(lnRR_var))
db_vr  <- db_all %>% filter(!is.na(lnVR),  !is.na(lnVR_var))
db_cvr <- db_all %>% filter(!is.na(lnCVR), !is.na(lnCVR_var))

# Per-metric VCV matrices (rho = 0.5)
VCV_rr <- metafor::vcalc(vi = lnRR_var,  cluster = Cohort_ID, obs = ES_ID, rho = 0.5, data = db_rr)
VCV_vr <- metafor::vcalc(vi = lnVR_var,  cluster = Cohort_ID, obs = ES_ID, rho = 0.5, data = db_vr)
VCV_cvr<- metafor::vcalc(vi = lnCVR_var, cluster = Cohort_ID, obs = ES_ID, rho = 0.5, data = db_cvr)


```




::: callout-note
## Helper functions
Filter to common moderator levels (k ≥ 5 in each metric)
```{r}
#| label: filter_common_levels
#| code-fold: true

filter_low_k_single <- function(dat, V, moderator, min_k = 5) {
  mod_chr <- moderator
  # If moderator is not a factor, just return as-is
  if (!is.factor(dat[[mod_chr]])) {
    return(list(data = dat, V = V, keep_levels = NULL, k = NULL))
  }

  k_counts <- dat %>%
    count(.data[[mod_chr]], name = "k_es")

  keep_levels <- k_counts %>%
    filter(k_es >= min_k) %>%
    pull(.data[[mod_chr]])

  dat_f <- dat %>% filter(.data[[mod_chr]] %in% keep_levels)
  idx   <- which(dat[[mod_chr]] %in% keep_levels)
  V_f   <- V[idx, idx, drop = FALSE]

  list(data = dat_f, V = V_f, keep_levels = keep_levels, k = k_counts)
}


```


Fit one uni-moderator model + plot 

```{r}
#| label: fit_one_unimod
#| code-fold: true

fit_unimod <- function(dat, V, yi, mods_formula, mod_name, xlab_expr) {

  # Guard: if nothing left after filtering
  if (nrow(dat) < 2) return(NULL)

  mod <- metafor::rma.mv(
    yi = dat[[yi]],
    V  = V,
    mods = as.formula(mods_formula),
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain),
    test = "t",
    method = "REML",
    sparse = TRUE,
    data = dat
  )

  list(
    data  = dat,
    model = mod,
    r2    = round(orchaRd::r2_ml(mod), 4),
    i2    = orchaRd::i2_ml(mod),
    plot  = orchard_plot(
      mod,
      mod   = mod_name,       
      group = "Study_ID",
      xlab  = xlab_expr,
      flip  = TRUE,
      legend.pos  = "top.left",
      trunk.size  = 0.3,
      branch.size = 2,
      alpha       = 0.3
    ) +
      scale_colour_brewer(palette = "Set1") +
      scale_fill_brewer(palette = "Dark2") +
      theme(legend.direction = "vertical")
  )
}


```

Optional Tukey contrasts 

```{r}
#| label: tukey_if_no_intercept
#| code-fold: true

maybe_tukey <- function(dat, V, yi, moderator, min_k = 3) {

  dat <- dat %>%
    mutate("{moderator}" := droplevels(as.factor(.data[[moderator]])))

  k <- nlevels(dat[[moderator]])
  if (is.na(k) || k < min_k) return(NULL)

  # Fit without intercept so coef = one per level
  mods_formula <- as.formula(paste0("~ ", moderator, " - 1"))

  m <- metafor::rma.mv(
    yi = dat[[yi]],
    V  = V,
    mods = mods_formula,
    random = list(~1 | Study_ID,
                  ~1 | ES_ID,
                  ~1 | Strain),
    test = "t",
    method = "REML",
    sparse = TRUE,
    data = dat
  )

  cn <- names(coef(m))
  K <- multcomp::contrMat(rep(1, k), type = "Tukey")
  colnames(K) <- cn

  g <- multcomp::glht(m, linfct = K)

 
  base::summary(g, test = multcomp::adjusted("none"))
}
```


:::


## Outcome type

```{r}
#| label: run_outcome_type
MOD  <- "Outcome_type"
MODS <- "~ Outcome_type"

f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)

res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))


```




:::: columns

:::: {.column width="49%"}
### lnRR
```{r}
summary(res_rr$model)
```
```{r}
#| label: outcome_type_lnRR_r2
res_rr$r2
```

::: card
```{r}
#| label: outcome_type_lnRR_plot
res_rr$plot
```
:::

:::

:::: {.column width="2%"} ::::
:::


:::: {.column width="49%"}

### lnVR

```{r}
#| label: outcome_type_lnVR_summary
summary(res_vr$model)
```


```{r}
#| label: outcome_type_lnVR_r2
res_vr$r2
```

::: card
```{r}
#| label: outcome_type_lnVR_plot
res_vr$plot
```
:::

:::

:::


:::: {.column width="25%"} 
::::
:::: {.column width="50%"}
### lnCVR
```{r}
#| label: outcome_type_lnCVR_summary
summary(res_cvr$model)
```

```{r}
#| label: outcome_type_lnCVR_r2
res_cvr$r2
```

::: card
```{r}
#| label: outcome_type_lnCVR_plot
res_cvr$plot
```
:::
:::
:::: {.column width="25%"}
:::







## Behavioral assay

```{r}
#| label: run_Assay_type
MOD  <- "Assay_type"
MODS <- "~ Assay_type - 1"


assay_labels <- c(
  "Elevated Plus Maze" = "EPM",
  "Open Field Test" = "OFT",
  "Light-Dark Box" = "LDB",
  "Forced Swim Test (FST)" = "FST",
  "Tail Suspension Test (TST)" = "TST",
  "Sucrose Preference Test (SPT)" = "SPT"
)


# 1) Filter each effect-size dataset (and subset the VCV accordingly)
f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)
# 2) Fit the three unimoderator models (same moderator, different yi/vi)
res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))

# 2b) Relabel x-axis in the orchard plots (so EPM/OFT/etc. show)
res_rr$plot  <- res_rr$plot  + scale_x_discrete(labels = assay_labels)
res_vr$plot  <- res_vr$plot  + scale_x_discrete(labels = assay_labels)
res_cvr$plot <- res_cvr$plot + scale_x_discrete(labels = assay_labels)

# 3) Tukey contrasts (use the filtered data + matched VCV for each dataset)

tuk_rr  <- maybe_tukey(dat = f_rr$data,  V = f_rr$V,  yi = "lnRR",  moderator = MOD)
tuk_vr  <- maybe_tukey(dat = f_vr$data,  V = f_vr$V,  yi = "lnVR",  moderator = MOD)
tuk_cvr <- maybe_tukey(dat = f_cvr$data, V = f_cvr$V, yi = "lnCVR", moderator = MOD)

```






:::: columns

:::: {.column width="49%"}
### lnRR
```{r}
summary(res_rr$model)
```
```{r}
#| label: Assay_type_lnRR_r2
res_rr$r2
```

::: card
```{r}
#| label: Assay_type_lnRR_plot
res_rr$plot
```
:::
```{r}
#| label: assay_lnRR_tukey
tuk_rr
```

:::

:::: {.column width="2%"} ::::
:::


:::: {.column width="49%"}

### lnVR

```{r}
#| label: assay_lnVR_summary
summary(res_vr$model)
```


```{r}
#| label: assay_lnVR_r2
res_vr$r2
```

::: card
```{r}
#| label: assay_lnVR_plot
res_vr$plot
```
:::
```{r}
#| label: assay_lnVR_tukey
tuk_vr
```
:::

:::


:::: {.column width="25%"} 
::::
:::: {.column width="50%"}
### lnCVR
```{r}
#| label: assay_lnCVR_summary
summary(res_cvr$model)
```

```{r}
#| label: assay_lnCVR_r2
res_cvr$r2
```

::: card
```{r}
#| label: assay_lnCVR_plot
res_cvr$plot
```
:::

```{r}
#| label: assay_lnCVR_tukey
tuk_cvr

```

:::
:::: {.column width="25%"}
:::




## Behavioral mechanism

```{r}
#| label: run_mechanism
MOD  <- "Induced behaviour"
MODS <- "~ `Induced behaviour`"

f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)

res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))


```




:::: columns

:::: {.column width="49%"}
### lnRR
```{r}
summary(res_rr$model)
```
```{r}
#| label: mechanism_lnRR_r2
res_rr$r2
```

::: card
```{r}
#| label: mechanism_lnRR_plot
res_rr$plot
```
:::

:::

:::: {.column width="2%"} ::::
:::


:::: {.column width="49%"}

### lnVR

```{r}
#| label: mechanism_lnVR_summary
summary(res_vr$model)
```


```{r}
#| label: mechanism_lnVR_r2
res_vr$r2
```

::: card
```{r}
#| label: mechanism_lnVR_plot
res_vr$plot
```
:::

:::

:::


:::: {.column width="25%"} 
::::
:::: {.column width="50%"}
### lnCVR
```{r}
#| label: mechanism_lnCVR_summary
summary(res_cvr$model)
```

```{r}
#| label: mechanism_lnCVR_r2
res_cvr$r2
```

::: card
```{r}
#| label: mechanism_lnCVR_plot
res_cvr$plot
```
:::
:::
:::: {.column width="25%"}
:::





## Lifestage of exposure


```{r}
#| label: run_Lifestage
MOD  <- "Lifestage_exposure"
MODS <- "~ Lifestage_exposure -1"


lifestage_labels <- c(
  "Adolescent"  = "Adol.",
  "Adult"       = "Adult",
  "Juvenile"    = "Juv.",
  "Young adult" = "Y. adult",
  "Mixed"       = "Mixed",
  "Unclear"     = "Unclear"
)



# 1) Filter each effect-size dataset (and subset the VCV accordingly)
f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)



# 2) Fit the three unimoderator models (same moderator, different yi/vi)
res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))

# 2b) Relabel x-axis in the orchard plots (so EPM/OFT/etc. show)
res_rr$plot  <- res_rr$plot  + scale_x_discrete(labels = lifestage_labels)
res_vr$plot  <- res_vr$plot  + scale_x_discrete(labels = lifestage_labels)
res_cvr$plot <- res_cvr$plot + scale_x_discrete(labels = lifestage_labels)

# 3) Tukey contrasts (use the filtered data + matched VCV for each dataset)

tuk_rr  <- maybe_tukey(dat = f_rr$data,  V = f_rr$V,  yi = "lnRR",  moderator = MOD)
tuk_vr  <- maybe_tukey(dat = f_vr$data,  V = f_vr$V,  yi = "lnVR",  moderator = MOD)
tuk_cvr <- maybe_tukey(dat = f_cvr$data, V = f_cvr$V, yi = "lnCVR", moderator = MOD)

```






:::: columns

:::: {.column width="49%"}
### lnRR
```{r}
summary(res_rr$model)
```
```{r}
#| label: Lifestage_lnRR_r2
res_rr$r2
```

::: card
```{r}
#| label: Lifestage_lnRR_plot
res_rr$plot
```
:::
```{r}
#| label: Lifestage_lnRR_tukey
tuk_rr
```

:::

:::: {.column width="2%"} ::::
:::


:::: {.column width="49%"}

### lnVR

```{r}
#| label: Lifestage_lnVR_summary
summary(res_vr$model)
```


```{r}
#| label: Lifestage_lnVR_r2
res_vr$r2
```

::: card
```{r}
#| label: Lifestage_lnVR_plot
res_vr$plot
```
:::
```{r}
#| label: Lifestage_lnVR_tukey
tuk_vr
```
:::

:::


:::: {.column width="25%"} 
::::
:::: {.column width="50%"}
### lnCVR
```{r}
#| label: Lifestage_lnCVR_summary
summary(res_cvr$model)
```

```{r}
#| label: Lifestage_lnCVR_r2
res_cvr$r2
```

::: card
```{r}
#| label: Lifestage_lnCVR_plot
res_cvr$plot
```
:::

```{r}
#| label: Lifestage_lnCVR_tukey
tuk_cvr

```

:::
:::: {.column width="25%"}
:::


## Control conditions

```{r}
#| label: run_Control_conditions
MOD  <- "Control_conditions"
MODS <- "~ `Control_conditions`"

f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)

res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))


```




:::: columns

:::: {.column width="49%"}
### lnRR
```{r}
summary(res_rr$model)
```
```{r}
#| label: Control_conditions_lnRR_r2
res_rr$r2
```

::: card
```{r}
#| label: Control_conditions_lnRR_plot
res_rr$plot
```
:::

:::

:::: {.column width="2%"} ::::
:::


:::: {.column width="49%"}

### lnVR

```{r}
#| label: Control_conditions_lnVR_summary
summary(res_vr$model)
```


```{r}
#| label: Control_conditions_lnVR_r2
res_vr$r2
```

::: card
```{r}
#| label: Control_conditions_lnVR_plot
res_vr$plot
```
:::

:::

:::


:::: {.column width="25%"} 
::::
:::: {.column width="50%"}
### lnCVR
```{r}
#| label: Control_conditions_lnCVR_summary
summary(res_cvr$model)
```

```{r}
#| label: Control_conditions_lnCVR_r2
res_cvr$r2
```

::: card
```{r}
#| label: Control_conditions_lnCVR_plot
res_cvr$plot
```
:::
:::




## Relative timing


```{r}
#| label: run_relative
MOD  <- "Relative_timing"
MODS <- "~ Relative_timing -1"





# 1) Filter each effect-size dataset (and subset the VCV accordingly)
f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)



# 2) Fit the three unimoderator models (same moderator, different yi/vi)
res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))



# 3) Tukey contrasts (use the filtered data + matched VCV for each dataset)

tuk_rr  <- maybe_tukey(dat = f_rr$data,  V = f_rr$V,  yi = "lnRR",  moderator = MOD)
tuk_vr  <- maybe_tukey(dat = f_vr$data,  V = f_vr$V,  yi = "lnVR",  moderator = MOD)
tuk_cvr <- maybe_tukey(dat = f_cvr$data, V = f_cvr$V, yi = "lnCVR", moderator = MOD)

```






:::: columns

:::: {.column width="49%"}
### lnRR
```{r}
summary(res_rr$model)
```
```{r}
#| label: Relative_timing_lnRR_r2
res_rr$r2
```

::: card
```{r}
#| label: Relative_timing_lnRR_plot
res_rr$plot
```
:::
```{r}
#| label: Relative_timing_lnRR_tukey
tuk_rr
```
:::

:::: {.column width="2%"} 
::::


:::: {.column width="49%"}

### lnVR

```{r}
#| label: Relative_timing_lnVR_summary
summary(res_vr$model)
```


```{r}
#| label: Relative_timing_lnVR_r2
res_vr$r2
```

::: card
```{r}
#| label: Relative_timing_lnVR_plot
res_vr$plot
```
:::
```{r}
#| label: Relative_timing_lnVR_tukey
tuk_vr
```
:::




:::: {.column width="25%"} 
::::

:::: {.column width="50%"}
### lnCVR
```{r}
#| label: Relative_timing_lnCVR_summary
summary(res_cvr$model)
```

```{r}
#| label: Relative_timing_lnCVR_r2
res_cvr$r2
```

::: card
```{r}
#| label: Relative_timing_lnCVR_plot
res_cvr$plot
```
:::

```{r}
#| label: Relative_timing_lnCVR_tukey
tuk_cvr

```

:::
:::: {.column width="25%"}
:::


## Music genre









```{r}
#| label: run_genre
MOD  <- "Meta_genre"
MODS <- "~ Meta_genre -1"


genre_labels <- c(
  "Mixed"  = "Mixed",
  "Popular Contemporary Music"       = "Contemporary",
  "Traditional Music / Folk / World"    = "World",
  "Western Art Music / Orchestral" = "Orchestral"
)



# 1) Filter each effect-size dataset (and subset the VCV accordingly)
f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)



# 2) Fit the three unimoderator models (same moderator, different yi/vi)
res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))



# 2b) Relabel x-axis in the orchard plots (so EPM/OFT/etc. show)
res_rr$plot  <- res_rr$plot  + scale_x_discrete(labels = genre_labels)
res_vr$plot  <- res_vr$plot  + scale_x_discrete(labels = genre_labels)
res_cvr$plot <- res_cvr$plot + scale_x_discrete(labels = genre_labels)





# 3) Tukey contrasts (use the filtered data + matched VCV for each dataset)

tuk_rr  <- maybe_tukey(dat = f_rr$data,  V = f_rr$V,  yi = "lnRR",  moderator = MOD)
tuk_vr  <- maybe_tukey(dat = f_vr$data,  V = f_vr$V,  yi = "lnVR",  moderator = MOD)
tuk_cvr <- maybe_tukey(dat = f_cvr$data, V = f_cvr$V, yi = "lnCVR", moderator = MOD)

```






:::: columns

:::: {.column width="49%"}
### lnRR
```{r}
summary(res_rr$model)
```
```{r}
#| label: Meta_genre_lnRR_r2
res_rr$r2
```

::: card
```{r}
#| label: Meta_genre_lnRR_plot
res_rr$plot
```
:::
```{r}
#| label: Meta_genre_lnRR_tukey
tuk_rr
```

:::

:::: {.column width="2%"} ::::
:::


:::: {.column width="49%"}

### lnVR

```{r}
#| label: Meta_genre_lnVR_summary
summary(res_vr$model)
```


```{r}
#| label: Meta_genre_lnVR_r2
res_vr$r2
```

::: card
```{r}
#| label: Meta_genre_lnVR_plot
res_vr$plot
```
:::
```{r}
#| label: Meta_genre_lnVR_tukey
tuk_vr
```
:::

:::


:::: {.column width="25%"} 
::::
:::: {.column width="50%"}
### lnCVR
```{r}
#| label: Meta_genre_lnCVR_summary
summary(res_cvr$model)
```

```{r}
#| label: Meta_genre_lnCVR_r2
res_cvr$r2
```

::: card
```{r}
#| label: Meta_genre_lnCVR_plot
res_cvr$plot
```
:::

```{r}
#| label: Meta_genre_lnCVR_tukey
tuk_cvr

```

:::
:::: {.column width="25%"}
:::




## Experimental design






```{r}
#| label: run_Experimental_design
MOD  <- "Experimental_design"
MODS <- "~ Experimental_design -1"


design_labels<-c(
  "Factorial"="Factorial",
  "Posttest-Only Control Group"="Posttest",
  "Repeated Measures"="Repeated"
  
)



# 1) Filter each effect-size dataset (and subset the VCV accordingly)
f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)



# 2) Fit the three unimoderator models (same moderator, different yi/vi)
res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))



# 2b) Relabel x-axis in the orchard plots (so EPM/OFT/etc. show)
res_rr$plot  <- res_rr$plot  + scale_x_discrete(labels = design_labels)
res_vr$plot  <- res_vr$plot  + scale_x_discrete(labels = design_labels)
res_cvr$plot <- res_cvr$plot + scale_x_discrete(labels = design_labels)





# 3) Tukey contrasts (use the filtered data + matched VCV for each dataset)

tuk_rr  <- maybe_tukey(dat = f_rr$data,  V = f_rr$V,  yi = "lnRR",  moderator = MOD)
tuk_vr  <- maybe_tukey(dat = f_vr$data,  V = f_vr$V,  yi = "lnVR",  moderator = MOD)
tuk_cvr <- maybe_tukey(dat = f_cvr$data, V = f_cvr$V, yi = "lnCVR", moderator = MOD)

```






:::: columns

:::: {.column width="49%"}
### lnRR
```{r}
summary(res_rr$model)
```
```{r}
#| label: Experimental_design_lnRR_r2
res_rr$r2
```

::: card
```{r}
#| label: Experimental_design_lnRR_plot
res_rr$plot
```
:::
```{r}
#| label: Experimental_design_lnRR_tukey
tuk_rr
```

:::

:::: {.column width="2%"} ::::
:::


:::: {.column width="49%"}

### lnVR

```{r}
#| label: Experimental_design_lnVR_summary
summary(res_vr$model)
```


```{r}
#| label: Experimental_design_lnVR_r2
res_vr$r2
```

::: card
```{r}
#| label: Experimental_design_lnVR_plot
res_vr$plot
```
:::
```{r}
#| label: Experimental_design_lnVR_tukey
tuk_vr
```
:::

:::


:::: {.column width="25%"} 
::::
:::: {.column width="50%"}
### lnCVR
```{r}
#| label: Experimental_design_lnCVR_summary
summary(res_cvr$model)
```

```{r}
#| label: Experimental_design_lnCVR_r2
res_cvr$r2
```

::: card
```{r}
#| label: Experimental_design_lnCVR_plot
res_cvr$plot
```
:::

```{r}
#| label: Experimental_design_lnCVR_tukey
tuk_cvr

```

:::
:::: {.column width="25%"}
:::




## Sex 




```{r}
#| label: run_Sex
MOD  <- "Sex"
MODS <- "~ Sex"

f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)

res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))


```




:::: columns

:::: {.column width="49%"}
### lnRR
```{r}
summary(res_rr$model)
```
```{r}
#| label: Sex_lnRR_r2
res_rr$r2
```

::: card
```{r}
#| label: Sex_lnRR_plot
res_rr$plot
```
:::

:::

:::: {.column width="2%"} ::::
:::


:::: {.column width="49%"}

### lnVR

```{r}
#| label: Sex_lnVR_summary
summary(res_vr$model)
```


```{r}
#| label: Sex_lnVR_r2
res_vr$r2
```

::: card
```{r}
#| label: Sex_lnVR_plot
res_vr$plot
```
:::

:::

:::


:::: {.column width="25%"} 
::::
:::: {.column width="50%"}
### lnCVR
```{r}
#| label: Sex_lnCVR_summary
summary(res_cvr$model)
```

```{r}
#| label: Sex_lnCVR_r2
res_cvr$r2
```

::: card
```{r}
#| label: Sex_lnCVR_plot
res_cvr$plot
```
:::
:::
:::: {.column width="25%"}
:::




## Exposure duration



Music_exposure_duration



```{r}
#| label: run_Exposure
MOD  <- "Music_exposure_duration"
MODS <- "~ Music_exposure_duration -1"





# 1) Filter each effect-size dataset (and subset the VCV accordingly)
f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)



# 2) Fit the three unimoderator models (same moderator, different yi/vi)
res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))







# 3) Tukey contrasts (use the filtered data + matched VCV for each dataset)

tuk_rr  <- maybe_tukey(dat = f_rr$data,  V = f_rr$V,  yi = "lnRR",  moderator = MOD)
tuk_vr  <- maybe_tukey(dat = f_vr$data,  V = f_vr$V,  yi = "lnVR",  moderator = MOD)
tuk_cvr <- maybe_tukey(dat = f_cvr$data, V = f_cvr$V, yi = "lnCVR", moderator = MOD)

```






:::: columns

:::: {.column width="49%"}
### lnRR
```{r}
summary(res_rr$model)
```
```{r}
#| label: Music_exposure_duration_lnRR_r2
res_rr$r2
```

::: card
```{r}
#| label: Music_exposure_duration_lnRR_plot
res_rr$plot
```
:::
```{r}
#| label: Music_exposure_duration_lnRR_tukey
tuk_rr
```

:::

:::: {.column width="2%"} ::::
:::


:::: {.column width="49%"}

### lnVR

```{r}
#| label: Music_exposure_duration_lnVR_summary
summary(res_vr$model)
```


```{r}
#| label: Music_exposure_duration_lnVR_r2
res_vr$r2
```

::: card
```{r}
#| label: Music_exposure_duration_lnVR_plot
res_vr$plot
```
:::
```{r}
#| label: Music_exposure_duration_lnVR_tukey
tuk_vr
```
:::

:::


:::: {.column width="25%"} 
::::
:::: {.column width="50%"}
### lnCVR
```{r}
#| label: Music_exposure_duration_lnCVR_summary
summary(res_cvr$model)
```

```{r}
#| label: Music_exposure_duration_lnCVR_r2
res_cvr$r2
```

::: card
```{r}
#| label: Music_exposure_duration_lnCVR_plot
res_cvr$plot
```
:::

```{r}
#| label: Music_exposure_duration_lnCVR_tukey
tuk_cvr

```

:::
:::: {.column width="25%"}
:::



## Experimental procedure







```{r}
#| label: run_Experimental_procedures
MOD  <- "Experimental_procedures"
MODS <- "~ Experimental_procedures"

f_rr  <- filter_low_k_single(db_rr,  VCV_rr,  MOD, min_k = 5)
f_vr  <- filter_low_k_single(db_vr,  VCV_vr,  MOD, min_k = 5)
f_cvr <- filter_low_k_single(db_cvr, VCV_cvr, MOD, min_k = 5)

res_rr  <- fit_unimod(f_rr$data,  f_rr$V,  "lnRR",  MODS, MOD, expression(lnRR))
res_vr  <- fit_unimod(f_vr$data,  f_vr$V,  "lnVR",  MODS, MOD, expression(lnVR))
res_cvr <- fit_unimod(f_cvr$data, f_cvr$V, "lnCVR", MODS, MOD, expression(lnCVR))


```




:::: columns

:::: {.column width="49%"}
### lnRR
```{r}
summary(res_rr$model)
```
```{r}
#| label: Experimental_procedures_lnRR_r2
res_rr$r2
```

::: card
```{r}
#| label: Experimental_procedures_lnRR_plot
res_rr$plot
```
:::

:::

:::: {.column width="2%"} ::::
:::


:::: {.column width="49%"}

### lnVR

```{r}
#| label: Experimental_procedures_lnVR_summary
summary(res_vr$model)
```


```{r}
#| label: Experimental_procedures_lnVR_r2
res_vr$r2
```

::: card
```{r}
#| label: Experimental_procedures_lnVR_plot
res_vr$plot
```
:::

:::

:::


:::: {.column width="25%"} 
::::
:::: {.column width="50%"}
### lnCVR
```{r}
#| label: Experimental_procedures_lnCVR_summary
summary(res_cvr$model)
```

```{r}
#| label: Experimental_procedures_lnCVR_r2
res_cvr$r2
```

::: card
```{r}
#| label: Experimental_procedures_lnCVR_plot
res_cvr$plot
```
:::
:::
:::: {.column width="25%"}
:::









::: callout-note
```{r}
sessionInfo()
```
:::