--- title: "IMPC Mouse data - Variance in sex differences" author: "Susanne & Felix Zajitschek" date: "2nd April 2019" output: html_document: code_folding: hide toc: true toc_float: true toc_depth: 3 --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE) ``` ```{r, include=FALSE} getwd() ``` # Packages ```{r} library(readr) library(dplyr) library(metafor) library(devtools) library(purrr) library(tidyverse) library(tibble) library(kableExtra) library(robumeta) library(ggpubr) library(ggplot2) ``` # Loading functions that are necessary ##Preparation of raw data 1) Data loading and cleaning of the csv file This step we have already done and provide a the cleaned up file which is less computing intensive. However, cvs ```{r} # loads the raw data, setting some default types for various columns load_raw <- function(filename) { read_csv(filename, col_types = cols( .default = col_character(), project_id = col_character(), id = col_character(), parameter_id = col_character(), age_in_days = col_integer(), date_of_experiment = col_datetime(format = ""), weight = col_double(), phenotyping_center_id = col_character(), production_center_id = col_character(), weight_date = col_datetime(format = ""), date_of_birth = col_datetime(format = ""), procedure_id = col_character(), pipeline_id = col_character(), biological_sample_id = col_character(), biological_model_id = col_character(), weight_days_old = col_integer(), datasource_id = col_character(), experiment_id = col_character(), data_point = col_double(), age_in_weeks = col_integer(), `_version_` = col_character() ) ) } # Apply some standard cleaning to the data clean_raw_data <- function(mydata) { mydata %>% # Fileter to IMPC source (recommened by Jeremey in email to Susi on 20 Aug 2018) filter(datasource_name == 'IMPC') %>% # standardise trait names mutate(parameter_name = tolower(parameter_name) ) %>% # remove extreme ages filter(age_in_days > 0 & age_in_days < 500) %>% # remove NAs filter(!is.na(data_point)) %>% # subset to reasonable set of variables # date_of_experiment: Jeremy suggested using as an indicator of batch-level effects select(production_center, strain_name, strain_accession_id, biological_sample_id, pipeline_stable_id, procedure_group, procedure_name, sex, date_of_experiment, age_in_days, weight, parameter_name, data_point) %>% arrange(production_center, biological_sample_id, age_in_days) } ``` 2) Subsetting the data to choose only one datapoint per individual per trait ```{r} # this is a necessary step for the loop across all traits data_subset_parameterid_individual_by_age <- function(mydata, parameter, age_min, age_center) { tmp <- mydata %>% filter(age_in_days >= age_min, id == parameter) %>% # take results for single individual closest to age_center mutate(age_diff = abs(age_center - age_in_days)) %>% group_by(biological_sample_id) %>% filter(age_diff == min(age_diff)) %>% select(-age_diff) # still some individuals with multiple records (because same individual appears under different procedures, so filter to one record) j <- match(unique(tmp$biological_sample_id), tmp$biological_sample_id) tmp[j, ] } ``` ## Functions for preparing the data for meta analyses 3) "Population statistics" ```{r} calculate_population_stats <- function(mydata, min_individuals = 5) { mydata %>% group_by(population, strain_name, production_center, sex) %>% summarise( trait = parameter_name[1], x_bar = mean(data_point), x_sd = sd(data_point), n_ind = n() ) %>% ungroup() %>% filter(n_ind > min_individuals) %>% # Check both sexes present & filter those missing group_by(population) %>% mutate( n_sex = n_distinct(sex) ) %>% ungroup() %>% filter(n_sex ==2) %>% select(-n_sex) %>% arrange(production_center, strain_name, population, sex) } ``` 4) Extraction of effect sizes and sample variances ```{r} create_meta_analysis_effect_sizes <- function(mydata) { i <- seq(1, nrow(mydata), by = 2) input <- data.frame( n1i = mydata$n_ind[i], n2i = mydata$n_ind[i + 1], x1i = mydata$x_bar[i], x2i = mydata$x_bar[i + 1], sd1i = mydata$x_sd[i], sd2i = mydata$x_sd[i + 1] ) mydata[i,] %>% select(strain_name, production_center) %>% mutate( effect_size_CVR = Calc.lnCVR(CMean = input$x1i, CSD = input$sd1i, CN = input$n1i, EMean = input$x2i, ESD = input$sd2i, EN = input$n2i), sample_variance_CVR = Calc.var.lnCVR(CMean = input$x1i, CSD = input$sd1i, CN = input$n1i, EMean = input$x2i, ESD = input$sd2i, EN = input$n2i), effect_size_VR = Calc.lnVR(CSD = input$sd1i, CN = input$n1i, ESD = input$sd2i, EN = input$n2i), sample_variance_VR = Calc.var.lnVR(CN = input$n1i, EN = input$n2i), effect_size_RR = Calc.lnRR(CMean = input$x1i, CSD = input$sd1i, CN = input$n1i, EMean = input$x2i, ESD = input$sd2i, EN = input$n2i), sample_variance_RR = Calc.var.lnRR(CMean = input$x1i, CSD = input$sd1i, CN = input$n1i, EMean = input$x2i, ESD = input$sd2i, EN = input$n2i), err = as.factor(seq_len(n())) ) } ``` 5) Meta Analysis Function to calculate metanalaysis statistics. Created by A M Senior @ the University of Otago NZ 03/01/2014 Below are funcitons for calculating effect sizes for meta-analysis of variance. All functions take the mean, sd and n from the control and experimental groups. The first function, Cal.lnCVR, calculates the the log repsonse-ratio of the coefficient of variance (lnCVR) - see Nakagawa et al 2015. The second function calculates the measuremnt error variance for lnCVR. As well as the aforementioned parameters, this function also takes Equal.E.C.Corr (default = T), which must be True or False. If true, the funciton assumes that the correlaiton between mean and sd (Taylor's Law) is equal for the mean and control groups, and, thus these data are pooled. If False the mean-SD correlation for the experimental and control groups are calculated seperatley from one another. Similar functions are then implemented for lnVR (for comparison of standard deviations) and ln RR (for comparison of means) ```{r} Calc.lnCVR <- function(CMean, CSD, CN, EMean, ESD, EN){ log(ESD) - log(EMean) + 1 / (2*(EN - 1)) - (log(CSD) - log(CMean) + 1 / (2*(CN - 1))) } Calc.var.lnCVR <- function(CMean, CSD, CN, EMean, ESD, EN, Equal.E.C.Corr=T) { if(Equal.E.C.Corr==T){ mvcorr <- <-0 #cor.test(log(c(CMean, EMean)), log(c(CSD, ESD)))$estimate old, slightly incorrect S2 <- CSD^2 / (CN * (CMean^2)) + 1 / (2 * (CN - 1)) - 2 * mvcorr * sqrt((CSD^2 / (CN * (CMean^2))) * (1 / (2 * (CN - 1)))) + ESD^2 / (EN * (EMean^2)) + 1 / (2 * (EN - 1)) - 2 * mvcorr * sqrt((ESD^2 / (EN * (EMean^2))) * (1 / (2 * (EN - 1)))) } else{ Cmvcorr <- cor.test(log(CMean), log(CSD))$estimate Emvcorr <- cor.test(log(EMean), (ESD))$estimate S2 <- CSD^2 / (CN * (CMean^2)) + 1 / (2 * (CN - 1)) - 2 * Cmvcorr * sqrt((CSD^2 / (CN * (CMean^2))) * (1 / (2 * (CN - 1)))) + ESD^2 / (EN * (EMean^2)) + 1 / (2 * (EN - 1)) - 2 * Emvcorr * sqrt((ESD^2 / (EN * (EMean^2))) * (1 / (2 * (EN - 1)))) } S2 } Calc.lnVR <- function(CSD, CN, ESD, EN){ log(ESD) - log(CSD) + 1 / (2*(EN - 1)) - 1 / (2*(CN - 1)) } Calc.var.lnVR <- function( CN, EN) { 1 / (2*(EN - 1)) + 1 / (2*(CN - 1)) } Calc.lnRR <- function(CMean, CSD, CN, EMean, ESD, EN) { log(EMean) - log(CMean) } Calc.var.lnRR <- function(CMean, CSD, CN, EMean, ESD, EN) { CSD^2/(CN * CMean^2) + ESD^2/(EN * EMean^2) } ``` Having loaded the necessary functions, we can get started on the dataset. We here provide the cleaned dataset, which we have saved in a folder called "export", as easy starting point. However, the full dataset can ve loaded and cleaned using the da cleaning function (Function 1 above), if "#" signs in the code below are removed (created as that is much smaller than th e .csv - which we can still provide for those who absoliutely want to start from scratch?) ```{r} ## Load raw data - save cleaned dataset as RDS for reuse #data_raw <- load_raw("data/dr7.0_all_control_data.csv") %>% # clean_raw_data() #dir.create("export", F, F) #saveRDS(data_raw, "export/data_clean.rds") data1 <- readRDS("export/data_clean.rds") #data1 ``` ## Clean data This requires the selection of traits that have been measured in at least 2 centers. Consequently, rare or unusual methods and procedures are being filtered out in this step. ```{r } dat1 <- data1 %>% group_by(parameter_name) %>% summarize(center_per_trait = length(unique(production_center, na.rm = TRUE))) dat2 <- merge(data1, dat1) dat_moreThan1center <- dat2 %>% filter(center_per_trait >= 2) data2 <- dat_moreThan1center #min(data2$center_per_trait) # as a check if there indeed are no single occurences ``` #Preparation for Meta analysis ## Define population variable & add grouping variables In this step, a grouping variable is added (found in "Parameter.Grouping.csv") The grouping variables were decided based on functional groups and procedures ```{r } data3 <- data2 %>% mutate(population = sprintf("%s-%s", production_center, strain_name)) group <- read.csv("ParameterGrouping.csv") data <- data3 data$parameterGroup <- group$parameter[match(data$parameter_name, group$parameter_name)] ``` ## Assign each unique parameter_name (=trait,use trait variable) a unique number ('id') We add a new variable, where redundant traits are combined [note however, at this stage the dataset still contains non-sensical traits, i.e. traits that may not contain any u=information on variance] ```{r} head(data) names(data)[16] <- "parameter_group" data <- transform(data, id = match(parameter_name, unique(parameter_name))) n1 <- length(unique(data$parameter_name)) #232 n2 <- length(unique(data$parameter_group)) #161 n3 <- length(unique(data$procedure_name)) # 26 n <- length(unique(data$id)) #n # just to check that the number of traits is 232 ``` ## Create a matrix to store results for all traits As the current version of this script utilizes a loop instead of tidyR code, it is here necessary to create an empty matrix, in which the returning values will be stored. ```{r} results.alltraits.grouping <- as.data.frame(cbind(c(1:n), matrix(rep(0, n*13), ncol = 13))) #number of individual results per trait = 10 names(results.alltraits.grouping) <- c("id", "lnCVR", "lnCVR_lower", "lnCVR_upper", "lnCVR_se", "lnVR", "lnVR_lower", "lnVR_upper", "lnVR_se", "lnRR", "lnRR_lower", "lnRR_upper" ,"lnRR_se" , "sampleSize") ``` # LOOP, to run meta-analysis on all traits The loop combines the functions menationed above and fills the data matrix with results from our meta analysis. Error messages indicate traits that either did not reach convergence, or that did not return meaningful results in the metaanalysis, due to absence of variance. Those traits will be removed ion later steps, outlined below. ```{r} for(t in 1:n) { tryCatch({ data_par_age <- data_subset_parameterid_individual_by_age(data, t, age_min = 0, age_center = 100) population_stats <- calculate_population_stats(data_par_age) results <- create_meta_analysis_effect_sizes(population_stats) #lnCVR, log repsonse-ratio of the coefficient of variance cvr <- metafor::rma.mv(yi = effect_size_CVR, V = sample_variance_CVR, random = list(~1| strain_name, ~1|production_center, ~1|err), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), data = results) results.alltraits.grouping[t, 2] <- cvr$b results.alltraits.grouping[t, 3] <- cvr$ci.lb results.alltraits.grouping[t, 4] <- cvr$ci.ub results.alltraits.grouping[t, 5] <- cvr$se cvr #lnVR, comparison of standard deviations cv <- metafor::rma.mv(yi = effect_size_VR, V = sample_variance_VR, random = list(~1| strain_name, ~1|production_center, ~1|err), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F, data = results) results.alltraits.grouping[t, 6] <- cv$b results.alltraits.grouping[t, 7] <- cv$ci.lb results.alltraits.grouping[t, 8] <- cv$ci.ub results.alltraits.grouping[t, 9] <- cv$se # for means, lnRR means <- metafor::rma.mv(yi = effect_size_RR, V = sample_variance_RR, random = list(~1| strain_name, ~1|production_center, ~1|err), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), data = results) results.alltraits.grouping[t, 10] <- means$b results.alltraits.grouping[t, 11] <- means$ci.lb results.alltraits.grouping[t, 12] <- means$ci.ub results.alltraits.grouping[t, 13] <- means$se results.alltraits.grouping[t, 14] <- means$k }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")}) } ``` # Merging datasets Procedure names, groupiung variables etc are merged back together with the results from the metafor analysis above. This requires loading of another excel sheet, "procedures.csv" ```{r} procedures <- read.csv("procedures.csv") results.alltraits.grouping$parameter_group <- data$parameter_group[match(results.alltraits.grouping$id, data$id)] results.alltraits.grouping$procedure <- data$procedure_name[match(results.alltraits.grouping$id, data$id)] results.alltraits.grouping$GroupingTerm <- procedures$GroupingTerm[match(results.alltraits.grouping$procedure, procedures$procedure)] results.alltraits.grouping$parameter_name <- data$parameter_name[match(results.alltraits.grouping$id, data$id)] meta1 <- results.alltraits.grouping n <- length(unique(meta1$parameter_name)) # 232 ``` Removal of traits that did not achieve convergence, are non-sensical for analysis of variance (such as traits that show variaton, such as number of ribs, digits, etc). 14 traits from the originally 232 that had been included are removed. ```{r} meta_clean <- meta1[ !(meta1$id %in% c(84,144,158,160,161,162,163,165,166,167,168,221,222,231)), ] removed <-length(unique(meta_clean$parameter_name)) #218 ``` #Dealing with Correlated Paramters This dataset contained a number of highly correlated taits, such as different kinds of cell counts (for example, hierarchichal parametrization within immunologocal assays). As those datapoints are not independent of each other, we conducted a meta analyses on these correlated parameters to collapse the number of levels. ## Collapsing correlated parameters Here we double check numbers of trait parameters in the dataset ```{r} meta1 <- meta_clean # length(unique(meta1$procedure)) #18 # length(unique(meta1$GroupingTerm)) #9 # length(unique(meta1$parameter_group)) # 148 levels. To be used as grouping factor for meta-meta analysis / collapsing down based on things that are classified identically in "parameter_group" but have different "parameter_name" length(unique(meta1$parameter_name)) #218 ``` ## Count of number of parameter names (correlated sub-traits) in each parameter group (par_group_size) This serves to idenfify and separate the traits that are correlated from the full dataset that can be preocessed as is. If the sample size (n) for a given "parameter group" equals 1, the trait is unique and uncorrelated. All instances, where there are 2 or more traits accociated with the same parameter group (90 cases), are selected for a "mini-meta analysis", which removes the issue of correlation. ```{r} kable(cbind (meta1 %>% count(parameter_group) )) %>% kable_styling() %>% scroll_box(width = "100%", height = "200px") meta1b <- meta1 %>% group_by(parameter_group) %>% summarize(par_group_size = length(unique(parameter_name, na.rm = TRUE))) #this gives a summary of number of parameter names in each parameter group, now it neeeds to get merged it back together meta1$par_group_size <- meta1b$par_group_size[match(meta1$parameter_group, meta1b$parameter_group)] # Create subsets with > 1 count (par_group_size > 1) meta1_sub<-subset(meta1,par_group_size >1) # 90 observations meta1_sub$sampleSize <- as.numeric(meta1_sub$sampleSize) ``` # Preparation for Visualization and Meta-analysis ## Perform meta-analyses on correlated sub-traits, using robumeta The subset of the data is prepared (nested), and in this first step the model of the meta analysis effect sizes are calculated ```{r} # nesting n_count <- meta1_sub %>% group_by(parameter_group) %>% mutate(raw_N = sum(sampleSize)) %>% nest() model_count <- n_count %>% mutate(model_lnRR = map(data, ~ robu(.x$lnRR ~ 1, data= .x, studynum= .x$id, modelweights = c("CORR"), rho = 0.8, small = TRUE, var.eff.size= (.x$lnRR_se)^2 )), model_lnVR = map(data, ~ robu(.x$lnVR ~ 1, data= .x, studynum= .x$id, modelweights = c("CORR"), rho = 0.8, small = TRUE, var.eff.size= (.x$lnVR_se)^2 )), model_lnCVR = map(data, ~ robu(.x$lnCVR ~ 1, data= .x, studynum= .x$id, modelweights = c("CORR"), rho = 0.8, small = TRUE, var.eff.size= (.x$lnCVR_se)^2 ))) ``` ## Extract and save parameter estimates Function to collect the outcomes of the "mini" meta analysis ```{r} count_fun <- function(mod_sub) return(c(mod_sub$reg_table$b.r, mod_sub$reg_table$CI.L, mod_sub$reg_table$CI.U, mod_sub$reg_table$SE)) #estimate, lower ci, upper ci, SE ``` Meta analysis using robu meta ```{r} robusub_RR <- model_count %>% transmute(parameter_group, estimatelnRR = map(model_lnRR, count_fun)) %>% mutate(r = map(estimatelnRR, ~ data.frame(t(.)))) %>% unnest(r) %>% select(-estimatelnRR) %>% purrr::set_names(c("parameter_group","lnRR","lnRR_lower","lnRR_upper","lnRR_se")) robusub_CVR <- model_count %>% transmute(parameter_group, estimatelnCVR = map(model_lnCVR, count_fun)) %>% mutate(r = map(estimatelnCVR, ~ data.frame(t(.)))) %>% unnest(r) %>% select(-estimatelnCVR) %>% purrr::set_names(c("parameter_group","lnCVR","lnCVR_lower","lnCVR_upper","lnCVR_se")) robusub_VR <- model_count %>% transmute(parameter_group, estimatelnVR = map(model_lnVR, count_fun)) %>% mutate(r = map(estimatelnVR, ~ data.frame(t(.)))) %>% unnest(r) %>% select(-estimatelnVR) %>% purrr::set_names(c("parameter_group","lnVR","lnVR_lower","lnVR_upper","lnVR_se")) robu_all <- full_join(robusub_CVR, robusub_VR) %>% full_join(., robusub_RR) kable(cbind(robu_all, robu_all)) %>% kable_styling() %>% scroll_box(width = "100%", height = "200px") ``` ## Merge the two data sets (the new [robu_all] and the initial [uncorrelated sub-traits with count = 1]) ```{r} meta_all <- meta1 %>% filter(par_group_size == 1) %>% as_tibble #str(meta_all) #str(robu_all) #which(is.na(match(names(meta_all),names(robu_all)))) # check ``` # Combine data ```{r} # Step1 combinedmeta <- bind_rows(robu_all, meta_all) #glimpse(combinedmeta) # Steps 2&3 metacombo <- combinedmeta metacombo$counts <- meta1$par_group_size[match( metacombo$parameter_group, meta1$parameter_group)] metacombo$procedure2 <-meta1$procedure[match( metacombo$parameter_group, meta1$parameter_group)] metacombo$GroupingTerm2 <-meta1$GroupingTerm[match( metacombo$parameter_group, meta1$parameter_group)] kable(cbind (metacombo, metacombo)) %>% kable_styling() %>% scroll_box(width = "100%", height = "200px") ``` # Clean-up and rename ```{r} metacombo <-metacombo[, c(1, 20:22, 2:13)] names(metacombo)[3] <- "procedure" names(metacombo)[4] <- "GroupingTerm" # Quick pre-check before doing plots compare <- metacombo %>% group_by(GroupingTerm) %>% dplyr::summarize(MeanCVR = mean(lnCVR),MeanVR = mean(lnVR), MeanRR = mean(lnRR) ) compare ``` # Last step: meta-meta-analysis ## *Perform meta-analyses (3 for each of the 9 grouping terms: lnCVR, lnVR, lnRR) This is the full result dataset ```{r} kable(cbind (metacombo,metacombo)) %>% kable_styling() %>% scroll_box(width = "100%", height = "200px") ``` # Prepare data Nesting, calculating the number of parameters within each grouping term, and running the metaanalysis ```{r} metacombo_final <- metacombo %>% group_by(GroupingTerm) %>% nest() # **Calculate number of parameters per grouping term metacombo_final <- metacombo_final %>% mutate(para_per_GroupingTerm = map_dbl(data, nrow)) # For all grouping terms metacombo_final_all <- metacombo %>% nest() # **Final fixed effects meta-analyses within grouping terms, with SE of the estimate overall1 <- metacombo_final %>% mutate(model_lnCVR = map(data, ~ metafor::rma.uni(yi = .x$lnCVR, sei = (.x$lnCVR_upper - .x$lnCVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)), model_lnVR = map(data, ~ metafor::rma.uni(yi = .x$lnVR, sei = (.x$lnVR_upper - .x$lnVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)), model_lnRR = map(data, ~ metafor::rma.uni(yi = .x$lnRR, sei = (.x$lnRR_upper - .x$lnRR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F))) # **Final fixed effects meta-analyses ACROSS grouping terms, with SE of the estimate overall_all1 <- metacombo_final_all %>% mutate(model_lnCVR = map(data, ~ metafor::rma.uni(yi = .x$lnCVR, sei = (.x$lnCVR_upper - .x$lnCVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)), model_lnVR = map(data, ~ metafor::rma.uni(yi = .x$lnVR, sei = (.x$lnVR_upper - .x$lnVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)), model_lnRR = map(data, ~ metafor::rma.uni(yi = .x$lnRR, sei = (.x$lnRR_upper - .x$lnRR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F))) ``` # Re-structure data for each grouping term; delete un-used variables ```{r} Behaviour <- as.data.frame(overall1 %>% filter(., GroupingTerm == "Behaviour") %>% mutate(lnCVR=.[[4]][[1]]$b, lnCVR_lower=.[[4]][[1]]$ci.lb, lnCVR_upper=.[[4]][[1]]$ci.ub, lnCVR_se=.[[4]][[1]]$se, lnVR=.[[5]][[1]]$b, lnVR_lower=.[[5]][[1]]$ci.lb, lnVR_upper=.[[5]][[1]]$ci.ub, lnVR_se=.[[5]][[1]]$se, lnRR=.[[6]][[1]]$b, lnRR_lower=.[[6]][[1]]$ci.lb, lnRR_upper=.[[6]][[1]]$ci.ub, lnRR_se=.[[6]][[1]]$se) )[, c(1,7:18)] Immunology <- as.data.frame(overall1 %>% filter(., GroupingTerm == "Immunology") %>% mutate(lnCVR=.[[4]][[1]]$b, lnCVR_lower=.[[4]][[1]]$ci.lb, lnCVR_upper=.[[4]][[1]]$ci.ub, lnCVR_se=.[[4]][[1]]$se, lnVR=.[[5]][[1]]$b, lnVR_lower=.[[5]][[1]]$ci.lb, lnVR_upper=.[[5]][[1]]$ci.ub, lnVR_se=.[[5]][[1]]$se, lnRR=.[[6]][[1]]$b, lnRR_lower=.[[6]][[1]]$ci.lb, lnRR_upper=.[[6]][[1]]$ci.ub, lnRR_se=.[[6]][[1]]$se) )[, c(1,7:18)] Hematology <- as.data.frame(overall1 %>% filter(., GroupingTerm == "Hematology") %>% mutate(lnCVR=.[[4]][[1]]$b, lnCVR_lower=.[[4]][[1]]$ci.lb, lnCVR_upper=.[[4]][[1]]$ci.ub, lnCVR_se=.[[4]][[1]]$se, lnVR=.[[5]][[1]]$b, lnVR_lower=.[[5]][[1]]$ci.lb, lnVR_upper=.[[5]][[1]]$ci.ub, lnVR_se=.[[5]][[1]]$se, lnRR=.[[6]][[1]]$b, lnRR_lower=.[[6]][[1]]$ci.lb, lnRR_upper=.[[6]][[1]]$ci.ub, lnRR_se=.[[6]][[1]]$se) )[, c(1,7:18)] Hearing <- as.data.frame(overall1 %>% filter(., GroupingTerm == "Hearing") %>% mutate(lnCVR=.[[4]][[1]]$b, lnCVR_lower=.[[4]][[1]]$ci.lb, lnCVR_upper=.[[4]][[1]]$ci.ub, lnCVR_se=.[[4]][[1]]$se, lnVR=.[[5]][[1]]$b, lnVR_lower=.[[5]][[1]]$ci.lb, lnVR_upper=.[[5]][[1]]$ci.ub, lnVR_se=.[[5]][[1]]$se, lnRR=.[[6]][[1]]$b, lnRR_lower=.[[6]][[1]]$ci.lb, lnRR_upper=.[[6]][[1]]$ci.ub, lnRR_se=.[[6]][[1]]$se) )[, c(1,7:18)] Physiology <- as.data.frame(overall1 %>% filter(., GroupingTerm == "Physiology") %>% mutate(lnCVR=.[[4]][[1]]$b, lnCVR_lower=.[[4]][[1]]$ci.lb, lnCVR_upper=.[[4]][[1]]$ci.ub, lnCVR_se=.[[4]][[1]]$se, lnVR=.[[5]][[1]]$b, lnVR_lower=.[[5]][[1]]$ci.lb, lnVR_upper=.[[5]][[1]]$ci.ub, lnVR_se=.[[5]][[1]]$se, lnRR=.[[6]][[1]]$b, lnRR_lower=.[[6]][[1]]$ci.lb, lnRR_upper=.[[6]][[1]]$ci.ub, lnRR_se=.[[6]][[1]]$se) )[, c(1,7:18)] Metabolism <- as.data.frame(overall1 %>% filter(., GroupingTerm == "Metabolism") %>% mutate(lnCVR=.[[4]][[1]]$b, lnCVR_lower=.[[4]][[1]]$ci.lb, lnCVR_upper=.[[4]][[1]]$ci.ub, lnCVR_se=.[[4]][[1]]$se, lnVR=.[[5]][[1]]$b, lnVR_lower=.[[5]][[1]]$ci.lb, lnVR_upper=.[[5]][[1]]$ci.ub, lnVR_se=.[[5]][[1]]$se, lnRR=.[[6]][[1]]$b, lnRR_lower=.[[6]][[1]]$ci.lb, lnRR_upper=.[[6]][[1]]$ci.ub, lnRR_se=.[[6]][[1]]$se) )[, c(1,7:18)] Morphology <- as.data.frame(overall1 %>% filter(., GroupingTerm == "Morphology") %>% mutate(lnCVR=.[[4]][[1]]$b, lnCVR_lower=.[[4]][[1]]$ci.lb, lnCVR_upper=.[[4]][[1]]$ci.ub, lnCVR_se=.[[4]][[1]]$se, lnVR=.[[5]][[1]]$b, lnVR_lower=.[[5]][[1]]$ci.lb, lnVR_upper=.[[5]][[1]]$ci.ub, lnVR_se=.[[5]][[1]]$se, lnRR=.[[6]][[1]]$b, lnRR_lower=.[[6]][[1]]$ci.lb, lnRR_upper=.[[6]][[1]]$ci.ub, lnRR_se=.[[6]][[1]]$se) )[, c(1,7:18)] Heart <- as.data.frame(overall1 %>% filter(., GroupingTerm == "Heart") %>% mutate(lnCVR=.[[4]][[1]]$b, lnCVR_lower=.[[4]][[1]]$ci.lb, lnCVR_upper=.[[4]][[1]]$ci.ub, lnCVR_se=.[[4]][[1]]$se, lnVR=.[[5]][[1]]$b, lnVR_lower=.[[5]][[1]]$ci.lb, lnVR_upper=.[[5]][[1]]$ci.ub, lnVR_se=.[[5]][[1]]$se, lnRR=.[[6]][[1]]$b, lnRR_lower=.[[6]][[1]]$ci.lb, lnRR_upper=.[[6]][[1]]$ci.ub, lnRR_se=.[[6]][[1]]$se) )[, c(1,7:18)] Eye <- as.data.frame(overall1 %>% filter(., GroupingTerm == "Eye") %>% mutate(lnCVR=.[[4]][[1]]$b, lnCVR_lower=.[[4]][[1]]$ci.lb, lnCVR_upper=.[[4]][[1]]$ci.ub, lnCVR_se=.[[4]][[1]]$se, lnVR=.[[5]][[1]]$b, lnVR_lower=.[[5]][[1]]$ci.lb, lnVR_upper=.[[5]][[1]]$ci.ub, lnVR_se=.[[5]][[1]]$se, lnRR=.[[6]][[1]]$b, lnRR_lower=.[[6]][[1]]$ci.lb, lnRR_upper=.[[6]][[1]]$ci.ub, lnRR_se=.[[6]][[1]]$se) )[, c(1,7:18)] All <- as.data.frame(overall_all1 %>% mutate(lnCVR=.[[2]][[1]]$b, lnCVR_lower=.[[2]][[1]]$ci.lb, lnCVR_upper=.[[2]][[1]]$ci.ub, lnCVR_se=.[[2]][[1]]$se,lnVR=.[[3]][[1]]$b, lnVR_lower=.[[3]][[1]]$ci.lb, lnVR_upper=.[[3]][[1]]$ci.ub, lnVR_se=.[[3]][[1]]$se, lnRR=.[[4]][[1]]$b, lnRR_lower=.[[4]][[1]]$ci.lb, lnRR_upper=.[[4]][[1]]$ci.ub, lnRR_se=.[[4]][[1]]$se) )[, c(5:16)] All$lnCVR <- as.numeric(All$lnCVR) All$lnVR <- as.numeric(All$lnVR) All$lnRR <- as.numeric(All$lnRR) All <- All %>% mutate(GroupingTerm = "All") overall2 <- bind_rows(Behaviour, Morphology, Metabolism, Physiology, Immunology, Hematology, Heart, Hearing, Eye, All) ``` # PLOTS # **Plot FIGURE 2 (First-order meta analysis results) # **Re-order grouping terms ```{r} meta_clean$GroupingTerm <- factor(meta_clean$GroupingTerm, levels =c("Behaviour","Morphology","Metabolism","Physiology","Immunology","Hematology","Heart","Hearing","Eye") ) meta_clean$GroupingTerm <- factor(meta_clean$GroupingTerm, rev(levels(meta_clean$GroupingTerm))) # *Prepare data for all traits meta.plot2.all <- meta_clean %>% select(lnCVR, lnVR, lnRR, GroupingTerm) %>% arrange(GroupingTerm) meta.plot2.all.b <- gather(meta.plot2.all, trait, value, c(lnCVR, lnVR, lnRR)) meta.plot2.all.b$trait <- factor(meta.plot2.all.b$trait, levels =c("lnCVR","lnVR","lnRR") ) meta.plot2.all.c <- meta.plot2.all.b %>% group_by_at(vars(trait, GroupingTerm)) %>% summarise(malebias = sum(value > 0), femalebias = sum(value<= 0), total= malebias + femalebias, malepercent = malebias*100/total, femalepercent = femalebias*100/total) meta.plot2.all.c$label <- "All traits" # restructure to create stacked bar plots meta.plot2.all.d <- as.data.frame(meta.plot2.all.c) meta.plot2.all.e <- gather(meta.plot2.all.d, key = sex, value = percent, malepercent:femalepercent, factor_key = TRUE) # create new sample size variable meta.plot2.all.e$samplesize <- with(meta.plot2.all.e, ifelse(sex == "malepercent", malebias, femalebias) ) malebias_Fig2_alltraits <- ggplot(meta.plot2.all.e) + aes(x = GroupingTerm, y = percent, fill = sex) + geom_col() + geom_hline(yintercept = 50, linetype = "dashed", color = "gray40") + geom_text(data = subset(meta.plot2.all.e, samplesize != 0), aes(label = samplesize), position = position_stack(vjust = .5), color = "white", size = 3.5) + facet_grid(cols = vars(trait), rows = vars(label), labeller = label_wrap_gen(width = 18), scales= 'free', space='free') + scale_fill_brewer(palette = "Set2") + theme_bw(base_size = 18) + theme(strip.text.y = element_text(angle = 270, size = 10, margin = margin(t=15, r=15, b=15, l=15)), strip.text.x = element_text(size = 12), strip.background = element_rect(colour = NULL,linetype = "blank", fill = "gray90"), text = element_text(size=14), panel.spacing = unit(0.5, "lines"), panel.border= element_blank(), axis.line=element_line(), panel.grid.major.x = element_line(linetype = "solid", colour = "gray95"), panel.grid.major.y = element_line(linetype = "solid", color = "gray95"), panel.grid.minor.y = element_blank(), panel.grid.minor.x = element_blank(), legend.position = "none", axis.title.x = element_blank(), axis.title.y = element_blank() ) + coord_flip() #malebias_Fig2_alltraits ``` # *Prepare data for traits with CI not overlapping 0 ##create column with 1= different from zero, 0= zero included in CI ```{r} meta.plot2.sig <- meta_clean %>% mutate(lnCVRsig = ifelse(lnCVR_lower*lnCVR_upper >0, 1, 0), lnVRsig = ifelse(lnVR_lower*lnVR_upper >0, 1, 0), lnRRsig = ifelse(lnRR_lower*lnRR_upper > 0, 1,0)) meta.plot2.sig.b <- meta.plot2.sig[, c("lnCVR", "lnVR", "lnRR", "lnCVRsig", "lnVRsig", "lnRRsig", "GroupingTerm")] meta.plot2.sig.c <- gather(meta.plot2.sig.b, trait, value, lnCVR:lnRR) meta.plot2.sig.c$sig <- "placeholder" meta.plot2.sig.c$trait <- factor(meta.plot2.sig.c$trait, levels =c("lnCVR","lnVR","lnRR") ) meta.plot2.sig.c$sig <- ifelse(meta.plot2.sig.c$trait == "lnCVR", meta.plot2.sig.c$lnCVRsig, ifelse(meta.plot2.sig.c$trait == "lnVR", meta.plot2.sig.c$lnVRsig, meta.plot2.sig.c$lnRRsig)) #choosing sex biased ln-ratios significantly larger than 0 meta.plot2.sig.malebias <- meta.plot2.sig.c %>% group_by_at(vars(trait, GroupingTerm)) %>% filter(sig== 1) %>% summarise(male_sig = sum(value > 0), female_sig = sum(value < 0), total = male_sig + female_sig) meta.plot2.sig.malebias <- ungroup(meta.plot2.sig.malebias) %>% add_row(trait = "lnCVR", GroupingTerm = "Hearing", male_sig = 0, female_sig = 0, .before = 4) %>% #add "Hearing" for lnCVR (not filtered as only zeros) mutate(malepercent = male_sig*100 / total, femalepercent = female_sig*100 / total) meta.plot2.sig.malebias$label <- "CI not overlapping zero" # restructure to create stacked bar plots meta.plot2.sig.bothsexes <- as.data.frame(meta.plot2.sig.malebias) meta.plot2.sig.bothsexes.b <- gather(meta.plot2.sig.bothsexes, key = sex, value = percent, malepercent:femalepercent, factor_key = TRUE) # create new sample size variable meta.plot2.sig.bothsexes.b$samplesize <- with(meta.plot2.sig.bothsexes.b, ifelse(sex == "malepercent", male_sig, female_sig) ) # *Plot Fig2 all significant results (CI not overlapping zero): # no sig. lnCVR for 'Hearing' in either sex; no sig. male-biased lnCVR for 'Immunology' and 'Eye, and no sig. male-biased lnVR for 'Eye' malebias_Fig2_sigtraits <- ggplot(meta.plot2.sig.bothsexes.b) + aes(x = GroupingTerm, y = percent, fill = sex) + geom_col() + geom_hline(yintercept = 50, linetype = "dashed", color = "gray40") + geom_text(data = subset(meta.plot2.sig.bothsexes.b, samplesize != 0), aes(label = samplesize), position = position_stack(vjust = .5), color = "white", size = 3.5) + facet_grid(cols = vars(trait), rows = vars(label), labeller = label_wrap_gen(width = 18), scales= 'free', space='free') + scale_fill_brewer(palette = "Set2") + theme_bw(base_size = 18) + theme(strip.text.y = element_text(angle = 270, size = 10, margin = margin(t=15, r=15, b=15, l=15)), strip.text.x = element_blank(), strip.background = element_rect(colour = NULL,linetype = "blank", fill = "gray90"), text = element_text(size=14), panel.spacing = unit(0.5, "lines"), panel.border= element_blank(), axis.line=element_line(), panel.grid.major.x = element_line(linetype = "solid", colour = "gray95"), panel.grid.major.y = element_line(linetype = "solid", color = "gray95"), panel.grid.minor.y = element_blank(), panel.grid.minor.x = element_blank(), legend.position = "none", axis.title.x = element_blank(), axis.title.y = element_blank() ) + coord_flip() ``` # *Prepare data for traits with effect size ratios > 10% larger in males ```{r} meta.plot2.over10 <- meta_clean %>% select(lnCVR, lnVR, lnRR, GroupingTerm) %>% arrange(GroupingTerm) meta.plot2.over10.b <- gather(meta.plot2.over10, trait, value, c(lnCVR, lnVR, lnRR)) meta.plot2.over10.b$trait <- factor(meta.plot2.over10.b$trait, levels =c("lnCVR","lnVR","lnRR") ) meta.plot2.over10.c <- meta.plot2.over10.b %>% group_by_at(vars(trait, GroupingTerm)) %>% summarise(malebias = sum(value > log(11/10)), femalebias = sum(value < log(9/10)), total= malebias + femalebias, malepercent = malebias*100/total, femalepercent = femalebias*100/total) meta.plot2.over10.c$label <- "Sex difference in m/f ratios > 10%" # restructure to create stacked bar plots meta.plot2.over10.c <- as.data.frame(meta.plot2.over10.c) meta.plot2.over10.d <- gather(meta.plot2.over10.c, key = sex, value = percent, malepercent:femalepercent, factor_key = TRUE) # create new sample size variable meta.plot2.over10.d$samplesize <- with(meta.plot2.over10.d, ifelse(sex == "malepercent", malebias, femalebias) ) # *Plot Fig2 Sex difference in m/f ratio > 10% malebias_Fig2_over10 <- ggplot(meta.plot2.over10.d) + aes(x = GroupingTerm, y = percent, fill = sex) + geom_col() + geom_hline(yintercept = 50, linetype = "dashed", color = "gray40") + geom_text(data = subset(meta.plot2.over10.d, samplesize != 0), aes(label = samplesize), position = position_stack(vjust = .5), color = "white", size = 3.5) + facet_grid(cols = vars(trait), rows = vars(label), labeller = label_wrap_gen(width = 18), scales= 'free', space='free') + scale_fill_brewer(palette = "Set2") + theme_bw(base_size = 18) + theme(strip.text.y = element_text(angle = 270, size = 10, margin = margin(t=15, r=15, b=15, l=15)), strip.text.x = element_blank(), strip.background = element_rect(colour = NULL,linetype = "blank", fill = "gray90"), text = element_text(size=14), panel.spacing = unit(0.5, "lines"), panel.border= element_blank(), axis.line=element_line(), panel.grid.major.x = element_line(linetype = "solid", colour = "gray95"), panel.grid.major.y = element_line(linetype = "solid", color = "gray95"), panel.grid.minor.y = element_blank(), panel.grid.minor.x = element_blank(), legend.position = "none", axis.title.x = element_blank(), axis.title.y = element_blank() ) + coord_flip() #malebias_Fig2_over10 ``` Create final combined Figure ```{r} Fig2 <- ggarrange(malebias_Fig2_alltraits, malebias_Fig2_sigtraits,malebias_Fig2_over10, nrow = 3, align = "v", heights = c(1.22,1,1)) Fig2 #ggsave("Fig2.pdf", plot = Fig2, width = 6, height = 5) ``` ## Preparation, for Figure 3: Overall results of second order meta anlaysis ## Restructure data for plotting Data are restructred, and grouping terms are being re-ordered ```{r} overall3 <- gather(overall2, parameter, value, c(lnCVR, lnVR, lnRR), factor_key= TRUE) lnCVR.ci <- overall3 %>% filter(parameter == "lnCVR") %>% mutate(ci.low = lnCVR_lower, ci.high = lnCVR_upper) lnVR.ci <- overall3 %>% filter(parameter == "lnVR") %>% mutate(ci.low = lnVR_lower, ci.high = lnVR_upper) lnRR.ci <- overall3 %>% filter(parameter == "lnRR") %>% mutate(ci.low = lnRR_lower, ci.high = lnRR_upper) overall4 <- bind_rows(lnCVR.ci, lnVR.ci, lnRR.ci) %>% select(GroupingTerm, parameter, value, ci.low, ci.high) # re-order Grouping Terms overall4$GroupingTerm <- factor(overall4$GroupingTerm, levels =c("Behaviour","Morphology","Metabolism","Physiology","Immunology","Hematology","Heart","Hearing","Eye", "All") ) overall4$GroupingTerm <- factor(overall4$GroupingTerm, rev(levels(overall4$GroupingTerm))) overall4$label <- "All traits" kable(cbind(overall4, overall4)) %>% kable_styling() %>% scroll_box(width = "100%", height = "200px") ``` # Plot FIGURE 3 (Second-order meta analysis results) # Preparation: Sub-Plot for Figure 3: all traits ```{r} Metameta_Fig3_alltraits <- overall4 %>% ggplot(aes(y= GroupingTerm, x= value)) + geom_errorbarh(aes(xmin = ci.low, xmax = ci.high), height = 0.1, show.legend = FALSE) + geom_point(aes(shape = parameter), fill = 'black', color = 'black', size = 2.2, show.legend = FALSE) + scale_x_continuous(limits=c(-0.24, 0.25), breaks = c(-0.2, -0.1, 0, 0.1, 0.2), name='Effect size') + geom_vline(xintercept=0, color='black', linetype='dashed')+ facet_grid(cols = vars(parameter), rows = vars(label), labeller = label_wrap_gen(width = 23), scales= 'free', space='free')+ theme_bw()+ theme(strip.text.y = element_text(angle = 270, size = 10, margin = margin(t=15, r=15, b=15, l=15)), strip.text.x = element_text(size = 12), strip.background = element_rect(colour = NULL, linetype = "blank", fill = "gray90"), text = element_text(size = 14), panel.spacing = unit(0.5, "lines"), panel.border= element_blank(), axis.line=element_line(), panel.grid.major.x = element_line(linetype = "solid", colour = "gray95"), panel.grid.major.y = element_line(linetype = "solid", color = "gray95"), panel.grid.minor.y = element_blank(), panel.grid.minor.x = element_blank(), legend.title = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank()) #Metameta_Fig3_alltraits ``` ######## # *Prepare data for traits with CI not overlapping 0 #create column with 1= different from zero, 0= zero included in CI # ** Male-biased traits ```{r} meta.male.plot3.sig <- metacombo %>% mutate(sigCVR = ifelse(lnCVR_lower > 0, 1, 0), sigVR = ifelse(lnVR_lower > 0, 1, 0), sigRR = ifelse(lnRR_lower > 0, 1, 0)) #Significant subset for lnCVR metacombo_male.plot3.CVR <- meta.male.plot3.sig %>% filter(sigCVR == 1) %>% group_by(GroupingTerm) %>% nest() metacombo_male.plot3.CVR.all <- meta.male.plot3.sig %>% filter(sigCVR == 1) %>% nest() #Significant subset for lnVR metacombo_male.plot3.VR <- meta.male.plot3.sig %>% filter(sigVR == 1) %>% group_by(GroupingTerm) %>% nest() metacombo_male.plot3.VR.all <- meta.male.plot3.sig %>% filter(sigVR == 1) %>% nest() #Significant subset for lnRR metacombo_male.plot3.RR <- meta.male.plot3.sig %>% filter(sigRR == 1) %>% group_by(GroupingTerm) %>% nest() metacombo_male.plot3.RR.all <- meta.male.plot3.sig %>% filter(sigRR == 1) %>% nest() # **Final fixed effects meta-analyses within grouping terms, with SE of the estimate plot3.male.meta.CVR <- metacombo_male.plot3.CVR %>% mutate(model_lnCVR = map(data, ~ metafor::rma.uni(yi = .x$lnCVR, sei = (.x$lnCVR_upper - .x$lnCVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.male.meta.VR <- metacombo_male.plot3.VR %>% mutate(model_lnVR = map(data, ~ metafor::rma.uni(yi = .x$lnVR, sei = (.x$lnVR_upper - .x$lnVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.male.meta.RR <- metacombo_male.plot3.RR %>% mutate(model_lnRR = map(data, ~ metafor::rma.uni(yi = .x$lnRR, sei = (.x$lnRR_upper - .x$lnRR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) # Across all grouping terms # plot3.male.meta.CVR.all <- metacombo_male.plot3.CVR.all %>% mutate(model_lnCVR = map(data, ~ metafor::rma.uni(yi = .x$lnCVR, sei = (.x$lnCVR_upper - .x$lnCVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.male.meta.CVR.all <- plot3.male.meta.CVR.all %>% mutate(GroupingTerm = "All") plot3.male.meta.VR.all <- metacombo_male.plot3.VR.all %>% mutate(model_lnVR = map(data, ~ metafor::rma.uni(yi = .x$lnVR, sei = (.x$lnVR_upper - .x$lnVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.male.meta.VR.all <- plot3.male.meta.VR.all %>% mutate(GroupingTerm = "All") plot3.male.meta.RR.all <- metacombo_male.plot3.RR.all %>% mutate(model_lnRR = map(data, ~ metafor::rma.uni(yi = .x$lnRR, sei = (.x$lnRR_upper - .x$lnRR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.male.meta.RR.all <- plot3.male.meta.RR.all %>% mutate(GroupingTerm = "All") # Combine with separate grouping term results plot3.male.meta.CVR <- bind_rows(plot3.male.meta.CVR, plot3.male.meta.CVR.all) plot3.male.meta.VR <- bind_rows(plot3.male.meta.VR, plot3.male.meta.VR.all) plot3.male.meta.RR <- bind_rows(plot3.male.meta.RR, plot3.male.meta.RR.all) # **Re-structure data for each grouping term; delete un-used variables plot3.male.meta.CVR.b <- as.data.frame(plot3.male.meta.CVR %>% group_by(GroupingTerm) %>% mutate(lnCVR = map_dbl(model_lnCVR, pluck(2)), lnCVR_lower = map_dbl(model_lnCVR, pluck(6)), lnCVR_upper =map_dbl(model_lnCVR, pluck(7)), lnCVR_se =map_dbl(model_lnCVR, pluck(3))) )[, c(1,4:7)] add.row.hearing <- as.data.frame(t(c("Hearing", NA, NA, NA, NA))) %>% setNames(names(plot3.male.meta.CVR.b)) plot3.male.meta.CVR.b <- bind_rows(plot3.male.meta.CVR.b, add.row.hearing) plot3.male.meta.CVR.b <- plot3.male.meta.CVR.b[order(plot3.male.meta.CVR.b$GroupingTerm),] plot3.male.meta.VR.b <- as.data.frame(plot3.male.meta.VR %>% group_by(GroupingTerm) %>% mutate(lnVR = map_dbl(model_lnVR, pluck(2)), lnVR_lower = map_dbl(model_lnVR, pluck(6)), lnVR_upper =map_dbl(model_lnVR, pluck(7)), lnVR_se =map_dbl(model_lnVR, pluck(3))) )[, c(1,4:7)] plot3.male.meta.VR.b <- plot3.male.meta.VR.b[order(plot3.male.meta.VR.b$GroupingTerm),] plot3.male.meta.RR.b <- as.data.frame(plot3.male.meta.RR %>% group_by(GroupingTerm) %>% mutate(lnRR = map_dbl(model_lnRR, pluck(2)), lnRR_lower = map_dbl(model_lnRR, pluck(6)), lnRR_upper =map_dbl(model_lnRR, pluck(7)), lnRR_se =map_dbl(model_lnRR, pluck(3))) )[, c(1,4:7)] plot3.male.meta.RR.b <- plot3.male.meta.RR.b[order(plot3.male.meta.RR.b$GroupingTerm),] overall.male.plot3 <- inner_join(plot3.male.meta.CVR.b, plot3.male.meta.VR.b) overall.male.plot3 <- inner_join(overall.male.plot3, plot3.male.meta.RR.b) overall.male.plot3$GroupingTerm <- factor(overall.male.plot3$GroupingTerm, levels =c("Behaviour","Morphology","Metabolism","Physiology","Immunology","Hematology","Heart","Hearing","Eye", "All") ) overall.male.plot3$GroupingTerm <- factor(overall.male.plot3$GroupingTerm, rev(levels(overall.male.plot3$GroupingTerm))) #add missing GroupingTerms for plot overall.male.plot3 <- add_row(overall.male.plot3, GroupingTerm = "Behaviour") overall.male.plot3 <- add_row(overall.male.plot3, GroupingTerm = "Immunology") overall.male.plot3 <- add_row(overall.male.plot3, GroupingTerm = "Eye") overall.male.plot3$GroupingTerm <- factor(overall.male.plot3$GroupingTerm, levels =c("Behaviour","Morphology","Metabolism","Physiology","Immunology","Hematology","Heart","Hearing","Eye", "All") ) overall.male.plot3$GroupingTerm <- factor(overall.male.plot3$GroupingTerm, rev(levels(overall.male.plot3$GroupingTerm))) ``` # **Restructure MALE data for plotting ```{r} overall3.male.sig <- gather(overall.male.plot3, parameter, value, c(lnCVR, lnVR, lnRR), factor_key= TRUE) lnCVR.ci <- overall3.male.sig %>% filter(parameter == "lnCVR") %>% mutate(ci.low = lnCVR_lower, ci.high = lnCVR_upper) lnVR.ci <- overall3.male.sig %>% filter(parameter == "lnVR") %>% mutate(ci.low = lnVR_lower, ci.high = lnVR_upper) lnRR.ci <- overall3.male.sig %>% filter(parameter == "lnRR") %>% mutate(ci.low = lnRR_lower, ci.high = lnRR_upper) overall4.male.sig <- bind_rows(lnCVR.ci, lnVR.ci, lnRR.ci) %>% select(GroupingTerm, parameter, value, ci.low, ci.high) overall4.male.sig$label <- "CI not overlapping zero" ``` # **Plot Fig3 all significant results (CI not overlapping zero) for males ```{r} ###### Metameta_Fig3_male.sig <- overall4.male.sig %>% ggplot(aes(y= GroupingTerm, x= value)) + geom_errorbarh(aes(xmin = ci.low, xmax = ci.high), height = 0.1, show.legend = FALSE) + geom_point(aes(shape = parameter), fill = 'blue', color = 'blue', size = 2.2, #needs adjustment to nicer blue, 20-5-19 show.legend = FALSE) + scale_x_continuous(limits=c(0, 0.4), breaks = c(0, 0.3), name='Effect size') + geom_vline(xintercept=0, color='black', linetype='dashed')+ facet_grid(cols = vars(parameter), rows = vars(label), labeller = label_wrap_gen(width = 23), scales= 'free', space='free')+ theme_bw()+ theme(strip.text.y = element_text(angle = 270, size = 10, margin = margin(t=15, r=15, b=15, l=15)), strip.text.x = element_text(size = 12), strip.background = element_rect(colour = NULL, linetype = "blank", fill = "gray90"), text = element_text(size = 14), panel.spacing = unit(0.5, "lines"), panel.border= element_blank(), axis.line=element_line(), panel.grid.major.x = element_line(linetype = "solid", colour = "gray95"), panel.grid.major.y = element_line(linetype = "solid", color = "gray95"), panel.grid.minor.y = element_blank(), panel.grid.minor.x = element_blank(), legend.title = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank()) #Metameta_Fig3_male.sig ``` ####################### # **Female Fig3 sig #*Prepare data for traits with CI not overlapping 0 create column with 1= different from zero, 0= zero included in CI ```{r} # female-biased traits meta.female.plot3.sig <- metacombo %>% mutate(sigCVR = ifelse(lnCVR_upper < 0, 1, 0), sigVR = ifelse(lnVR_upper < 0, 1, 0), sigRR = ifelse(lnRR_upper < 0, 1, 0)) #Significant subset for lnCVR metacombo_female.plot3.CVR <- meta.female.plot3.sig %>% filter(sigCVR == 1) %>% group_by(GroupingTerm) %>% nest() metacombo_female.plot3.CVR.all <- meta.female.plot3.sig %>% filter(sigCVR == 1) %>% nest() #Significant subset for lnVR metacombo_female.plot3.VR <- meta.female.plot3.sig %>% filter(sigVR == 1) %>% group_by(GroupingTerm) %>% nest() metacombo_female.plot3.VR.all <- meta.female.plot3.sig %>% filter(sigVR == 1) %>% nest() #Significant subset for lnRR metacombo_female.plot3.RR <- meta.female.plot3.sig %>% filter(sigRR == 1) %>% group_by(GroupingTerm) %>% nest() metacombo_female.plot3.RR.all <- meta.female.plot3.sig %>% filter(sigRR == 1) %>% nest() # **Final fixed effects meta-analyses within grouping terms, with SE of the estimate plot3.female.meta.CVR <- metacombo_female.plot3.CVR %>% mutate(model_lnCVR = map(data, ~ metafor::rma.uni(yi = .x$lnCVR, sei = (.x$lnCVR_upper - .x$lnCVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.female.meta.VR <- metacombo_female.plot3.VR %>% mutate(model_lnVR = map(data, ~ metafor::rma.uni(yi = .x$lnVR, sei = (.x$lnVR_upper - .x$lnVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.female.meta.RR <- metacombo_female.plot3.RR %>% mutate(model_lnRR = map(data, ~ metafor::rma.uni(yi = .x$lnRR, sei = (.x$lnRR_upper - .x$lnRR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) # Across all grouping terms # plot3.female.meta.CVR.all <- metacombo_female.plot3.CVR.all %>% mutate(model_lnCVR = map(data, ~ metafor::rma.uni(yi = .x$lnCVR, sei = (.x$lnCVR_upper - .x$lnCVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.female.meta.CVR.all <- plot3.female.meta.CVR.all %>% mutate(GroupingTerm = "All") plot3.female.meta.VR.all <- metacombo_female.plot3.VR.all %>% mutate(model_lnVR = map(data, ~ metafor::rma.uni(yi = .x$lnVR, sei = (.x$lnVR_upper - .x$lnVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.female.meta.VR.all <- plot3.female.meta.VR.all %>% mutate(GroupingTerm = "All") plot3.female.meta.RR.all <- metacombo_female.plot3.RR.all %>% mutate(model_lnRR = map(data, ~ metafor::rma.uni(yi = .x$lnRR, sei = (.x$lnRR_upper - .x$lnRR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.female.meta.RR.all <- plot3.female.meta.RR.all %>% mutate(GroupingTerm = "All") # Combine with separate grouping term results plot3.female.meta.CVR <- bind_rows(plot3.female.meta.CVR, plot3.female.meta.CVR.all) plot3.female.meta.VR <- bind_rows(plot3.female.meta.VR, plot3.female.meta.VR.all) plot3.female.meta.RR <- bind_rows(plot3.female.meta.RR, plot3.female.meta.RR.all) # **Re-structure data for each grouping term; delete un-used variables plot3.female.meta.CVR.b <- as.data.frame(plot3.female.meta.CVR %>% group_by(GroupingTerm) %>% mutate(lnCVR = map_dbl(model_lnCVR, pluck(2)), lnCVR_lower = map_dbl(model_lnCVR, pluck(6)), lnCVR_upper =map_dbl(model_lnCVR, pluck(7)), lnCVR_se =map_dbl(model_lnCVR, pluck(3))) )[, c(1,4:7)] add.row.hearing <- as.data.frame(t(c("Hearing", NA, NA, NA, NA))) %>% setNames(names(plot3.female.meta.CVR.b)) plot3.female.meta.CVR.b <- bind_rows(plot3.female.meta.CVR.b, add.row.hearing) plot3.female.meta.CVR.b <- plot3.female.meta.CVR.b[order(plot3.female.meta.CVR.b$GroupingTerm),] plot3.female.meta.VR.b <- as.data.frame(plot3.female.meta.VR %>% group_by(GroupingTerm) %>% mutate(lnVR = map_dbl(model_lnVR, pluck(2)), lnVR_lower = map_dbl(model_lnVR, pluck(6)), lnVR_upper =map_dbl(model_lnVR, pluck(7)), lnVR_se =map_dbl(model_lnVR, pluck(3))) )[, c(1,4:7)] plot3.female.meta.VR.b <- plot3.female.meta.VR.b[order(plot3.female.meta.VR.b$GroupingTerm),] plot3.female.meta.RR.b <- as.data.frame(plot3.female.meta.RR %>% group_by(GroupingTerm) %>% mutate(lnRR = map_dbl(model_lnRR, pluck(2)), lnRR_lower = map_dbl(model_lnRR, pluck(6)), lnRR_upper =map_dbl(model_lnRR, pluck(7)), lnRR_se =map_dbl(model_lnRR, pluck(3))) )[, c(1,4:7)] plot3.female.meta.RR.b <- plot3.female.meta.RR.b[order(plot3.female.meta.RR.b$GroupingTerm),] overall.female.plot3 <- full_join(plot3.female.meta.CVR.b, plot3.female.meta.VR.b) #FELIX: changed from inner to full overall.female.plot3 <- full_join(overall.female.plot3, plot3.female.meta.RR.b) #FELIX: changed from inner to full overall.female.plot3$GroupingTerm <- factor(overall.female.plot3$GroupingTerm, levels =c("Behaviour","Morphology","Metabolism","Physiology","Immunology","Hematology","Heart","Hearing","Eye", "All") ) overall.female.plot3$GroupingTerm <- factor(overall.female.plot3$GroupingTerm, rev(levels(overall.female.plot3$GroupingTerm))) #add missing GroupingTerms for plot: NOT NEEDED (next 5 lines)FELIX overall.female.plot3 <- add_row(overall.female.plot3, GroupingTerm = "Morphology") overall.female.plot3 <- add_row(overall.female.plot3, GroupingTerm = "Metabolism") overall.female.plot3 <- add_row(overall.female.plot3, GroupingTerm = "Hematology") overall.female.plot3 <- add_row(overall.female.plot3, GroupingTerm = "Hearing") overall.female.plot3 <- add_row(overall.female.plot3, GroupingTerm = "Eye") NOT NEEDED (next 2 lines)FELIX overall.female.plot3$GroupingTerm <- factor(overall.female.plot3$GroupingTerm, levels =c("Behaviour","Morphology","Metabolism","Physiology","Immunology","Hematology","Heart","Hearing","Eye", "All") ) overall.female.plot3$GroupingTerm <- factor(overall.female.plot3$GroupingTerm, rev(levels(overall.female.plot3$GroupingTerm))) ``` # **Restructure data for plotting ```{r} overall3.female.sig <- gather(overall.female.plot3, parameter, value, c(lnCVR, lnVR, lnRR), factor_key= TRUE) lnCVR.ci <- overall3.female.sig %>% filter(parameter == "lnCVR") %>% mutate(ci.low = lnCVR_lower, ci.high = lnCVR_upper) lnVR.ci <- overall3.female.sig %>% filter(parameter == "lnVR") %>% mutate(ci.low = lnVR_lower, ci.high = lnVR_upper) lnRR.ci <- overall3.female.sig %>% filter(parameter == "lnRR") %>% mutate(ci.low = lnRR_lower, ci.high = lnRR_upper) overall4.female.sig <- bind_rows(lnCVR.ci, lnVR.ci, lnRR.ci) %>% select(GroupingTerm, parameter, value, ci.low, ci.high) overall4.female.sig$label <- "CI not overlapping zero" ``` # **Plot Fig3 all significant results (CI not overlapping zero) ```{r} Metameta_Fig3_female.sig <- overall4.female.sig %>% ggplot(aes(y= GroupingTerm, x= value)) + geom_errorbarh(aes(xmin = ci.low, xmax = ci.high), height = 0.1, show.legend = FALSE) + geom_point(aes(shape = parameter), fill = 'red', color = 'red', size = 2.2, show.legend = FALSE) + scale_x_continuous(limits=c(-0.4, 0), breaks = c(-0.3 ,0), name='Effect size') + geom_vline(xintercept=0, color='black', linetype='dashed')+ facet_grid(cols = vars(parameter), #rows = vars(label), #labeller = label_wrap_gen(width = 23), scales= 'free', space='free')+ theme_bw()+ theme(strip.text.y = element_text(angle = 270, size = 10, margin = margin(t=15, r=15, b=15, l=15)), strip.text.x = element_text(size = 12), strip.background = element_rect(colour = NULL, linetype = "blank", fill = "gray90"), text = element_text(size = 14), panel.spacing = unit(0.5, "lines"), panel.border= element_blank(), axis.line=element_line(), panel.grid.major.x = element_line(linetype = "solid", colour = "gray95"), panel.grid.major.y = element_line(linetype = "solid", color = "gray95"), panel.grid.minor.y = element_blank(), panel.grid.minor.x = element_blank(), legend.title = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank()) #Metameta_Fig3_female.sig ``` ####################### # *Fig3 >10% # *Prepare data for traits with m/f difference > 10% #create column with 1= larger, 0= diff not larger than 10% # Male Fig 3 > 10% (male biased traits) ```{r} meta.male.plot3.perc <- metacombo %>% mutate(percCVR = ifelse(lnCVR > log (11/10), 1, 0), percVR = ifelse(lnVR > log (11/10), 1, 0), percRR = ifelse(lnRR > log (11/10), 1, 0)) #Significant subset for lnCVR metacombo_male.plot3.CVR.perc <- meta.male.plot3.perc %>% filter(percCVR == 1) %>% group_by(GroupingTerm) %>% nest() metacombo_male.plot3.CVR.perc.all <- meta.male.plot3.perc %>% filter(percCVR == 1) %>% nest() #Significant subset for lnVR metacombo_male.plot3.VR.perc <- meta.male.plot3.perc %>% filter(percVR == 1) %>% group_by(GroupingTerm) %>% nest() metacombo_male.plot3.VR.perc.all <- meta.male.plot3.perc %>% filter(percVR == 1) %>% nest() #Significant subset for lnRR metacombo_male.plot3.RR.perc <- meta.male.plot3.perc %>% filter(percRR == 1) %>% group_by(GroupingTerm) %>% nest() metacombo_male.plot3.RR.perc.all <- meta.male.plot3.perc %>% filter(percRR == 1) %>% nest() # **Final fixed effects meta-analyses within grouping terms and across grouping terms, with SE of the estimate plot3.male.meta.CVR.perc <- metacombo_male.plot3.CVR.perc %>% mutate(model_lnCVR = map(data, ~ metafor::rma.uni(yi = .x$lnCVR, sei = (.x$lnCVR_upper - .x$lnCVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.male.meta.VR.perc <- metacombo_male.plot3.VR.perc %>% mutate(model_lnVR = map(data, ~ metafor::rma.uni(yi = .x$lnVR, sei = (.x$lnVR_upper - .x$lnVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.male.meta.RR.perc <- metacombo_male.plot3.RR.perc %>% mutate(model_lnRR = map(data, ~ metafor::rma.uni(yi = .x$lnRR, sei = (.x$lnRR_upper - .x$lnRR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) # Across all grouping terms # plot3.male.meta.CVR.perc.all <- metacombo_male.plot3.CVR.perc.all %>% mutate(model_lnCVR = map(data, ~ metafor::rma.uni(yi = .x$lnCVR, sei = (.x$lnCVR_upper - .x$lnCVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.male.meta.CVR.perc.all <- plot3.male.meta.CVR.perc.all %>% mutate(GroupingTerm = "All") plot3.male.meta.VR.perc.all <- metacombo_male.plot3.VR.perc.all %>% mutate(model_lnVR = map(data, ~ metafor::rma.uni(yi = .x$lnVR, sei = (.x$lnVR_upper - .x$lnVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.male.meta.VR.perc.all <- plot3.male.meta.VR.perc.all %>% mutate(GroupingTerm = "All") plot3.male.meta.RR.perc.all <- metacombo_male.plot3.RR.perc.all %>% mutate(model_lnRR = map(data, ~ metafor::rma.uni(yi = .x$lnRR, sei = (.x$lnRR_upper - .x$lnRR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.male.meta.RR.perc.all <- plot3.male.meta.RR.perc.all %>% mutate(GroupingTerm = "All") # Combine with separate grouping term results plot3.male.meta.CVR.perc <- bind_rows(plot3.male.meta.CVR.perc, plot3.male.meta.CVR.perc.all) plot3.male.meta.VR.perc <- bind_rows(plot3.male.meta.VR.perc, plot3.male.meta.VR.perc.all) plot3.male.meta.RR.perc <- bind_rows(plot3.male.meta.RR.perc, plot3.male.meta.RR.perc.all) # **Re-structure data for each grouping term; delete un-used variables: "Hearing missing for all 3 parameters" plot3.male.meta.CVR.perc.b <- as.data.frame(plot3.male.meta.CVR.perc %>% group_by(GroupingTerm) %>% mutate(lnCVR = map_dbl(model_lnCVR, pluck(2)), lnCVR_lower = map_dbl(model_lnCVR, pluck(6)), lnCVR_upper =map_dbl(model_lnCVR, pluck(7)), lnCVR_se =map_dbl(model_lnCVR, pluck(3))) )[, c(1,4:7)] add.row.hearing <- as.data.frame(t(c("Hearing", NA, NA, NA, NA))) %>% setNames(names(plot3.male.meta.CVR.perc.b)) plot3.male.meta.CVR.perc.b <- rbind(plot3.male.meta.CVR.perc.b, add.row.hearing) plot3.male.meta.CVR.perc.b <- plot3.male.meta.CVR.perc.b[order(plot3.male.meta.CVR.perc.b$GroupingTerm),] plot3.male.meta.VR.perc.b <- as.data.frame(plot3.male.meta.VR.perc %>% group_by(GroupingTerm) %>% mutate(lnVR = map_dbl(model_lnVR, pluck(2)), lnVR_lower = map_dbl(model_lnVR, pluck(6)), lnVR_upper =map_dbl(model_lnVR, pluck(7)), lnVR_se =map_dbl(model_lnVR, pluck(3))) )[, c(1,4:7)] add.row.hearing <- as.data.frame(t(c("Hearing", NA, NA, NA, NA))) %>% setNames(names(plot3.male.meta.VR.perc.b)) plot3.male.meta.VR.perc.b <- rbind(plot3.male.meta.VR.perc.b, add.row.hearing) plot3.male.meta.VR.perc.b <- plot3.male.meta.VR.perc.b[order(plot3.male.meta.VR.perc.b$GroupingTerm),] plot3.male.meta.RR.perc.b <- as.data.frame(plot3.male.meta.RR.perc %>% group_by(GroupingTerm) %>% mutate(lnRR = map_dbl(model_lnRR, pluck(2)), lnRR_lower = map_dbl(model_lnRR, pluck(6)), lnRR_upper =map_dbl(model_lnRR, pluck(7)), lnRR_se =map_dbl(model_lnRR, pluck(3))) )[, c(1,4:7)] add.row.hearing <- as.data.frame(t(c("Hearing", NA, NA, NA, NA))) %>% setNames(names(plot3.male.meta.RR.perc.b)) plot3.male.meta.RR.perc.b <- rbind(plot3.male.meta.RR.perc.b, add.row.hearing) plot3.male.meta.RR.perc.b <- plot3.male.meta.RR.perc.b[order(plot3.male.meta.RR.perc.b$GroupingTerm),] overall.male.plot3.perc <- full_join(plot3.male.meta.CVR.perc.b, plot3.male.meta.VR.perc.b) #FELIX: changed inner to full overall.male.plot3.perc <- full_join(overall.male.plot3.perc, plot3.male.meta.RR.perc.b) #FELIX: changed inner to full #FELIX: remove next 2 lines! overall.male.plot3.perc$GroupingTerm <- factor(overall.male.plot3.perc$GroupingTerm, levels =c("Behaviour","Morphology","Metabolism","Physiology","Immunology","Hematology","Heart","Hearing","Eye", "All") ) overall.male.plot3.perc$GroupingTerm <- factor(overall.male.plot3.perc$GroupingTerm, rev(levels(overall.male.plot3.perc$GroupingTerm))) #add missing GroupingTerms for plot overall.male.plot3.perc <- add_row(overall.male.plot3.perc, GroupingTerm = "Heart") #FELIX: delete this line overall.male.plot3.perc <- add_row(overall.male.plot3.perc, GroupingTerm = "Eye") overall.male.plot3.perc$GroupingTerm <- factor(overall.male.plot3.perc$GroupingTerm, levels =c("Behaviour","Morphology","Metabolism","Physiology","Immunology","Hematology","Heart","Hearing","Eye", "All") ) overall.male.plot3.perc$GroupingTerm <- factor(overall.male.plot3.perc$GroupingTerm, rev(levels(overall.male.plot3.perc$GroupingTerm))) ``` # **Restructure data for plotting : Male biased, 10% difference ```{r} overall3.perc <- gather(overall.male.plot3.perc, parameter, value, c(lnCVR, lnVR, lnRR), factor_key= TRUE) lnCVR.ci <- overall3.perc %>% filter(parameter == "lnCVR") %>% mutate(ci.low = lnCVR_lower, ci.high = lnCVR_upper) lnVR.ci <- overall3.perc %>% filter(parameter == "lnVR") %>% mutate(ci.low = lnVR_lower, ci.high = lnVR_upper) lnRR.ci <- overall3.perc %>% filter(parameter == "lnRR") %>% mutate(ci.low = lnRR_lower, ci.high = lnRR_upper) overall4.male.perc <- bind_rows(lnCVR.ci, lnVR.ci, lnRR.ci) %>% select(GroupingTerm, parameter, value, ci.low, ci.high) overall4.male.perc$label <- "Sex difference in m/f ratios > 10%" overall4.male.perc$value <- as.numeric(overall4.male.perc$value) overall4.male.perc$ci.low <- as.numeric(overall4.male.perc$ci.low) overall4.male.perc$ci.high <- as.numeric(overall4.male.perc$ci.high) ``` # **Plot Fig3 all >10% difference (male bias) ```{r} Metameta_Fig3_male.perc <- overall4.male.perc %>% filter(., GroupingTerm != "Hearing") %>% ggplot(aes(y= GroupingTerm, x= value)) + geom_errorbarh(aes(xmin = ci.low, xmax = ci.high), height = 0.1, show.legend = FALSE) + geom_point(aes(shape = parameter, fill = parameter), color = 'blue', size = 2.2, show.legend = FALSE) + scale_x_continuous(limits=c(-0.2, 0.62), breaks = c(0, 0.3), name='Effect size') + geom_vline(xintercept=0, color='black', linetype='dashed')+ facet_grid(cols = vars(parameter), rows = vars(label), labeller = label_wrap_gen(width = 23), scales= 'free', space='free')+ theme_bw()+ theme(strip.text.y = element_text(angle = 270, size = 10, margin = margin(t=15, r=15, b=15, l=15)), strip.text.x = element_blank(), strip.background = element_rect(colour = NULL, linetype = "blank", fill = "gray90"), text = element_text(size = 14), panel.spacing = unit(0.5, "lines"), panel.border= element_blank(), axis.line=element_line(), panel.grid.major.x = element_line(linetype = "solid", colour = "gray95"), panel.grid.major.y = element_line(linetype = "solid", color = "gray95"), panel.grid.minor.y = element_blank(), panel.grid.minor.x = element_blank(), legend.title = element_blank(), axis.title.x = element_text(hjust = 0.5, size = 14), axis.title.y = element_blank()) # Metameta_Fig3_male.perc ``` ################## # ** Female Fig 3 >10% ```{r} meta.plot3.perc <- metacombo %>% mutate(percCVR = ifelse(lnCVR < log (9/10), 1, 0), percVR = ifelse(lnVR < log (9/10), 1, 0), percRR = ifelse(lnRR < log (9/10), 1, 0)) #Significant subset for lnCVR metacombo_plot3.CVR.perc <- meta.plot3.perc %>% filter(percCVR == 1) %>% group_by(GroupingTerm) %>% nest() metacombo_plot3.CVR.perc.all <- meta.plot3.perc %>% filter(percCVR == 1) %>% nest() #Significant subset for lnVR metacombo_plot3.VR.perc <- meta.plot3.perc %>% filter(percVR == 1) %>% group_by(GroupingTerm) %>% nest() metacombo_plot3.VR.perc.all <- meta.plot3.perc %>% filter(percVR == 1) %>% nest() #Significant subset for lnRR metacombo_plot3.RR.perc <- meta.plot3.perc %>% filter(percRR == 1) %>% group_by(GroupingTerm) %>% nest() metacombo_plot3.RR.perc.all <- meta.plot3.perc %>% filter(percRR == 1) %>% nest() # **Final fixed effects meta-analyses within grouping terms, with SE of the estimate plot3.meta.CVR.perc <- metacombo_plot3.CVR.perc %>% mutate(model_lnCVR = map(data, ~ metafor::rma.uni(yi = .x$lnCVR, sei = (.x$lnCVR_upper - .x$lnCVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.meta.VR.perc <- metacombo_plot3.VR.perc %>% mutate(model_lnVR = map(data, ~ metafor::rma.uni(yi = .x$lnVR, sei = (.x$lnVR_upper - .x$lnVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.meta.RR.perc <- metacombo_plot3.RR.perc %>% mutate(model_lnRR = map(data, ~ metafor::rma.uni(yi = .x$lnRR, sei = (.x$lnRR_upper - .x$lnRR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) # Across all grouping terms # plot3.meta.CVR.perc.all <- metacombo_plot3.CVR.perc.all %>% mutate(model_lnCVR = map(data, ~ metafor::rma.uni(yi = .x$lnCVR, sei = (.x$lnCVR_upper - .x$lnCVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.meta.CVR.perc.all <- plot3.meta.CVR.perc.all %>% mutate(GroupingTerm = "All") plot3.meta.VR.perc.all <- metacombo_plot3.VR.perc.all %>% mutate(model_lnVR = map(data, ~ metafor::rma.uni(yi = .x$lnVR, sei = (.x$lnVR_upper - .x$lnVR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.meta.VR.perc.all <- plot3.meta.VR.perc.all %>% mutate(GroupingTerm = "All") plot3.meta.RR.perc.all <- metacombo_plot3.RR.perc.all %>% mutate(model_lnRR = map(data, ~ metafor::rma.uni(yi = .x$lnRR, sei = (.x$lnRR_upper - .x$lnRR_lower)/ (2*1.96), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), verbose=F)) ) plot3.meta.RR.perc.all <- plot3.meta.RR.perc.all %>% mutate(GroupingTerm = "All") # Combine with separate grouping term results plot3.meta.CVR.perc <- bind_rows(plot3.meta.CVR.perc, plot3.meta.CVR.perc.all) plot3.meta.VR.perc <- bind_rows(plot3.meta.VR.perc, plot3.meta.VR.perc.all) plot3.meta.RR.perc <- bind_rows(plot3.meta.RR.perc, plot3.meta.RR.perc.all) # **Re-structure data for each grouping term; delete un-used variables: "Hearing missing for all 3 parameters" plot3.meta.CVR.perc.b <- as.data.frame(plot3.meta.CVR.perc %>% group_by(GroupingTerm) %>% mutate(lnCVR = map_dbl(model_lnCVR, pluck(2)), lnCVR_lower = map_dbl(model_lnCVR, pluck(6)), lnCVR_upper =map_dbl(model_lnCVR, pluck(7)), lnCVR_se =map_dbl(model_lnCVR, pluck(3))) )[, c(1,4:7)] add.row.hearing <- as.data.frame(t(c("Hearing", NA, NA, NA, NA))) %>% setNames(names(plot3.meta.CVR.perc.b)) plot3.meta.CVR.perc.b <- rbind(plot3.meta.CVR.perc.b, add.row.hearing) plot3.meta.CVR.perc.b <- plot3.meta.CVR.perc.b[order(plot3.meta.CVR.perc.b$GroupingTerm),] plot3.meta.VR.perc.b <- as.data.frame(plot3.meta.VR.perc %>% group_by(GroupingTerm) %>% mutate(lnVR = map_dbl(model_lnVR, pluck(2)), lnVR_lower = map_dbl(model_lnVR, pluck(6)), lnVR_upper =map_dbl(model_lnVR, pluck(7)), lnVR_se =map_dbl(model_lnVR, pluck(3))) )[, c(1,4:7)] add.row.hearing <- as.data.frame(t(c("Hearing", NA, NA, NA, NA))) %>% setNames(names(plot3.meta.VR.perc.b)) plot3.meta.VR.perc.b <- rbind(plot3.meta.VR.perc.b, add.row.hearing) plot3.meta.VR.perc.b <- plot3.meta.VR.perc.b[order(plot3.meta.VR.perc.b$GroupingTerm),] plot3.meta.RR.perc.b <- as.data.frame(plot3.meta.RR.perc %>% group_by(GroupingTerm) %>% mutate(lnRR = map_dbl(model_lnRR, pluck(2)), lnRR_lower = map_dbl(model_lnRR, pluck(6)), lnRR_upper =map_dbl(model_lnRR, pluck(7)), lnRR_se =map_dbl(model_lnRR, pluck(3))) )[, c(1,4:7)] add.row.hearing <- as.data.frame(t(c("Hearing", NA, NA, NA, NA))) %>% setNames(names(plot3.meta.RR.perc.b)) plot3.meta.RR.perc.b <- rbind(plot3.meta.RR.perc.b, add.row.hearing) plot3.meta.RR.perc.b <- plot3.meta.RR.perc.b[order(plot3.meta.RR.perc.b$GroupingTerm),] overall.plot3.perc <- full_join(plot3.meta.CVR.perc.b, plot3.meta.VR.perc.b) #FELIX: changed inner to full overall.plot3.perc <- full_join(overall.plot3.perc, plot3.meta.RR.perc.b) #FELIX: changed inner to full #FELIX: remove next 2 lines overall.plot3.perc$GroupingTerm <- factor(overall.plot3.perc$GroupingTerm, levels =c("Behaviour","Morphology","Metabolism","Physiology","Immunology","Hematology","Heart","Hearing","Eye", "All") ) overall.plot3.perc$GroupingTerm <- factor(overall.plot3.perc$GroupingTerm, rev(levels(overall.plot3.perc$GroupingTerm))) #add missing GroupingTerms for plot overall.plot3.perc <- add_row(overall.plot3.perc, GroupingTerm = "Metabolism") #FELIX: delete this line overall.plot3.perc <- add_row(overall.plot3.perc, GroupingTerm = "Hematology") overall.plot3.perc <- add_row(overall.plot3.perc, GroupingTerm = "Eye") #FELIX: delete this line overall.plot3.perc$GroupingTerm <- factor(overall.plot3.perc$GroupingTerm, levels =c("Behaviour","Morphology","Metabolism","Physiology","Immunology","Hematology","Heart","Hearing","Eye", "All") ) overall.plot3.perc$GroupingTerm <- factor(overall.plot3.perc$GroupingTerm, rev(levels(overall.plot3.perc$GroupingTerm))) ``` # **Restructure data for plotting Female bias, 10 percent difference ```{r} overall3.perc <- gather(overall.plot3.perc, parameter, value, c(lnCVR, lnVR, lnRR), factor_key= TRUE) lnCVR.ci <- overall3.perc %>% filter(parameter == "lnCVR") %>% mutate(ci.low = lnCVR_lower, ci.high = lnCVR_upper) lnVR.ci <- overall3.perc %>% filter(parameter == "lnVR") %>% mutate(ci.low = lnVR_lower, ci.high = lnVR_upper) lnRR.ci <- overall3.perc %>% filter(parameter == "lnRR") %>% mutate(ci.low = lnRR_lower, ci.high = lnRR_upper) overall4.perc <- bind_rows(lnCVR.ci, lnVR.ci, lnRR.ci) %>% select(GroupingTerm, parameter, value, ci.low, ci.high) overall4.perc$label <- "Sex difference in m/f ratios > 10%" overall4.perc$value <- as.numeric(overall4.perc$value) overall4.perc$ci.low <- as.numeric(overall4.perc$ci.low) overall4.perc$ci.high <- as.numeric(overall4.perc$ci.high) ``` # **Plot Fig3 all >10% difference ```{r} Metameta_Fig3_female.perc <- overall4.perc %>% ggplot(aes(y= GroupingTerm, x= value)) + geom_errorbarh(aes(xmin = ci.low, xmax = ci.high), height = 0.1, show.legend = FALSE) + geom_point(aes(shape = parameter), fill = 'red', color = 'red', size = 2.2, show.legend = FALSE) + #scale_shape_manual(values = scale_x_continuous(limits=c(-0.53, 0.2), breaks = c(-0.3, 0), name='Effect size') + geom_vline(xintercept=0, color='black', linetype='dashed')+ facet_grid(cols = vars(parameter), #rows = vars(label), #labeller = label_wrap_gen(width = 23), scales= 'free', space='free')+ theme_bw()+ theme(strip.text.y = element_text(angle = 270, size = 10, margin = margin(t=15, r=15, b=15, l=15)), strip.text.x = element_blank(), strip.background = element_rect(colour = NULL, linetype = "blank", fill = "gray90"), text = element_text(size = 14), panel.spacing = unit(0.5, "lines"), panel.border= element_blank(), axis.line=element_line(), panel.grid.major.x = element_line(linetype = "solid", colour = "gray95"), panel.grid.major.y = element_line(linetype = "solid", color = "gray95"), panel.grid.minor.y = element_blank(), panel.grid.minor.x = element_blank(), legend.title = element_blank(), axis.title.x = element_text(hjust = 0.5, size = 14), axis.title.y = element_blank()) #Metameta_Fig3_female.perc ``` # *Plot Fig3 all plots combined ```{r} library(ggpubr) Fig3.bottom <- ggarrange(Metameta_Fig3_female.sig, Metameta_Fig3_male.sig, Metameta_Fig3_female.perc, Metameta_Fig3_male.perc, ncol = 2, nrow = 2, widths = c(1, 1.20), heights = c(1, 1)) Fig3 <- ggarrange(Metameta_Fig3_alltraits, Fig3.bottom, ncol = 1, nrow = 2, heights = c(1.4, 2.5)) Fig3 # ggsave("Fig3.pdf", plot = Fig3, width = 9, height = 6) ``` Plot Supplement FIGURE S1 (Second-order meta-analysis on heterogeneity) ## *Create matrix to store results for all traits ```{r} results.allhetero.grouping <- as.data.frame(cbind(c(1:n), matrix(rep(0, n*30), ncol = 30))) names(results.allhetero.grouping) <- c("id", "sigma2_strain.CVR", "sigma2_center.CVR", "sigma2_error.CVR", "s.nlevels.strain.CVR", "s.nlevels.center.CVR", "s.nlevels.error.CVR", "sigma2_strain.VR", "sigma2_center.VR", "sigma2_error.VR", "s.nlevels.strain.VR", "s.nlevels.center.VR", "s.nlevels.error.VR", "sigma2_strain.RR", "sigma2_center.RR", "sigma2_error.RR", "s.nlevels.strain.RR", "s.nlevels.center.RR", "s.nlevels.error.RR", "lnCVR", "lnCVR_lower", "lnCVR_upper", "lnCVR_se", "lnVR", "lnVR_lower", "lnVR_upper", "lnVR_se", "lnRR", "lnRR_lower", "lnRR_upper" ,"lnRR_se") ``` # **LOOP ```{r} for(t in 1:n) { tryCatch({ data_par_age <- data_subset_parameterid_individual_by_age(data, t, age_min = 0, age_center = 100) population_stats <- calculate_population_stats(data_par_age) results <- create_meta_analysis_effect_sizes(population_stats) # lnCVR, logaritm of the ratio of male and female coefficients of variance cvr. <- metafor::rma.mv(yi = effect_size_CVR, V = sample_variance_CVR, random = list(~1| strain_name, ~1|production_center, ~1|err), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), data = results) results.allhetero.grouping[t, 2] <- cvr.$sigma2[1] results.allhetero.grouping[t, 3] <- cvr.$sigma2[2] results.allhetero.grouping[t, 4] <- cvr.$sigma2[3] results.allhetero.grouping[t, 5] <- cvr.$s.nlevels[1] results.allhetero.grouping[t, 6] <- cvr.$s.nlevels[2] results.allhetero.grouping[t, 7] <- cvr.$s.nlevels[3] results.allhetero.grouping[t, 20] <- cvr.$b results.allhetero.grouping[t, 21] <- cvr.$ci.lb results.allhetero.grouping[t, 22] <- cvr.$ci.ub results.allhetero.grouping[t, 23] <- cvr.$se # lnVR, male to female variability ratio (logarithm of male and female standard deviations) vr. <- metafor::rma.mv(yi = effect_size_VR, V = sample_variance_VR, random = list(~1| strain_name, ~1|production_center, ~1|err), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), data = results) results.allhetero.grouping[t, 8] <- vr.$sigma2[1] results.allhetero.grouping[t, 9] <- vr.$sigma2[2] results.allhetero.grouping[t, 10] <- vr.$sigma2[3] results.allhetero.grouping[t, 11] <- vr.$s.nlevels[1] results.allhetero.grouping[t, 12] <- vr.$s.nlevels[2] results.allhetero.grouping[t, 13] <- vr.$s.nlevels[3] results.allhetero.grouping[t, 24] <- vr.$b results.allhetero.grouping[t, 25] <- vr.$ci.lb results.allhetero.grouping[t, 26] <- vr.$ci.ub results.allhetero.grouping[t, 27] <- vr.$se # lnRR, response ratio (logarithm of male and female means) rr. <- metafor::rma.mv(yi = effect_size_RR, V = sample_variance_RR, random = list(~1| strain_name, ~1|production_center, ~1|err), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 1000), data = results) results.allhetero.grouping[t, 14] <- rr.$sigma2[1] results.allhetero.grouping[t, 15] <- rr.$sigma2[2] results.allhetero.grouping[t, 16] <- rr.$sigma2[3] results.allhetero.grouping[t, 17] <- rr.$s.nlevels[1] results.allhetero.grouping[t, 18] <- rr.$s.nlevels[2] results.allhetero.grouping[t, 19] <- rr.$s.nlevels[3] results.allhetero.grouping[t, 28] <- rr.$b results.allhetero.grouping[t, 29] <- rr.$ci.lb results.allhetero.grouping[t, 30] <- rr.$ci.ub results.allhetero.grouping[t, 31] <- rr.$se }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")}) } ``` ## *Exclude traits ```{r} results.allhetero.grouping2 <- results.allhetero.grouping[results.allhetero.grouping$s.nlevels.strain.VR != 0, ] nrow(results.allhetero.grouping2) ``` # *Merge data sets containing metafor results with procedure etc. names ```{r} procedures <- read.csv("procedures.csv") ``` ```{r} results.allhetero.grouping2$parameter_group <- data$parameter_group[match(results.allhetero.grouping2$id, data$id)] results.allhetero.grouping2$procedure <- data$procedure_name[match(results.allhetero.grouping2$id, data$id)] ``` ```{r} results.allhetero.grouping2$GroupingTerm <- procedures$GroupingTerm[match(results.allhetero.grouping2$procedure, procedures$procedure)] results.allhetero.grouping2$parameter_name <- data$parameter_name[match(results.allhetero.grouping2$id, data$id)] ``` ## *Correlated parameters ```{r} metahetero1 <- results.allhetero.grouping2 length(unique(metahetero1$procedure)) #18 FELIX30-5-19: Komisch, ich bekomme gerade 19, und unten: 9, 152, 223; evt. wegen der neuen Formel! length(unique(metahetero1$GroupingTerm)) #9 length(unique(metahetero1$parameter_group)) # 148 length(unique(metahetero1$parameter_name)) #218 ``` # **Count of number of parameter names (correlated sub-traits) in each parameter group (par_group_size) ```{r} metahetero1b <- metahetero1 %>% group_by(parameter_group) %>% mutate(par_group_size = n_distinct(parameter_name)) metahetero1$par_group_size <- metahetero1b$par_group_size[match(metahetero1$parameter_group, metahetero1b$parameter_group)] ``` # **Create subsets with > 1 count (par_group_size > 1) ```{r} metahetero1_sub <- subset(metahetero1, par_group_size > 1) # 90 observations str(metahetero1_sub) # metahetero1_sub$sampleSize <- as.numeric(metahetero1_sub$sampleSize) #Felix30-5-19: delete this line ``` # **Nest data ```{r} n_count. <- metahetero1_sub %>% group_by(parameter_group) %>% #mutate(raw_N = sum(sampleSize)) %>% #don't think is necessary: delete in final version nest() ``` ```{r} model_count. <- n_count. %>% mutate(model_lnRR = map(data, ~ robu(.x$lnRR ~ 1, data= .x, studynum= .x$id, modelweights = c("CORR"), rho = 0.8, small = TRUE, var.eff.size= (.x$lnRR_se)^2 )), model_lnVR = map(data, ~ robu(.x$lnVR ~ 1, data= .x, studynum= .x$id, modelweights = c("CORR"), rho = 0.8, small = TRUE, var.eff.size= (.x$lnVR_se)^2 )), model_lnCVR = map(data, ~ robu(.x$lnCVR ~ 1, data= .x, studynum= .x$id, modelweights = c("CORR"), rho = 0.8, small = TRUE, var.eff.size= (.x$lnCVR_se)^2 ))) #Robumeta object details: #str(model_count.$model_lnCVR[[1]]) ``` ## *Perform meta-analyses on correlated sub-traits, using robumeta ## **Extract and save parameter estimates ```{r} count_fun. <- function(mod_sub) return(c(as.numeric(mod_sub$mod_info$term1), mod_sub$N) ) ``` ```{r} robusub_RR. <- model_count. %>% transmute(parameter_group, estimatelnRR = map(model_lnRR, count_fun.)) %>% mutate(r = map(estimatelnRR, ~ data.frame(t(.)))) %>% unnest(r) %>% select(-estimatelnRR) %>% purrr::set_names(c("parameter_group","var.RR","N.RR")) robusub_CVR. <- model_count. %>% transmute(parameter_group, estimatelnCVR = map(model_lnCVR, count_fun.)) %>% mutate(r = map(estimatelnCVR, ~ data.frame(t(.)))) %>% unnest(r) %>% select(-estimatelnCVR) %>% purrr::set_names(c("parameter_group","var.CVR","N.CVR")) robusub_VR. <- model_count. %>% transmute(parameter_group, estimatelnVR = map(model_lnVR, count_fun.)) %>% mutate(r = map(estimatelnVR, ~ data.frame(t(.)))) %>% unnest(r) %>% select(-estimatelnVR) %>% purrr::set_names(c("parameter_group","var.VR","N.VR")) robu_all. <- full_join(robusub_CVR., robusub_VR.) %>% full_join(., robusub_RR.) ``` ## **Merge the two data sets (the new [robu_all] and the initial [uncorrelated sub-traits with count = 1]) ## In this step, we 1) put the N from robumeta and the N from metafor (s.nlevels.error) together into the same columns (N.RR, N.VR, N.CVR) 2) calculate the total variance for metafor models as the sum of random effect variances and the residual error, then put them in the same columns together with the residual variances from robumeta ```{r} metahetero_all <- metahetero1 %>% filter(par_group_size == 1) %>% as_tibble metahetero_all$N.RR <- metahetero_all$s.nlevels.error.RR metahetero_all$N.CVR <- metahetero_all$s.nlevels.error.CVR metahetero_all$N.VR <- metahetero_all$s.nlevels.error.VR metahetero_all$var.RR <- log(sqrt(metahetero_all$sigma2_strain.RR + metahetero_all$sigma2_center.RR + metahetero_all$sigma2_error.RR)) metahetero_all$var.VR <- log(sqrt(metahetero_all$sigma2_strain.VR + metahetero_all$sigma2_center.VR + metahetero_all$sigma2_error.VR)) metahetero_all$var.CVR <- log(sqrt(metahetero_all$sigma2_strain.CVR + metahetero_all$sigma2_center.CVR + metahetero_all$sigma2_error.CVR)) #str(metahetero_all) #str(robu_all.) metahetero_all <- metahetero_all %>% mutate(var.RR = if_else(var.RR == -Inf, -7 ,var.RR), var.VR = if_else(var.VR == -Inf, -5 ,var.VR), var.CVR = if_else(var.CVR == -Inf, -6 ,var.CVR)) ``` # **Combine data # Step1 ```{r} combinedmetahetero <- bind_rows(robu_all., metahetero_all) glimpse(combinedmetahetero) ``` # Steps 2&3 ```{r} metacombohetero <- combinedmetahetero metacombohetero$counts <- metahetero1$par_group_size[match( metacombohetero$parameter_group, metahetero1$parameter_group)] metacombohetero$procedure2 <-metahetero1$procedure[match( metacombohetero$parameter_group, metahetero1$parameter_group)] metacombohetero$GroupingTerm2 <-metahetero1$GroupingTerm[match( metacombohetero$parameter_group, metahetero1$parameter_group)] ``` # **Clean-up and rename ```{r} metacombohetero <- metacombohetero[, c(1:7, 43:45)] names(metacombohetero)[9] <- "procedure" names(metacombohetero)[10] <- "GroupingTerm" ``` ```{r} #write.csv(metacombohetero, "metacombohetero.csv") ``` ## *Last step: Meta-meta-analysis of heterogeneity ```{r} glimpse(metacombohetero) ``` ## *Perform meta-meta-analysis (3 for each of the 9 grouping terms: var.CVR, var.VR, var.RR) ```{r} metacombohetero_final <- metacombohetero %>% group_by(GroupingTerm) %>% nest() ``` # **Calculate number of parameters per grouping term : not needed; delete in final version #metacombo_final <- metacombo_final %>% mutate(para_per_GroupingTerm = map_dbl(data, nrow)) # **Final fixed effects meta-analyses within grouping terms, with SE of the estimate ```{r} metacombohetero$var.CVR heterog1 <- metacombohetero_final %>% mutate(model_heteroCVR = map(data, ~ metafor::rma.uni(yi = .x$var.CVR, sei = sqrt(1 / 2*(.x$N.CVR - 1)), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 10000, stepadj=0.5), verbose=F)), model_heteroVR = map(data, ~ metafor::rma.uni(yi = .x$var.VR, sei = sqrt(1 / 2*(.x$N.VR - 1)), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 10000, stepadj=0.5), verbose=F)), model_heteroRR = map(data, ~ metafor::rma.uni(yi = .x$var.RR, sei = sqrt(1 / 2*(.x$N.RR - 1)), control=list(optimizer="optim", optmethod="Nelder-Mead", maxit= 10000, stepadj=0.5), verbose=F))) heterog1 # **Re-structure data for each grouping term; extract heterogenenity/variance terms; delete un-used variables Behaviour. <- heterog1 %>% filter(., GroupingTerm == "Behaviour") %>% select(., -data) %>% mutate(heteroCVR=.[[2]][[1]]$b, heteroCVR_lower=.[[2]][[1]]$ci.lb, heteroCVR_upper=.[[2]][[1]]$ci.ub, heteroCVR_se=.[[2]][[1]]$se, heteroVR=.[[3]][[1]]$b, heteroVR_lower=.[[3]][[1]]$ci.lb, heteroVR_upper=.[[3]][[1]]$ci.ub, heteroVR_se=.[[3]][[1]]$se, heteroRR=.[[4]][[1]]$b, heteroRR_lower=.[[4]][[1]]$ci.lb, heteroRR_upper=.[[4]][[1]]$ci.ub, heteroRR_se=.[[4]][[1]]$se) %>% select(., GroupingTerm, heteroCVR:heteroRR_se) Immunology. <- heterog1 %>% filter(., GroupingTerm == "Immunology") %>% select(., -data) %>% mutate(heteroCVR=.[[2]][[1]]$b, heteroCVR_lower=.[[2]][[1]]$ci.lb, heteroCVR_upper=.[[2]][[1]]$ci.ub, heteroCVR_se=.[[2]][[1]]$se, heteroVR=.[[3]][[1]]$b, heteroVR_lower=.[[3]][[1]]$ci.lb, heteroVR_upper=.[[3]][[1]]$ci.ub, heteroVR_se=.[[3]][[1]]$se, heteroRR=.[[4]][[1]]$b, heteroRR_lower=.[[4]][[1]]$ci.lb, heteroRR_upper=.[[4]][[1]]$ci.ub, heteroRR_se=.[[4]][[1]]$se) %>% select(., GroupingTerm, heteroCVR:heteroRR_se) Hematology. <- heterog1 %>% filter(., GroupingTerm == "Hematology") %>% select(., -data) %>% mutate(heteroCVR=.[[2]][[1]]$b, heteroCVR_lower=.[[2]][[1]]$ci.lb, heteroCVR_upper=.[[2]][[1]]$ci.ub, heteroCVR_se=.[[2]][[1]]$se, heteroVR=.[[3]][[1]]$b, heteroVR_lower=.[[3]][[1]]$ci.lb, heteroVR_upper=.[[3]][[1]]$ci.ub, heteroVR_se=.[[3]][[1]]$se, heteroRR=.[[4]][[1]]$b, heteroRR_lower=.[[4]][[1]]$ci.lb, heteroRR_upper=.[[4]][[1]]$ci.ub, heteroRR_se=.[[4]][[1]]$se) %>% select(., GroupingTerm, heteroCVR:heteroRR_se) Hearing. <- heterog1 %>% filter(., GroupingTerm == "Hearing") %>% select(., -data) %>% mutate(heteroCVR=.[[2]][[1]]$b, heteroCVR_lower=.[[2]][[1]]$ci.lb, heteroCVR_upper=.[[2]][[1]]$ci.ub, heteroCVR_se=.[[2]][[1]]$se, heteroVR=.[[3]][[1]]$b, heteroVR_lower=.[[3]][[1]]$ci.lb, heteroVR_upper=.[[3]][[1]]$ci.ub, heteroVR_se=.[[3]][[1]]$se, heteroRR=.[[4]][[1]]$b, heteroRR_lower=.[[4]][[1]]$ci.lb, heteroRR_upper=.[[4]][[1]]$ci.ub, heteroRR_se=.[[4]][[1]]$se) %>% select(., GroupingTerm, heteroCVR:heteroRR_se) Physiology. <- heterog1 %>% filter(., GroupingTerm == "Physiology") %>% select(., -data) %>% mutate(heteroCVR=.[[2]][[1]]$b, heteroCVR_lower=.[[2]][[1]]$ci.lb, heteroCVR_upper=.[[2]][[1]]$ci.ub, heteroCVR_se=.[[2]][[1]]$se, heteroVR=.[[3]][[1]]$b, heteroVR_lower=.[[3]][[1]]$ci.lb, heteroVR_upper=.[[3]][[1]]$ci.ub, heteroVR_se=.[[3]][[1]]$se, heteroRR=.[[4]][[1]]$b, heteroRR_lower=.[[4]][[1]]$ci.lb, heteroRR_upper=.[[4]][[1]]$ci.ub, heteroRR_se=.[[4]][[1]]$se) %>% select(., GroupingTerm, heteroCVR:heteroRR_se) Metabolism. <- heterog1 %>% filter(., GroupingTerm == "Metabolism") %>% select(., -data) %>% mutate(heteroCVR=.[[2]][[1]]$b, heteroCVR_lower=.[[2]][[1]]$ci.lb, heteroCVR_upper=.[[2]][[1]]$ci.ub, heteroCVR_se=.[[2]][[1]]$se, heteroVR=.[[3]][[1]]$b, heteroVR_lower=.[[3]][[1]]$ci.lb, heteroVR_upper=.[[3]][[1]]$ci.ub, heteroVR_se=.[[3]][[1]]$se, heteroRR=.[[4]][[1]]$b, heteroRR_lower=.[[4]][[1]]$ci.lb, heteroRR_upper=.[[4]][[1]]$ci.ub, heteroRR_se=.[[4]][[1]]$se) %>% select(., GroupingTerm, heteroCVR:heteroRR_se) Morphology. <- heterog1 %>% filter(., GroupingTerm == "Morphology") %>% select(., -data) %>% mutate(heteroCVR=.[[2]][[1]]$b, heteroCVR_lower=.[[2]][[1]]$ci.lb, heteroCVR_upper=.[[2]][[1]]$ci.ub, heteroCVR_se=.[[2]][[1]]$se, heteroVR=.[[3]][[1]]$b, heteroVR_lower=.[[3]][[1]]$ci.lb, heteroVR_upper=.[[3]][[1]]$ci.ub, heteroVR_se=.[[3]][[1]]$se, heteroRR=.[[4]][[1]]$b, heteroRR_lower=.[[4]][[1]]$ci.lb, heteroRR_upper=.[[4]][[1]]$ci.ub, heteroRR_se=.[[4]][[1]]$se) %>% select(., GroupingTerm, heteroCVR:heteroRR_se) Heart. <- heterog1 %>% filter(., GroupingTerm == "Heart") %>% select(., -data) %>% mutate(heteroCVR=.[[2]][[1]]$b, heteroCVR_lower=.[[2]][[1]]$ci.lb, heteroCVR_upper=.[[2]][[1]]$ci.ub, heteroCVR_se=.[[2]][[1]]$se, heteroVR=.[[3]][[1]]$b, heteroVR_lower=.[[3]][[1]]$ci.lb, heteroVR_upper=.[[3]][[1]]$ci.ub, heteroVR_se=.[[3]][[1]]$se, heteroRR=.[[4]][[1]]$b, heteroRR_lower=.[[4]][[1]]$ci.lb, heteroRR_upper=.[[4]][[1]]$ci.ub, heteroRR_se=.[[4]][[1]]$se) %>% select(., GroupingTerm, heteroCVR:heteroRR_se) Eye. <- heterog1 %>% filter(., GroupingTerm == "Eye") %>% select(., -data) %>% mutate(heteroCVR=.[[2]][[1]]$b, heteroCVR_lower=.[[2]][[1]]$ci.lb, heteroCVR_upper=.[[2]][[1]]$ci.ub, heteroCVR_se=.[[2]][[1]]$se, heteroVR=.[[3]][[1]]$b, heteroVR_lower=.[[3]][[1]]$ci.lb, heteroVR_upper=.[[3]][[1]]$ci.ub, heteroVR_se=.[[3]][[1]]$se, heteroRR=.[[4]][[1]]$b, heteroRR_lower=.[[4]][[1]]$ci.lb, heteroRR_upper=.[[4]][[1]]$ci.ub, heteroRR_se=.[[4]][[1]]$se) %>% select(., GroupingTerm, heteroCVR:heteroRR_se) heterog2 <- bind_rows(Behaviour., Morphology., Metabolism., Physiology., Immunology., Hematology., Heart., Hearing., Eye.) str(heterog2) ``` #################################################################################################################################### # *Supplement Figure S1 # **Restructure data for plotting ```{r} heterog3 <- gather(heterog2, parameter, value, c(heteroCVR, heteroVR, heteroRR), factor_key= TRUE) heteroCVR.ci <- heterog3 %>% filter(parameter == "heteroCVR") %>% mutate(ci.low = heteroCVR_lower, ci.high = heteroCVR_upper) heteroVR.ci <- heterog3 %>% filter(parameter == "heteroVR") %>% mutate(ci.low = heteroVR_lower, ci.high = heteroVR_upper) heteroRR.ci <- heterog3 %>% filter(parameter == "heteroRR") %>% mutate(ci.low = heteroRR_lower, ci.high = heteroRR_upper) heterog4 <- bind_rows(heteroCVR.ci, heteroVR.ci, heteroRR.ci) %>% select(GroupingTerm, parameter, value, ci.low, ci.high) # **Re-order grouping terms heterog4$GroupingTerm <- factor(heterog4$GroupingTerm, levels =c("Behaviour","Morphology","Metabolism","Physiology","Immunology","Hematology","Heart","Hearing","Eye") ) heterog4$GroupingTerm <- factor(heterog4$GroupingTerm, rev(levels(heterog4$GroupingTerm))) heterog4$label <- "All traits" #write.csv(heterog4, "heterog4.csv") ``` # *Plot Supplement FIGURE S1 (Second-order meta analysis on heterogeneity) # **Plot FigS1 all traits ```{r} Metameta_FigS1_alltraits <- heterog4 %>% ggplot(aes(y= GroupingTerm, x= value)) + geom_errorbarh(aes(xmin = ci.low, xmax = ci.high), height = 0.1, show.legend = FALSE) + geom_point(aes(shape = parameter, fill = parameter, color = parameter), size = 2.2, show.legend = FALSE) + scale_x_continuous(limits=c(-7.0, 0.5), #breaks = c(-2.0, -1.5, -1.0, -0.5, 0, 0.5, 1.0, 1.5, 2.0), name='Effect size') + facet_grid(cols = vars(parameter), rows = vars(label), labeller = label_wrap_gen(width = 23), scales= 'free', space='free')+ theme_bw()+ theme(strip.text.y = element_text(angle = 270, size = 10, margin = margin(t=15, r=15, b=15, l=15)), strip.text.x = element_text(size = 12), strip.background = element_rect(colour = NULL, linetype = "blank", fill = "gray90"), text = element_text(size = 14), panel.spacing = unit(0.5, "lines"), panel.border= element_blank(), axis.line=element_line(), panel.grid.major.x = element_line(linetype = "solid", colour = "gray95"), panel.grid.major.y = element_line(linetype = "solid", color = "gray95"), panel.grid.minor.y = element_blank(), panel.grid.minor.x = element_blank(), legend.title = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank()) Metameta_FigS1_alltraits ``` ################################################################################################### #### TABLES with Heterogeneity (tau2, I2) of all the groups in FIG3 ### #CVR heteroeach.meta.CVR.c <- as.data.frame(overall1 %>% group_by(GroupingTerm) %>% mutate(tau2 = map_dbl(model_lnCVR, pluck(9)), I2 = map_dbl(model_lnCVR, pluck(23))) )[, c("GroupingTerm", "tau2", "I2")] heteroall.meta.CVR.c <- as.data.frame(overall_all1 %>% mutate(tau2 = map_dbl(model_lnCVR, pluck(9)), I2 = map_dbl(model_lnCVR, pluck(23))) )[, c("tau2", "I2")] heteroall.meta.CVR.c <- heteroall.meta.CVR.c %>% mutate(GroupingTerm = "All") overall2.CVR.c <- bind_rows(heteroeach.meta.CVR.c, heteroall.meta.CVR.c) overall2.CVR.c <- add_column(overall2.c, var = "ln(CVR)", .before= "tau2") overall2.CVR.c <- overall2.c[order(overall2.c$GroupingTerm),] #VR heteroeach.meta.VR.c <- as.data.frame(overall1 %>% group_by(GroupingTerm) %>% mutate(tau2 = map_dbl(model_lnVR, pluck(9)), I2 = map_dbl(model_lnVR, pluck(23))) )[, c("GroupingTerm", "tau2", "I2")] heteroall.meta.VR.c <- as.data.frame(overall_all1 %>% mutate(tau2 = map_dbl(model_lnVR, pluck(9)), I2 = map_dbl(model_lnVR, pluck(23))) )[, c("tau2", "I2")] heteroall.meta.VR.c <- heteroall.meta.VR.c %>% mutate(GroupingTerm = "All") overall2.VR.c <- bind_rows(heteroeach.meta.VR.c, heteroall.meta.VR.c) overall2.VR.c <- add_column(overall2.VR.c, var = "ln(VR)", .before= "tau2") overall2.VR.c <- overall2.VR.c[order(overall2.VR.c$GroupingTerm),] #RR heteroeach.meta.RR.c <- as.data.frame(overall1 %>% group_by(GroupingTerm) %>% mutate(tau2 = map_dbl(model_lnRR, pluck(9)), I2 = map_dbl(model_lnRR, pluck(23))) )[, c("GroupingTerm", "tau2", "I2")] heteroall.meta.RR.c <- as.data.frame(overall_all1 %>% mutate(tau2 = map_dbl(model_lnRR, pluck(9)), I2 = map_dbl(model_lnRR, pluck(23))) )[, c("tau2", "I2")] heteroall.meta.RR.c <- heteroall.meta.RR.c %>% mutate(GroupingTerm = "All") overall2.RR.c <- bind_rows(heteroeach.meta.RR.c, heteroall.meta.RR.c) overall2.RR.c <- add_column(overall2.RR.c, var = "ln(RR)", .before= "tau2") overall2.RR.c <- overall2.RR.c[order(overall2.RR.c$GroupingTerm),] overall2.het <- full_join(overall2.CVR.c, overall2.VR.c) overall2.het <- full_join(overall2.het, overall2.RR.c) for_table_overall.het <- overall2.het[order(factor(overall2.het$GroupingTerm, levels = c("Behaviour","Morphology","Metabolism","Physiology","Immunology","Hematology","Heart","Hearing","Eye", "All"))),] ##################### ## the following uses the same data from above, right after (code in quotation marks is copied from section above): " # Combine with separate grouping term results plot3.male.meta.CVR <- bind_rows(plot3.male.meta.CVR, plot3.male.meta.CVR.all) plot3.male.meta.VR <- bind_rows(plot3.male.meta.VR, plot3.male.meta.VR.all) plot3.male.meta.RR <- bind_rows(plot3.male.meta.RR, plot3.male.meta.RR.all) " ## Male not overlapping zero (significant) # **Re-structure data for each grouping term; delete un-used variables #plot3.male.meta.CVR[[3]][[1]][1:30] #tau2 is at position '9', I2 is at position '23' #plot3.male.meta.CVR[[3]][[1]][c(9, 23)] plot3.male.meta.CVR.c <- as.data.frame(plot3.male.meta.CVR %>% group_by(GroupingTerm) %>% mutate(tau2 = map_dbl(model_lnCVR, pluck(9)), I2 = map_dbl(model_lnCVR, pluck(23))) )[, c(1,4,5)] #add missing GroupingTerms for plot plot3.male.meta.CVR.c <- add_row(plot3.male.meta.CVR.c, GroupingTerm = "Immunology") plot3.male.meta.CVR.c <- add_row(plot3.male.meta.CVR.c, GroupingTerm = "Hearing") plot3.male.meta.CVR.c <- add_row(plot3.male.meta.CVR.c, GroupingTerm = "Eye") plot3.male.meta.CVR.c <- add_column(plot3.male.meta.CVR.c, var = "ln(CVR)", .before= "tau2") plot3.male.meta.CVR.c <- plot3.male.meta.CVR.c[order(plot3.male.meta.CVR.c$GroupingTerm),] plot3.male.meta.VR.c <- as.data.frame(plot3.male.meta.VR %>% group_by(GroupingTerm) %>% mutate(tau2 = map_dbl(model_lnVR, pluck(9)), I2 = map_dbl(model_lnVR, pluck(23))) )[, c(1,4,5)] plot3.male.meta.VR.c <- add_row(plot3.male.meta.VR.c, GroupingTerm = "Immunology") plot3.male.meta.VR.c <- add_row(plot3.male.meta.VR.c, GroupingTerm = "Eye") plot3.male.meta.VR.c <- add_column(plot3.male.meta.VR.c, var = "ln(VR)", .before= "tau2") plot3.male.meta.VR.c <- plot3.male.meta.VR.c[order(plot3.male.meta.VR.c$GroupingTerm),] plot3.male.meta.RR.c <- as.data.frame(plot3.male.meta.RR %>% group_by(GroupingTerm) %>% mutate(tau2 = map_dbl(model_lnRR, pluck(9)), I2 = map_dbl(model_lnRR, pluck(23))) )[, c(1,4,5)] plot3.male.meta.RR.c <- add_column(plot3.male.meta.RR.c, var = "ln(RR)", .before= "tau2") plot3.male.meta.RR.c <- plot3.male.meta.RR.c[order(plot3.male.meta.RR.c$GroupingTerm),] overall.male.plot3. <- full_join(plot3.male.meta.CVR.c, plot3.male.meta.VR.c) overall.male.plot3. <- full_join(overall.male.plot3., plot3.male.meta.RR.c) for_table_malesig <- overall.male.plot3.[order(factor(overall.male.plot3.$GroupingTerm, levels = c("Behaviour","Morphology","Metabolism","Physiology","Immunology","Hematology","Heart","Hearing","Eye", "All"))),] ``` #NEW ADDED 3-6-2019 FZ: missing heterogeneity plots # ## Female not overlapping zero (significant) # **Re-structure data for each grouping term; delete un-used variables #plot3.female.meta.CVR[[3]][[1]][1:30] #tau2 is at position '9', I2 is at position '23' #plot3.female.meta.CVR[[3]][[1]][c(9, 23)] plot3.female.meta.CVR.c <- as.data.frame(plot3.female.meta.CVR %>% group_by(GroupingTerm) %>% mutate(tau2 = map_dbl(model_lnCVR, pluck(9)), I2 = map_dbl(model_lnCVR, pluck(23))) )[, c(1,4,5)] #add missing GroupingTerms plot3.female.meta.CVR.c <- add_row(plot3.female.meta.CVR.c, GroupingTerm = "Morphology") plot3.female.meta.CVR.c <- add_row(plot3.female.meta.CVR.c, GroupingTerm = "Hearing") plot3.female.meta.CVR.c <- add_column(plot3.female.meta.CVR.c, var = "ln(CVR)", .before= "tau2") plot3.female.meta.CVR.c <- plot3.female.meta.CVR.c[order(plot3.female.meta.CVR.c$GroupingTerm),] plot3.female.meta.VR.c <- as.data.frame(plot3.female.meta.VR %>% group_by(GroupingTerm) %>% mutate(tau2 = map_dbl(model_lnVR, pluck(9)), I2 = map_dbl(model_lnVR, pluck(23))) )[, c(1,4,5)] plot3.female.meta.VR.c <- add_row(plot3.female.meta.VR.c, GroupingTerm = "Morphology") plot3.female.meta.VR.c <- add_row(plot3.female.meta.VR.c, GroupingTerm = "Hearing") plot3.female.meta.VR.c <- add_row(plot3.female.meta.VR.c, GroupingTerm = "Hematology") plot3.female.meta.VR.c <- add_column(plot3.female.meta.VR.c, var = "ln(VR)", .before= "tau2") plot3.female.meta.VR.c <- plot3.female.meta.VR.c[order(plot3.female.meta.VR.c$GroupingTerm),] plot3.female.meta.RR.c <- as.data.frame(plot3.female.meta.RR %>% group_by(GroupingTerm) %>% mutate(tau2 = map_dbl(model_lnRR, pluck(9)), I2 = map_dbl(model_lnRR, pluck(23))) )[, c(1,4,5)] plot3.female.meta.RR.c <- add_row(plot3.female.meta.RR.c, GroupingTerm = "Eye") plot3.female.meta.RR.c <- add_row(plot3.female.meta.RR.c, GroupingTerm = "Metabolism") plot3.female.meta.RR.c <- add_column(plot3.female.meta.RR.c, var = "ln(RR)", .before= "tau2") plot3.female.meta.RR.c <- plot3.female.meta.RR.c[order(plot3.female.meta.RR.c$GroupingTerm),] overall.female.plot3. <- full_join(plot3.female.meta.CVR.c, plot3.female.meta.VR.c) overall.female.plot3. <- full_join(overall.female.plot3., plot3.female.meta.RR.c) for_table_femsig <- overall.female.plot3.[order(factor(overall.female.plot3.$GroupingTerm, levels = c("Behaviour","Morphology","Metabolism","Physiology","Immunology","Hematology","Heart","Hearing","Eye", "All"))),] ##### plot3.male.meta.CVR.perc.b ## Male-biased >10% # **Re-structure data for each grouping term; delete un-used variables plot3.male.meta.CVR.perc.c <- as.data.frame(plot3.male.meta.CVR.perc %>% group_by(GroupingTerm) %>% mutate(tau2 = map_dbl(model_lnCVR, pluck(9)), I2 = map_dbl(model_lnCVR, pluck(23))) )[, c(1,4,5)] #add missing GroupingTerms for plot plot3.male.meta.CVR.perc.c <- add_row(plot3.male.meta.CVR.perc.c, GroupingTerm = "Hearing") plot3.male.meta.CVR.perc.c <- add_row(plot3.male.meta.CVR.perc.c, GroupingTerm = "Eye") plot3.male.meta.CVR.perc.c <- add_column(plot3.male.meta.CVR.perc.c, var = "ln(CVR)", .before= "tau2") plot3.male.meta.CVR.perc.c <- plot3.male.meta.CVR.perc.c[order(plot3.male.meta.CVR.perc.c$GroupingTerm),] plot3.male.meta.VR.perc.c <- as.data.frame(plot3.male.meta.VR.perc %>% group_by(GroupingTerm) %>% mutate(tau2 = map_dbl(model_lnVR, pluck(9)), I2 = map_dbl(model_lnVR, pluck(23))) )[, c(1,4,5)] plot3.male.meta.VR.perc.c <- add_row(plot3.male.meta.VR.perc.c, GroupingTerm = "Hearing") plot3.male.meta.VR.perc.c <- add_row(plot3.male.meta.VR.perc.c, GroupingTerm = "Eye") plot3.male.meta.VR.perc.c <- add_column(plot3.male.meta.VR.perc.c, var = "ln(VR)", .before= "tau2") plot3.male.meta.VR.perc.c <- plot3.male.meta.VR.perc.c[order(plot3.male.meta.VR.perc.c$GroupingTerm),] plot3.male.meta.RR.perc.c <- as.data.frame(plot3.male.meta.RR.perc %>% group_by(GroupingTerm) %>% mutate(tau2 = map_dbl(model_lnRR, pluck(9)), I2 = map_dbl(model_lnRR, pluck(23))) )[, c(1,4,5)] plot3.male.meta.RR.perc.c <- add_row(plot3.male.meta.RR.perc.c, GroupingTerm = "Hearing") plot3.male.meta.RR.perc.c <- add_row(plot3.male.meta.RR.perc.c, GroupingTerm = "Eye") plot3.male.meta.RR.perc.c <- add_row(plot3.male.meta.RR.perc.c, GroupingTerm = "Heart") plot3.male.meta.RR.perc.c <- add_column(plot3.male.meta.RR.perc.c, var = "ln(RR)", .before= "tau2") plot3.male.meta.RR.perc.c <- plot3.male.meta.RR.perc.c[order(plot3.male.meta.RR.perc.c$GroupingTerm),] overall.male.perc. <- full_join(plot3.male.meta.CVR.perc.c, plot3.male.meta.VR.perc.c) overall.male.perc. <- full_join(overall.male.perc., plot3.male.meta.RR.perc.c) for_table_male10perc <- overall.male.perc.[order(factor(overall.male.perc.$GroupingTerm, levels = c("Behaviour","Morphology","Metabolism","Physiology","Immunology","Hematology","Heart","Hearing","Eye", "All"))),] ## ## Female-biased >10% # **Re-structure data #plot3.meta.CVR.perc[[3]][[1]][1:30] #tau2 is at position '9', I2 is at position '23' #plot3.meta.CVR.perc[[3]][[1]][c(9, 23)] plot3.female.meta.CVR.perc.c <- as.data.frame(plot3.meta.CVR.perc %>% group_by(GroupingTerm) %>% mutate(tau2 = map_dbl(model_lnCVR, pluck(9)), I2 = map_dbl(model_lnCVR, pluck(23))) )[, c(1,4,5)] # all zero #add missing GroupingTerms for plot plot3.female.meta.CVR.perc.c <- add_row(plot3.female.meta.CVR.perc.c, GroupingTerm = "Hearing") plot3.female.meta.CVR.perc.c <- add_row(plot3.female.meta.CVR.perc.c, GroupingTerm = "Behaviour") plot3.female.meta.CVR.perc.c <- add_row(plot3.female.meta.CVR.perc.c, GroupingTerm = "Hematology") plot3.female.meta.CVR.perc.c <- add_column(plot3.female.meta.CVR.perc.c, var = "ln(CVR)", .before= "tau2") plot3.female.meta.CVR.perc.c <- plot3.female.meta.CVR.perc.c[order(plot3.female.meta.CVR.perc.c$GroupingTerm),] plot3.female.meta.VR.perc.c <- as.data.frame(plot3.meta.VR.perc %>% group_by(GroupingTerm) %>% mutate(tau2 = map_dbl(model_lnVR, pluck(9)), I2 = map_dbl(model_lnVR, pluck(23))) )[, c(1,4,5)] # all zero, except 'All' #add missing GroupingTerms for plot plot3.female.meta.VR.perc.c <- add_row(plot3.female.meta.VR.perc.c, GroupingTerm = "Hearing") plot3.female.meta.VR.perc.c <- add_row(plot3.female.meta.VR.perc.c, GroupingTerm = "Hematology") plot3.female.meta.VR.perc.c <- add_column(plot3.female.meta.VR.perc.c, var = "ln(VR)", .before= "tau2") plot3.female.meta.VR.perc.c <- plot3.female.meta.VR.perc.c[order(plot3.female.meta.VR.perc.c$GroupingTerm),] plot3.female.meta.RR.perc.c <- as.data.frame(plot3.meta.RR.perc %>% group_by(GroupingTerm) %>% mutate(tau2 = map_dbl(model_lnRR, pluck(9)), I2 = map_dbl(model_lnRR, pluck(23))) )[, c(1,4,5)] #add missing GroupingTerms for plot plot3.female.meta.RR.perc.c <- add_row(plot3.female.meta.RR.perc.c, GroupingTerm = "Hearing") plot3.female.meta.RR.perc.c <- add_row(plot3.female.meta.RR.perc.c, GroupingTerm = "Eye") plot3.female.meta.RR.perc.c <- add_row(plot3.female.meta.RR.perc.c, GroupingTerm = "Metabolism") plot3.female.meta.RR.perc.c <- add_row(plot3.female.meta.RR.perc.c, GroupingTerm = "Hematology") plot3.female.meta.RR.perc.c <- add_column(plot3.female.meta.RR.perc.c, var = "ln(RR)", .before= "tau2") plot3.female.meta.RR.perc.c <- plot3.female.meta.RR.perc.c[order(plot3.female.meta.RR.perc.c$GroupingTerm),] overall.female.perc. <- full_join(plot3.female.meta.CVR.perc.c, plot3.female.meta.VR.perc.c) overall.female.perc. <- full_join(overall.female.perc., plot3.female.meta.RR.perc.c) for_table_female10perc <- overall.female.perc.[order(factor(overall.female.perc.$GroupingTerm, levels = c("Behaviour","Morphology","Metabolism","Physiology","Immunology","Hematology","Heart","Hearing","Eye", "All"))),]