Last updated: 2020-11-24
Checks: 5 1
Knit directory: ~/Dropbox/psephysiology/
This reproducible R Markdown analysis was created with workflowr (version 1.6.2). The Checks tab describes the reproducibility checks that were applied when the results were created. The Past versions tab lists the development history.
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(12345)
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.
Tracking code development and connecting the code version to the results is critical for reproducibility. To start using Git, open the Terminal and type git init
in your project directory.
This project is not being versioned with Git. To obtain the full reproducibility benefits of using workflowr, please see ?wflow_start
.
library(tidyverse)
library(GGally)
library(gridExtra)
library(ggridges)
library(nlme)
library(brms)
library(tidybayes)
library(kableExtra)
library(knitrhooks) # install with devtools::install_github("nathaneastwood/knitrhooks")
output_max_height() # a knitrhook option
options(stringsAsFactors = FALSE)
dat1 <- read.csv('data/3.metabolite_data.csv')
# subset data, keep only raw variables and scale
metdat <- dat1 %>%
# keep only second timepoint (3d old)
filter(time == '2') %>%
# scale variables
mutate(fwt = as.numeric(scale(fwt_mg)),
dwt = as.numeric(scale(dwt_mg)),
Hex = as.numeric(scale(Hex_frac)),
Aqf = as.numeric(scale(Aq_frac)),
Pro = as.numeric(scale(Protein)),
Gly = as.numeric(scale(Glycogen)),
Chi = as.numeric(scale(Chitin))) %>%
# keep only raw measurements - calculate fractional data later
select(sex, treatment, LINE = line, fwt, dwt, Hex, Aqf, Pro, Gly, Chi) %>%
mutate(Wat = fwt - dwt)
metdat <- dat1 %>%
# keep only second timepoint (3d old)
filter(time == '2') %>%
# scale variables
mutate(fwt = as.numeric(scale(fwt_mg)),
dwt = as.numeric(scale(dwt_mg)),
Hex = as.numeric(scale(Hex_frac)),
Aqf = as.numeric(scale(Aq_frac)),
Pro = as.numeric(scale(Protein)),
Gly = as.numeric(scale(Glycogen)),
Chi = as.numeric(scale(Chitin))) %>%
# keep only raw measurements - calculate fractional data later
select(sex, treatment, LINE = line, -fwt, dwt, Aqf, Chi, Gly, Hex, Pro)
This analysis set out to test whether sexual selection treatment had an effect on metabolite composition of flies. We measured dry fly weight dwt
and five metabolites which together equal the dry weight; Hex
(hexane fraction, lipids), Aqf
(aqueous fraction, soluble carbohydrates), Pro
(protein), Gly
(glycogen), and Chi
(chitin). We expect body weight to vary between the sexes and potentially between treatments. In turn, we expect body weight to affect our five response variables of interest. Larger flies will have more lipids, carbs, etc., and this may vary by sex and treatment both directly and indirectly.
DiagrammeR::grViz('digraph {
graph [layout = dot, rankdir = LR]
# define the global styles of the nodes. We can override these in box if we wish
node [shape = rectangle, style = filled, fillcolor = Linen]
"Metabolite\ncomposition" [shape = oval, fillcolor = Beige]
# edge definitions with the node IDs
"Mating system\ntreatment (M vs P)" -> {"Body mass"}
"Mating system\ntreatment (M vs P)" -> {"Metabolite\ncomposition"}
"Sex\n(Female vs Male)" -> {"Body mass"} -> {"Metabolite\ncomposition"}
"Sex\n(Female vs Male)" -> {"Metabolite\ncomposition"}
{"Metabolite\ncomposition"} -> "Lipids"
{"Metabolite\ncomposition"} -> "Carbohydrates"
{"Metabolite\ncomposition"} -> "Glycogen"
{"Metabolite\ncomposition"} -> "Protein"
{"Metabolite\ncomposition"} -> "Chitin"
}')
metdat %>%
reshape2::melt(id.vars = c('sex', 'treatment', 'LINE', 'dwt')) %>%
ggplot(aes(x = dwt, y = value, colour = treatment)) +
geom_point() +
geom_smooth(method = 'lm', se = FALSE) +
scale_colour_brewer(palette = 'Set1', direction = -1, name = "") +
facet_grid(sex ~ variable) +
theme_bw() +
theme(legend.position = 'top') +
NULL
R chunk for pairs plot
Here I fit a model including body weight as a mediator variable. That is, body weight potentially varies between the sexes and between selection treatments, and body weight may also directly influence the five response variables. The model allows for fixed effects of selection and sex and their interaction with body weight. The three-way selection x sex x body weight interaction allows the effect of selection on the response variable to vary between the sexes, and with a different slope for body weight.
As with Luke’s analysis, set priors for all fixed effect parameters normal(0,1)
. Although Luke had sd = 3
. Additionally set priors for random effects
# set priors
prior1 <- c(set_prior("normal(0,0.1)", class = "b", resp = 'Aqf'),
set_prior("normal(0,0.1)", class = "b", resp = 'Chi'),
set_prior("normal(0,0.1)", class = "b", resp = 'Gly'),
set_prior("normal(0,0.1)", class = "b", resp = 'Hex'),
set_prior("normal(0,0.1)", class = "b", resp = 'Pro'),
set_prior("normal(0,0.1)", class = "b", resp = 'dwt'),
set_prior("cauchy(0,0.1)", class = "sd", resp = 'Aqf'),
set_prior("cauchy(0,0.1)", class = "sd", resp = 'Chi'),
set_prior("cauchy(0,0.1)", class = "sd", resp = 'Gly'),
set_prior("cauchy(0,0.1)", class = "sd", resp = 'Hex'),
set_prior("cauchy(0,0.1)", class = "sd", resp = 'Pro'),
set_prior("cauchy(0,0.1)", class = "sd", resp = 'dwt'))
brms_formula <-
bf(mvbind(Hex, Aqf, Pro, Gly, Chi) ~
sex * treatment * dwt + (1|p|LINE)) +
# body mass sub-model
bf(dwt ~ sex * treatment +
(1|p|LINE)) +
set_rescor(FALSE)
# brms_SEM <- brm(
# brms_formula,
# data = metdat,
# iter = 5000, chains = 4, cores = 4,
# prior = prior1,
# control = list(max_treedepth = 20,
# adapt_delta = 0.999)
# )
# load in the model instead of running
brms_SEM <- readRDS('output/brms_SEM.rds')
grid.arrange(
pp_check(brms_SEM, resp = "Aqf") + ggtitle("Aqf") + theme(legend.position = "none"),
pp_check(brms_SEM, resp = "Chi") + ggtitle("Chi") + theme(legend.position = "none"),
pp_check(brms_SEM, resp = "Gly") + ggtitle("Gly") + theme(legend.position = "none"),
pp_check(brms_SEM, resp = "Hex") + ggtitle("Hex") + theme(legend.position = "none"),
pp_check(brms_SEM, resp = "Pro") + ggtitle("Pro") + theme(legend.position = "none"),
nrow = 1
)
Plot posteriors for response variables and body size separately.
# get posterior predictions
post_dat <- posterior_samples(brms_SEM) %>%
as_tibble() %>%
select(contains("b_"), -contains("Intercept")) %>%
mutate(draw = 1:n()) %>%
pivot_longer(-draw) %>%
mutate(key = str_remove_all(name, "b_"),
var = gsub("_.*", "", x = key),
eff = gsub(".*_", "", x = key))
post_dat %>%
filter(var != 'dwt') %>%
ggplot(aes(value, eff, fill = eff)) +
geom_vline(xintercept = 0, linetype = 2) +
stat_halfeye(alpha = .8) +
scale_fill_brewer(palette = "Spectral") +
ylab("Model parameter") +
xlab("Effect on Metabolite weight") +
facet_wrap(~ var, nrow = 1) +
theme_ridges() +
theme(legend.position = "none") +
NULL
post_dat %>%
filter(var == 'dwt') %>%
ggplot(aes(value, eff, fill = eff)) +
geom_vline(xintercept = 0, linetype = 2) +
stat_halfeye(alpha = .8) +
scale_fill_brewer(palette = "Spectral") +
ylab("Model parameter") +
xlab("Effect on Body weight") +
theme_ridges() +
theme(legend.position = "none") +
NULL
data.frame(param = rownames(fixef(brms_SEM)),
fixef(brms_SEM)) %>%
mutate(var = gsub('_.*', '', x = param),
par = gsub('.*_', '', x = param),
var2 = gsub('dwt', 'zdwt', var),
star = if_else(sign(Q2.5) == sign(Q97.5), '*', '')) %>%
select(var2, par, Estimate, Est.Error, Q2.5, Q97.5, star) %>%
arrange(var2) %>%
select(Parameter = par, Estimate, Est.Error, Q2.5, Q97.5, star) %>%
mutate(Parameter = c(rep(c('Intercept', 'Male', 'Polandry', 'Body weight',
'Polandry x Male', 'Body weight x Male', 'Polyandry x Body weight',
'Polyandry x Male x Body weight'), 5),
'Intercept', 'Male', 'Polyandry', 'Polyandry x Male')) %>%
kable() %>%
kable_styling() %>%
kable_styling(full_width = FALSE) %>%
group_rows("Carbohydrates", 1, 8) %>%
group_rows("Chitin", 9, 16) %>%
group_rows("Glycogen", 17, 24) %>%
group_rows("Lipids", 25, 32) %>%
group_rows("Protein", 33, 40) %>%
group_rows("Body weight", 41, 44)
Parameter | Estimate | Est.Error | Q2.5 | Q97.5 | star |
---|---|---|---|---|---|
Carbohydrates | |||||
Intercept | 0.1714983 | 0.1349144 | -0.0945009 | 0.4364838 | |
Male | -0.1518639 | 0.0928750 | -0.3336862 | 0.0285726 | |
Polandry | -0.0272399 | 0.0881125 | -0.1971564 | 0.1450494 | |
Body weight | 0.3386260 | 0.0835475 | 0.1729942 | 0.5025976 |
|
Polandry x Male | -0.0806061 | 0.0922942 | -0.2610999 | 0.0983601 | |
Body weight x Male | 0.1366700 | 0.0931816 | -0.0449952 | 0.3222993 | |
Polyandry x Body weight | 0.1550002 | 0.0834759 | -0.0086002 | 0.3222961 | |
Polyandry x Male x Body weight | 0.0630317 | 0.0965411 | -0.1241364 | 0.2519342 | |
Chitin | |||||
Intercept | 0.0452885 | 0.2319819 | -0.4208547 | 0.4873574 | |
Male | -0.0188831 | 0.0951880 | -0.2024412 | 0.1666103 | |
Polandry | -0.0196953 | 0.0936917 | -0.2031056 | 0.1654647 | |
Body weight | 0.0892243 | 0.0856931 | -0.0797229 | 0.2561783 | |
Polandry x Male | -0.0265415 | 0.0966752 | -0.2175734 | 0.1657149 | |
Body weight x Male | 0.0425495 | 0.0956188 | -0.1411421 | 0.2309482 | |
Polyandry x Body weight | 0.0683646 | 0.0909855 | -0.1118619 | 0.2474581 | |
Polyandry x Male x Body weight | 0.0438118 | 0.0951648 | -0.1416162 | 0.2292286 | |
Glycogen | |||||
Intercept | 0.0287643 | 0.1619038 | -0.2891110 | 0.3460149 | |
Male | -0.0648606 | 0.0964365 | -0.2550203 | 0.1223700 | |
Polandry | 0.0502960 | 0.0936436 | -0.1346089 | 0.2329895 | |
Body weight | 0.1927455 | 0.0887444 | 0.0138473 | 0.3643072 |
|
Polandry x Male | 0.0032513 | 0.0964376 | -0.1838628 | 0.1923192 | |
Body weight x Male | 0.0655607 | 0.0961830 | -0.1219661 | 0.2495521 | |
Polyandry x Body weight | 0.0807752 | 0.0901056 | -0.0932273 | 0.2581921 | |
Polyandry x Male x Body weight | -0.0019626 | 0.0953672 | -0.1917484 | 0.1835361 | |
Lipids | |||||
Intercept | 0.0398499 | 0.1345951 | -0.2243927 | 0.3050826 | |
Male | -0.1226856 | 0.0959817 | -0.3129218 | 0.0610563 | |
Polandry | 0.1258373 | 0.0885150 | -0.0480276 | 0.2975061 | |
Body weight | 0.3683435 | 0.0831640 | 0.2036315 | 0.5308176 |
|
Polandry x Male | -0.0063785 | 0.0941639 | -0.1901252 | 0.1769372 | |
Body weight x Male | 0.1263877 | 0.0937854 | -0.0614751 | 0.3098339 | |
Polyandry x Body weight | 0.2130393 | 0.0848081 | 0.0454402 | 0.3769011 |
|
Polyandry x Male x Body weight | 0.0083977 | 0.0950130 | -0.1769160 | 0.1961643 | |
Protein | |||||
Intercept | 0.1571959 | 0.1443347 | -0.1207632 | 0.4293221 | |
Male | -0.1603434 | 0.0948598 | -0.3451387 | 0.0277937 | |
Polandry | 0.0127451 | 0.0900325 | -0.1616061 | 0.1901971 | |
Body weight | 0.3277234 | 0.0825826 | 0.1615875 | 0.4885108 |
|
Polandry x Male | -0.0312713 | 0.0931886 | -0.2106957 | 0.1484134 | |
Body weight x Male | 0.1746670 | 0.0969503 | -0.0177338 | 0.3660244 | |
Polyandry x Body weight | 0.1021757 | 0.0852404 | -0.0629964 | 0.2706162 | |
Polyandry x Male x Body weight | 0.0317577 | 0.0956811 | -0.1521720 | 0.2197227 | |
Body weight | |||||
Intercept | 0.1167671 | 0.1618532 | -0.2098954 | 0.4333520 | |
Male | -0.2390697 | 0.1072820 | -0.4537327 | -0.0313626 |
|
Polyandry | 0.0572130 | 0.0936381 | -0.1275896 | 0.2408248 | |
Polyandry x Male | -0.1028201 | 0.0966760 | -0.2859933 | 0.0840322 |
Body weight has a positive effect on Aqf
, Gly
, Hex
, and Pro
. Larger flies contain more of these metabolites. There is also evidence of a treatment x body weight interaction for Hex
. Hex
increases with body weight moreso in polyandrous flies (steeper slope). There is a sex effect on body weight (as expected). Males weigh less than females.
# fitbrms_SEM <- metdat %>%
# modelr::data_grid(treatment, sex, LINE, dwt) %>%
# add_fitted_draws(brms_SEM) %>%
# sample_frac(size = .5)
fitbrms_SEM <- readRDS('output/fitbrms_SEM.rds')
fitbrms_SEM %>%
filter(.category != 'dwt') %>%
group_by(treatment, sex, dwt, .category) %>%
summarise(mn = mean(.value),
lwr = qnorm(0.975)*sd(.value)/sqrt(n()),
upr = qnorm(0.975)*sd(.value)/sqrt(n())) %>%
ggplot(aes(x = dwt, y = mn, colour = treatment)) +
geom_ribbon(aes(ymin = mn - lwr, ymax = mn + upr, fill = treatment)) +
scale_fill_brewer(palette = 'Set1', direction = -1, name = "") +
scale_colour_brewer(palette = 'Set1', direction = -1, name = "") +
facet_grid(sex ~ .category) +
theme_bw() +
theme(legend.position = 'top') +
NULL
Using the hypothesis
function I loop through each response variable to test difference from intercept (monogamy females. This is essentially the same as the summary table from the fit.
vars <- c("Aqf", "Chi", "Gly", "Hex", "Pro")
tests <- c('_dwt', '_sexm', '_sexm:dwt', '_sexm:treatmentP', '_sexm:treatmentP:dwt',
'_treatmentP', '_treatmentP:dwt')
hypSEM <- data.frame(expand_grid(vars, tests) %>%
mutate(est = NA,
err = NA,
lwr = NA,
upr = NA,
star = NA) %>%
rbind(data.frame(vars = rep('dwt', 3),
tests = c('_sexm', '_treatmentP', '_sexm:treatmentP'),
est = NA,
err = NA,
lwr = NA,
upr = NA,
star = NA)))
for(i in 1:nrow(hypSEM)) {
result = hypothesis(brms_SEM, paste0(hypSEM[i, 1], hypSEM[i, 2], ' = 0'))$hypothesis
hypSEM[i, 3] = round(result$Estimate, 3)
hypSEM[i, 4] = round(result$Est.Error, 3)
hypSEM[i, 5] = round(result$CI.Lower, 3)
hypSEM[i, 6] = round(result$CI.Upper, 3)
hypSEM[i, 7] = result$Star
}
hypSEM %>%
select(Parameter = tests, Estimate = est, `Est. error` = err, `CI lower` = lwr, `CI upper` = upr, star) %>%
mutate(Parameter = c(rep(c('Body weight', 'Male', 'Male x Body weight',
'Male x Polyandry', 'Body weight x Polyandry x Male',
'Polandry', 'Body weight x Polyandry'), 5),
'Male', 'Polyandry', 'Male x Polyandry')) %>%
kable() %>%
kable_styling(full_width = FALSE) %>%
group_rows("Carbohydrates", 1, 7) %>%
group_rows("Chitin", 8, 14) %>%
group_rows("Glycogen", 15, 21) %>%
group_rows("Lipids", 22, 28) %>%
group_rows("Protein", 29, 35) %>%
group_rows("Body weight", 36, 38)
Parameter | Estimate | Est. error | CI lower | CI upper | star |
---|---|---|---|---|---|
Carbohydrates | |||||
Body weight | 0.339 | 0.084 | 0.173 | 0.503 |
|
Male | -0.152 | 0.093 | -0.334 | 0.029 | |
Male x Body weight | 0.137 | 0.093 | -0.045 | 0.322 | |
Male x Polyandry | -0.081 | 0.092 | -0.261 | 0.098 | |
Body weight x Polyandry x Male | 0.063 | 0.097 | -0.124 | 0.252 | |
Polandry | -0.027 | 0.088 | -0.197 | 0.145 | |
Body weight x Polyandry | 0.155 | 0.083 | -0.009 | 0.322 | |
Chitin | |||||
Body weight | 0.089 | 0.086 | -0.080 | 0.256 | |
Male | -0.019 | 0.095 | -0.202 | 0.167 | |
Male x Body weight | 0.043 | 0.096 | -0.141 | 0.231 | |
Male x Polyandry | -0.027 | 0.097 | -0.218 | 0.166 | |
Body weight x Polyandry x Male | 0.044 | 0.095 | -0.142 | 0.229 | |
Polandry | -0.020 | 0.094 | -0.203 | 0.165 | |
Body weight x Polyandry | 0.068 | 0.091 | -0.112 | 0.247 | |
Glycogen | |||||
Body weight | 0.193 | 0.089 | 0.014 | 0.364 |
|
Male | -0.065 | 0.096 | -0.255 | 0.122 | |
Male x Body weight | 0.066 | 0.096 | -0.122 | 0.250 | |
Male x Polyandry | 0.003 | 0.096 | -0.184 | 0.192 | |
Body weight x Polyandry x Male | -0.002 | 0.095 | -0.192 | 0.184 | |
Polandry | 0.050 | 0.094 | -0.135 | 0.233 | |
Body weight x Polyandry | 0.081 | 0.090 | -0.093 | 0.258 | |
Lipids | |||||
Body weight | 0.368 | 0.083 | 0.204 | 0.531 |
|
Male | -0.123 | 0.096 | -0.313 | 0.061 | |
Male x Body weight | 0.126 | 0.094 | -0.061 | 0.310 | |
Male x Polyandry | -0.006 | 0.094 | -0.190 | 0.177 | |
Body weight x Polyandry x Male | 0.008 | 0.095 | -0.177 | 0.196 | |
Polandry | 0.126 | 0.089 | -0.048 | 0.298 | |
Body weight x Polyandry | 0.213 | 0.085 | 0.045 | 0.377 |
|
Protein | |||||
Body weight | 0.328 | 0.083 | 0.162 | 0.489 |
|
Male | -0.160 | 0.095 | -0.345 | 0.028 | |
Male x Body weight | 0.175 | 0.097 | -0.018 | 0.366 | |
Male x Polyandry | -0.031 | 0.093 | -0.211 | 0.148 | |
Body weight x Polyandry x Male | 0.032 | 0.096 | -0.152 | 0.220 | |
Polandry | 0.013 | 0.090 | -0.162 | 0.190 | |
Body weight x Polyandry | 0.102 | 0.085 | -0.063 | 0.271 | |
Body weight | |||||
Male | -0.239 | 0.107 | -0.454 | -0.031 |
|
Polyandry | 0.057 | 0.094 | -0.128 | 0.241 | |
Male x Polyandry | -0.103 | 0.097 | -0.286 | 0.084 |
sessionInfo()
R version 4.0.3 (2020-10-10) Platform: x86_64-apple-darwin17.0 (64-bit) Running under: macOS Mojave 10.14.6 Matrix products: default BLAS: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRblas.dylib LAPACK: /Library/Frameworks/R.framework/Versions/4.0/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] knitrhooks_0.0.4 knitr_1.30 kableExtra_1.3.1 tidybayes_2.3.1 [5] brms_2.14.4 Rcpp_1.0.5 nlme_3.1-149 ggridges_0.5.2 [9] gridExtra_2.3 GGally_2.0.0 forcats_0.5.0 stringr_1.4.0 [13] dplyr_1.0.2 purrr_0.3.4 readr_1.4.0 tidyr_1.1.2 [17] tibble_3.0.4 ggplot2_3.3.2 tidyverse_1.3.0 loaded via a namespace (and not attached): [1] readxl_1.3.1 backports_1.1.10 workflowr_1.6.2 [4] plyr_1.8.6 igraph_1.2.6 splines_4.0.3 [7] svUnit_1.0.3 crosstalk_1.1.0.1 rstantools_2.1.1 [10] inline_0.3.16 digest_0.6.25 htmltools_0.5.0 [13] rsconnect_0.8.16 fansi_0.4.1 magrittr_2.0.1 [16] modelr_0.1.8 RcppParallel_5.0.2 matrixStats_0.57.0 [19] xts_0.12.1 prettyunits_1.1.1 colorspace_1.4-1 [22] blob_1.2.1 rvest_0.3.6 ggdist_2.3.0 [25] haven_2.3.1 xfun_0.19 callr_3.5.1 [28] crayon_1.3.4 jsonlite_1.7.1 lme4_1.1-23 [31] zoo_1.8-8 glue_1.4.2 gtable_0.3.0 [34] webshot_0.5.2 V8_3.4.0 distributional_0.2.1 [37] pkgbuild_1.1.0 rstan_2.21.2 abind_1.4-5 [40] scales_1.1.1 mvtnorm_1.1-1 DBI_1.1.0 [43] miniUI_0.1.1.1 viridisLite_0.3.0 xtable_1.8-4 [46] stats4_4.0.3 StanHeaders_2.21.0-6 DT_0.16 [49] htmlwidgets_1.5.2 httr_1.4.2 DiagrammeR_1.0.6.1 [52] threejs_0.3.3 arrayhelpers_1.1-0 RColorBrewer_1.1-2 [55] ellipsis_0.3.1 pkgconfig_2.0.3 reshape_0.8.8 [58] loo_2.3.1 farver_2.0.3 dbplyr_1.4.4 [61] labeling_0.3 tidyselect_1.1.0 rlang_0.4.8 [64] reshape2_1.4.4 later_1.1.0.1 visNetwork_2.0.9 [67] munsell_0.5.0 cellranger_1.1.0 tools_4.0.3 [70] cli_2.1.0 generics_0.0.2 broom_0.7.1 [73] evaluate_0.14 fastmap_1.0.1 yaml_2.2.1 [76] processx_3.4.4 fs_1.5.0 mime_0.9 [79] projpred_2.0.2 xml2_1.3.2 compiler_4.0.3 [82] bayesplot_1.7.2 shinythemes_1.1.2 rstudioapi_0.11 [85] gamm4_0.2-6 curl_4.3 reprex_0.3.0 [88] statmod_1.4.34 stringi_1.5.3 highr_0.8 [91] ps_1.4.0 Brobdingnag_1.2-6 lattice_0.20-41 [94] Matrix_1.2-18 nloptr_1.2.2.2 markdown_1.1 [97] shinyjs_2.0.0 vctrs_0.3.4 pillar_1.4.6 [100] lifecycle_0.2.0 bridgesampling_1.0-0 httpuv_1.5.4 [103] R6_2.4.1 promises_1.1.1 codetools_0.2-16 [106] boot_1.3-25 colourpicker_1.1.0 MASS_7.3-53 [109] gtools_3.8.2 assertthat_0.2.1 rprojroot_1.3-2 [112] withr_2.3.0 shinystan_2.5.0 mgcv_1.8-33 [115] parallel_4.0.3 hms_0.5.3 grid_4.0.3 [118] coda_0.19-4 minqa_1.2.4 rmarkdown_2.4 [121] git2r_0.27.1 shiny_1.5.0 lubridate_1.7.9 [124] base64enc_0.1-3 dygraphs_1.1.1.6