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)
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.
# 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)
}
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)
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).
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