Last updated: 2023-04-10

Checks: 7 0

Knit directory: fitnessGWAS/

This reproducible R Markdown analysis was created with workflowr (version 1.7.0.4). The Checks tab describes the reproducibility checks that were applied when the results were created. The Past versions tab lists the development history.


Great! Since the R Markdown file has been committed to the Git repository, you know the exact version of the code that produced these results.

Great job! The global environment was empty. Objects defined in the global environment can affect the analysis in your R Markdown file in unknown ways. For reproduciblity it’s best to always run the code in an empty environment.

The command set.seed(20180914) was run prior to running the code in the R Markdown file. Setting a seed ensures that any results that rely on randomness, e.g. subsampling or permutations, are reproducible.

Great job! Recording the operating system, R version, and package versions is critical for reproducibility.

Nice! There were no cached chunks for this analysis, so you can be confident that you successfully produced the results during this run.

Great job! Using relative paths to the files within your workflowr project makes it easier to run your code on other machines.

Great! You are using Git for version control. Tracking code development and connecting the code version to the results is critical for reproducibility.

The results in this page were generated with repository version 2b013b9. See the Past versions tab to see a history of the changes made to the R Markdown and HTML files.

Note that you need to be careful to ensure that all relevant files for the analysis have been committed to Git prior to generating the results (you can use wflow_publish or wflow_git_commit). workflowr only checks the R Markdown file, but you know if there are other scripts or data files that it depends on. Below is the status of the Git repository when the results were generated:


Ignored files:
    Ignored:    .DS_Store
    Ignored:    .Rapp.history
    Ignored:    .Rhistory
    Ignored:    .Rproj.user/
    Ignored:    .httr-oauth
    Ignored:    .pversion
    Ignored:    analysis/.DS_Store
    Ignored:    code/.DS_Store
    Ignored:    code/Drosophila_GWAS.Rmd
    Ignored:    data/.DS_Store
    Ignored:    data/derived/
    Ignored:    data/input/.DS_Store
    Ignored:    data/input/.pversion
    Ignored:    data/input/dgrp.fb557.annot.txt
    Ignored:    data/input/dgrp2.bed
    Ignored:    data/input/dgrp2.bim
    Ignored:    data/input/dgrp2.fam
    Ignored:    data/input/huang_transcriptome/
    Ignored:    figures/.DS_Store
    Ignored:    old_analyses/.DS_Store

Untracked files:
    Untracked:  old_analyses/Data for old analyses/
    Untracked:  old_analyses/eQTL_analysis.Rmd
    Untracked:  old_analyses/fitness_data.csv
    Untracked:  old_analyses/gcta_quant_genetics_OLD.Rmd
    Untracked:  old_analyses/quantitative_genetics_OLD_brms.Rmd

Unstaged changes:
    Modified:   analysis/index.Rmd
    Deleted:    figures/fig1.pdf
    Modified:   figures/fig3_boyle_plot.pdf
    Modified:   figures/fig4_mutation_load.pdf
    Modified:   figures/fig5_quartiles_plot.pdf
    Modified:   figures/fig6_antagonism_ratios.pdf
    Modified:   figures/fig7_models.pdf

Note that any generated files, e.g. HTML, png, CSS, etc., are not included in this status report because it is ok for generated content to have uncommitted changes.


These are the previous versions of the repository in which changes were made to the R Markdown (analysis/get_predicted_line_means.Rmd) and HTML (docs/get_predicted_line_means.html) files. If you’ve configured a remote Git repository (see ?wflow_git_remote), click on the hyperlinks in the table below to view the files as they were in that past version.

File Version Author Date Message
Rmd 2b013b9 lukeholman 2023-04-10 wflow_publish("analysis/get_predicted_line_means.Rmd")
html 4dc3be8 lukeholman 2023-04-10 Build site.
Rmd cee9d58 lukeholman 2023-04-10 wflow_publish("analysis/get_predicted_line_means.Rmd")
html d40a8f5 lukeholman 2023-03-21 Build site.
Rmd 27afd25 lukeholman 2023-03-21 wflow_publish("analysis/get_predicted_line_means.Rmd")
html 55c8c9b lukeholman 2023-03-15 Build site.
Rmd 6ea4fd1 lukeholman 2023-03-15 wflow_publish("analysis/get_predicted_line_means.Rmd")
html 65e9fc2 lukeholman 2023-03-15 Build site.
Rmd c58d02a lukeholman 2023-03-15 wflow_publish("analysis/get_predicted_line_means.Rmd")
html ddf5579 lukeholman 2023-03-15 Build site.
Rmd edb3ecb lukeholman 2023-03-15 wflow_publish("analysis/get_predicted_line_means.Rmd")
html 7449a90 lukeholman 2021-10-01 Build site.
html e91acfc lukeholman 2021-09-27 Build site.
Rmd 5d64d63 lukeholman 2021-09-27 Commit Sept 2021
html 8d14298 lukeholman 2021-09-26 Build site.
Rmd af15dd6 lukeholman 2021-09-26 Commit Sept 2021
html 871ae81 lukeholman 2021-03-04 Build site.
html e112260 lukeholman 2021-03-04 Build site.
html 836a780 lukeholman 2021-03-04 Build site.
html 359ff37 lukeholman 2021-03-04 Build site.
Rmd b1836d7 lukeholman 2021-03-04 big first commit 2021
Rmd 8d54ea5 Luke Holman 2018-12-23 Initial commit
html 8d54ea5 Luke Holman 2018-12-23 Initial commit

library(tidyverse)
library(brms)
library(mice)
library(future)
library(future.apply)
library(kableExtra)

Estimate the line means for relative fitness

Most studies of the DGRP calculate “line means” simply by averaging the phenotypes of several individuals per line. Instead, we used Bayesian generalised linear mixed model (GLMMs) to estimate the true line means for each of the 4 fitness traits, implemented in the brms package.

One notable advantage of using a model instead of a simple average is that a model allows one to statistically remove confounding factors such as block effects, which would otherwise bias the line means. Note that we measured line 352 in every block in our experiments, in order to improve precision when estimating block effects. Additionally, we must properly account for our experimental design in order to avoid pseudoreplication. Our design involved repeatedly measuring the same individuals to determine early- and late-life fitness, which we incorporate into the model via the random effect vial.

For the progeny count data used to measure early and late female fitness, we used a multivariate model with two components, one for early- and one for late-life fitness, which had the following formulae (in brms-like pseudocode):

Progeny count (early) = Intercept + (1 | p | line) + (1 | q | block) + (1 | r | vial)

Progeny count (late) = Intercept + (1 | p | line) + (1 | q | block) + (1 | r | vial)

Here, the model terms with the form (1 | x | y) represent random intercepts for line, block, and vial ID (i.e. y), where the letter between the pipe operators (x) indicates which random intercepts are assumed to be correlated with which other random intercepts. Thus, we assume that the effects of line, block, and vial ID on early-life fitness are potentially correlated with the effects of these three random variables on late-life fitness, and estimate this correlation from the data and prior.

The progeny count data were assumed to follow a Poisson distribution (with the standard log link function).

Similarly, for our measure of male fitness, proportion of offspring sired, we used a multivariate model consisting of a pair of binomial GLMMs (with logit link), with the following formula:

Proportion of progeny sired (early) = Intercept + (1 | p | line) + (1 | q | block) + (1 | r | vial)

Proportion of progeny sired (late) = Intercept + (1 | p | line) + (1 | q | block) + (1 | r | vial)

Where the response variable was a Bernoulli outcome describing the paternity of each offspring observed (either a male from the focal DGRP line, or from one of the competitor males).

For both models, we mostly used the brms default (weak) priors, except that we chose more informative, ‘skeptical’ priors for the random intercept terms, of the form cauchy(0, 0.1). This prior helps the model to converge by making very large estimates implausible, constraining the parameter space.

Define functions for prediction

# function to load the raw data on male and female fitness, and tidy it for analysis
load_and_tidy_fitness_data <- function(){
  female_fitness <- read_csv("data/input/female_fitness.csv") %>% 
    arrange(line) %>%
    split(paste(.$block, .$line)) %>%
    map(~ .x %>% mutate(replicate = 1:n())) %>%
    bind_rows() %>%
    mutate(vial = 1:n(),
           vial = paste("F", line, block, replicate, sep = "_"),
           line = paste("line_", line, sep = "")) %>% 
    dplyr::select(-num.F.late1, -num.F.late2, -num.laying.F.early, -replicate) %>%
    mutate(female.fitness.early = replace(female.fitness.early, is.na(female.fitness.early), 0),
           female.fitness.late = replace(female.fitness.late, is.na(female.fitness.late), 0)) 
  
  male_fitness <- read_csv("data/input/male_fitness.csv") %>% 
    arrange(line) %>%
    split(paste(.$block, .$line)) %>%
    map(~ .x %>% mutate(replicate = 1:n())) %>%
    bind_rows() %>%
    mutate(vial = paste("M", line, block, replicate, sep = "_"),
           line = paste("line_", line, sep = "")) %>%
    dplyr::select(-num.DGRP.males, -replicate)
  
  # Save these tidy files, for data archiving
  write.csv(female_fitness, file = "data/input/female_fitness_CLEANED.csv", row.names = FALSE)
  write.csv(male_fitness, file = "data/input/male_fitness_CLEANED.csv", row.names = FALSE)
  
  list(female_fitness = female_fitness, male_fitness = male_fitness)
}


# A function to calculate each line's expected fitness, using brms models to adjust for block + vial random effects
# For the male late life assay, we also adjust for the number of competitor males that died 
# (this assumes that their deaths happened randomly with respect to which line we were measuring)
get_predicted_line_means <- function(overwrite = FALSE){
  
  # If it's already calculated, just load up the file. Otherwise, make the file
  out.file <- "data/derived/predicted_line_means.csv"
  if(file.exists(out.file) & !overwrite) return(read_csv(out.file))
  
  ####### Load the individual-level data for females
  female_fitness <- load_and_tidy_fitness_data()[[1]] 
  
  ####### Load the individual-level data for males, and impute missing values
  
  # For one vial, there is no early-life measurement because the females did not produce offspring. 
  # Therefore we impute that datapoint and make 5 imputed datasets using the package 'mice'
  # See this link for explanation: https://cran.r-project.org/web/packages/brms/vignettes/brms_missings.html
  male_fitness <- load_and_tidy_fitness_data()[[2]]
  male_fitness <- male_fitness %>% 
    mutate(early.male.rival = replace(early.male.rival, early.male.rival + early.male.focal == 0, NA),
           early.male.focal = replace(early.male.focal, is.na(early.male.rival), NA)) 
  male_fitness_imputed <- mice(male_fitness, m = 5, print = FALSE, seed = 1)
  male_fitness_imputed <- lapply(1:5, function(i) { # for each imputed dataset, 
    complete(male_fitness_imputed, i) %>% 
      mutate(total1 = early.male.rival + early.male.focal, # tally up the focal+rival offspring for binomial model
             total2 = late.male.rival + late.male.focal) %>% # scale this covariate
      # For late-life assays where the 5 focal males all died before reaching age 14, 
      # we need to assign them zero fitness. We did this by assuming that the rivals sired 100/100 offspring.
      # This scenario happened in 47 vials (out of 810)
      mutate(late.male.focal = replace(late.male.focal, total2 == 0, 100),
             total2 = replace(total2, total2 == 0, 100))
  })

  ####### Run model on the female data 
  
  # Define the priors for the models
  prior_females <- 
    c(set_prior("cauchy(0, 0.1)", class = "sd", resp = 'femalefitnessearly', group = "line"),
      set_prior("cauchy(0, 0.1)", class = "sd", resp = 'femalefitnessearly', group = "block"),
      set_prior("cauchy(0, 0.1)", class = "sd", resp = 'femalefitnessearly', group = "vial"),
      set_prior("cauchy(0, 0.1)", class = "sd", resp = 'femalefitnesslate', group = "line"),
      set_prior("cauchy(0, 0.1)", class = "sd", resp = 'femalefitnesslate', group = "block"),
      set_prior("cauchy(0, 0.1)", class = "sd", resp = 'femalefitnesslate', group = "vial"))
  
  prior_males <- 
    c(set_prior("cauchy(0, 0.1)", class = "sd", resp = 'earlymalefocal', group = "line"),
      set_prior("cauchy(0, 0.1)", class = "sd", resp = 'earlymalefocal', group = "block"),
      set_prior("cauchy(0, 0.1)", class = "sd", resp = 'earlymalefocal', group = "vial"),
      set_prior("cauchy(0, 0.1)", class = "sd", resp = 'latemalefocal', group = "line"),
      set_prior("cauchy(0, 0.1)", class = "sd", resp = 'latemalefocal', group = "block"),
      set_prior("cauchy(0, 0.1)", class = "sd", resp = 'latemalefocal', group = "vial"))
      
   
  female1 <- bf(female.fitness.early ~ (1 | p | line) + (1 | q | block) + (1 | r | vial))
  female2 <- bf(female.fitness.late ~  (1 | p | line) + (1 | q | block) + (1 | r | vial))
  female_model <- brm(female1 + female2, 
                      family = "poisson", data = female_fitness,
                      prior = prior_females,
                      iter = 5000, chains = 4, cores = 4,
                      seed = 1, control = list(adapt_delta = 0.999, max_treedepth = 15)) 
  writeLines(capture.output(summary(female_model)), 
             con = "data/derived/model_summary_females.txt")
  
  # saveRDS(female_model, "data/derived/female_fitness_prediction_model.rds")
  
  
  ### Run model on male data 
  male1 <- bf(early.male.focal | trials(total1) ~ (1 | p | line) + (1 | q | block) + (1 | r | vial))
  male2 <- bf(late.male.focal  | trials(total2) ~ (1 | p | line) + (1 | q | block) + (1 | r | vial))
  
  # Run 5 models, on each of the 5 imputed datasets, and combine the results
  male_model <- brm_multiple(male1 + male2,
                             family = "binomial", 
                             prior = prior_males,
                             data = male_fitness_imputed,
                             iter = 5000, chains = 1, cores = 4,
                             seed = 1, control = list(adapt_delta = 0.999, max_treedepth = 15)) 
  writeLines(capture.output(summary(male_model)), 
             con = "data/derived/model_summary_males.txt")
  # saveRDS(male_model, "data/derived/male_fitness_prediction_model.rds") 

  ####### Define new data for prediction
  new.data.female <- female_fitness %>% 
    select(line) %>% distinct() %>% arrange(line)
  
  new.data.male <- male_fitness %>% 
    select(line) %>% distinct() %>% arrange(line) %>% 
    mutate(total1 = 100, # changing this number does not affect the line means, as expected
           total2 = 100)
  
  # Get predicted lines means for early and late life *female* fitness on linear predictor scale (i.e. fairly normal)
  female_line_preds <- data.frame(
    new.data.female, 
    fitted(female_model, 
           newdata = new.data.female, 
           re_formula = "~ (1 | line)", 
           scale = "linear")) %>%
    select(line, Estimate.femalefitnessearly, Estimate.femalefitnesslate) %>% 
    rename(female.fitness.early = Estimate.femalefitnessearly,
           female.fitness.late = Estimate.femalefitnesslate) %>%
    mutate(female.fitness.early = as.numeric(scale(female.fitness.early)), # scale the line means
           female.fitness.late = as.numeric(scale(female.fitness.late)))
  
  # Get predicted lines means for early and late life *male* fitness on linear predictor scale (i.e. fairly normal)
  male_line_preds <- data.frame(
    new.data.male, 
    fitted(male_model, 
           newdata = new.data.male, 
           re_formula = "~ (1 | line)", 
           scale = "linear")) %>%
    select(line, Estimate.earlymalefocal, Estimate.latemalefocal) %>% 
    rename(male.fitness.early = Estimate.earlymalefocal,
           male.fitness.late = Estimate.latemalefocal) %>%
    mutate(male.fitness.early = as.numeric(scale(male.fitness.early)), # scale the line means
           male.fitness.late = as.numeric(scale(male.fitness.late))) 

  # Record which block(s) each line was measured in. Generally one block, except for ref line (all blocks)
  line_blocks <- rbind(female_fitness %>% select(block, line), 
                       male_fitness   %>% select(block, line)) %>% 
    mutate(block = replace(block, line == "352", "reference_line")) %>% 
    distinct() %>% 
    group_by(line) %>% summarise(block = paste0(block, collapse = ", ")) 
  
  predicted_line_means <- female_line_preds %>%
    left_join(male_line_preds, by = "line") %>% 
    left_join(line_blocks, by = "line") %>%
    arrange(line) 
  
  write.csv(predicted_line_means, out.file, row.names = FALSE)
}

Predict line means and save the results

The object predicted_line_means is the estimated line means from the Bayesian models. These means are on the scale of the linear predictor (i.e. Poisson for females, binomial for males) rather than on the scale of the original response. They have been scaled to have a mean of 0 and a variance of 1. You can view the predicted line means in a table on this page.

predicted_line_means <- get_predicted_line_means(overwrite = FALSE) 

Summary of model used to predict female line means:

cat(readLines('data/derived/model_summary_females.txt'), sep = '\n')
 Family: MV(poisson, poisson) 
  Links: mu = log
         mu = log 
Formula: female.fitness.early ~ (1 | p | line) + (1 | q | block) + (1 | r | vial) 
         female.fitness.late ~ (1 | p | line) + (1 | q | block) + (1 | r | vial) 
   Data: female_fitness (Number of observations: 816) 
  Draws: 4 chains, each with iter = 5000; warmup = 2500; thin = 1;
         total post-warmup draws = 10000

Group-Level Effects: 
~block (Number of levels: 10) 
                                                              Estimate Est.Error l-95% CI
sd(femalefitnessearly_Intercept)                                  0.29      0.09     0.16
sd(femalefitnesslate_Intercept)                                   1.21      0.35     0.70
cor(femalefitnessearly_Intercept,femalefitnesslate_Intercept)    -0.42      0.29    -0.88
                                                              u-95% CI Rhat Bulk_ESS Tail_ESS
sd(femalefitnessearly_Intercept)                                  0.50 1.00     6956     7704
sd(femalefitnesslate_Intercept)                                   2.05 1.00     7505     8048
cor(femalefitnessearly_Intercept,femalefitnesslate_Intercept)     0.22 1.00     8011     7082

~line (Number of levels: 125) 
                                                              Estimate Est.Error l-95% CI
sd(femalefitnessearly_Intercept)                                  0.58      0.05     0.50
sd(femalefitnesslate_Intercept)                                   1.82      0.17     1.51
cor(femalefitnessearly_Intercept,femalefitnesslate_Intercept)     0.68      0.07     0.53
                                                              u-95% CI Rhat Bulk_ESS Tail_ESS
sd(femalefitnessearly_Intercept)                                  0.68 1.00     5015     7236
sd(femalefitnesslate_Intercept)                                   2.18 1.00     5994     7883
cor(femalefitnessearly_Intercept,femalefitnesslate_Intercept)     0.79 1.00     7663     7679

~vial (Number of levels: 816) 
                                                              Estimate Est.Error l-95% CI
sd(femalefitnessearly_Intercept)                                  0.52      0.02     0.49
sd(femalefitnesslate_Intercept)                                   1.54      0.07     1.42
cor(femalefitnessearly_Intercept,femalefitnesslate_Intercept)     0.21      0.05     0.12
                                                              u-95% CI Rhat Bulk_ESS Tail_ESS
sd(femalefitnessearly_Intercept)                                  0.55 1.00     4219     6935
sd(femalefitnesslate_Intercept)                                   1.68 1.00     4543     6625
cor(femalefitnessearly_Intercept,femalefitnesslate_Intercept)     0.30 1.00     7886     7637

Population-Level Effects: 
                             Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
femalefitnessearly_Intercept     4.40      0.11     4.19     4.62 1.00    11287     6886
femalefitnesslate_Intercept      0.70      0.44    -0.16     1.57 1.00    13408     7848

Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).

Summary of model used to predict male line means:

cat(readLines('data/derived/model_summary_males.txt'), sep = '\n')
 Family: MV(binomial, binomial) 
  Links: mu = logit
         mu = logit 
Formula: early.male.focal | trials(total1) ~ (1 | p | line) + (1 | q | block) + (1 | r | vial) 
         late.male.focal | trials(total2) ~ (1 | p | line) + (1 | q | block) + (1 | r | vial) 
   Data: male_fitness_imputed (Number of observations: 810) 
  Draws: 5 chains, each with iter = 5000; warmup = 2500; thin = 1;
         total post-warmup draws = 12500

Group-Level Effects: 
~block (Number of levels: 10) 
                                                      Estimate Est.Error l-95% CI u-95% CI Rhat
sd(earlymalefocal_Intercept)                              0.75      0.20     0.46     1.23 1.00
sd(latemalefocal_Intercept)                               0.30      0.21     0.01     0.78 1.00
cor(earlymalefocal_Intercept,latemalefocal_Intercept)     0.29      0.43    -0.73     0.93 1.00
                                                      Bulk_ESS Tail_ESS
sd(earlymalefocal_Intercept)                              6267     8051
sd(latemalefocal_Intercept)                               1615     5033
cor(earlymalefocal_Intercept,latemalefocal_Intercept)     9194     7696

~line (Number of levels: 124) 
                                                      Estimate Est.Error l-95% CI u-95% CI Rhat
sd(earlymalefocal_Intercept)                              0.54      0.05     0.45     0.64 1.00
sd(latemalefocal_Intercept)                               0.85      0.21     0.39     1.23 1.01
cor(earlymalefocal_Intercept,latemalefocal_Intercept)     0.68      0.15     0.36     0.96 1.01
                                                      Bulk_ESS Tail_ESS
sd(earlymalefocal_Intercept)                              4250     6699
sd(latemalefocal_Intercept)                                451      431
cor(earlymalefocal_Intercept,latemalefocal_Intercept)      613      595

~vial (Number of levels: 810) 
                                                      Estimate Est.Error l-95% CI u-95% CI Rhat
sd(earlymalefocal_Intercept)                              0.81      0.03     0.76     0.86 1.01
sd(latemalefocal_Intercept)                               2.79      0.11     2.59     3.02 1.00
cor(earlymalefocal_Intercept,latemalefocal_Intercept)     0.18      0.04     0.10     0.27 1.01
                                                      Bulk_ESS Tail_ESS
sd(earlymalefocal_Intercept)                              3279     7052
sd(latemalefocal_Intercept)                               2587     5796
cor(earlymalefocal_Intercept,latemalefocal_Intercept)     1844     4566

Population-Level Effects: 
                         Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
earlymalefocal_Intercept     0.15      0.25    -0.35     0.64 1.00     6060     5570
latemalefocal_Intercept     -0.82      0.18    -1.18    -0.46 1.00     6338     7534

Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).

sessionInfo()
R version 4.2.2 (2022-10-31)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Big Sur ... 10.16

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

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

other attached packages:
 [1] kableExtra_1.3.4    future.apply_1.10.0 future_1.30.0      
 [4] mice_3.15.0         brms_2.18.0         Rcpp_1.0.10        
 [7] lubridate_1.9.2     forcats_1.0.0       stringr_1.5.0      
[10] dplyr_1.1.0         purrr_1.0.1         readr_2.1.4        
[13] tidyr_1.3.0         tibble_3.1.8        ggplot2_3.4.1      
[16] tidyverse_2.0.0     knitrhooks_0.0.4    knitr_1.42         
[19] workflowr_1.7.0.4  

loaded via a namespace (and not attached):
  [1] colorspace_2.1-0     ellipsis_0.3.2       rprojroot_2.0.3     
  [4] markdown_1.4         base64enc_0.1-3      fs_1.6.1            
  [7] rstudioapi_0.14      listenv_0.9.0        farver_2.1.1        
 [10] rstan_2.21.8         bit64_4.0.5          DT_0.27             
 [13] fansi_1.0.4          mvtnorm_1.1-3        xml2_1.3.3          
 [16] bridgesampling_1.1-2 codetools_0.2-18     cachem_1.0.7        
 [19] shinythemes_1.2.0    bayesplot_1.10.0     jsonlite_1.8.4      
 [22] broom_1.0.3          shiny_1.7.4          compiler_4.2.2      
 [25] httr_1.4.5           backports_1.4.1      Matrix_1.5-1        
 [28] fastmap_1.1.1        cli_3.6.0            later_1.3.0         
 [31] htmltools_0.5.4      prettyunits_1.1.1    tools_4.2.2         
 [34] igraph_1.3.5         coda_0.19-4          gtable_0.3.1        
 [37] glue_1.6.2           reshape2_1.4.4       posterior_1.3.1     
 [40] jquerylib_0.1.4      vctrs_0.5.2          svglite_2.1.1       
 [43] nlme_3.1-160         crosstalk_1.2.0      tensorA_0.36.2      
 [46] xfun_0.37            globals_0.16.2       ps_1.7.2            
 [49] rvest_1.0.3          timechange_0.2.0     mime_0.12           
 [52] miniUI_0.1.1.1       lifecycle_1.0.3      gtools_3.9.4        
 [55] getPass_0.2-2        zoo_1.8-11           scales_1.2.1        
 [58] vroom_1.6.1          colourpicker_1.2.0   hms_1.1.2           
 [61] promises_1.2.0.1     Brobdingnag_1.2-9    parallel_4.2.2      
 [64] inline_0.3.19        shinystan_2.6.0      yaml_2.3.7          
 [67] gridExtra_2.3        loo_2.5.1            StanHeaders_2.21.0-7
 [70] sass_0.4.5           stringi_1.7.12       dygraphs_1.1.1.6    
 [73] checkmate_2.1.0      pkgbuild_1.4.0       systemfonts_1.0.4   
 [76] rlang_1.0.6          pkgconfig_2.0.3      matrixStats_0.63.0  
 [79] distributional_0.3.1 evaluate_0.20        lattice_0.20-45     
 [82] rstantools_2.2.0     htmlwidgets_1.6.1    bit_4.0.5           
 [85] processx_3.8.0       tidyselect_1.2.0     parallelly_1.34.0   
 [88] plyr_1.8.8           magrittr_2.0.3       R6_2.5.1            
 [91] generics_0.1.3       DBI_1.1.3            pillar_1.8.1        
 [94] whisker_0.4.1        withr_2.5.0          xts_0.12.2          
 [97] abind_1.4-5          crayon_1.5.2         utf8_1.2.2          
[100] tzdb_0.3.0           rmarkdown_2.20       grid_4.2.2          
[103] callr_3.7.3          git2r_0.31.0         threejs_0.3.3       
[106] webshot_0.5.4        digest_0.6.31        xtable_1.8-4        
[109] httpuv_1.6.9         RcppParallel_5.1.6   stats4_4.2.2        
[112] munsell_0.5.0        viridisLite_0.4.1    bslib_0.4.2         
[115] shinyjs_2.1.0