diff --git a/01_Mesobromion.R b/01_Mesobromion.R index e85854c33a8ef014903c6ca6fdd80fdecadb1ff0..4090a7de39b49347e5acce4f44811b458614b65a 100644 --- a/01_Mesobromion.R +++ b/01_Mesobromion.R @@ -163,7 +163,8 @@ species <- read_delim("_data/Mesobromion/species.out.10perc.txt", delim="\t") traits <- read_delim("_data/Mesobromion/traits.out.10perc.txt", delim="\t") traits <- traits %>% - column_to_rownames("species0") # %>% + column_to_rownames("species0") %>% + dplyr::select(LeafArea:Disp.unit.leng) #dplyr::select(PlantHeight, LeafC.perdrymass, LeafN, StemDens, Stem.cond.dens, Seed.num.rep.unit, SLA) @@ -172,22 +173,37 @@ traits <- traits %>% myfilelist <- list.files(path="_derived/Mesobromion/", pattern="HIDDEN_[0-9]+.RData", full.names = T) corXY <- NULL corXY.perm <- NULL +corXY.bootstr <- NULL for(ff in myfilelist){ index <- as.numeric(regmatches(ff, gregexpr("[[:digit:]]+", ff))[[1]]) load(ff) corXY <- rbind(corXY, cor.obs) corXY.perm <- rbind(corXY.perm, cor.perm) + corXY.bootstr <- rbind(corXY.bootstr, cor.bootstr) print(index) } + +diffs <- corXY.bootstr - corXY.perm +sign <- apply(diffs, MARGIN=1, function(x){sum(x>0)>190}) +sign <- data.frame(Trait.comb=names(sign), sign=sign) + corXY %>% arrange(Test, desc(Coef)) -aa <- data.frame(Trait.comb=paste0("t", 1:80), +aa <- data.frame(Trait.comb=paste0("t", 1:15), trait.name=colnames(traits))#[-which(colnames(traits) %in% c("species", "species0"))]) -bb <- get.SES(obs.df = corXY, perm.df = corXY.perm, stat="RV") %>% - separate(Trait.comb, c("trait1", "trait2")) %>% + +corXY.ci <- data.frame(Trait.comb=rownames(corXY.bootstr), + obs=corXY.bootstr[,1], + q025=apply(corXY.bootstr[,-1], MARGIN=1, quantile, probs=0.025), + q975=apply(corXY.bootstr[,-1], MARGIN=1, quantile, probs=0.975)) %>% + left_join(sign, by="Trait.comb") %>% + as.tbl() %>% + mutate(Trait.comb2=Trait.comb) %>% + separate(Trait.comb2, c("trait1", "trait2", "trait3")) %>% mutate(trait2=paste0("t", trait2)) %>% + mutate(trait3=paste0("t", trait3)) %>% left_join(aa %>% rename(trait1=Trait.comb), by="trait1") %>% dplyr::select(-trait1) %>% @@ -195,12 +211,63 @@ bb <- get.SES(obs.df = corXY, perm.df = corXY.perm, stat="RV") %>% left_join(aa %>% rename(trait2=Trait.comb), by="trait2") %>% dplyr::select(-trait2) %>% - rename(trait2=trait.name) %>% - dplyr::select(trait1, trait2, q025:conf.p) %>% + rename(trait2=trait.name) %>% + left_join(aa %>% + rename(trait3=Trait.comb), by="trait3") %>% + dplyr::select(-trait3) %>% + rename(trait3=trait.name) %>% + mutate(ntraits= (!is.na(trait1)) + (!is.na(trait2)) + (!is.na(trait3))) %>% + arrange(ntraits, obs) + +### spider plot +# faceted spider plot +mydata <- corXY.ci %>% + filter(grepl(pattern = "t2", Trait.comb)) %>% + #filter(grepl(pattern = "_6", Trait.comb)) %>% + filter(sign==T) %>% + filter(ntraits<=2) %>% + mutate(Trait.comb=factor(Trait.comb)) %>% + mutate(seq=1:nrow(.)) + +ggplot(data=mydata) + + geom_segment(aes(x=q025, xend=q975, y=seq, yend=seq1, col=sign)) + + geom_point(aes(x=obs, y=seq), pch=15) + + scale_y_continuous(breaks=mydata$seq, + labels=mydata$Trait.comb) + + + + + + +corXY.SES <- get.SES(obs.df = corXY, perm.df = corXY.perm, stat="RV") %>% + separate(Trait.comb, c("trait1", "trait2", "trait3")) %>% + mutate(trait2=paste0("t", trait2)) %>% + mutate(trait3=paste0("t", trait3)) %>% + left_join(aa %>% + rename(trait1=Trait.comb), by="trait1") %>% + dplyr::select(-trait1) %>% + rename(trait1=trait.name) %>% + left_join(aa %>% + rename(trait2=Trait.comb), by="trait2") %>% + dplyr::select(-trait2) %>% + rename(trait2=trait.name) %>% + left_join(aa %>% + rename(trait3=Trait.comb), by="trait3") %>% + dplyr::select(-trait3) %>% + rename(trait3=trait.name) %>% + dplyr::select(trait1, trait2, trait3, q025:conf.p) %>% arrange(desc(SES.np)) print(bb, n=20) + + +break() + + + + #### Calculate and plot PCA of CWMs CWM.wide <- species %>% rownames_to_column("RELEVE_NR") %>% @@ -239,75 +306,32 @@ ggplot() + ylab(paste("PC2 (", varexpl[2], "%)", sep="")) + theme_bw() + theme(panel.grid = element_blank()) + - ggtitle("PCA of CWMs (Axis 1 and 2)") - - -ggplot() + - geom_point(data=as.data.frame(CWM.pca$CA$u[,c(1,3)]), - aes(x=PC1, y=PC3), pch="+", size=2, alpha=0.8) + - geom_segment(data=as.data.frame(CWM.pca$CA$v*2) %>% - rownames_to_column("Trait") %>% - mutate(in.try=ifelse(Trait %in% colnames(alltry), "Dark red", "Dark blue")), - aes(x=0, xend=PC1, y=0, yend=PC3, col=in.try), arrow = arrow(length = unit(0.08, "inches")), alpha=0.8) + - geom_text(data=as.data.frame(CWM.pca$CA$v*2.1) %>% - rownames_to_column("Trait") %>% - mutate(in.try=ifelse(Trait %in% colnames(alltry), "Dark red", "Dark blue")), - aes(x=PC1, y=PC3, label=Trait, col=in.try), size=3 ) + - scale_color_identity() + - xlab(paste("PC1 (", varexpl[1], "%)", sep="")) + - ylab(paste("PC3 (", varexpl[3], "%)", sep="")) + - theme_bw() + - theme(panel.grid = element_blank()) + - ggtitle("PCA of CWMs (Axis 1 and 3)") - - - - + title("PCA of CWMs") #PCA of individual traits trait.pca <- vegan::rda(as.matrix(traits %>% - filter(!is.na(rowSums(.)))), na.action=na.omit, - scale=T) + filter(!is.na(rowSums(.)))), na.action=na.omit) varexpl.t <- round(trait.pca$CA$eig/sum(trait.pca$CA$eig)*100,1) ggplot() + geom_point(data=as.data.frame(trait.pca$CA$u[,1:2]), aes(x=PC1, y=PC2), pch="+", size=2, alpha=0.8) + - geom_segment(data=as.data.frame(trait.pca$CA$v*1.3) %>% + geom_segment(data=as.data.frame(trait.pca$CA$v*2) %>% rownames_to_column("Trait") %>% mutate(in.try=ifelse(Trait %in% colnames(alltry), "Dark red", "Dark blue")), aes(x=0, xend=PC1, y=0, yend=PC2, col=in.try), arrow = arrow(length = unit(0.08, "inches")), alpha=0.8) + - geom_text(data=as.data.frame(trait.pca$CA$v*1.4) %>% + geom_text(data=as.data.frame(trait.pca$CA$v*2.1) %>% rownames_to_column("Trait") %>% mutate(in.try=ifelse(Trait %in% colnames(alltry), "Dark red", "Dark blue")), aes(x=PC1, y=PC2, label=Trait, col=in.try), size=3 ) + scale_color_identity() + - xlab(paste("PC1 (", varexpl.t[1], "%)", sep="")) + - ylab(paste("PC2 (", varexpl.t[2], "%)", sep="")) + + xlab(paste("PC1 (", varexpl[1], "%)", sep="")) + + ylab(paste("PC2 (", varexpl[2], "%)", sep="")) + theme_bw() + theme(panel.grid = element_blank()) + - ggtitle("PCA of species-level traits") + - coord_equal() - -trait.envf <- envfit(trait.pca, traits %>% - filter(!is.na(rowSums(.))), choices = c(1,2,3), na.rm = T) + title("PCA of species-level traits") -as.data.frame(trait.envf$vectors$arrows) %>% - rownames_to_column("Trait") %>% - arrange(desc(PC1)) - - -out <- NULL -for(tt1 in 2:ncol(traits)){ - for(tt2 in 1:ncol(traits)) { - #for(tt2 in 1:(tt1-1)) { - tmp <- cor.test(traits[,tt1], traits[,tt2], use="pairwise.complete.obs") - out <- rbind(out, - data.frame(trait1=colnames(traits)[tt1] , trait2=colnames(traits)[tt2], r=tmp$estimate, pvalue.r=tmp$p.value)) - } -} -bb %>% left_join(out, by=c("trait1", "trait2")) #### Map of plots diff --git a/01b_MesobromionCluster.R b/01b_MesobromionCluster.R index 7fef7c6d37173629f59b39eeb6520c540fee4bd1..c7a92aae76755b11c59d9b3bfd4f4b6c33b09f9c 100644 --- a/01b_MesobromionCluster.R +++ b/01b_MesobromionCluster.R @@ -14,148 +14,8 @@ require(ade4) require(parallel) require(doParallel) -#### Function 1 - CorXY #### -get.corXY <- function(comm, traits, trait.sel="all", stat=c("mantel", "RV", "procrustes")){ - if(identical(trait.sel, "all")) {trait.sel <- 1:ncol(traits)} - ii <- trait.sel - lab.tmp <- paste(ii, collapse="_") - ### delete potential missing species - if(any(colSums(comm)==0)){ - empty <- which(colSums(comm)==0) - traits <- traits[-empty,] - comm <- comm[,-empty] - } - syn.out.tmp <- matrix.x(comm=comm, traits=traits[,ii,drop=F], scale=T)$matrix.X - W.beals <- as.data.frame(beals(comm, include=T, type=2)) - corXY <- NULL - if("mantel" %in% stat){ - W.beals.d <- dist(W.beals) - mantel.tmp <- mantel(W.beals.d, dist(syn.out.tmp[])) - corXY <- rbind(corXY, - data.frame(Trait.comb=lab.tmp, Test="Mantel", Coef=mantel.tmp$statistic, pvalue=mantel.tmp$signif)) - } - if("RV" %in% stat){ - RV.tmp <- RV.rtest(W.beals, as.data.frame(syn.out.tmp)) - corXY <- rbind(corXY, - data.frame(Trait.comb=lab.tmp, Test="RV", Coef=RV.tmp$obs, pvalue=RV.tmp$pvalue)) - } - if("procrustes" %in% stat){ - prot.tmp <- protest(W.beals, syn.out.tmp) - corXY <- rbind(corXY, - data.frame(Trait.comb=lab.tmp, Test="Procrustes", Coef=prot.tmp$t0, pvalue=prot.tmp$signif)) - } - return(corXY) -} - - - -#### Function 2 - CorTE #### -get.corTE <- function(comm, traits, envir, trait.sel="all", env.sel="all", stat=c("mantel", "RV")){ - if(identical(trait.sel, "all")) {trait.sel <- 1:ncol(traits)} - if(identical(env.sel, "all" )) {env.sel <- 1:ncol(envir)} - ii <- trait.sel - lab.tmp <- paste(ii, collapse="_") - ## delete potential missing species - if(any(colSums(comm)==0)){ - empty <- which(colSums(comm)==0) - traits <- traits[-empty,] - comm <- comm[,-empty] - } - syn.out.tmp <- matrix.t(comm=comm, traits=traits, scale=T)$matrix.T - ee <- env.sel - lab.env <- paste(ee, collapse="_") - corTE <- NULL - if("mantel" %in% stat){ - mantel.tmp <- mantel(dist(envir[,ee, drop=F]), dist(syn.out.tmp[,ii,drop=F])) - corTE <- rbind(corTE, - data.frame(Trait.comb=lab.tmp, Env.comb=lab.env, Test="Mantel", Coef=mantel.tmp$statistic, pvalue=mantel.tmp$signif)) - } - if("RV" %in% stat){ - RV.tmp <- RV.rtest(as.data.frame(envir[,ee, drop=F]), as.data.frame(syn.out.tmp[,ii,drop=F])) - corTE <- rbind(corTE, - data.frame(Trait.comb=lab.tmp, Env.comb=lab.env, Test="RV", Coef=RV.tmp$obs, pvalue=RV.tmp$pvalue)) - } - if("procrustes" %in% stat){ - prot.tmp <- protest(envir[,ee, drop=F], syn.out.tmp[,ii,drop=F]) - corTE <- rbind(corTE, - data.frame(Trait.comb=lab.tmp, Env.comb=lab.env, Test="Procrustes", Coef=prot.tmp$t0, pvalue=prot.tmp$signif)) - } - return(corTE) -} - - -#### Function 3 - CorXE #### -get.corXE <- function(comm, traits, envir, trait.sel="all", env.sel="all", stat=c("mantel", "RV", "procrustes")){ - if(identical(trait.sel, "all")) {trait.sel <- 1:ncol(traits)} - if(identical(env.sel, "all" )) {env.sel <- 1:ncol(envir)} - ii <- trait.sel - lab.tmp <- paste(ii, collapse="_") - ### delete potential missing species - if(any(colSums(comm)==0)){ - empty <- which(colSums(comm)==0) - traits <- traits[-empty,] - comm <- comm[,-empty] - } - syn.out.tmp <- matrix.x(comm=comm, traits=traits[,ii,drop=F], scale=T)$matrix.X - ee <- env.sel - lab.env <- paste(ee, collapse="_") - corXE <- NULL - if("mantel" %in% stat){ - mantel.tmp <- mantel(dist(envir[,ee, drop=F]), dist(syn.out.tmp[])) - corXE <- rbind(corXE, - data.frame(Trait.comb=lab.tmp, Env.comb=lab.env, Test="Mantel", Coef=mantel.tmp$statistic, pvalue=mantel.tmp$signif)) - } - if("RV" %in% stat){ - RV.tmp <- RV.rtest(as.data.frame(envir[,ee, drop=F]), as.data.frame(syn.out.tmp)) - corXE <- rbind(corXE, - data.frame(Trait.comb=lab.tmp, Env.comb=lab.env, Test="RV", Coef=RV.tmp$obs, pvalue=RV.tmp$pvalue)) - } - if("procrustes" %in% stat){ - prot.tmp <- protest(envir[,ee, drop=F], syn.out.tmp) - corXE <- rbind(corXE, - data.frame(Trait.comb=lab.tmp, Env.comb=lab.env, Test="Procrustes", Coef=prot.tmp$t0, pvalue=prot.tmp$signif)) - } - return(corXE) -} - - - -### Get SES (both parametric and non parametric) -#obs.df = output from one of the get functions above -#perm.df = df traitCombination X permutations with the chosen statistic of correlation on permuteda data - -get.SES <- function(obs.df, perm.df, stat="RV") { - nperm <- dim(perm.df)[2] - SES.out <- as.data.frame.table(perm.df) %>% - rename(Trait.comb=Var1, perm=Var2, coef=Freq ) %>% - group_by(Trait.comb) %>% - left_join(obs.df %>% - filter(Test==stat) %>% - dplyr::select(-pvalue, -Test) %>% - mutate(Trait.comb=paste0("t", Trait.comb)) %>% - rename(obs=Coef), - by=c("Trait.comb")) %>% - summarize(q15 = quantile(coef, probs = 0.15865), - q50 = quantile(coef, .5), - q84 = quantile(coef, 0.84135), - mean.perm=mean(coef), - sd.perm=sd(coef), - greater.than.obs=sum( (abs(coef)>=abs(obs))/n())) %>% - left_join(obs.df %>% - filter(Test==stat) %>% - dplyr::select(-pvalue, -Test) %>% - mutate(Trait.comb=paste0("t", Trait.comb)) %>% - rename(obs=Coef), - by=c("Trait.comb")) %>% - mutate(SES.np= ifelse(obs>=q50, (obs-q50)/(q84-q50), (obs-q50)/(q50-q15))) %>% - mutate(SES=(obs-mean.perm)/sd.perm) %>% - arrange(desc(SES.np)) %>% - mutate(conf.m=obs-1.65*(sd.perm/sqrt(nperm))) %>% - mutate(conf.p=obs+1.65*(sd.perm/sqrt(nperm))) - return(SES.out) -} - +source("99_HIDDEN_functions.R") Mesobromion <- function(species.path, traits.path, output, myfunction="get.corXY", max.inter.t, chunkn, chunk.i, nperm=99){