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.


Load packages

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)

Load metabolite composition data

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)

Subset data to keep only raw variables and then scale - will want to do this cleaning step prior to upload for real thing

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.

DAG

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"
}')

Inspecting the raw data

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

A pairs plot also goes here using Luke’s custom plot - need to check how to incorporate that function

R chunk for pairs plot

Fit the multivariate brms model

Fit brms SEM

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.

Priors

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

Summary of the results of the full model

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.

Extract posterior estimates of the means and plotting…

# 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

Hypothesis testing

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