diff --git a/04_Additional_Figs.R b/04_Additional_Figs.R new file mode 100644 index 0000000000000000000000000000000000000000..f20b40971b9aae7a7b98e5696e6bb4ecde70851c --- /dev/null +++ b/04_Additional_Figs.R @@ -0,0 +1,173 @@ +library(tidyverse) + +#### Ancillary parsing functions #### +# split final Dataset into a list, one element for each simulated dataset +split.by.dataset <- function(toparse){ + x <- read_lines(toparse) + tag <- "^SIMULATED DATA [0-9]+$" + last.tag <- "^FINAL RESULTS$" + splits <- grep(pattern=tag, x=x) + last.split <- grep(pattern=last.tag, x=x)-2 + dataset.nr <- as.numeric(unlist(regmatches(x[splits], gregexpr("[[:digit:]]+", x[splits])))) + + split.l <- list() + for(i in 1:length(splits)){ + split.l[[i]] <- splits[i]: (c(splits, last.split)[i+1]-1) + } + + x2 <- lapply(split.l, function(l){return(x[l])}) ### splits files into 100 datasets + names(x2) <- paste("Dataset", dataset.nr) + return(x2) +} + +## split each element from the above list into introduction & 14 trait x environmental effect combinations +split.trait.env.combos <- function( y ){ + tag <- "^RESULTS WITH SIMULATED DATA [0-9]+$" + splits <- c(0, grep(pattern=tag, x=y)) + dataset.nr <- as.numeric(unlist(regmatches(y[splits], gregexpr("[[:digit:]]+", y[splits])))) + + split.l2 <- list() + for(i in 1:length(splits)){ + split.l2[[i]] <- splits[i]: (c(splits, length(y))[i+1]-1) + } + trait.weights <- grep(pattern="Trait weights", x=y) + trait.weights <- regmatches(y[trait.weights], gregexpr("[[:digit:]]+", y[trait.weights])) + trait.weights <- sapply(trait.weights, function(t){paste(paste0("t",1:length(t),"=", t), collapse=" ")}) + + env.weights <- grep(pattern="Ecosystem variable weights", x=y) + env.weights <- regmatches(y[env.weights], gregexpr("[[:digit:]]+", y[env.weights])) + env.weights <- sapply(env.weights, function(e){paste(paste0("e",1:length(e),"=", e), collapse=" ")}) + + all.names <- c(paste("Simulated dataset", unique(dataset.nr)), + paste("Simulated dataset", dataset.nr, "-", trait.weights, "-",env.weights)) + x3 <- lapply(split.l2, function(l){return(y[l])}) ### splits files into 14 results (trait x env combos) + names(x3) <- all.names + return(x3) + } + +## parse alpha beta and gamma diversity, as well as correlation coefficients from output of previous function +extract.results <- function(z){ + get.abg <- function(z, tag_string) { + W <- "Diversity descriptors of composition matrix W" + Y <- "Diversity descriptors of Beals smoothed composition matrix Y" + X <- "Diversity descriptors of fuzzy-weighted composition matrix X" + tag <- get(tag_string) + abg.lines <- z[grep(pattern=tag, x=z)+1:4] + abg.res <- NULL + if(length(abg.lines)>0){ + abg.res <- regmatches(abg.lines, gregexpr("-*[[:digit:]]+\\.[[:digit:]]+", abg.lines)) + abg.res <- sapply(abg.res, function(a){a[length(a)]}) + names(abg.res) <- paste(c("alpha", "beta", "gamma", "propbeta"), tag_string, sep=".")} + return(abg.res) + } + + + get.cor <- function(z, tag_string) { + Y <- "Correlation coefficients between PCOA ordination community scores \\(based on Beals-smoothed composition matrix Y\\) and other community or ecosystem descriptors" + W <- "Correlation coefficients between PCOA ordination community scores \\(based on composition matrix W\\) and other community or ecosystem descriptors" + tag <- get(tag_string) + cor.lines <- z[grep(pattern=tag, x=z)+2:18] + cor.res <- NULL + if(length(cor.lines)>0){ + cor.res <- unlist(regmatches(cor.lines, gregexpr("-*[[:digit:]]+\\.[[:digit:]]+", cor.lines))) + cor.with <- unlist(regmatches(cor.lines, gregexpr("CWM trait [[:digit:]]|Ecosystem variable [[:digit:]]", cor.lines))) + cor.with <- gsub(pattern="Ecosystem variable ", replacement="e", x=cor.with) + cor.with <- gsub(pattern="CWM trait ", replacement="t", x=cor.with) + + names(cor.res) <- paste("cor", tag_string, cor.with, rep(paste0("a", 1:3), each=5), sep=".") + } + return(cor.res) + } + + + bind.res <- function(zz){ + return(c(get.abg(zz, "W"), + get.abg(zz, "Y"), + get.abg(zz, "X"), + get.cor(zz, "Y"), + get.cor(zz, "W"))) + } + + tmp <- lapply(z, bind.res) + return( tmp %>% + bind_rows %>% + mutate(dataset=names(tmp))) + #mutate(dataset=rep(names(tmp), lapply(tmp, length)))) +} + +## Function to create Figure SXXV +create.panel <- function(x){ + gg.betaW <- ggplot(data=x %>% + dplyr::filter(metric=="propbeta") %>% + dplyr::filter(matrix=="W")) + + geom_vline(aes(xintercept=0), lty=2, alpha=0.6) + + geom_hline(aes(yintercept=0), lty=2, alpha=0.6) + + geom_density(aes(value)) + + xlab("Proportional Beta Diversity (W)") + + xlim(c(0,1.1)) + + ylim(c(0,60)) + + theme_classic() + + gg.betaY <- gg.betaW %+% + (x %>% + dplyr::filter(metric=="propbeta") %>% + dplyr::filter(matrix=="Y")) + + xlab("Proportional Beta Diversity (Y)") + + gg.corW <- gg.betaW %+% + (x %>% + dplyr::filter(metric=="cor") %>% + dplyr::filter(matrix=="W") %>% + dplyr::filter(with %in% c("e1", "e2", "e3")) %>% + group_by(dataset, metric, matrix) %>% + summarize(value=max(abs(value))))+ + xlab("Cor(WE)") + + ylab(NULL) + + gg.corY <- gg.betaW %+% + (x %>% + dplyr::filter(metric=="cor") %>% + dplyr::filter(matrix=="Y") %>% + dplyr::filter(with %in% c("e1", "e2", "e3")) %>% + group_by(dataset, metric, matrix) %>% + summarize(value=max(abs(value)))) + + xlab("Cor(YE)") + + ylab(NULL) + + gg.panel <- cowplot::plot_grid(gg.betaW, gg.corW, + gg.betaY, gg.corY, + nrow=2, rel_widths = c(1,1.06)) + return(gg.panel) +} + + + + + +### Parse output file #### +mypath <- "_data/Experiment_30Oct2020_FactorInteraction&TraitCorr_XY_SampleSize_Main=040_Inter=00_Corr=00_v21169" +myfiles <- list.files(path=mypath, pattern = "FinalSimulatedData.txt", recursive = T, full.names = T) +myfiles <- myfiles[grepl("_new", x=myfiles)] + +for(i in 1:length(myfiles)){ + toparse <- myfiles[i] + sampleN <- regmatches(toparse, gregexpr("N=[[:digit:]]+", toparse))[[1]] + x2 <- split.by.dataset(toparse) + x3 <- lapply(x2, split.trait.env.combos) + + div.summary <- lapply(x3, extract.results) %>% + bind_rows %>% + dplyr::relocate(dataset) %>% + pivot_longer(-dataset, names_to="metric", values_to="value") %>% + filter(!is.na(value)) %>% + separate(dataset, into=c("dataset", "trait", "env"), sep=" - ") %>% + dplyr::relocate(metric, .after=dataset) %>% + separate(metric, into=c("metric", "matrix", "with", "PCOA"), sep="\\.") %>% + mutate(value=as.numeric(value)) + + gg.out <- create.panel(div.summary) + ggsave(filename = paste0("_pics/R1/FigSXXZ_Panel_BetaCor_", sampleN, ".png"), + width=6, height=5, device="png", dpi = 300, plot = gg.out) +} + +