Last updated: 2020-12-04
Checks: 7 0
Knit directory: exp_evol_respiration/
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! 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(20190703)
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 d441b69. 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: .Rproj.user/
Ignored: analysis/.DS_Store
Untracked files:
Untracked: data/3.metabolite_data.csv
Untracked: output/brms_metabolite_PCA_SEM.rds
Untracked: output/brms_metabolite_SEM.rds
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/metabolites.Rmd
) and HTML (docs/metabolites.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 | d441b69 | lukeholman | 2020-12-04 | Luke metabolites analysis |
Rmd | c8feb2d | lukeholman | 2020-11-30 | Same page with Martin |
html | 3fdbcb2 | lukeholman | 2020-11-30 | Tweaks Nov 2020 |
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)
This analysis set out to test whether sexual selection treatment had an effect on metabolite composition of flies. We measured fresh and dry fly weight in milligrams, plus the weights of five metabolites which together equal the dry weight. These are:
Lipid_conc
(i.e. the weight of the hexane fraction, divided by the full dry weight),Carbohydrate_conc
(i.e. the weight of the aqueous fraction, divided by the full dry weight),Protein_conc
(i.e. \(\mu\)g of protein per milligram as measured by the bicinchoninic acid protein assay),Glycogen_conc
(), andChitin_conc
()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.
metabolites <- read_csv('data/3.metabolite_data.csv') %>%
mutate(sex = ifelse(sex == "m", "Male", "Female"),
treatment = ifelse(treatment == "M", "Monogamy", "Polyandry")) %>%
# set "sum" coding for contrasts for "line", since there is no meaningful "control line"
mutate(line = C(factor(line), "contr.sum")) %>%
# log transform glycogen since it shows a long tail (others are reasonably normal-looking)
mutate(Glycogen_ug_mg = log(Glycogen_ug_mg)) %>%
# There was a technical error with the flies collected on day 1, so they are excluded from the whole paper. All measurements are of 3d-old flies
filter(time == '2')
scaled_metabolites <- metabolites %>%
# Find proportional metabolites as a proportion of total dry weight
mutate(
Dry_weight = dwt_mg,
Lipid_conc = Hex_frac / Dry_weight,
Carbohydrate_conc = Aq_frac / Dry_weight,
Protein_conc = Protein_ug_mg,
Glycogen_conc = Glycogen_ug_mg,
Chitin_conc = Chitin_mg_mg
) %>%
select(sex, treatment, line, Dry_weight, ends_with("conc")) %>%
mutate_at(vars(ends_with("conc")), ~ as.numeric(scale(.x))) %>%
mutate(sextreat = paste(sex, treatment),
sextreat = replace(sextreat, sextreat == "Male Monogamy", "M males"),
sextreat = replace(sextreat, sextreat == "Male Polyandry", "P males"),
sextreat = replace(sextreat, sextreat == "Female Monogamy", "M females"),
sextreat = replace(sextreat, sextreat == "Female Polyandry", "P females"),
sextreat = factor(sextreat, c("M males", "P males", "M females", "P females")))
cols <- c("M females" = "pink",
"P females" = "red",
"M males" = "skyblue",
"P males" = "blue")
modified_densityDiag <- function(data, mapping, ...) {
ggally_densityDiag(data, mapping, ...) + scale_fill_manual(values = cols) +
scale_x_continuous(guide = guide_axis(check.overlap = TRUE))
}
modified_points <- function(data, mapping, ...) {
ggally_points(data, mapping, ...) + scale_colour_manual(values = cols) +
scale_x_continuous(guide = guide_axis(check.overlap = TRUE))
}
modified_facetdensity <- function(data, mapping, ...) {
ggally_facetdensity(data, mapping, ...) + scale_colour_manual(values = cols)
}
modified_box_no_facet <- function(data, mapping, ...) {
ggally_box_no_facet(data, mapping, ...) + scale_fill_manual(values = cols)
}
pairs_plot <- scaled_metabolites %>%
select(-line) %>%
arrange(sex, treatment) %>%
ggpairs(aes(colour = sextreat),
diag = list(continuous = wrap(modified_densityDiag, alpha = 0.7),
discrete = wrap("blank")),
lower = list(continuous = wrap(modified_points, alpha = 0.7, size = 0.5),
discrete = wrap("blank"),
combo = wrap(modified_box_no_facet, alpha = 0.7)),
upper = list(continuous = wrap(modified_points, alpha = 0.7, size = 0.5),
discrete = wrap("blank"),
combo = wrap(modified_facetdensity, alpha = 0.7, size = 0.5)))
pairs_plot
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"} -> "Glycogencogen"
{"Metabolite\ncomposition"} -> "Protein"
{"Metabolite\ncomposition"} -> "Chitin"
}')
levels <- c("Carbohydrate", "Chitin", "Glycogen", "Lipid", "Protein", "Dryweight")
grid.arrange(
scaled_metabolites %>%
rename_all(~ str_remove_all(.x, "_conc")) %>%
mutate(sex = factor(sex, c("Male", "Female"))) %>%
reshape2::melt(id.vars = c('sex', 'treatment', 'sextreat', 'line', 'Dry_weight')) %>%
mutate(variable = factor(variable, levels)) %>%
ggplot(aes(x = sex, y = value, fill = sextreat)) +
geom_hline(yintercept = 0, linetype = 2) +
geom_boxplot() +
facet_grid( ~ variable) +
theme_bw() +
xlab("Sex") + ylab("Concentration") +
theme(legend.position = 'top') +
scale_fill_manual(values = cols, name = ""),
scaled_metabolites %>%
rename_all(~ str_remove_all(.x, "_conc")) %>%
reshape2::melt(id.vars = c('sex', 'treatment', 'sextreat', 'line', 'Dry_weight')) %>%
mutate(variable = factor(variable, levels)) %>%
ggplot(aes(x = Dry_weight, y = value, colour = sextreat, fill = sextreat)) +
geom_smooth(method = 'lm', se = TRUE, aes(colour = NULL, fill = NULL), colour = "grey20", size = .4) +
geom_point(pch = 21, colour = "grey20") +
facet_grid( ~ variable) +
theme_bw() +
xlab("Dry weight (mg)") + ylab("Concentration") +
theme(legend.position = 'none') +
scale_colour_manual(values = cols, name = "") +
scale_fill_manual(values = cols, name = ""),
heights = c(0.55, 0.45)
)
brms
structural equation modelHere we fit a model of the five metabolites, which includes dry body weight as a mediator variable. That is, our model estimates the effect of treatment, sex and line (and all the 2- and 3-way interactions) on dry weight, and then estimates the effect of those some predictors (plus dry weight) on the five metabolites. The model assumes that although the different sexes, treatment groups, and lines may differ in their dry weight, the relationship between dry weight and the metabolites does not vary by sex/treatment/line. This assumption was made to constrain the number of parameters in the model, and to reflect out prior beliefs about allometric scaling of metabolites.
Set Normal priors on all fixed effect parameters, mean = 0, sd = 2. As well as fitting our expectations about the true values of these parameters, setting somewhat informative priors constrains the effects sizes and helps the model to converge. We leave other priors at their defaults.
prior1 <- c(set_prior("normal(0, 2)", class = "b", resp = 'Lipid'),
set_prior("normal(0, 2)", class = "b", resp = 'Carbohydrate'),
set_prior("normal(0, 2)", class = "b", resp = 'Protein'),
set_prior("normal(0, 2)", class = "b", resp = 'Glycogen'),
set_prior("normal(0, 2)", class = "b", resp = 'Chitin'),
set_prior("normal(0, 2)", class = "b", resp = 'Dryweight'))
# Formula for the SEM:
brms_formula <-
# Models of the 5 metabolites
bf(mvbind(Lipid, Carbohydrate, Protein, Glycogen, Chitin) ~
sex*treatment*line + Dryweight) +
# dry weight sub-model
bf(Dryweight ~ sex*treatment*line) +
# Allow for (and estimate) covariance between the residuals of the difference response variables
set_rescor(TRUE)
if(!file.exists("output/brms_metabolite_SEM.rds")){
brms_metabolite_SEM <- brm(
brms_formula,
data = scaled_metabolites %>% # brms does not like underscores in variable names
rename(Dryweight = Dry_weight) %>%
rename_all(~ gsub("_conc", "", .x)),
iter = 5000, chains = 4, cores = 1,
prior = prior1,
control = list(max_treedepth = 20,
adapt_delta = 0.9)
)
saveRDS(brms_metabolite_SEM, "output/brms_metabolite_SEM.rds")
} else {
brms_metabolite_SEM <- readRDS('output/brms_metabolite_SEM.rds')
}
grid.arrange(
pp_check(brms_metabolite_SEM, resp = "Dryweight") +
ggtitle("Dry weight") + theme(legend.position = "none"),
pp_check(brms_metabolite_SEM, resp = "Lipid") +
ggtitle("Lipid") + theme(legend.position = "none"),
pp_check(brms_metabolite_SEM, resp = "Carbohydrate") +
ggtitle("Carbohydrate") + theme(legend.position = "none"),
pp_check(brms_metabolite_SEM, resp = "Protein") +
ggtitle("Protein") + theme(legend.position = "none"),
pp_check(brms_metabolite_SEM, resp = "Glycogen") +
ggtitle("Glycogen") + theme(legend.position = "none"),
pp_check(brms_metabolite_SEM, resp = "Chitin") +
ggtitle("Chitin") + theme(legend.position = "none"),
nrow = 1
)
This tables shows the parameter estimates for the fixed effects associated with treatment, sex, their interaction, and dry weight (where relevant) for each response variable. The p
column shows 1 - minus the “probability of direction”, i.e. the posterior probability that the reported sign of the estimate is correct given the data and the prior; subtracting this value from one gives a Bayesian equivalent of a one-sided p-value. For brevity, we have omitted all the parameter estimates involving the predictor variable line
, as well as the estiamtes of residual (co)variance. Click the next tab to see a complete summary of the model and its output.
vars <- c("Lipid", "Carbohydrate", "Glycogen", "Protein", "Chitin")
tests <- c('_Dryweight', '_sexMale',
'_sexMale:treatmentPolyandry',
'_treatmentPolyandry')
hypSEM <- data.frame(expand_grid(vars, tests) %>%
mutate(est = NA,
err = NA,
lwr = NA,
upr = NA) %>%
# bind body weight on the end
rbind(data.frame(
vars = rep('Dryweight', 3),
tests = c('_sexMale',
'_treatmentPolyandry',
'_sexMale:treatmentPolyandry'),
est = NA,
err = NA,
lwr = NA,
upr = NA)))
for(i in 1:nrow(hypSEM)) {
result = hypothesis(brms_metabolite_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)
}
pvals <- bayestestR::p_direction(brms_metabolite_SEM) %>%
as.data.frame() %>%
mutate(vars = map_chr(str_split(Parameter, "_"), ~ .x[2]),
tests = map_chr(str_split(Parameter, "_"), ~ .x[3]),
tests = str_c("_", str_remove_all(tests, "[.]")),
tests = replace(tests, tests == "_sexMaletreatmentPolyandry", "_sexMale:treatmentPolyandry")) %>%
filter(!str_detect(tests, "line")) %>%
mutate(p_val = 1 - pd, star = ifelse(p_val < 0.05, "*", "")) %>%
select(vars, tests, p_val, star)
hypSEM <- hypSEM %>% left_join(pvals, by = c("vars", "tests"))
hypSEM %>%
mutate(Parameter = c(rep(c('Dry weight', 'Male',
'Male x Polyandry',
'Polyandry'), 5),
'Male', 'Polyandry', 'Male x Polyandry')) %>%
mutate(Parameter = factor(Parameter, c("Dry weight", "Male", "Polyandry", "Male x Polyandry")),
vars = factor(vars, c("Carbohydrate", "Chitin", "Glycogen", "Lipid", "Protein", "Dryweight"))) %>%
arrange(vars, Parameter) %>%
select(Parameter, Estimate = est, `Est. error` = err,
`CI lower` = lwr, `CI upper` = upr, `p` = p_val, star) %>%
rename(` ` = star) %>%
kable() %>%
kable_styling(full_width = FALSE) %>%
group_rows("Carbohydrates", 1, 4) %>%
group_rows("Chitin", 5, 8) %>%
group_rows("Glycogen", 9, 12) %>%
group_rows("Lipids", 13, 16) %>%
group_rows("Protein", 17, 20) %>%
group_rows("Dry weight", 21, 23)
Parameter | Estimate | Est. error | CI lower | CI upper | p | |
---|---|---|---|---|---|---|
Carbohydrates | ||||||
Dry weight | 0.228 | 1.857 | -3.397 | 3.837 | 0.4494 | |
Male | -0.085 | 0.537 | -1.133 | 0.967 | 0.4395 | |
Polyandry | -0.277 | 0.355 | -0.960 | 0.444 | 0.2097 | |
Male x Polyandry | -0.524 | 0.462 | -1.436 | 0.392 | 0.1265 | |
Chitin | ||||||
Dry weight | -0.276 | 1.841 | -3.884 | 3.305 | 0.4385 | |
Male | 1.291 | 0.499 | 0.301 | 2.268 | 0.0055 |
|
Polyandry | -0.258 | 0.295 | -0.837 | 0.326 | 0.1880 | |
Male x Polyandry | -0.357 | 0.378 | -1.112 | 0.379 | 0.1651 | |
Glycogen | ||||||
Dry weight | 0.387 | 1.839 | -3.185 | 4.006 | 0.4188 | |
Male | -0.968 | 0.522 | -2.008 | 0.053 | 0.0304 |
|
Polyandry | 0.275 | 0.344 | -0.386 | 0.969 | 0.2091 | |
Male x Polyandry | 0.637 | 0.447 | -0.242 | 1.502 | 0.0746 | |
Lipids | ||||||
Dry weight | 0.997 | 1.832 | -2.583 | 4.573 | 0.2927 | |
Male | -0.780 | 0.493 | -1.756 | 0.176 | 0.0549 | |
Polyandry | 0.741 | 0.286 | 0.182 | 1.306 | 0.0055 |
|
Male x Polyandry | -0.241 | 0.364 | -0.959 | 0.478 | 0.2529 | |
Protein | ||||||
Dry weight | -0.291 | 1.840 | -3.879 | 3.284 | 0.4416 | |
Male | 0.074 | 0.554 | -1.009 | 1.175 | 0.4487 | |
Polyandry | -0.605 | 0.398 | -1.392 | 0.169 | 0.0634 | |
Male x Polyandry | 0.838 | 0.529 | -0.212 | 1.878 | 0.0550 | |
Dry weight | ||||||
Male | -0.232 | 0.017 | -0.265 | -0.199 | 0.0000 |
|
Polyandry | 0.081 | 0.017 | 0.049 | 0.115 | 0.0001 |
|
Male x Polyandry | -0.059 | 0.024 | -0.105 | -0.013 | 0.0076 |
|
summary.brmsfit()
brms_metabolite_SEM
Family: MV(gaussian, gaussian, gaussian, gaussian, gaussian, gaussian) Links: mu = identity; sigma = identity mu = identity; sigma = identity mu = identity; sigma = identity mu = identity; sigma = identity mu = identity; sigma = identity mu = identity; sigma = identity Formula: Lipid ~ sex * treatment * line + Dryweight Carbohydrate ~ sex * treatment * line + Dryweight Protein ~ sex * treatment * line + Dryweight Glycogen ~ sex * treatment * line + Dryweight Chitin ~ sex * treatment * line + Dryweight Dryweight ~ sex * treatment * line Data: scaled_metabolites %>% rename(Dryweight = Dry_weig (Number of observations: 48) Samples: 4 chains, each with iter = 5000; warmup = 2500; thin = 1; total post-warmup samples = 10000 Population-Level Effects: Estimate Est.Error l-95% CI Lipid_Intercept -0.39 1.05 -2.43 Carbohydrate_Intercept 0.20 1.07 -1.86 Protein_Intercept 0.19 1.07 -1.87 Glycogen_Intercept 0.01 1.05 -2.08 Chitin_Intercept -0.30 1.05 -2.34 Dryweight_Intercept 0.56 0.01 0.54 Lipid_sexMale -0.78 0.49 -1.76 Lipid_treatmentPolyandry 0.74 0.29 0.18 Lipid_line1 -0.43 0.33 -1.08 Lipid_line2 0.72 0.30 0.12 Lipid_line3 0.11 0.29 -0.46 Lipid_Dryweight 1.00 1.83 -2.58 Lipid_sexMale:treatmentPolyandry -0.24 0.36 -0.96 Lipid_sexMale:line1 1.13 0.45 0.25 Lipid_sexMale:line2 -1.01 0.42 -1.81 Lipid_sexMale:line3 0.05 0.41 -0.79 Lipid_treatmentPolyandry:line1 0.67 0.41 -0.13 Lipid_treatmentPolyandry:line2 -1.60 0.44 -2.47 Lipid_treatmentPolyandry:line3 0.72 0.41 -0.10 Lipid_sexMale:treatmentPolyandry:line1 -0.94 0.56 -2.02 Lipid_sexMale:treatmentPolyandry:line2 1.83 0.58 0.67 Lipid_sexMale:treatmentPolyandry:line3 -1.13 0.57 -2.23 Carbohydrate_sexMale -0.09 0.54 -1.13 Carbohydrate_treatmentPolyandry -0.28 0.35 -0.96 Carbohydrate_line1 0.04 0.39 -0.72 Carbohydrate_line2 0.72 0.38 -0.03 Carbohydrate_line3 0.11 0.37 -0.64 Carbohydrate_Dryweight 0.23 1.86 -3.40 Carbohydrate_sexMale:treatmentPolyandry -0.52 0.46 -1.44 Carbohydrate_sexMale:line1 -0.50 0.53 -1.55 Carbohydrate_sexMale:line2 -0.84 0.52 -1.86 Carbohydrate_sexMale:line3 0.08 0.52 -0.93 Carbohydrate_treatmentPolyandry:line1 -0.15 0.52 -1.15 Carbohydrate_treatmentPolyandry:line2 -1.02 0.54 -2.08 Carbohydrate_treatmentPolyandry:line3 -0.39 0.51 -1.38 Carbohydrate_sexMale:treatmentPolyandry:line1 0.15 0.70 -1.23 Carbohydrate_sexMale:treatmentPolyandry:line2 -0.33 0.72 -1.77 Carbohydrate_sexMale:treatmentPolyandry:line3 1.52 0.71 0.11 Protein_sexMale 0.07 0.55 -1.01 Protein_treatmentPolyandry -0.61 0.40 -1.39 Protein_line1 0.07 0.44 -0.78 Protein_line2 0.50 0.43 -0.34 Protein_line3 -0.21 0.43 -1.05 Protein_Dryweight -0.29 1.84 -3.88 Protein_sexMale:treatmentPolyandry 0.84 0.53 -0.21 Protein_sexMale:line1 -0.35 0.59 -1.52 Protein_sexMale:line2 0.64 0.58 -0.53 Protein_sexMale:line3 -0.98 0.59 -2.11 Protein_treatmentPolyandry:line1 -0.30 0.58 -1.45 Protein_treatmentPolyandry:line2 -0.17 0.60 -1.37 Protein_treatmentPolyandry:line3 0.73 0.58 -0.39 Protein_sexMale:treatmentPolyandry:line1 0.08 0.79 -1.45 Protein_sexMale:treatmentPolyandry:line2 -1.05 0.79 -2.59 Protein_sexMale:treatmentPolyandry:line3 1.04 0.80 -0.54 Glycogen_sexMale -0.97 0.52 -2.01 Glycogen_treatmentPolyandry 0.27 0.34 -0.39 Glycogen_line1 -0.02 0.38 -0.79 Glycogen_line2 0.06 0.36 -0.65 Glycogen_line3 0.61 0.36 -0.11 Glycogen_Dryweight 0.39 1.84 -3.18 Glycogen_sexMale:treatmentPolyandry 0.64 0.45 -0.24 Glycogen_sexMale:line1 0.04 0.52 -0.97 Glycogen_sexMale:line2 0.17 0.50 -0.82 Glycogen_sexMale:line3 -0.16 0.50 -1.16 Glycogen_treatmentPolyandry:line1 -0.14 0.50 -1.11 Glycogen_treatmentPolyandry:line2 -0.26 0.52 -1.30 Glycogen_treatmentPolyandry:line3 -1.00 0.50 -1.96 Glycogen_sexMale:treatmentPolyandry:line1 0.94 0.68 -0.38 Glycogen_sexMale:treatmentPolyandry:line2 0.13 0.69 -1.23 Glycogen_sexMale:treatmentPolyandry:line3 1.14 0.69 -0.21 Chitin_sexMale 1.29 0.50 0.30 Chitin_treatmentPolyandry -0.26 0.29 -0.84 Chitin_line1 0.19 0.34 -0.48 Chitin_line2 -0.22 0.31 -0.83 Chitin_line3 -0.22 0.30 -0.81 Chitin_Dryweight -0.28 1.84 -3.88 Chitin_sexMale:treatmentPolyandry -0.36 0.38 -1.11 Chitin_sexMale:line1 0.48 0.45 -0.41 Chitin_sexMale:line2 0.68 0.43 -0.17 Chitin_sexMale:line3 -0.16 0.43 -1.00 Chitin_treatmentPolyandry:line1 -0.61 0.43 -1.45 Chitin_treatmentPolyandry:line2 0.71 0.45 -0.19 Chitin_treatmentPolyandry:line3 0.04 0.42 -0.80 Chitin_sexMale:treatmentPolyandry:line1 0.35 0.58 -0.83 Chitin_sexMale:treatmentPolyandry:line2 -0.18 0.60 -1.34 Chitin_sexMale:treatmentPolyandry:line3 -1.03 0.59 -2.20 Dryweight_sexMale -0.23 0.02 -0.26 Dryweight_treatmentPolyandry 0.08 0.02 0.05 Dryweight_line1 -0.08 0.02 -0.13 Dryweight_line2 0.05 0.02 0.01 Dryweight_line3 0.02 0.02 -0.02 Dryweight_sexMale:treatmentPolyandry -0.06 0.02 -0.11 Dryweight_sexMale:line1 0.10 0.03 0.05 Dryweight_sexMale:line2 -0.05 0.03 -0.11 Dryweight_sexMale:line3 -0.04 0.03 -0.09 Dryweight_treatmentPolyandry:line1 0.05 0.03 -0.01 Dryweight_treatmentPolyandry:line2 -0.10 0.03 -0.16 Dryweight_treatmentPolyandry:line3 0.02 0.03 -0.03 Dryweight_sexMale:treatmentPolyandry:line1 -0.04 0.04 -0.12 Dryweight_sexMale:treatmentPolyandry:line2 0.09 0.04 0.01 Dryweight_sexMale:treatmentPolyandry:line3 -0.04 0.04 -0.11 u-95% CI Rhat Bulk_ESS Tail_ESS Lipid_Intercept 1.66 1.00 5551 7569 Carbohydrate_Intercept 2.31 1.00 7351 7899 Protein_Intercept 2.27 1.00 9759 8118 Glycogen_Intercept 2.08 1.00 7214 7629 Chitin_Intercept 1.76 1.00 6201 7685 Dryweight_Intercept 0.59 1.00 11265 8219 Lipid_sexMale 0.18 1.00 6532 7398 Lipid_treatmentPolyandry 1.31 1.00 7245 7264 Lipid_line1 0.21 1.00 5387 7115 Lipid_line2 1.31 1.00 5658 6416 Lipid_line3 0.70 1.00 6594 7292 Lipid_Dryweight 4.57 1.00 5337 7107 Lipid_sexMale:treatmentPolyandry 0.48 1.00 8883 7368 Lipid_sexMale:line1 2.00 1.00 5645 7458 Lipid_sexMale:line2 -0.19 1.00 6022 6806 Lipid_sexMale:line3 0.86 1.00 6543 7299 Lipid_treatmentPolyandry:line1 1.48 1.00 6594 7054 Lipid_treatmentPolyandry:line2 -0.74 1.00 5455 6969 Lipid_treatmentPolyandry:line3 1.52 1.00 6785 8045 Lipid_sexMale:treatmentPolyandry:line1 0.17 1.00 6910 7415 Lipid_sexMale:treatmentPolyandry:line2 2.93 1.00 6035 7359 Lipid_sexMale:treatmentPolyandry:line3 -0.01 1.00 6391 7264 Carbohydrate_sexMale 0.97 1.00 8672 7918 Carbohydrate_treatmentPolyandry 0.44 1.00 8986 8208 Carbohydrate_line1 0.80 1.00 6352 7094 Carbohydrate_line2 1.47 1.00 6475 7027 Carbohydrate_line3 0.83 1.00 6608 7158 Carbohydrate_Dryweight 3.84 1.00 6924 7193 Carbohydrate_sexMale:treatmentPolyandry 0.39 1.00 9195 8198 Carbohydrate_sexMale:line1 0.55 1.00 6408 7770 Carbohydrate_sexMale:line2 0.17 1.00 6464 6647 Carbohydrate_sexMale:line3 1.12 1.00 6828 7354 Carbohydrate_treatmentPolyandry:line1 0.85 1.00 7020 7773 Carbohydrate_treatmentPolyandry:line2 0.06 1.00 6314 7447 Carbohydrate_treatmentPolyandry:line3 0.61 1.00 6808 7753 Carbohydrate_sexMale:treatmentPolyandry:line1 1.53 1.00 7296 7651 Carbohydrate_sexMale:treatmentPolyandry:line2 1.07 1.00 6550 7213 Carbohydrate_sexMale:treatmentPolyandry:line3 2.88 1.00 7062 8090 Protein_sexMale 1.18 1.00 10143 7950 Protein_treatmentPolyandry 0.17 1.00 9880 7799 Protein_line1 0.93 1.00 6938 7152 Protein_line2 1.35 1.00 7763 7455 Protein_line3 0.62 1.00 7871 7521 Protein_Dryweight 3.28 1.00 9605 8248 Protein_sexMale:treatmentPolyandry 1.88 1.00 9986 8005 Protein_sexMale:line1 0.82 1.00 6994 6894 Protein_sexMale:line2 1.76 1.00 7873 7792 Protein_sexMale:line3 0.20 1.00 7968 7765 Protein_treatmentPolyandry:line1 0.83 1.00 7854 7732 Protein_treatmentPolyandry:line2 1.00 1.00 7693 7641 Protein_treatmentPolyandry:line3 1.84 1.00 7964 7559 Protein_sexMale:treatmentPolyandry:line1 1.59 1.00 8586 7540 Protein_sexMale:treatmentPolyandry:line2 0.50 1.00 8232 7742 Protein_sexMale:treatmentPolyandry:line3 2.62 1.00 8589 8176 Glycogen_sexMale 0.05 1.00 8773 7568 Glycogen_treatmentPolyandry 0.97 1.00 8364 7116 Glycogen_line1 0.73 1.00 6298 7153 Glycogen_line2 0.78 1.00 6892 7693 Glycogen_line3 1.32 1.00 6475 7544 Glycogen_Dryweight 4.01 1.00 6959 7392 Glycogen_sexMale:treatmentPolyandry 1.50 1.00 9605 8578 Glycogen_sexMale:line1 1.07 1.00 6612 7953 Glycogen_sexMale:line2 1.13 1.00 6752 7640 Glycogen_sexMale:line3 0.84 1.00 7485 8166 Glycogen_treatmentPolyandry:line1 0.88 1.00 7077 7651 Glycogen_treatmentPolyandry:line2 0.76 1.00 6719 7792 Glycogen_treatmentPolyandry:line3 -0.00 1.00 7061 7456 Glycogen_sexMale:treatmentPolyandry:line1 2.27 1.00 8055 7837 Glycogen_sexMale:treatmentPolyandry:line2 1.49 1.00 6930 8033 Glycogen_sexMale:treatmentPolyandry:line3 2.49 1.00 8104 7647 Chitin_sexMale 2.27 1.00 7388 7646 Chitin_treatmentPolyandry 0.33 1.00 7955 7902 Chitin_line1 0.86 1.00 4969 7418 Chitin_line2 0.42 1.00 5478 6553 Chitin_line3 0.38 1.00 7039 7596 Chitin_Dryweight 3.30 1.00 5894 7347 Chitin_sexMale:treatmentPolyandry 0.38 1.00 9669 7598 Chitin_sexMale:line1 1.38 1.00 5068 6947 Chitin_sexMale:line2 1.52 1.00 5514 7692 Chitin_sexMale:line3 0.69 1.00 7006 7681 Chitin_treatmentPolyandry:line1 0.25 1.00 6490 7390 Chitin_treatmentPolyandry:line2 1.58 1.00 5410 7563 Chitin_treatmentPolyandry:line3 0.86 1.00 6930 7244 Chitin_sexMale:treatmentPolyandry:line1 1.47 1.00 6770 7632 Chitin_sexMale:treatmentPolyandry:line2 0.99 1.00 5753 6256 Chitin_sexMale:treatmentPolyandry:line3 0.13 1.00 7297 7761 Dryweight_sexMale -0.20 1.00 11022 8161 Dryweight_treatmentPolyandry 0.12 1.00 10140 8280 Dryweight_line1 -0.05 1.00 5592 6742 Dryweight_line2 0.09 1.00 6334 7190 Dryweight_line3 0.06 1.00 5839 6788 Dryweight_sexMale:treatmentPolyandry -0.01 1.00 8996 7885 Dryweight_sexMale:line1 0.16 1.00 6072 7282 Dryweight_sexMale:line2 0.01 1.00 5836 7023 Dryweight_sexMale:line3 0.02 1.00 5680 6662 Dryweight_treatmentPolyandry:line1 0.11 1.00 5645 6996 Dryweight_treatmentPolyandry:line2 -0.05 1.00 6067 7584 Dryweight_treatmentPolyandry:line3 0.08 1.00 6124 7170 Dryweight_sexMale:treatmentPolyandry:line1 0.03 1.00 6181 7101 Dryweight_sexMale:treatmentPolyandry:line2 0.17 1.00 6135 7022 Dryweight_sexMale:treatmentPolyandry:line3 0.04 1.00 5896 6520 Family Specific Parameters: Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS sigma_Lipid 0.62 0.08 0.48 0.81 1.00 8901 7960 sigma_Carbohydrate 0.81 0.11 0.64 1.05 1.00 9453 8007 sigma_Protein 0.94 0.13 0.73 1.23 1.00 9378 8359 sigma_Glycogen 0.78 0.11 0.60 1.01 1.00 8671 7494 sigma_Chitin 0.65 0.09 0.50 0.85 1.00 8997 7939 sigma_Dryweight 0.04 0.01 0.03 0.05 1.00 7737 7539 Residual Correlations: Estimate Est.Error l-95% CI u-95% CI Rhat rescor(Lipid,Carbohydrate) -0.44 0.14 -0.69 -0.14 1.00 rescor(Lipid,Protein) 0.02 0.16 -0.30 0.33 1.00 rescor(Carbohydrate,Protein) -0.07 0.16 -0.38 0.26 1.00 rescor(Lipid,Glycogen) 0.06 0.17 -0.27 0.37 1.00 rescor(Carbohydrate,Glycogen) -0.10 0.16 -0.40 0.23 1.00 rescor(Protein,Glycogen) -0.13 0.16 -0.44 0.20 1.00 rescor(Lipid,Chitin) -0.16 0.16 -0.47 0.17 1.00 rescor(Carbohydrate,Chitin) -0.13 0.16 -0.44 0.20 1.00 rescor(Protein,Chitin) 0.21 0.16 -0.12 0.50 1.00 rescor(Glycogen,Chitin) -0.01 0.16 -0.32 0.31 1.00 rescor(Lipid,Dryweight) 0.02 0.19 -0.36 0.39 1.00 rescor(Carbohydrate,Dryweight) 0.09 0.18 -0.27 0.43 1.00 rescor(Protein,Dryweight) -0.06 0.17 -0.39 0.29 1.00 rescor(Glycogen,Dryweight) 0.16 0.18 -0.20 0.50 1.00 rescor(Chitin,Dryweight) 0.05 0.19 -0.32 0.41 1.00 Bulk_ESS Tail_ESS rescor(Lipid,Carbohydrate) 8396 8362 rescor(Lipid,Protein) 9839 8907 rescor(Carbohydrate,Protein) 9856 8076 rescor(Lipid,Glycogen) 9353 8153 rescor(Carbohydrate,Glycogen) 10131 8136 rescor(Protein,Glycogen) 8928 7780 rescor(Lipid,Chitin) 9773 7628 rescor(Carbohydrate,Chitin) 10661 8345 rescor(Protein,Chitin) 8109 8028 rescor(Glycogen,Chitin) 8418 7801 rescor(Lipid,Dryweight) 5645 7685 rescor(Carbohydrate,Dryweight) 7230 8198 rescor(Protein,Dryweight) 7524 7753 rescor(Glycogen,Dryweight) 6149 7587 rescor(Chitin,Dryweight) 5949 7942 Samples were drawn 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).
Here, we use the model to predict the… NEED TO DO THIS FOR DIFFERENT BODY SIZES TOO…
Text here…
new <- expand_grid(sex = c("Male", "Female"),
treatment = c("Monogamy", "Polyandry"),
Dryweight = 0, line = NA) %>%
mutate(type = 1:n())
levels <- c("Carbohydrate", "Chitin", "Glycogen", "Lipid", "Protein", "Dryweight")
# Predict data from the SEM of metabolites...
# Because we use sum contrasts for "line" and line=NA in the new data,
# this predicts at the global means across the 4 lines (see ?posterior_epred)
fitted_values <- posterior_epred(brms_metabolite_SEM, newdata = new, summary = FALSE) %>%
reshape2::melt() %>% rename(draw = Var1, type = Var2, variable = Var3) %>%
as_tibble() %>%
left_join(new, by = "type") %>%
select(draw, variable, value, sex, treatment) %>%
mutate(variable = factor(variable, levels))
treat_diff <- fitted_values %>%
spread(treatment, value) %>%
mutate(`Difference in means (Poly - Mono)` = Polyandry - Monogamy)
summary_dat1 <- treat_diff %>%
filter(variable != 'Dryweight') %>%
rename(x = `Difference in means (Poly - Mono)`) %>%
group_by(variable, sex) %>%
summarise(`Difference in means (Poly - Mono)` = median(x),
`Lower 95% CI` = quantile(x, probs = 0.025),
`Upper 95% CI` = quantile(x, probs = 0.975),
p = 1 - as.numeric(bayestestR::p_direction(x)),
` ` = ifelse(p < 0.05, "*", ""),
.groups = "drop")
sampled_draws <- sample(unique(fitted_values$draw), 100)
treat_diff %>%
filter(variable != 'Dryweight') %>%
ggplot(aes(x = sex, y = `Difference in means (Poly - Mono)`,fill = sex)) +
geom_hline(yintercept = 0, linetype = 2) +
stat_halfeye() +
geom_line(data = treat_diff %>%
filter(draw %in% sampled_draws) %>%
filter(variable != 'Dryweight'),
alpha = 0.8, size = 0.12, colour = "black", aes(group = draw)) +
geom_point(data = summary_dat1, pch = 21, colour = "black", size = 3.1) +
scale_fill_brewer(palette = 'Pastel1', direction = 1, name = "") +
scale_colour_brewer(palette = 'Pastel1', direction = 1, name = "") +
facet_wrap( ~ variable, nrow = 1) +
theme_bw() +
theme(legend.position = 'none',
strip.background = element_blank(),
panel.grid.major.x = element_blank()) +
coord_cartesian(ylim = c(-1.8, 1.8)) +
ylab("Difference in means between\nselection treatments (P - M)") + xlab("Sex")
summary_dat1 %>%
kable(digits=3) %>%
kable_styling(full_width = FALSE)
variable | sex | Difference in means (Poly - Mono) | Lower 95% CI | Upper 95% CI | p | |
---|---|---|---|---|---|---|
Carbohydrate | Female | -0.275 | -0.960 | 0.444 | 0.210 | |
Carbohydrate | Male | -0.800 | -1.439 | -0.148 | 0.009 |
|
Chitin | Female | -0.262 | -0.837 | 0.326 | 0.188 | |
Chitin | Male | -0.614 | -1.139 | -0.091 | 0.010 |
|
Glycogen | Female | 0.267 | -0.386 | 0.969 | 0.209 | |
Glycogen | Male | 0.913 | 0.281 | 1.534 | 0.003 |
|
Lipid | Female | 0.739 | 0.182 | 1.306 | 0.005 |
|
Lipid | Male | 0.497 | -0.007 | 1.018 | 0.027 |
|
Protein | Female | -0.605 | -1.392 | 0.169 | 0.063 | |
Protein | Male | 0.230 | -0.529 | 0.983 | 0.266 |
This section essentially examines the treatment \(\times\) sex interaction term, by calculating the difference in the effect size of the P/M treatment between sexes, for each of the five metabolites. We find no strong evidence for a treatment \(\times\) sex interaction, i.e. the treatment effects did not differ detectably between sexes. However, the effect of the Polyandry treatment on glycogen concentration appears to be marginally more positive in males than females (probability of direction = 92.5%, similar to a one-sided p-value of 0.075).
treatsex_interaction_data <- treat_diff %>%
select(draw, variable, sex, d = `Difference in means (Poly - Mono)`) %>%
arrange(draw, variable, sex) %>%
group_by(draw, variable) %>%
summarise(`Difference in effect size between sexes` = d[2] - d[1],
.groups = "drop") # males - females
treatsex_interaction_data %>%
filter(variable != 'Dryweight') %>%
ggplot(aes(x = `Difference in effect size between sexes`, y = 1, fill = stat((x) < 0))) +
geom_vline(xintercept = 0, linetype = 2) +
stat_halfeyeh() +
facet_wrap( ~ variable) +
scale_fill_brewer(palette = 'Pastel2', direction = 1, name = "") +
theme_bw() +
theme(legend.position = 'none',
strip.background = element_blank()) +
ylab("Posterior density")
treatsex_interaction_data %>%
filter(variable != 'Dryweight') %>%
rename(x = `Difference in effect size between sexes`) %>%
group_by(variable) %>%
summarise(`Difference in effect size between sexes` = median(x),
`Lower 95% CI` = quantile(x, probs = 0.025),
`Upper 95% CI` = quantile(x, probs = 0.975),
p = 1 - as.numeric(bayestestR::p_direction(x)),
` ` = ifelse(p < 0.05, "*", ""),
.groups = "drop") %>%
kable(digits=3) %>%
kable_styling(full_width = FALSE)
variable | Difference in effect size between sexes | Lower 95% CI | Upper 95% CI | p | |
---|---|---|---|---|---|
Carbohydrate | -0.523 | -1.436 | 0.392 | 0.126 | |
Chitin | -0.355 | -1.112 | 0.379 | 0.165 | |
Glycogen | 0.639 | -0.242 | 1.502 | 0.075 | |
Lipid | -0.240 | -0.959 | 0.478 | 0.253 | |
Protein | 0.841 | -0.212 | 1.878 | 0.055 |
sessionInfo()
R version 4.0.3 (2020-10-10) Platform: x86_64-apple-darwin17.0 (64-bit) Running under: macOS Catalina 10.15.4 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_AU.UTF-8/en_AU.UTF-8/en_AU.UTF-8/C/en_AU.UTF-8/en_AU.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.1.0 tidybayes_2.0.3 [5] brms_2.14.4 Rcpp_1.0.4.6 nlme_3.1-149 ggridges_0.5.2 [9] gridExtra_2.3 GGally_1.5.0 forcats_0.5.0 stringr_1.4.0 [13] dplyr_1.0.0 purrr_0.3.4 readr_1.3.1 tidyr_1.1.0 [17] tibble_3.0.1 ggplot2_3.3.2 tidyverse_1.3.0 workflowr_1.6.2 loaded via a namespace (and not attached): [1] readxl_1.3.1 backports_1.1.7 plyr_1.8.6 [4] igraph_1.2.5 svUnit_1.0.3 splines_4.0.3 [7] crosstalk_1.1.0.1 TH.data_1.0-10 rstantools_2.1.1 [10] inline_0.3.15 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.1 matrixStats_0.56.0 [19] xts_0.12-0 sandwich_2.5-1 prettyunits_1.1.1 [22] colorspace_1.4-1 blob_1.2.1 rvest_0.3.5 [25] haven_2.3.1 xfun_0.19 callr_3.4.3 [28] crayon_1.3.4 jsonlite_1.7.0 lme4_1.1-23 [31] survival_3.2-7 zoo_1.8-8 glue_1.4.2 [34] gtable_0.3.0 emmeans_1.4.7 webshot_0.5.2 [37] V8_3.4.0 pkgbuild_1.0.8 rstan_2.21.2 [40] abind_1.4-5 scales_1.1.1 mvtnorm_1.1-0 [43] DBI_1.1.0 miniUI_0.1.1.1 viridisLite_0.3.0 [46] xtable_1.8-4 stats4_4.0.3 StanHeaders_2.21.0-3 [49] DT_0.13 htmlwidgets_1.5.1 httr_1.4.1 [52] DiagrammeR_1.0.6.1 threejs_0.3.3 arrayhelpers_1.1-0 [55] RColorBrewer_1.1-2 ellipsis_0.3.1 farver_2.0.3 [58] pkgconfig_2.0.3 reshape_0.8.8 loo_2.3.1 [61] dbplyr_1.4.4 labeling_0.3 tidyselect_1.1.0 [64] rlang_0.4.6 reshape2_1.4.4 later_1.0.0 [67] visNetwork_2.0.9 munsell_0.5.0 cellranger_1.1.0 [70] tools_4.0.3 cli_2.0.2 generics_0.0.2 [73] broom_0.5.6 evaluate_0.14 fastmap_1.0.1 [76] yaml_2.2.1 processx_3.4.2 fs_1.4.1 [79] whisker_0.4 mime_0.9 projpred_2.0.2 [82] xml2_1.3.2 compiler_4.0.3 bayesplot_1.7.2 [85] shinythemes_1.1.2 rstudioapi_0.11 gamm4_0.2-6 [88] curl_4.3 reprex_0.3.0 statmod_1.4.34 [91] stringi_1.5.3 highr_0.8 ps_1.3.3 [94] Brobdingnag_1.2-6 lattice_0.20-41 Matrix_1.2-18 [97] nloptr_1.2.2.1 markdown_1.1 shinyjs_1.1 [100] vctrs_0.3.0 pillar_1.4.4 lifecycle_0.2.0 [103] bridgesampling_1.0-0 estimability_1.3 insight_0.8.4 [106] httpuv_1.5.3.1 R6_2.4.1 promises_1.1.0 [109] codetools_0.2-16 boot_1.3-25 colourpicker_1.0 [112] MASS_7.3-53 gtools_3.8.2 assertthat_0.2.1 [115] rprojroot_1.3-2 withr_2.2.0 shinystan_2.5.0 [118] multcomp_1.4-13 bayestestR_0.6.0 mgcv_1.8-33 [121] parallel_4.0.3 hms_0.5.3 grid_4.0.3 [124] coda_0.19-3 minqa_1.2.4 rmarkdown_2.5 [127] git2r_0.27.1 shiny_1.4.0.2 lubridate_1.7.8 [130] base64enc_0.1-3 dygraphs_1.1.1.6