From 65ff0679e91d92d60402334de34bf7d0a438a88a Mon Sep 17 00:00:00 2001 From: Adrien Taudiere Date: Wed, 6 Sep 2023 12:11:41 +0200 Subject: [PATCH 01/16] Use bit score instead of % id match in sorting blast table --- R/blast.R | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/R/blast.R b/R/blast.R index 0ec14dd0..2dca5266 100644 --- a/R/blast.R +++ b/R/blast.R @@ -20,10 +20,10 @@ #' @param e_value_cut (default: 1e-30) cut of in e-value (%) to keep result #' The BLAST E-value is the number of expected hits of similar quality (score) #' that could be found just by chance. -#' @param unique_per_seq (logical) if TRUE only return the first match for -#' each sequence in seq2search -#' @param score_filter (logical) does results are filter by score? If -#' FALSE, `id_cut`,`bit_score_cut` and `min_cover_cut` are ignored +#' @param unique_per_seq (logical, default FALSE) if TRUE only return the better match +#' (higher **bit score**) for each sequence +#' @param score_filter (logical, default TRUE) does results are filter by score? If +#' FALSE, `id_cut`,`bit_score_cut`, `e_value_cut` and `min_cover_cut` are ignored #' @param list_no_output_query (logical) does the result table include #' query sequences for which `blastn` does not find any correspondence? #' @param args_makedb Additional parameters parse to makeblastdb command @@ -132,7 +132,7 @@ blast_to_phyloseq <- function(physeq, "Query cover" ) - blast_tab <- blast_tab[order(blast_tab[, "% id. match"], decreasing = TRUE), ] + blast_tab <- blast_tab[order(blast_tab[, "bit score"], decreasing = TRUE), ] if (unique_per_seq) { blast_tab <- blast_tab[which(!duplicated(blast_tab[, 1])), ] @@ -301,7 +301,7 @@ blast_pq <- function(physeq, "Query cover" ) - blast_tab <- blast_tab[order(blast_tab[, "% id. match"], decreasing = TRUE), ] + blast_tab <- blast_tab[order(blast_tab[, "bit score"], decreasing = TRUE), ] if (unique_per_seq) { blast_tab <- blast_tab[which(!duplicated(blast_tab[, 1])), ] @@ -533,7 +533,7 @@ blast_to_derep <- function(derep, blast_tab$occurence <- sub("seqs\\)", "", sub(".*\\(", "", blast_tab$`Sample name`, perl = TRUE), perl = TRUE) - blast_tab <- blast_tab[order(blast_tab[, "% id. match"], decreasing = TRUE), ] + blast_tab <- blast_tab[order(blast_tab[, "bit score"], decreasing = TRUE), ] if (unique_per_seq) { blast_tab <- blast_tab[which(!duplicated(blast_tab[, 1])), ] From a13e63028d923e8986c1eb8d3058e83c13b63097 Mon Sep 17 00:00:00 2001 From: Adrien Taudiere Date: Wed, 6 Sep 2023 12:12:30 +0200 Subject: [PATCH 02/16] Add blast and vsearch to pkgdown action --- .github/workflows/pkgdown.yaml | 6 ++++++ vignettes/filter.Rmd | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml index e1e2e525..62aa3080 100644 --- a/.github/workflows/pkgdown.yaml +++ b/.github/workflows/pkgdown.yaml @@ -33,6 +33,12 @@ jobs: extra-packages: any::pkgdown, local::. needs: website + - name: Install vsearch + run: sudo apt-get install vsearch + + - name: Install blastn + run: sudo apt-get install ncbi-blast+ + - name: Build site run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE) shell: Rscript {0} diff --git a/vignettes/filter.Rmd b/vignettes/filter.Rmd index 70936905..422a6bb2 100644 --- a/vignettes/filter.Rmd +++ b/vignettes/filter.Rmd @@ -16,6 +16,7 @@ knitr::opts_chunk$set( ```{r setup, message=FALSE} library(MiscMetabar) +library(formattable) ``` ## Filter samples @@ -71,7 +72,6 @@ track_formattable <- ```{r} if (class(blast_error_or_not) != "try-error") { -library(formattable) formattable(track_formattable, list( area(col = nb_sequences) ~ color_bar("cyan", na.rm = T), From 4cf27f811edaf126f30a28a14979967363121ed8 Mon Sep 17 00:00:00 2001 From: Adrien Taudiere Date: Wed, 6 Sep 2023 12:30:43 +0200 Subject: [PATCH 03/16] Add formattable to DESCRIPTION --- DESCRIPTION | 1 + 1 file changed, 1 insertion(+) diff --git a/DESCRIPTION b/DESCRIPTION index ea601364..a5edd377 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -23,6 +23,7 @@ Suggests: DESeq2, DT, edgeR, + formattable, gghalves, ggVennDiagram, grDevices, From 9a0b803634ef5dcaef64993fd98e33ea00c5500b Mon Sep 17 00:00:00 2001 From: Adrien Taudiere Date: Wed, 6 Sep 2023 16:51:47 +0200 Subject: [PATCH 04/16] minor improvment of documentation --- R/dada_phyloseq.R | 3 ++- tests/testthat/test_vsearch.R | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/R/dada_phyloseq.R b/R/dada_phyloseq.R index 5e00ec50..8df47b92 100644 --- a/R/dada_phyloseq.R +++ b/R/dada_phyloseq.R @@ -432,7 +432,8 @@ track_wkflow_samples <- function(list_pq_obj, ...) { #' Set the clustering method. #' - `clusterize` use the [DECIPHER::Clusterize()] fonction, #' - `vsearch` use the vsearch software (https://github.com/torognes/vsearch/) -#' with arguments `-cluster_fast` and `-strand both` +#' with arguments `--cluster_size` by default (see args `vsearch_cluster_method`) +#' and `-strand both` (see args `vsearch_args`) #' @param vsearchpath path to vsearch #' @param id (default: 0.97) level of identity to cluster #' @param tax_adjust See the man page diff --git a/tests/testthat/test_vsearch.R b/tests/testthat/test_vsearch.R index 56d46516..6763fc22 100644 --- a/tests/testthat/test_vsearch.R +++ b/tests/testthat/test_vsearch.R @@ -15,8 +15,11 @@ if (class(vsearch_error_or_not) == "try-error") { message("vs_search_global() and asv2otu(..., method=vsearch) can't be tested when vsearch is not installed") } else { test_that("asv2otu works fine with vsearch method", { - expect_s4_class(asv2otu(data_fungi_sp_known, method = "vsearch"), "phyloseq") + expect_s4_class(d_vs <- asv2otu(data_fungi_sp_known, method = "vsearch"), "phyloseq") + expect_s4_class(d_fast <- asv2otu(data_fungi_sp_known, method = "vsearch", vsearch_cluster_method = "--cluster_fast"), "phyloseq") expect_s3_class(asv2otu(seq_names = sequences_ex, method = "vsearch"), "data.frame") + expect_true(sum(!d_fast@refseq == d_vs@refseq) > 0) + expect_true(dim(d_fast@otu_table) == dim(d_fast@otu_table)) }) test_that("vs_search_global works fine with vsearch method", { From dcd4f972457febfbc8f44eb0d5fc321229f00a5d Mon Sep 17 00:00:00 2001 From: Adrien Taudiere Date: Fri, 8 Sep 2023 12:04:06 +0200 Subject: [PATCH 05/16] add option paires in multi_biplot_pq --- DESCRIPTION | 1 + NEWS.md | 2 ++ R/plot_functions.R | 36 ++++++++++++++++++++++------ README.Rmd | 21 ++++++++++++++++ tests/testthat/test_figures_biplot.R | 5 ++++ 5 files changed, 58 insertions(+), 7 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index a5edd377..3fac1d8f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -16,6 +16,7 @@ Depends: magrittr, phyloseq Suggests: + benchdamic, Biostrings, circlize, data.table, diff --git a/NEWS.md b/NEWS.md index cd7f762a..30591056 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,8 @@ # MiscMetabar 0.41 (in development) - Add function `iNEXT_pq()` to calculate hill diversity using the [iNEXT](https://github.com/AnneChao/iNEXT) package. +- Add argument `paires` to `multi_biplot_pq()` in order to indicate all paires of samples we want to print. + # MiscMetabar 0.40 diff --git a/R/plot_functions.R b/R/plot_functions.R index 2aa97093..8ce38735 100644 --- a/R/plot_functions.R +++ b/R/plot_functions.R @@ -1849,8 +1849,11 @@ biplot_pq <- function(physeq, #' using one factor. #' #' @inheritParams clean_pq -#' @param split_by (required) the name of the factor to make all combination +#' @param split_by (required if paires is NULL) the name of the factor to make all combination #' of couples of values +#' @param paires (required if paires is NULL) the name of the factor in physeq@sam_data` slot +#' to make plot by paires of samples. Each level must be present only two times. +#' Note that if you set paires, you also must set fact arguments to pass on to [bi_plot_pq()]. #' @param na_remove (logical, default TRUE) if TRUE remove all the samples #' with NA in the `split_by` variable of the `physeq@sam_data` slot #' @param ... all other parameters passed on to [biplot_pq()] @@ -1867,12 +1870,20 @@ biplot_pq <- function(physeq, #' @author Adrien Taudière multi_biplot_pq <- function(physeq, split_by = NULL, - na_remove = TRUE, + paires = NULL, + na_remove = TRUE, ...) { - if (is.null(split_by) || is.null(physeq@sam_data[[split_by]])) { + if (is.null(paires) && is.null(split_by)) { + stop("You must set one of split_by or paires.") + } else if (!is.null(paires) && !is.null(split_by)) { + stop("You must set either split_by or paires, not both.") + } else if (!is.null(split_by) && is.null(physeq@sam_data[[split_by]])) { stop("split_by must be set and must be a variable in physeq@sam_data") + } else if (!is.null(paires) && is.null(physeq@sam_data[[paires]])) { + stop("paires must be set and must be a variable in physeq@sam_data") } - if (na_remove) { + + if (na_remove && !is.null(split_by)) { new_physeq <- subset_samples_pq(physeq, !is.na(physeq@sam_data[[split_by]])) if (nsamples(physeq) - nsamples(new_physeq) > 0) { message(paste0( @@ -1883,10 +1894,19 @@ multi_biplot_pq <- function(physeq, physeq <- new_physeq } - names_split_by <- names(table(physeq@sam_data[[split_by]])) - couples <- combn(names_split_by, 2) + if(!is.null(paires)){ + +p <- list() +for (c in levels(as.factor(physeq@sam_data[[paires]]))) { + new_physeq <- subset_samples_pq(physeq, physeq@sam_data[[paires]] %in% c ) + p[[c]] <- biplot_pq(new_physeq, ...) + ggtitle(c) +} + + } else { + names_split_by <- names(table(physeq@sam_data[[split_by]])) + couples <- combn(names_split_by, 2) - p <- list() + p <- list() for (c in 1:ncol(couples)) { names_p <- paste0(couples[1, c], " - ", couples[2, c]) new_physeq <- subset_samples_pq(physeq, physeq@sam_data[[split_by]] %in% @@ -1894,9 +1914,11 @@ multi_biplot_pq <- function(physeq, p[[names_p]] <- biplot_pq(new_physeq, fact = split_by, merge_sample_by = split_by, + ... ) } + } return(p) } diff --git a/README.Rmd b/README.Rmd index 837590ea..049b5580 100644 --- a/README.Rmd +++ b/README.Rmd @@ -57,3 +57,24 @@ summary_plot_pq(data_fungi) ```{r} circle_pq(data_fungi, "Height", taxa = "Class", add_nb_seq = F) ``` + + +### Installation of other softwares for debian Linux distributions + +#### blastn + +```sh +sudo apt-get install ncbi-blast+ +``` + +#### vsearch + +```sh +sudo apt-get install vsearch +``` + +#### Package benchdamic + +```sh +sudo apt-get install libgsl-dev libmpfr-dev +``` \ No newline at end of file diff --git a/tests/testthat/test_figures_biplot.R b/tests/testthat/test_figures_biplot.R index 298e51de..becdb6ac 100644 --- a/tests/testthat/test_figures_biplot.R +++ b/tests/testthat/test_figures_biplot.R @@ -17,8 +17,13 @@ test_that("biplot_pq works", { test_that("multi_biplot_pq works with data_fungi dataset", { p1 <- multi_biplot_pq(data_fungi_abun, split_by = "Time", na_remove = FALSE) p2 <- multi_biplot_pq(data_fungi_abun, "Height") + data_fungi_abun@sam_data$Random_paires <- as.factor(sample(rep(1:(nsamples(data_fungi_abun)/2), 2))) + p3 <- multi_biplot_pq(data_fungi_abun, paires = "Random_paires") expect_s3_class(p1[[1]], "ggplot") expect_type(p1, "list") expect_s3_class(p2[[1]], "ggplot") expect_type(p2, "list") + expect_s3_class(p3[[1]], "ggplot") + expect_type(p3, "list") + expect_equal(length(p3), 85) }) From 798f613b1c8a92bfd65fb72161fd1a2b5c7d9d82 Mon Sep 17 00:00:00 2001 From: Adrien Taudiere Date: Fri, 8 Sep 2023 12:48:43 +0200 Subject: [PATCH 06/16] Fix a bug in test --- tests/testthat/test_vsearch.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testthat/test_vsearch.R b/tests/testthat/test_vsearch.R index 6763fc22..5f71ec4e 100644 --- a/tests/testthat/test_vsearch.R +++ b/tests/testthat/test_vsearch.R @@ -19,7 +19,7 @@ if (class(vsearch_error_or_not) == "try-error") { expect_s4_class(d_fast <- asv2otu(data_fungi_sp_known, method = "vsearch", vsearch_cluster_method = "--cluster_fast"), "phyloseq") expect_s3_class(asv2otu(seq_names = sequences_ex, method = "vsearch"), "data.frame") expect_true(sum(!d_fast@refseq == d_vs@refseq) > 0) - expect_true(dim(d_fast@otu_table) == dim(d_fast@otu_table)) + expect_equal(sum(dim(d_vs@otu_table) == dim(d_fast@otu_table)), 2) }) test_that("vs_search_global works fine with vsearch method", { From 659c7901daa688d0f10b267bd6bb79c16c40da78 Mon Sep 17 00:00:00 2001 From: Adrien Taudiere Date: Fri, 8 Sep 2023 13:55:27 +0200 Subject: [PATCH 07/16] Improve result of compare_pairs_pq --- NEWS.md | 1 + R/table_functions.R | 27 +++++++++++++++++++-------- tests/testthat/test_table_functions.R | 4 ++-- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/NEWS.md b/NEWS.md index 30591056..0d41fe78 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,6 +2,7 @@ - Add function `iNEXT_pq()` to calculate hill diversity using the [iNEXT](https://github.com/AnneChao/iNEXT) package. - Add argument `paires` to `multi_biplot_pq()` in order to indicate all paires of samples we want to print. +- Improve `compare_pairs_pq()` with information about the number of shared sequences among paires # MiscMetabar 0.40 diff --git a/R/table_functions.R b/R/table_functions.R index bb1f1664..a47d4fd9 100644 --- a/R/table_functions.R +++ b/R/table_functions.R @@ -109,7 +109,8 @@ tax_datatable <- function(physeq, #' NA in the variables set in bifactor, modality and merge_sample_by. #' NA in variables are well managed even if na_remove = FALSE, so na_remove may #' be useless. -#' @return A tibble +#' @return A tibble with information about the number of shared ASV, shared number of sequences +#' and diversity #' @importFrom rlang .data #' @export #' @examples @@ -199,7 +200,7 @@ compare_pairs_pq <- function(physeq = NULL, sample_data(newphyseq) <- sample_data(new_DF) } if (nsamples(newphyseq) != 2) { - res[[i]] <- c(NA, NA, NA, NA, NA) + res[[i]] <- rep(NA, 8) warning("At least one case do not contain 2 samples, so NA were introduced.") } else { cond1 <- newphyseq@sam_data[[bifactor]] == lev1 @@ -215,8 +216,15 @@ compare_pairs_pq <- function(physeq = NULL, div_second <- round(vegan::diversity(newphyseq@otu_table, index = veg_index )[cond2], 2) + + nb_shared_seq <- sum(newphyseq@otu_table[,newphyseq@otu_table[cond1, ] > nb_min_seq & + newphyseq@otu_table[cond2, ] > nb_min_seq]) - res[[i]] <- c(nb_first, nb_second, nb_shared, div_first, div_second) + perc_seq_shared_lv1 <- round(100 * nb_shared_seq / sum(newphyseq@otu_table[,newphyseq@otu_table[cond1, ] > nb_min_seq]), 2) + + perc_seq_shared_lv2 <- round(100 * nb_shared_seq / sum(newphyseq@otu_table[,newphyseq@otu_table[cond2, ] > nb_min_seq]), 2) + + res[[i]] <- c(nb_first, nb_second, nb_shared, div_first, div_second, nb_shared_seq, perc_seq_shared_lv1, perc_seq_shared_lv2) } } @@ -236,13 +244,16 @@ compare_pairs_pq <- function(physeq = NULL, .data$V5, 3)) colnames(res_df) <- c( - paste0("nb_", lev1), - paste0("nb_", lev2), - "nb_shared", + paste0("nb_ASV_", lev1), + paste0("nb_ASV_", lev2), + "nb_shared_ASV", paste0("div_", lev1), paste0("div_", lev2), - paste0("percent_shared_", lev1), - paste0("percent_shared_", lev2), + "nb_shared_seq", + paste0("percent_shared_seq_", lev1), + paste0("percent_shared_seq_", lev2), + paste0("percent_shared_ASV_", lev1), + paste0("percent_shared_ASV_", lev2), paste0("ratio_nb_", lev1, "_", lev2), paste0("ratio_div_", lev1, "_", lev2) ) diff --git a/tests/testthat/test_table_functions.R b/tests/testthat/test_table_functions.R index 5be7548b..7d947dc1 100644 --- a/tests/testthat/test_table_functions.R +++ b/tests/testthat/test_table_functions.R @@ -26,9 +26,9 @@ data_fungi_low_high_withNA@sam_data[["Height"]][1] <- NA test_that(" compare_pairs_pq function works fine with data_fungi dataset", { expect_s3_class(compare_pairs_pq(data_fungi_low_high, bifactor = "Height", merge_sample_by = "Height"), "tbl_df") expect_message(expect_message(compare_pairs_pq(data_fungi_low_high_withNA, bifactor = "Height", merge_sample_by = "Height"))) - expect_equal(dim(compare_pairs_pq(data_fungi_low_high, bifactor = "Height", merge_sample_by = "Height")), c(1, 10)) + expect_equal(dim(compare_pairs_pq(data_fungi_low_high, bifactor = "Height", merge_sample_by = "Height")), c(1, 13)) expect_s3_class(compare_pairs_pq(data_fungi_low_high, bifactor = "Height", merge_sample_by = "Height", nb_min_seq = 2), "tbl_df") expect_s3_class(compare_pairs_pq(data_fungi_low_high, bifactor = "Height", merge_sample_by = "Height", veg_index = "simpson"), "tbl_df") expect_s3_class(compare_pairs_pq(data_fungi_low_high_withNA, bifactor = "Height", merge_sample_by = "Height", modality = "Time"), "tbl_df") - expect_equal(dim(compare_pairs_pq(data_fungi_low_high_withNA, bifactor = "Height", merge_sample_by = "Height", modality = "Time")), c(4, 10)) + expect_equal(dim(compare_pairs_pq(data_fungi_low_high_withNA, bifactor = "Height", merge_sample_by = "Height", modality = "Time")), c(4, 13)) }) From 65119e993d37f6804d980ab6b038bdc7765efbbc Mon Sep 17 00:00:00 2001 From: Adrien Taudiere Date: Mon, 11 Sep 2023 15:46:07 +0200 Subject: [PATCH 08/16] add upset_pq --- DESCRIPTION | 2 +- NEWS.md | 1 + R/plot_functions.R | 219 ++++++++++++++++++++++++++++++++++++++++- README.Rmd | 6 -- paper/paper.md | 4 +- vignettes/beta-div.Rmd | 10 ++ 6 files changed, 228 insertions(+), 14 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 3fac1d8f..9ad2de31 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -16,9 +16,9 @@ Depends: magrittr, phyloseq Suggests: - benchdamic, Biostrings, circlize, + ComplexUpset data.table, DECIPHER, DESeq2, diff --git a/NEWS.md b/NEWS.md index 0d41fe78..20ef2866 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,6 +3,7 @@ - Add function `iNEXT_pq()` to calculate hill diversity using the [iNEXT](https://github.com/AnneChao/iNEXT) package. - Add argument `paires` to `multi_biplot_pq()` in order to indicate all paires of samples we want to print. - Improve `compare_pairs_pq()` with information about the number of shared sequences among paires +- Add function `upset_pq()` to plot upset of phyloseq object using the [ComplexUpset](https://krassowski.github.io/complex-upset/) package # MiscMetabar 0.40 diff --git a/R/plot_functions.R b/R/plot_functions.R index 8ce38735..7a2fa08a 100644 --- a/R/plot_functions.R +++ b/R/plot_functions.R @@ -924,7 +924,7 @@ venn_pq <- #' @return A \code{\link{ggplot}}2 plot representing Venn diagramm of #' modalities of the argument \code{factor} or if split_by is set a list #' of plots. -#' +#' @seealso [upset_pq()] #' @examples #' data(data_fungi) #' ggvenn_pq(data_fungi, fact = "Height") @@ -2272,7 +2272,7 @@ SRS_curve_pq <- function(physeq, clean_pq = FALSE, ...) { } -#' Visualization of two samples for comparison +#' iNterpolation and EXTrapolation of Hill numbers (with iNEXT) #' @description #' `r lifecycle::badge("experimental")` #' @@ -2281,13 +2281,13 @@ SRS_curve_pq <- function(physeq, clean_pq = FALSE, ...) { #' physeq are merged using the vector set by `merge_sample_by`. This #' merging used the [speedyseq::merge_samples2()]. In the case of #' [biplot_pq()] this must be a factor with two levels only. -#' @param ... other arguments for the ggplot function -#' @return A object of class XXX +#' @param ... other arguments for the [iNEXT::iNEXT()] function +#' @return see [iNEXT::iNEXT()] documentation #' @export #' #' @examples #' library("iNEXT") -#' iNEXT_pq(data_fungi, merge_sample_by="Height", q=1, datatype="abundance", nboot=5) +#' res_iNEXT <- iNEXT_pq(data_fungi, merge_sample_by="Height", q=1, datatype="abundance", nboot=5) #' ggiNEXT(res_iNEXT) #' ggiNEXT(res_iNEXT, type = 2) #' ggiNEXT(res_iNEXT, type = 3) @@ -2306,3 +2306,212 @@ iNEXT_pq <- function(physeq, merge_sample_by = NULL, ...){ } + + +#' Make upset plot for phyloseq object. +#' @description +#' `r lifecycle::badge("experimental")` +#' +#' Alternative to venn plot. +#' +#' @inheritParams clean_pq +#' @param fact (required): Name of the factor to cluster samples by modalities. +#' Need to be in \code{physeq@sam_data}. +#' @param min_nb_seq minimum number of sequences by OTUs by +#' samples to take into count this OTUs in this sample. For example, +#' if min_nb_seq=2,each value of 2 or less in the OTU table +#' will not count in the venn diagramm +#' @param na_remove : if TRUE (the default), NA values in fact are removed +#' if FALSE, NA values are set to "NA" +#' @param numeric_fonction (default : sum) the function for numeric vector +#' @param ... other arguments passed on to the [ComplexUpset::upset()] +#' +#' @return A \code{\link{ggplot}}2 plot +#' @export +#' @author Adrien Taudière +#' +#' @seealso [ggvenn_pq()] +#' @examples +#' upset_pq(data_fungi, modality = "Height", width_ratio = 0.2) +#' upset_pq(data_fungi, modality = "Height", min_nb_seq = 1000) +#' upset_pq(data_fungi, modality = "Height", na_remove = FALSE) +#' upset_pq(data_fungi, modality = "Time", width_ratio = 0.2) +#' +#' upset_pq( +#' data_fungi, +#' modality = "Time", +#' width_ratio = 0.2, +#' annotations = list( +#' 'Sequences per ASV \n (log10)' = ( +#' ggplot(mapping = aes(y = log10(Abundance))) +#' + geom_jitter(aes(color = +#' Abundance), na.rm = TRUE) +#' + geom_violin(alpha = 0.5, na.rm = TRUE) + +#' theme(legend.key.size = unit(0.2, "cm")) + +#' theme(axis.text=element_text(size=12)) +#' ), +#' 'ASV per phylum' = ( +#' ggplot(mapping = aes(fill = Phylum)) +#' + geom_bar() + ylab("ASV per phylum") + +#' theme(legend.key.size = unit(0.2, "cm"))+ +#' theme(axis.text=element_text(size=12)) +#' ) +#' ) +#' ) +#' +#' +#' upset_pq( +#' subset_taxa(data_fungi, Phylum == "Basidiomycota"), +#' modality = "Time", +#' width_ratio = 0.2, +#' base_annotations=list(), +#' annotations = list( +#' 'Sequences per ASV \n (log10)' = ( +#' ggplot(mapping = aes(y = log10(Abundance))) +#' + geom_jitter(aes(color = +#' Abundance), na.rm = TRUE) +#' + geom_violin(alpha = 0.5, na.rm = TRUE) + +#' theme(legend.key.size = unit(0.2, "cm")) + +#' theme(axis.text=element_text(size=12)) +#' ), +#' 'ASV per phylum' = ( +#' ggplot(mapping = aes(fill = Class)) +#' + geom_bar() + ylab("ASV per Class") + +#' theme(legend.key.size = unit(0.2, "cm"))+ +#' theme(axis.text=element_text(size=12)) +#' ) +#' ) +#' ) +#' +#' data_fungi2 <- data_fungi +#' data_fungi2@sam_data[["Time_0"]] <- data_fungi2@sam_data$Time == 0 +#' data_fungi2@sam_data[["Height__Time_0"]] <- +#' paste0(data_fungi2@sam_data[["Height"]] , "__", data_fungi2@sam_data[["Time_0"]]) +#' data_fungi2@sam_data[["Height__Time_0"]][grepl("NA", data_fungi2@sam_data[["Height__Time_0"]])] <- +#' NA +#' upset_pq(data_fungi2, modality = "Height__Time_0", width_ratio = 0.2) +upset_pq <- + function(physeq, + fact, + min_nb_seq = 0, + na_remove = TRUE, + numeric_fonction = sum, + ...) { + if (!is.null(min_nb_seq)) { + physeq <- subset_taxa_pq(physeq, taxa_sums(physeq) >= min_nb_seq) + } + + if (na_remove) { + physeq <- + subset_samples_pq(physeq,!is.na(physeq@sam_data[[fact]])) + } else { + physeq@sam_data[[fact]][is.na(physeq@sam_data[[fact]])] <- + "NA" + } + + physeq <- speedyseq::merge_samples2(physeq, fact) + + psm <- psmelt(physeq) + samp_names <- unique(psm$Sample) + psm <- + psm %>% mutate(val = TRUE) %>% pivot_wider(names_from = Sample, values_from = val) + psm[samp_names][is.na(psm[samp_names])] <- FALSE + + psm <- psm %>% filter(Abundance != 0) + psm[[fact]] <- as.character(psm[[fact]]) + + + psm2 <- data.frame(lapply(psm, function(col) { + tapply(col, paste0(psm$OTU), function(vec) { + diff_fct_diff_class(vec, numeric_fonction = numeric_fonction, na.rm = TRUE) + }) + })) %>% arrange(., desc(Abundance)) + + colnames(psm2) <- colnames(psm) + + p <- + ComplexUpset::upset(psm2, intersect = samp_names, ...) + xlab(fact) + return(p) + } + + +#' Compute different functions for different class of vector. +#' +#' @description +#' `r lifecycle::badge("experimental")` +#' Mainly an internal function useful in "lapply(..., tapply)" methods +#' +#' +#' @param x : a vector +#' @param numeric_fonction : a function for numeric vector. For ex. `sum` or `mean` +#' @param logical_method : A method for logical vector. One of : +#' - TRUE_if_one +#' - NA_if_not_all_TRUE +#' - FALSE_if_not_all_TRUE +#' @param character_method : A method for character vector (and factor). One of : +#' - unique_or_na +#' - more frequent +#' - more_frequent_without_equality +#' @param ... other arguments passed on to the numeric function (ex. na.rm=TRUE) +#' @return a single value +#' @export +#' +#' @author Adrien Taudière +diff_fct_diff_class <- + function(x, + numeric_fonction = mean, + na.rm = TRUE, + logical_method = "true_if_one", + ...) { + if (is.character(x) || is.factor(x)) { + if (length(unique(x)) == 1) { + return(unique(x)) + } + else if(character_method == "unique_or_na") { + return(NA) + } else if(character_method == "more_frequent") { + return(names(sort(table(x), decreasing = TRUE)[1])) + } else if(character_method == "more_frequent_without_equality") { + if(names(sort(table(x), decreasing = TRUE)[1]) == names(sort(table(x), decreasing = TRUE)[2])) { + return(NA) + } else { + return(names(sort(table(x), decreasing = TRUE)[1])) + } + } else { + stop(paste0(character_method, " is not a valid method for character_method params.")) + } + } else if (is.numeric(x)) { + return(numeric_fonction(x, ...)) + } else if (is.logical(x)) { + if (logical_method == "TRUE_if_one") { + if (sum(x, na.rm = na.rm) > 0) { + return(TRUE) + } else { + return(FALSE) + } + } + if (logical_method == "NA_if_not_all_TRUE") { + if (sum(x, na.rm = na.rm) > 0 && sum(!x, na.rm = na.rm) == 0) { + return(TRUE) + } + else if (sum(!x, na.rm = na.rm) > 0 && sum(x, na.rm = na.rm) > 0) { + return(NA) + } else if (sum(!x, na.rm = na.rm) > 0 && sum(x, na.rm = na.rm) == 0) { + return(FALSE) + } + } + if (logical_method == "FALSE_if_not_all_TRUE") { + if (sum(x, na.rm = na.rm) > 0 && sum(!x, na.rm = na.rm) == 0) { + return(TRUE) + } + else { + return(FALSE) + } + } else { + stop(paste0(character_method, " is not a valid method for character_method params.")) + } + } + else { + stop("At least one column is neither numeric nor character or logical") + } + } diff --git a/README.Rmd b/README.Rmd index 049b5580..fa70b7be 100644 --- a/README.Rmd +++ b/README.Rmd @@ -72,9 +72,3 @@ sudo apt-get install ncbi-blast+ ```sh sudo apt-get install vsearch ``` - -#### Package benchdamic - -```sh -sudo apt-get install libgsl-dev libmpfr-dev -``` \ No newline at end of file diff --git a/paper/paper.md b/paper/paper.md index 8911dcae..761880c7 100644 --- a/paper/paper.md +++ b/paper/paper.md @@ -68,9 +68,9 @@ Rapid graphical description of phyloseq object is available using the function ` **ASV** (stand for *Amplicon Sequence Variant*; also called **ESV** for *Exact Amplicon Variant*) is a DNA sequences recovered from a high-throughput analysis of marker genes. **OTU** are a group of closely related individuals generated by clustering sequences based on a threshold of similarity. An ASV is a special case of OTU with a similarity threshold of 100%. -The choice between ASV and OTU is important because they lead to different results ([@joos2020], box 2 in [@tedersoo2022]). Most articles advice to make a choice depending on the question. For example, ASV may outperform OTU in describing a group of very closely related species. Moreover, ASV are comparable across different datasets (obtained using identical marker genes). On the other hand, [@tedersoo2022] report that ESV approaches overestimate richness of common fungal species (due to haplotype variation) but underestimate richness of rare species. They consequently recommend the use of OTU in fungal community metabarcoding analysis. +The choice between ASV and OTU is important because they lead to different results ([@joos2020], box 2 in [@tedersoo2022]). Most articles advice to make a choice depending on the question. For example, ASV may outperform OTU in describing a group of very closely related species. Moreover, ASV are comparable across different datasets (obtained using identical marker genes). On the other hand, [@tedersoo2022] report that ESV approaches overestimate richness of common fungal species (due to haplotype variation) but underestimate richness of rare species. They consequently recommend the use of OTU in fungal community metabarcoding analysis. Finally, [@kauserud2023] args that ASV term falls within the original OTU term and recommend to use only the OTU terms but with a concise and clear report how the OTUs were generated. -Recent articles ([@forster2019],[@antich2021]) proposed to used both jointly. They recommend (i) to use ASV to denoise the dataset and (ii) for some questions, clustering the ASV sequences into OTUs. This is the aim of the function `asv2otu()` using either `DECIPHER::Clusterize` function from R or the [vsearch](https://github.com/torognes/vsearch) software. +Recent articles ([@forster2019],[@antich2021]) proposed to used both jointly. They recommend (i) to use ASV to denoise the dataset and (ii) for some questions, clustering the ASV sequences into OTUs. This is the aim of the function `asv2otu()` using either `DECIPHER::Clusterize` function from R or the [vsearch](https://github.com/torognes/vsearch) software. ## Exploration diff --git a/vignettes/beta-div.Rmd b/vignettes/beta-div.Rmd index ee5c76ae..17bfe90d 100644 --- a/vignettes/beta-div.Rmd +++ b/vignettes/beta-div.Rmd @@ -86,6 +86,16 @@ ggvenn_pq(data_fungi, fact = "Height", taxonomic_rank = "Genus", min_nb_seq = 10 ## Change in abundance across a factor +### Benchdamic + +There is a lot of available methods. Please refer to R package [benchdamic](https://github.com/mcalgaro93/benchdamic) for a list of method and a implementation of a benchmark for your data. + +### Library requirement for Debian Linux OS + +```sh +sudo apt-get install libgsl-dev libmpfr-dev +``` + ### Using Deseq2 package ```{r} From 24a0650d501e80b3d541e252585ea0798d47ba2a Mon Sep 17 00:00:00 2001 From: Adrien Taudiere Date: Wed, 13 Sep 2023 16:36:47 +0200 Subject: [PATCH 09/16] minor bug fix following v0.4 --- .github/workflows/draft-pdf.yaml | 5 +- .vscode/settings.json | 7 -- DESCRIPTION | 4 +- NAMESPACE | 3 + R/MiscMetabar-package.R | 2 +- R/blast.R | 40 +++---- R/dada_phyloseq.R | 5 +- R/plot_functions.R | 162 ++++++++++++++------------- R/table_functions.R | 10 +- R/targets_misc.R | 5 +- man/add_new_taxonomy_pq.Rd | 1 - man/asv2otu.Rd | 3 +- man/blast_pq.Rd | 8 +- man/blast_to_derep.Rd | 8 +- man/blast_to_phyloseq.Rd | 8 +- man/compare_pairs_pq.Rd | 3 +- man/diff_fct_diff_class.Rd | 46 ++++++++ man/ggvenn_pq.Rd | 3 + man/iNEXT_pq.Rd | 37 ++++++ man/multi_biplot_pq.Rd | 8 +- man/upset_pq.Rd | 120 ++++++++++++++++++++ paper/paper.bib | 9 ++ tests/testthat/test_blast.R | 4 +- tests/testthat/test_figures_biplot.R | 2 +- tests/testthat/test_vsearch.R | 2 +- vignettes/filter.Rmd | 69 ++++++------ 26 files changed, 401 insertions(+), 173 deletions(-) delete mode 100644 .vscode/settings.json create mode 100644 man/diff_fct_diff_class.Rd create mode 100644 man/iNEXT_pq.Rd create mode 100644 man/upset_pq.Rd diff --git a/.github/workflows/draft-pdf.yaml b/.github/workflows/draft-pdf.yaml index 65635939..7e81bd7e 100644 --- a/.github/workflows/draft-pdf.yaml +++ b/.github/workflows/draft-pdf.yaml @@ -1,5 +1,6 @@ -on: [push] - +on: + push: + branches: [main, master] jobs: paper: runs-on: ubuntu-latest diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 0e425dad..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "workbench.colorCustomizations": { - "activityBar.background": "#253202", - "titleBar.activeBackground": "#344602", - "titleBar.activeForeground": "#F4FEDC" - } -} \ No newline at end of file diff --git a/DESCRIPTION b/DESCRIPTION index 9ad2de31..2bd22cd6 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -18,7 +18,7 @@ Depends: Suggests: Biostrings, circlize, - ComplexUpset + ComplexUpset, data.table, DECIPHER, DESeq2, @@ -31,6 +31,7 @@ Suggests: grid, gridExtra, here, + iNEXT, knitr, lulu, metacoder, @@ -53,6 +54,7 @@ Suggests: stringr, testthat (>= 3.0.0), tibble, + tidyr, vegan, venneuler, viridis diff --git a/NAMESPACE b/NAMESPACE index a3b8f2a9..af4e025f 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -20,6 +20,7 @@ export(clean_physeq) export(clean_pq) export(compare_pairs_pq) export(count_seq) +export(diff_fct_diff_class) export(dist_bycol) export(dist_pos_control) export(filter_asv_blast) @@ -33,6 +34,7 @@ export(hill_phyloseq) export(hill_pq) export(hill_tuckey_phyloseq) export(hill_tuckey_pq) +export(iNEXT_pq) export(krona) export(list_fastq_files) export(lulu_phyloseq) @@ -71,6 +73,7 @@ export(tax_datatable) export(track_wkflow) export(track_wkflow_samples) export(tsne_pq) +export(upset_pq) export(venn_phyloseq) export(venn_pq) export(verify_pq) diff --git a/R/MiscMetabar-package.R b/R/MiscMetabar-package.R index 1e413c2c..388188ba 100644 --- a/R/MiscMetabar-package.R +++ b/R/MiscMetabar-package.R @@ -9,7 +9,7 @@ NULL if (getRversion() >= "2.15.1") { utils::globalVariables(c( - ".id", "%>%", "Ab", "Abundance", "col_tax", "combn", "complement", "devtools", "e-value", "Family", "Genus", "grid.draw", "grid.layout", "group_by", "Hill_0", "Hill_1", "Hill_2", "install_github", "log2FoldChange", "logFC", "lwr", "max_Hill", "modality", "multcompLetters", "nb_values", "ott_id", "OTU", "Proportion", "pushViewport", "Query name", "rarefy", "reverse", "rgb", "reverseComplement", "rrarefy", "Species", "summarise", "tax", "tax_col", "teststat", "tnrs_match_names", "tol_induced_subtree", "upr", "upViewport", "vegdist", "viewport", "x", "x1", "X1", "x2", "y", "y1", "y2", "ymax", "ymin" + ".id", "%>%", "Ab", "Abundance", "character_method", "col_tax", "combn", "complement", "devtools", "e-value", "Family", "Genus", "grid.draw", "grid.layout", "group_by", "Hill_0", "Hill_1", "Hill_2", "install_github", "log2FoldChange", "logFC", "lwr", "max_Hill", "modality", "multcompLetters", "nb_values", "ott_id", "OTU", "Proportion", "pushViewport", "Query name", "rarefy", "reverse", "rgb", "reverseComplement", "rrarefy", "Sample", "Species", "summarise", "tax", "tax_col", "teststat", "tnrs_match_names", "tol_induced_subtree", "upr", "upViewport", "val", "vegdist", "viewport", "x", "x1", "X1", "x2", "y", "y1", "y2", "ymax", "ymin" )) } diff --git a/R/blast.R b/R/blast.R index 2dca5266..daec9042 100644 --- a/R/blast.R +++ b/R/blast.R @@ -20,7 +20,7 @@ #' @param e_value_cut (default: 1e-30) cut of in e-value (%) to keep result #' The BLAST E-value is the number of expected hits of similar quality (score) #' that could be found just by chance. -#' @param unique_per_seq (logical, default FALSE) if TRUE only return the better match +#' @param unique_per_seq (logical, default FALSE) if TRUE only return the better match #' (higher **bit score**) for each sequence #' @param score_filter (logical, default TRUE) does results are filter by score? If #' FALSE, `id_cut`,`bit_score_cut`, `e_value_cut` and `min_cover_cut` are ignored @@ -34,9 +34,9 @@ #' @param keep_temporary_files (logical, default: FALSE) Do we keep temporary files #' - db.fasta (refseq transformed into a database) #' - dbase list of files (output of blastn) -#' - blast_result.txt the summary result of blastn using +#' - blast_result.txt the summary result of blastn using #' `-outfmt "6 qseqid qlen sseqid slen length pident evalue bitscore qcovs"` -#' +#' #' @seealso [MiscMetabar::blast_pq()] to use `refseq` slot as query sequences #' against un custom database. #' @@ -70,12 +70,13 @@ blast_to_phyloseq <- function(physeq, dna <- Biostrings::DNAStringSet(physeq@refseq) Biostrings::writeXStringSet(dna, paste0(tempdir(), "/", "db.fasta")) - system(paste0(blastpath, + system(paste0( + blastpath, "makeblastdb -dbtype nucl -in ", - paste0(tempdir(), "/", "db.fasta"), + paste0(tempdir(), "/", "db.fasta"), " -out ", paste0(tempdir(), "/", "dbase"), - " ", + " ", args_makedb )) @@ -97,7 +98,7 @@ blast_to_phyloseq <- function(physeq, ) if (file.info(paste0(tempdir(), "/", "blast_result.txt"))$size > 0) { blast_tab <- utils::read.table( - paste0(tempdir(), "/", "blast_result.txt"),, + paste0(tempdir(), "/", "blast_result.txt"), , sep = "\t", header = FALSE, stringsAsFactors = FALSE @@ -115,7 +116,7 @@ blast_to_phyloseq <- function(physeq, message(paste0("Temporary files are located at ", tempdir())) } - if(!blast_tab_OK){ + if (!blast_tab_OK) { message("None query sequences matched your phyloseq references sequences.") return(NULL) } @@ -184,9 +185,9 @@ blast_to_phyloseq <- function(physeq, #' @param keep_temporary_files (logical, default: FALSE) Do we keep temporary files #' - db.fasta (refseq transformed into a database) #' - dbase list of files (output of blastn) -#' - blast_result.txt the summary result of blastn using +#' - blast_result.txt the summary result of blastn using #' `-outfmt "6 qseqid qlen sseqid slen length pident evalue bitscore qcovs"` -#' +#' #' @seealso [MiscMetabar::blast_to_phyloseq()] to use `refseq` #' slot as a database #' @return a blast table @@ -254,7 +255,7 @@ blast_pq <- function(physeq, " -db ", database, " -out ", - paste0(tempdir(), "/", "blast_result.txt"), + paste0(tempdir(), "/", "blast_result.txt"), " -outfmt \"6 qseqid qlen sseqid slen", " length pident evalue bitscore qcovs\"", " -num_threads ", nproc, @@ -264,9 +265,9 @@ blast_pq <- function(physeq, ) } - if (file.info(paste0(tempdir(), "/", "blast_result.txt"))$size > 0) { + if (file.info(paste0(tempdir(), "/", "blast_result.txt"))$size > 0) { blast_tab <- utils::read.table( - paste0(tempdir(), "/", "blast_result.txt"),, + paste0(tempdir(), "/", "blast_result.txt"), , sep = "\t", header = FALSE, stringsAsFactors = FALSE @@ -284,7 +285,7 @@ blast_pq <- function(physeq, message(paste0("Temporary files are located at ", tempdir())) } - if(!blast_tab_OK){ + if (!blast_tab_OK) { message("None query sequences matched your phyloseq references sequences.") return(NULL) } @@ -423,7 +424,7 @@ filter_asv_blast <- function(physeq, #' @param keep_temporary_files (logical, default: FALSE) Do we keep temporary files #' - db.fasta (refseq transformed into a database) #' - dbase list of files (output of blastn) -#' - blast_result.txt the summary result of blastn using +#' - blast_result.txt the summary result of blastn using #' `-outfmt "6 qseqid qlen sseqid slen length pident evalue bitscore qcovs"` #' @return A blast table #' @@ -468,7 +469,8 @@ blast_to_derep <- function(derep, names(dna) <- paste0(names(dna), "(", unlist(derep_occurence), "seqs)") Biostrings::writeXStringSet(dna, paste0(tempdir(), "/", "db.fasta")) - system(paste0(blastpath, + system(paste0( + blastpath, "makeblastdb -dbtype nucl -in ", paste0(tempdir(), "/", "db.fasta"), " -out ", @@ -494,9 +496,9 @@ blast_to_derep <- function(derep, ) - if (file.info(paste0(tempdir(), "/", "blast_result.txt"))$size > 0) { + if (file.info(paste0(tempdir(), "/", "blast_result.txt"))$size > 0) { blast_tab <- utils::read.table( - paste0(tempdir(), "/", "blast_result.txt"),, + paste0(tempdir(), "/", "blast_result.txt"), , sep = "\t", header = FALSE, stringsAsFactors = FALSE @@ -514,7 +516,7 @@ blast_to_derep <- function(derep, message(paste0("Temporary files are located at ", tempdir())) } - if(!blast_tab_OK){ + if (!blast_tab_OK) { message("None query sequences matched your phyloseq references sequences.") return(NULL) } diff --git a/R/dada_phyloseq.R b/R/dada_phyloseq.R index 8df47b92..94c945d7 100644 --- a/R/dada_phyloseq.R +++ b/R/dada_phyloseq.R @@ -640,11 +640,11 @@ vs_search_global <- function(physeq, if (inherits(seq2search, "character")) { seq2search <- Biostrings::DNAStringSet(seq2search) } - Biostrings::writeXStringSet(seq2search, paste0(tempdir(), "seq2search.fasta")) + Biostrings::writeXStringSet(seq2search, paste0(tempdir(), "seq2search.fasta")) seq2search <- paste0(tempdir(), "seq2search.fasta") } else if (!is.null(path_to_fasta)) { dna <- Biostrings::readDNAStringSet(path_to_fasta) - Biostrings::writeXStringSet(dna, paste0(tempdir(), "seq2search.fasta")) + Biostrings::writeXStringSet(dna, paste0(tempdir(), "seq2search.fasta")) seq2search <- paste0(tempdir(), "seq2search.fasta") } @@ -1335,7 +1335,6 @@ select_one_sample <- function(physeq, sam_name, silent = FALSE) { #' @examples #' # example code #' -#' #' @author Adrien Taudière #' add_new_taxonomy_pq <- function(physeq, ref_fasta, suffix = NULL, ...) { diff --git a/R/plot_functions.R b/R/plot_functions.R index 7a2fa08a..bf38a006 100644 --- a/R/plot_functions.R +++ b/R/plot_functions.R @@ -924,7 +924,7 @@ venn_pq <- #' @return A \code{\link{ggplot}}2 plot representing Venn diagramm of #' modalities of the argument \code{factor} or if split_by is set a list #' of plots. -#' @seealso [upset_pq()] +#' @seealso [upset_pq()] #' @examples #' data(data_fungi) #' ggvenn_pq(data_fungi, fact = "Height") @@ -1853,7 +1853,7 @@ biplot_pq <- function(physeq, #' of couples of values #' @param paires (required if paires is NULL) the name of the factor in physeq@sam_data` slot #' to make plot by paires of samples. Each level must be present only two times. -#' Note that if you set paires, you also must set fact arguments to pass on to [bi_plot_pq()]. +#' Note that if you set paires, you also must set fact arguments to pass on to [biplot_pq()]. #' @param na_remove (logical, default TRUE) if TRUE remove all the samples #' with NA in the `split_by` variable of the `physeq@sam_data` slot #' @param ... all other parameters passed on to [biplot_pq()] @@ -1871,7 +1871,7 @@ biplot_pq <- function(physeq, multi_biplot_pq <- function(physeq, split_by = NULL, paires = NULL, - na_remove = TRUE, + na_remove = TRUE, ...) { if (is.null(paires) && is.null(split_by)) { stop("You must set one of split_by or paires.") @@ -1894,31 +1894,28 @@ multi_biplot_pq <- function(physeq, physeq <- new_physeq } - if(!is.null(paires)){ - -p <- list() -for (c in levels(as.factor(physeq@sam_data[[paires]]))) { - new_physeq <- subset_samples_pq(physeq, physeq@sam_data[[paires]] %in% c ) - p[[c]] <- biplot_pq(new_physeq, ...) + ggtitle(c) -} - + if (!is.null(paires)) { + p <- list() + for (c in levels(as.factor(physeq@sam_data[[paires]]))) { + new_physeq <- subset_samples_pq(physeq, physeq@sam_data[[paires]] %in% c) + p[[c]] <- biplot_pq(new_physeq, ...) + ggtitle(c) + } } else { names_split_by <- names(table(physeq@sam_data[[split_by]])) couples <- combn(names_split_by, 2) p <- list() - for (c in 1:ncol(couples)) { - names_p <- paste0(couples[1, c], " - ", couples[2, c]) - new_physeq <- subset_samples_pq(physeq, physeq@sam_data[[split_by]] %in% - c(couples[1, c], couples[2, c])) - p[[names_p]] <- biplot_pq(new_physeq, - fact = split_by, - merge_sample_by = split_by, - ... - ) + for (c in 1:ncol(couples)) { + names_p <- paste0(couples[1, c], " - ", couples[2, c]) + new_physeq <- subset_samples_pq(physeq, physeq@sam_data[[split_by]] %in% + c(couples[1, c], couples[2, c])) + p[[names_p]] <- biplot_pq(new_physeq, + fact = split_by, + merge_sample_by = split_by, + ... + ) + } } - - } return(p) } @@ -2287,15 +2284,16 @@ SRS_curve_pq <- function(physeq, clean_pq = FALSE, ...) { #' #' @examples #' library("iNEXT") -#' res_iNEXT <- iNEXT_pq(data_fungi, merge_sample_by="Height", q=1, datatype="abundance", nboot=5) +#' res_iNEXT <- iNEXT_pq(data_fungi, merge_sample_by = "Height", +#' q = 1, datatype = "abundance", nboot = 5) #' ggiNEXT(res_iNEXT) #' ggiNEXT(res_iNEXT, type = 2) #' ggiNEXT(res_iNEXT, type = 3) -#' +#' #' @author Adrien Taudière #' #' -iNEXT_pq <- function(physeq, merge_sample_by = NULL, ...){ +iNEXT_pq <- function(physeq, merge_sample_by = NULL, ...) { if (!is.null(merge_sample_by)) { physeq <- speedyseq::merge_samples2(physeq, merge_sample_by) physeq <- clean_pq(physeq, force_taxa_as_columns = TRUE) @@ -2311,9 +2309,9 @@ iNEXT_pq <- function(physeq, merge_sample_by = NULL, ...){ #' Make upset plot for phyloseq object. #' @description #' `r lifecycle::badge("experimental")` -#' +#' #' Alternative to venn plot. -#' +#' #' @inheritParams clean_pq #' @param fact (required): Name of the factor to cluster samples by modalities. #' Need to be in \code{physeq@sam_data}. @@ -2322,71 +2320,83 @@ iNEXT_pq <- function(physeq, merge_sample_by = NULL, ...){ #' if min_nb_seq=2,each value of 2 or less in the OTU table #' will not count in the venn diagramm #' @param na_remove : if TRUE (the default), NA values in fact are removed -#' if FALSE, NA values are set to "NA" +#' if FALSE, NA values are set to "NA" #' @param numeric_fonction (default : sum) the function for numeric vector #' @param ... other arguments passed on to the [ComplexUpset::upset()] #' -#' @return A \code{\link{ggplot}}2 plot +#' @return A \code{\link{ggplot}}2 plot #' @export #' @author Adrien Taudière #' #' @seealso [ggvenn_pq()] -#' @examples +#' @examples #' upset_pq(data_fungi, modality = "Height", width_ratio = 0.2) #' upset_pq(data_fungi, modality = "Height", min_nb_seq = 1000) #' upset_pq(data_fungi, modality = "Height", na_remove = FALSE) #' upset_pq(data_fungi, modality = "Time", width_ratio = 0.2) -#' +#' #' upset_pq( #' data_fungi, #' modality = "Time", #' width_ratio = 0.2, #' annotations = list( -#' 'Sequences per ASV \n (log10)' = ( +#' "Sequences per ASV \n (log10)" = ( #' ggplot(mapping = aes(y = log10(Abundance))) -#' + geom_jitter(aes(color = -#' Abundance), na.rm = TRUE) -#' + geom_violin(alpha = 0.5, na.rm = TRUE) + +#' + +#' geom_jitter(aes( +#' color = +#' Abundance +#' ), na.rm = TRUE) +#' + +#' geom_violin(alpha = 0.5, na.rm = TRUE) + #' theme(legend.key.size = unit(0.2, "cm")) + -#' theme(axis.text=element_text(size=12)) +#' theme(axis.text = element_text(size = 12)) #' ), -#' 'ASV per phylum' = ( +#' "ASV per phylum" = ( #' ggplot(mapping = aes(fill = Phylum)) -#' + geom_bar() + ylab("ASV per phylum") + -#' theme(legend.key.size = unit(0.2, "cm"))+ -#' theme(axis.text=element_text(size=12)) +#' + +#' geom_bar() + +#' ylab("ASV per phylum") + +#' theme(legend.key.size = unit(0.2, "cm")) + +#' theme(axis.text = element_text(size = 12)) #' ) #' ) #' ) -#' -#' +#' +#' #' upset_pq( #' subset_taxa(data_fungi, Phylum == "Basidiomycota"), #' modality = "Time", #' width_ratio = 0.2, -#' base_annotations=list(), +#' base_annotations = list(), #' annotations = list( -#' 'Sequences per ASV \n (log10)' = ( +#' "Sequences per ASV \n (log10)" = ( #' ggplot(mapping = aes(y = log10(Abundance))) -#' + geom_jitter(aes(color = -#' Abundance), na.rm = TRUE) -#' + geom_violin(alpha = 0.5, na.rm = TRUE) + +#' + +#' geom_jitter(aes( +#' color = +#' Abundance +#' ), na.rm = TRUE) +#' + +#' geom_violin(alpha = 0.5, na.rm = TRUE) + #' theme(legend.key.size = unit(0.2, "cm")) + -#' theme(axis.text=element_text(size=12)) +#' theme(axis.text = element_text(size = 12)) #' ), -#' 'ASV per phylum' = ( +#' "ASV per phylum" = ( #' ggplot(mapping = aes(fill = Class)) -#' + geom_bar() + ylab("ASV per Class") + -#' theme(legend.key.size = unit(0.2, "cm"))+ -#' theme(axis.text=element_text(size=12)) +#' + +#' geom_bar() + +#' ylab("ASV per Class") + +#' theme(legend.key.size = unit(0.2, "cm")) + +#' theme(axis.text = element_text(size = 12)) #' ) #' ) #' ) -#' +#' #' data_fungi2 <- data_fungi #' data_fungi2@sam_data[["Time_0"]] <- data_fungi2@sam_data$Time == 0 #' data_fungi2@sam_data[["Height__Time_0"]] <- -#' paste0(data_fungi2@sam_data[["Height"]] , "__", data_fungi2@sam_data[["Time_0"]]) +#' paste0(data_fungi2@sam_data[["Height"]], "__", data_fungi2@sam_data[["Time_0"]]) #' data_fungi2@sam_data[["Height__Time_0"]][grepl("NA", data_fungi2@sam_data[["Height__Time_0"]])] <- #' NA #' upset_pq(data_fungi2, modality = "Height__Time_0", width_ratio = 0.2) @@ -2403,7 +2413,7 @@ upset_pq <- if (na_remove) { physeq <- - subset_samples_pq(physeq,!is.na(physeq@sam_data[[fact]])) + subset_samples_pq(physeq, !is.na(physeq@sam_data[[fact]])) } else { physeq@sam_data[[fact]][is.na(physeq@sam_data[[fact]])] <- "NA" @@ -2414,7 +2424,9 @@ upset_pq <- psm <- psmelt(physeq) samp_names <- unique(psm$Sample) psm <- - psm %>% mutate(val = TRUE) %>% pivot_wider(names_from = Sample, values_from = val) + psm %>% + mutate(val = TRUE) %>% + tidyr::pivot_wider(names_from = Sample, values_from = val) psm[samp_names][is.na(psm[samp_names])] <- FALSE psm <- psm %>% filter(Abundance != 0) @@ -2436,43 +2448,42 @@ upset_pq <- #' Compute different functions for different class of vector. -#' +#' #' @description #' `r lifecycle::badge("experimental")` #' Mainly an internal function useful in "lapply(..., tapply)" methods #' -#' +#' #' @param x : a vector #' @param numeric_fonction : a function for numeric vector. For ex. `sum` or `mean` #' @param logical_method : A method for logical vector. One of : -#' - TRUE_if_one +#' - TRUE_if_one (default) #' - NA_if_not_all_TRUE #' - FALSE_if_not_all_TRUE #' @param character_method : A method for character vector (and factor). One of : -#' - unique_or_na +#' - unique_or_na (default) #' - more frequent #' - more_frequent_without_equality #' @param ... other arguments passed on to the numeric function (ex. na.rm=TRUE) #' @return a single value #' @export -#' +#' #' @author Adrien Taudière diff_fct_diff_class <- function(x, numeric_fonction = mean, - na.rm = TRUE, logical_method = "true_if_one", + character_method = "unique_or_na", ...) { if (is.character(x) || is.factor(x)) { if (length(unique(x)) == 1) { return(unique(x)) - } - else if(character_method == "unique_or_na") { + } else if (character_method == "unique_or_na") { return(NA) - } else if(character_method == "more_frequent") { + } else if (character_method == "more_frequent") { return(names(sort(table(x), decreasing = TRUE)[1])) - } else if(character_method == "more_frequent_without_equality") { - if(names(sort(table(x), decreasing = TRUE)[1]) == names(sort(table(x), decreasing = TRUE)[2])) { + } else if (character_method == "more_frequent_without_equality") { + if (names(sort(table(x), decreasing = TRUE)[1]) == names(sort(table(x), decreasing = TRUE)[2])) { return(NA) } else { return(names(sort(table(x), decreasing = TRUE)[1])) @@ -2484,34 +2495,31 @@ diff_fct_diff_class <- return(numeric_fonction(x, ...)) } else if (is.logical(x)) { if (logical_method == "TRUE_if_one") { - if (sum(x, na.rm = na.rm) > 0) { + if (sum(x, na.rm = TRUE) > 0) { return(TRUE) } else { return(FALSE) } } if (logical_method == "NA_if_not_all_TRUE") { - if (sum(x, na.rm = na.rm) > 0 && sum(!x, na.rm = na.rm) == 0) { + if (sum(x, na.rm = TRUE) > 0 && sum(!x, na.rm = TRUE) == 0) { return(TRUE) - } - else if (sum(!x, na.rm = na.rm) > 0 && sum(x, na.rm = na.rm) > 0) { + } else if (sum(!x, na.rm = TRUE) > 0 && sum(x, na.rm = TRUE) > 0) { return(NA) - } else if (sum(!x, na.rm = na.rm) > 0 && sum(x, na.rm = na.rm) == 0) { + } else if (sum(!x, na.rm = TRUE) > 0 && sum(x, na.rm = TRUE) == 0) { return(FALSE) } } if (logical_method == "FALSE_if_not_all_TRUE") { - if (sum(x, na.rm = na.rm) > 0 && sum(!x, na.rm = na.rm) == 0) { + if (sum(x, na.rm = TRUE) > 0 && sum(!x, na.rm = TRUE) == 0) { return(TRUE) - } - else { + } else { return(FALSE) } } else { stop(paste0(character_method, " is not a valid method for character_method params.")) } - } - else { + } else { stop("At least one column is neither numeric nor character or logical") } } diff --git a/R/table_functions.R b/R/table_functions.R index a47d4fd9..3ac4d29a 100644 --- a/R/table_functions.R +++ b/R/table_functions.R @@ -109,7 +109,7 @@ tax_datatable <- function(physeq, #' NA in the variables set in bifactor, modality and merge_sample_by. #' NA in variables are well managed even if na_remove = FALSE, so na_remove may #' be useless. -#' @return A tibble with information about the number of shared ASV, shared number of sequences +#' @return A tibble with information about the number of shared ASV, shared number of sequences #' and diversity #' @importFrom rlang .data #' @export @@ -216,13 +216,13 @@ compare_pairs_pq <- function(physeq = NULL, div_second <- round(vegan::diversity(newphyseq@otu_table, index = veg_index )[cond2], 2) - - nb_shared_seq <- sum(newphyseq@otu_table[,newphyseq@otu_table[cond1, ] > nb_min_seq & + + nb_shared_seq <- sum(newphyseq@otu_table[, newphyseq@otu_table[cond1, ] > nb_min_seq & newphyseq@otu_table[cond2, ] > nb_min_seq]) - perc_seq_shared_lv1 <- round(100 * nb_shared_seq / sum(newphyseq@otu_table[,newphyseq@otu_table[cond1, ] > nb_min_seq]), 2) + perc_seq_shared_lv1 <- round(100 * nb_shared_seq / sum(newphyseq@otu_table[, newphyseq@otu_table[cond1, ] > nb_min_seq]), 2) - perc_seq_shared_lv2 <- round(100 * nb_shared_seq / sum(newphyseq@otu_table[,newphyseq@otu_table[cond2, ] > nb_min_seq]), 2) + perc_seq_shared_lv2 <- round(100 * nb_shared_seq / sum(newphyseq@otu_table[, newphyseq@otu_table[cond2, ] > nb_min_seq]), 2) res[[i]] <- c(nb_first, nb_second, nb_shared, div_first, div_second, nb_shared_seq, perc_seq_shared_lv1, perc_seq_shared_lv2) } diff --git a/R/targets_misc.R b/R/targets_misc.R index 9f97dd66..c3dece8f 100644 --- a/R/targets_misc.R +++ b/R/targets_misc.R @@ -64,9 +64,8 @@ list_fastq_files <- #' #' @examples #' data(data_fungi) -#' rename_samples_otu_table(data_fungi, as.character(1:nsamples(data_fungi)), -#' taxa_are_rows = T -#' ) +#' rename_samples_otu_table(data_fungi, as.character(1:nsamples(data_fungi))) +#' rename_samples_otu_table <- function(physeq, names_of_samples) { otu_tab <- physeq@otu_table tax_in_row <- taxa_are_rows(physeq) diff --git a/man/add_new_taxonomy_pq.Rd b/man/add_new_taxonomy_pq.Rd index b7b67f57..d057ae06 100644 --- a/man/add_new_taxonomy_pq.Rd +++ b/man/add_new_taxonomy_pq.Rd @@ -30,7 +30,6 @@ One of main use of this function is to add taxonomic assignment from a new datab \examples{ # example code - } \author{ Adrien Taudière diff --git a/man/asv2otu.Rd b/man/asv2otu.Rd index 88756387..05556627 100644 --- a/man/asv2otu.Rd +++ b/man/asv2otu.Rd @@ -35,7 +35,8 @@ Set the clustering method. \itemize{ \item \code{clusterize} use the \code{\link[DECIPHER:Clusterize]{DECIPHER::Clusterize()}} fonction, \item \code{vsearch} use the vsearch software (https://github.com/torognes/vsearch/) -with arguments \code{-cluster_fast} and \verb{-strand both} +with arguments \code{--cluster_size} by default (see args \code{vsearch_cluster_method}) +and \verb{-strand both} (see args \code{vsearch_args}) }} \item{id}{(default: 0.97) level of identity to cluster} diff --git a/man/blast_pq.Rd b/man/blast_pq.Rd index 648cde44..ed67baa1 100644 --- a/man/blast_pq.Rd +++ b/man/blast_pq.Rd @@ -47,11 +47,11 @@ normalized raw-score. Each increase by one doubles the required database size The BLAST E-value is the number of expected hits of similar quality (score) that could be found just by chance.} -\item{unique_per_seq}{(logical) if TRUE only return the first match for -each sequence in seq2search} +\item{unique_per_seq}{(logical, default FALSE) if TRUE only return the better match +(higher \strong{bit score}) for each sequence} -\item{score_filter}{(logical) does results are filter by score? If -FALSE, \code{id_cut},\code{bit_score_cut} and \code{min_cover_cut} are ignored} +\item{score_filter}{(logical, default TRUE) does results are filter by score? If +FALSE, \code{id_cut},\code{bit_score_cut}, \code{e_value_cut} and \code{min_cover_cut} are ignored} \item{nproc}{(default: 1) Set to number of cpus/processors to use for blast (args -num_threads diff --git a/man/blast_to_derep.Rd b/man/blast_to_derep.Rd index 16c29f39..1ad7ee0d 100644 --- a/man/blast_to_derep.Rd +++ b/man/blast_to_derep.Rd @@ -46,11 +46,11 @@ normalized raw-score. Each increase by one doubles the required database size The BLAST E-value is the number of expected hits of similar quality (score) that could be found just by chance.} -\item{unique_per_seq}{(logical) if TRUE only return the first match for -each sequence in seq2search} +\item{unique_per_seq}{(logical, default FALSE) if TRUE only return the better match +(higher \strong{bit score}) for each sequence} -\item{score_filter}{(logical) does results are filter by score? If -FALSE, \code{id_cut},\code{bit_score_cut} and \code{min_cover_cut} are ignored} +\item{score_filter}{(logical, default TRUE) does results are filter by score? If +FALSE, \code{id_cut},\code{bit_score_cut}, \code{e_value_cut} and \code{min_cover_cut} are ignored} \item{list_no_output_query}{(logical) does the result table include query sequences for which \code{blastn} does not find any correspondence?} diff --git a/man/blast_to_phyloseq.Rd b/man/blast_to_phyloseq.Rd index 96aa67c8..c083ccc8 100644 --- a/man/blast_to_phyloseq.Rd +++ b/man/blast_to_phyloseq.Rd @@ -46,11 +46,11 @@ normalized raw-score. Each increase by one doubles the required database size The BLAST E-value is the number of expected hits of similar quality (score) that could be found just by chance.} -\item{unique_per_seq}{(logical) if TRUE only return the first match for -each sequence in seq2search} +\item{unique_per_seq}{(logical, default FALSE) if TRUE only return the better match +(higher \strong{bit score}) for each sequence} -\item{score_filter}{(logical) does results are filter by score? If -FALSE, \code{id_cut},\code{bit_score_cut} and \code{min_cover_cut} are ignored} +\item{score_filter}{(logical, default TRUE) does results are filter by score? If +FALSE, \code{id_cut},\code{bit_score_cut}, \code{e_value_cut} and \code{min_cover_cut} are ignored} \item{list_no_output_query}{(logical) does the result table include query sequences for which \code{blastn} does not find any correspondence?} diff --git a/man/compare_pairs_pq.Rd b/man/compare_pairs_pq.Rd index edff4f83..8d6fdac4 100644 --- a/man/compare_pairs_pq.Rd +++ b/man/compare_pairs_pq.Rd @@ -41,7 +41,8 @@ NA in variables are well managed even if na_remove = FALSE, so na_remove may be useless.} } \value{ -A tibble +A tibble with information about the number of shared ASV, shared number of sequences +and diversity } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} #' For the moment refseq slot need to be not Null. diff --git a/man/diff_fct_diff_class.Rd b/man/diff_fct_diff_class.Rd new file mode 100644 index 00000000..d514bca0 --- /dev/null +++ b/man/diff_fct_diff_class.Rd @@ -0,0 +1,46 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/plot_functions.R +\name{diff_fct_diff_class} +\alias{diff_fct_diff_class} +\title{Compute different functions for different class of vector.} +\usage{ +diff_fct_diff_class( + x, + numeric_fonction = mean, + na.rm = TRUE, + logical_method = "true_if_one", + character_method = "unique_or_na", + ... +) +} +\arguments{ +\item{x}{: a vector} + +\item{numeric_fonction}{: a function for numeric vector. For ex. \code{sum} or \code{mean}} + +\item{logical_method}{: A method for logical vector. One of : +\itemize{ +\item TRUE_if_one (default) +\item NA_if_not_all_TRUE +\item FALSE_if_not_all_TRUE +}} + +\item{character_method}{: A method for character vector (and factor). One of : +\itemize{ +\item unique_or_na (default) +\item more frequent +\item more_frequent_without_equality +}} + +\item{...}{other arguments passed on to the numeric function (ex. na.rm=TRUE)} +} +\value{ +a single value +} +\description{ +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} +Mainly an internal function useful in "lapply(..., tapply)" methods +} +\author{ +Adrien Taudière +} diff --git a/man/ggvenn_pq.Rd b/man/ggvenn_pq.Rd index 7f40c733..5bf41929 100644 --- a/man/ggvenn_pq.Rd +++ b/man/ggvenn_pq.Rd @@ -72,6 +72,9 @@ data_fungi2 <- subset_samples(data_fungi, data_fungi@sam_data$Tree_name == "A10- data_fungi@sam_data$Height \%in\% c("Low", "High")) ggvenn_pq(data_fungi2, fact = "Height") } +\seealso{ +\code{\link[=upset_pq]{upset_pq()}} +} \author{ Adrien Taudière } diff --git a/man/iNEXT_pq.Rd b/man/iNEXT_pq.Rd new file mode 100644 index 00000000..20e3c538 --- /dev/null +++ b/man/iNEXT_pq.Rd @@ -0,0 +1,37 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/plot_functions.R +\name{iNEXT_pq} +\alias{iNEXT_pq} +\title{iNterpolation and EXTrapolation of Hill numbers (with iNEXT)} +\usage{ +iNEXT_pq(physeq, merge_sample_by = NULL, ...) +} +\arguments{ +\item{physeq}{(required): a \code{\link{phyloseq-class}} object obtained +using the \code{phyloseq} package.} + +\item{merge_sample_by}{(default: NULL) if not \code{NULL} samples of +physeq are merged using the vector set by \code{merge_sample_by}. This +merging used the \code{\link[speedyseq:merge_samples2]{speedyseq::merge_samples2()}}. In the case of +\code{\link[=biplot_pq]{biplot_pq()}} this must be a factor with two levels only.} + +\item{...}{other arguments for the \code{\link[iNEXT:iNEXT]{iNEXT::iNEXT()}} function} +} +\value{ +see \code{\link[iNEXT:iNEXT]{iNEXT::iNEXT()}} documentation +} +\description{ +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} +} +\examples{ +library("iNEXT") +res_iNEXT <- iNEXT_pq(data_fungi, merge_sample_by = "Height", + q = 1, datatype = "abundance", nboot = 5) +ggiNEXT(res_iNEXT) +ggiNEXT(res_iNEXT, type = 2) +ggiNEXT(res_iNEXT, type = 3) + +} +\author{ +Adrien Taudière +} diff --git a/man/multi_biplot_pq.Rd b/man/multi_biplot_pq.Rd index be2784cb..3f659b77 100644 --- a/man/multi_biplot_pq.Rd +++ b/man/multi_biplot_pq.Rd @@ -4,15 +4,19 @@ \alias{multi_biplot_pq} \title{Visualization of a collection of couples of samples for comparison} \usage{ -multi_biplot_pq(physeq, split_by = NULL, na_remove = TRUE, ...) +multi_biplot_pq(physeq, split_by = NULL, paires = NULL, na_remove = TRUE, ...) } \arguments{ \item{physeq}{(required): a \code{\link{phyloseq-class}} object obtained using the \code{phyloseq} package.} -\item{split_by}{(required) the name of the factor to make all combination +\item{split_by}{(required if paires is NULL) the name of the factor to make all combination of couples of values} +\item{paires}{(required if paires is NULL) the name of the factor in physeq@sam_data` slot +to make plot by paires of samples. Each level must be present only two times. +Note that if you set paires, you also must set fact arguments to pass on to \code{\link[=biplot_pq]{biplot_pq()}}.} + \item{na_remove}{(logical, default TRUE) if TRUE remove all the samples with NA in the \code{split_by} variable of the \code{physeq@sam_data} slot} diff --git a/man/upset_pq.Rd b/man/upset_pq.Rd new file mode 100644 index 00000000..f7058edf --- /dev/null +++ b/man/upset_pq.Rd @@ -0,0 +1,120 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/plot_functions.R +\name{upset_pq} +\alias{upset_pq} +\title{Make upset plot for phyloseq object.} +\usage{ +upset_pq( + physeq, + fact, + min_nb_seq = 0, + na_remove = TRUE, + numeric_fonction = sum, + ... +) +} +\arguments{ +\item{physeq}{(required): a \code{\link{phyloseq-class}} object obtained +using the \code{phyloseq} package.} + +\item{fact}{(required): Name of the factor to cluster samples by modalities. +Need to be in \code{physeq@sam_data}.} + +\item{min_nb_seq}{minimum number of sequences by OTUs by +samples to take into count this OTUs in this sample. For example, +if min_nb_seq=2,each value of 2 or less in the OTU table +will not count in the venn diagramm} + +\item{na_remove}{: if TRUE (the default), NA values in fact are removed +if FALSE, NA values are set to "NA"} + +\item{numeric_fonction}{(default : sum) the function for numeric vector} + +\item{...}{other arguments passed on to the \code{\link[ComplexUpset:upset]{ComplexUpset::upset()}}} +} +\value{ +A \code{\link{ggplot}}2 plot +} +\description{ +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} + +Alternative to venn plot. +} +\examples{ +upset_pq(data_fungi, modality = "Height", width_ratio = 0.2) +upset_pq(data_fungi, modality = "Height", min_nb_seq = 1000) +upset_pq(data_fungi, modality = "Height", na_remove = FALSE) +upset_pq(data_fungi, modality = "Time", width_ratio = 0.2) + +upset_pq( + data_fungi, + modality = "Time", + width_ratio = 0.2, + annotations = list( + "Sequences per ASV \n (log10)" = ( + ggplot(mapping = aes(y = log10(Abundance))) + + + geom_jitter(aes( + color = + Abundance + ), na.rm = TRUE) + + + geom_violin(alpha = 0.5, na.rm = TRUE) + + theme(legend.key.size = unit(0.2, "cm")) + + theme(axis.text = element_text(size = 12)) + ), + "ASV per phylum" = ( + ggplot(mapping = aes(fill = Phylum)) + + + geom_bar() + + ylab("ASV per phylum") + + theme(legend.key.size = unit(0.2, "cm")) + + theme(axis.text = element_text(size = 12)) + ) + ) +) + + +upset_pq( + subset_taxa(data_fungi, Phylum == "Basidiomycota"), + modality = "Time", + width_ratio = 0.2, + base_annotations = list(), + annotations = list( + "Sequences per ASV \n (log10)" = ( + ggplot(mapping = aes(y = log10(Abundance))) + + + geom_jitter(aes( + color = + Abundance + ), na.rm = TRUE) + + + geom_violin(alpha = 0.5, na.rm = TRUE) + + theme(legend.key.size = unit(0.2, "cm")) + + theme(axis.text = element_text(size = 12)) + ), + "ASV per phylum" = ( + ggplot(mapping = aes(fill = Class)) + + + geom_bar() + + ylab("ASV per Class") + + theme(legend.key.size = unit(0.2, "cm")) + + theme(axis.text = element_text(size = 12)) + ) + ) +) + +data_fungi2 <- data_fungi +data_fungi2@sam_data[["Time_0"]] <- data_fungi2@sam_data$Time == 0 +data_fungi2@sam_data[["Height__Time_0"]] <- + paste0(data_fungi2@sam_data[["Height"]], "__", data_fungi2@sam_data[["Time_0"]]) +data_fungi2@sam_data[["Height__Time_0"]][grepl("NA", data_fungi2@sam_data[["Height__Time_0"]])] <- + NA +upset_pq(data_fungi2, modality = "Height__Time_0", width_ratio = 0.2) +} +\seealso{ +\code{\link[=ggvenn_pq]{ggvenn_pq()}} +} +\author{ +Adrien Taudière +} diff --git a/paper/paper.bib b/paper/paper.bib index 509a4bb6..dcbab7ee 100644 --- a/paper/paper.bib +++ b/paper/paper.bib @@ -223,3 +223,12 @@ @article{zhao2021 year = {2021}, publisher = {BioMed Central} } + +@article{kauserud2023, + title={ITS alchemy: On the use of ITS as a DNA marker in fungal ecology}, + author={Kauserud, H{\aa}vard}, + journal={Fungal Ecology}, + pages={101274}, + year={2023}, + publisher={Elsevier} +} diff --git a/tests/testthat/test_blast.R b/tests/testthat/test_blast.R index 94ab44e7..728207fc 100644 --- a/tests/testthat/test_blast.R +++ b/tests/testthat/test_blast.R @@ -22,8 +22,8 @@ if (class(blast_error_or_not) == "try-error") { expect_s3_class(blast_df <- blast_pq(df_basidio, path_db, unique_per_seq = TRUE), "data.frame") expect_s3_class(blast_df <- blast_pq(df_basidio, path_db, score_filter = FALSE), "data.frame") expect_s3_class(blast_df <- blast_pq(df_basidio, path_db, unique_per_seq = FALSE, score_filter = FALSE), "data.frame") - expect_s3_class(blast_df <- blast_pq(df_basidio, database="inst/extdata/dbase"), "data.frame") - expect_error(blast_df <- blast_pq(df_basidio, fasta_for_db = path_db, database="inst/extdata/dbase")) + expect_s3_class(blast_df <- blast_pq(df_basidio, database = "inst/extdata/dbase"), "data.frame") + expect_error(blast_df <- blast_pq(df_basidio, fasta_for_db = path_db, database = "inst/extdata/dbase")) expect_error(blast_df <- blast_pq(df_basidio)) }) diff --git a/tests/testthat/test_figures_biplot.R b/tests/testthat/test_figures_biplot.R index becdb6ac..66ea5d85 100644 --- a/tests/testthat/test_figures_biplot.R +++ b/tests/testthat/test_figures_biplot.R @@ -17,7 +17,7 @@ test_that("biplot_pq works", { test_that("multi_biplot_pq works with data_fungi dataset", { p1 <- multi_biplot_pq(data_fungi_abun, split_by = "Time", na_remove = FALSE) p2 <- multi_biplot_pq(data_fungi_abun, "Height") - data_fungi_abun@sam_data$Random_paires <- as.factor(sample(rep(1:(nsamples(data_fungi_abun)/2), 2))) + data_fungi_abun@sam_data$Random_paires <- as.factor(sample(rep(1:(nsamples(data_fungi_abun) / 2), 2))) p3 <- multi_biplot_pq(data_fungi_abun, paires = "Random_paires") expect_s3_class(p1[[1]], "ggplot") expect_type(p1, "list") diff --git a/tests/testthat/test_vsearch.R b/tests/testthat/test_vsearch.R index 5f71ec4e..021cbf77 100644 --- a/tests/testthat/test_vsearch.R +++ b/tests/testthat/test_vsearch.R @@ -12,7 +12,7 @@ path_db <- "inst/extdata/1000_sp_UNITE_sh_general_release_dynamic.fasta" suppressWarnings(vsearch_error_or_not <- try(system("vsearch 2>&1", intern = TRUE), silent = TRUE)) if (class(vsearch_error_or_not) == "try-error") { - message("vs_search_global() and asv2otu(..., method=vsearch) can't be tested when vsearch is not installed") + message("vs_search_global() and asv2otu(..., method=vsearch) can't be tested when vsearch is not installed") } else { test_that("asv2otu works fine with vsearch method", { expect_s4_class(d_vs <- asv2otu(data_fungi_sp_known, method = "vsearch"), "phyloseq") diff --git a/vignettes/filter.Rmd b/vignettes/filter.Rmd index 422a6bb2..0eacdefc 100644 --- a/vignettes/filter.Rmd +++ b/vignettes/filter.Rmd @@ -55,30 +55,30 @@ path_db <- system.file("extdata", "1000_sp_UNITE_sh_general_release_dynamic.fast suppressWarnings(blast_error_or_not <- try(system("blastn 2>&1", intern = TRUE), silent = TRUE)) if (class(blast_error_or_not) != "try-error") { - -df_blast_80 <- filter_asv_blast(df_basidio, fasta_for_db = path_db) -df_blast_50 <- filter_asv_blast(df_basidio, fasta_for_db = path_db, id_filter = 50, e_value_filter = 10, bit_score_filter = 20, min_cover_filter = 20) - -track_formattable <- - track_wkflow( - list( - "raw data" = df_basidio, - "id_filter = 80" = df_blast_80, - "id_filter = 50" = df_blast_50 + df_blast_80 <- filter_asv_blast(df_basidio, fasta_for_db = path_db) + df_blast_50 <- filter_asv_blast(df_basidio, fasta_for_db = path_db, id_filter = 50, e_value_filter = 10, bit_score_filter = 20, min_cover_filter = 20) + + track_formattable <- + track_wkflow( + list( + "raw data" = df_basidio, + "id_filter = 80" = df_blast_80, + "id_filter = 50" = df_blast_50 + ) ) -) } ``` ```{r} if (class(blast_error_or_not) != "try-error") { -formattable(track_formattable, - list( - area(col = nb_sequences) ~ color_bar("cyan", na.rm = T), - area(col = nb_clusters) ~ normalize_bar("yellowgreen", na.rm = TRUE, min = 0.3), - area(col = nb_samples) ~ normalize_bar("lightpink", na.rm = TRUE, min = 0.3) - ) -) + formattable( + track_formattable, + list( + area(col = nb_sequences) ~ color_bar("cyan", na.rm = T), + area(col = nb_clusters) ~ normalize_bar("yellowgreen", na.rm = TRUE, min = 0.3), + area(col = nb_samples) ~ normalize_bar("lightpink", na.rm = TRUE, min = 0.3) + ) + ) } ``` @@ -110,21 +110,22 @@ res_mean <- suppressWarnings(subset_taxa_tax_control(data_fungi, as.numeric(data ``` ```{r} -track_formattable <- track_wkflow(list("raw data" = data_fungi, - "cutoff_seq" = res_seq, - "cutoff_mixt" = res_mixt, - "cutoff_diff" = res_diff, - "min" = res_min, - "max" = res_max, - "mean" = res_mean - ) - ) - -formattable(track_formattable, - list( - area(col = nb_sequences) ~ color_bar("cyan"), - area(col = nb_clusters) ~ normalize_bar("yellowgreen", na.rm = TRUE, min = 0.3), - area(col = nb_samples) ~ normalize_bar("lightpink", na.rm = TRUE) - ) +track_formattable <- track_wkflow(list( + "raw data" = data_fungi, + "cutoff_seq" = res_seq, + "cutoff_mixt" = res_mixt, + "cutoff_diff" = res_diff, + "min" = res_min, + "max" = res_max, + "mean" = res_mean +)) + +formattable( + track_formattable, + list( + area(col = nb_sequences) ~ color_bar("cyan"), + area(col = nb_clusters) ~ normalize_bar("yellowgreen", na.rm = TRUE, min = 0.3), + area(col = nb_samples) ~ normalize_bar("lightpink", na.rm = TRUE) + ) ) ``` From ea0f75c30b80bae7a8fa80ac2fcaaa3a11696f4d Mon Sep 17 00:00:00 2001 From: Adrien Taudiere Date: Wed, 13 Sep 2023 17:45:01 +0200 Subject: [PATCH 10/16] Bug fix in diff_fct_diff_class --- R/plot_functions.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/plot_functions.R b/R/plot_functions.R index bf38a006..32d071cb 100644 --- a/R/plot_functions.R +++ b/R/plot_functions.R @@ -2472,7 +2472,7 @@ upset_pq <- diff_fct_diff_class <- function(x, numeric_fonction = mean, - logical_method = "true_if_one", + logical_method = "TRUE_if_one", character_method = "unique_or_na", ...) { if (is.character(x) || is.factor(x)) { @@ -2517,7 +2517,7 @@ diff_fct_diff_class <- return(FALSE) } } else { - stop(paste0(character_method, " is not a valid method for character_method params.")) + stop(paste0(logical_method, " is not a valid method for character_method params.")) } } else { stop("At least one column is neither numeric nor character or logical") From b3f985f2242e26b533671dff6879d36981f164ab Mon Sep 17 00:00:00 2001 From: Adrien Taudiere Date: Wed, 13 Sep 2023 22:39:19 +0200 Subject: [PATCH 11/16] Improve track_wkflow_samples --- .github/workflows/pkgdown.yaml | 7 ++----- .github/workflows/test-coverage.yaml | 5 ++--- R/dada_phyloseq.R | 17 ++++++++++++----- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml index 62aa3080..6251d2ed 100644 --- a/.github/workflows/pkgdown.yaml +++ b/.github/workflows/pkgdown.yaml @@ -2,11 +2,8 @@ # Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help on: push: - branches: [main, master] - pull_request: - branches: [main, master] - release: - types: [published] + branches: + - master workflow_dispatch: name: pkgdown diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index 74a141bd..1c4c396c 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -2,9 +2,8 @@ # Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help on: push: - branches: [main, master] - pull_request: - branches: [main, master] + branches: + - master name: test-coverage diff --git a/R/dada_phyloseq.R b/R/dada_phyloseq.R index 94c945d7..a551d7fd 100644 --- a/R/dada_phyloseq.R +++ b/R/dada_phyloseq.R @@ -381,14 +381,16 @@ track_wkflow <- function( ################################################################################ #' Track the number of reads (= sequences), samples and cluster (e.g. ASV) -#' for each samples -#' -#' @description +#' for each samples. +#' +#' @description #' `r lifecycle::badge("experimental")` #' +#' Contrary to [track_wkflow()], only phyloseq object are possible. #' More information are available in the manual of the function [track_wkflow()] #' #' @param list_pq_obj (required): a list of object passed on to [track_wkflow()] +#' Only phyloseq object will return value because information of sample is needed #' @param ... : other args passed on to [track_wkflow()] #' #' @return A list of dataframe. cf [track_wkflow()] for more information @@ -408,8 +410,13 @@ track_wkflow_samples <- function(list_pq_obj, ...) { } res <- list() for (s in sample_names(list_pq_obj[[1]])) { - list_pq_obj_samples <- lapply(list_pq_obj, select_one_sample, sam_name = s) - res[[s]] <- track_wkflow(list_pq_obj_samples, ...) + if(inherits(list_pq_obj[[1]]), "phyloseq") { + list_pq_obj_samples <- lapply(list_pq_obj, select_one_sample, sam_name = s) + res[[s]] <- track_wkflow(list_pq_obj_samples, ...) + } else { + message(paste0(names(list_pq_obj[[1]])), " is not a phyloseq obj. Sample information can't be computed. ") + res[[s]] <- NULL + } } return(res) } From c55c8ed7e788dc6ff3a63f05958c78cfba31406e Mon Sep 17 00:00:00 2001 From: Adrien Taudiere Date: Fri, 15 Sep 2023 16:10:51 +0200 Subject: [PATCH 12/16] Start an (empty) vignettes import_export_track --- .vscode/settings.json | 7 +++++++ _pkgdown.yml | 4 ++++ paper/compare_tools.ods | Bin 1168581 -> 1149253 bytes vignettes/import_export_track.Rmd | 8 ++++++++ 4 files changed, 19 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 vignettes/import_export_track.Rmd diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..0e425dad --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "workbench.colorCustomizations": { + "activityBar.background": "#253202", + "titleBar.activeBackground": "#344602", + "titleBar.activeForeground": "#F4FEDC" + } +} \ No newline at end of file diff --git a/_pkgdown.yml b/_pkgdown.yml index b0f0d829..88ff57e4 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -19,6 +19,10 @@ navbar: href: articles/alpha-div.html - text: Beta-diversity href: articles/beta-div.html + - text: Import/export and track + href: articles/Import-export-track.html + - text: Filter taxa and samples + href: articles/filter.html - text: ------- - text: "For developpers" - text: Rules of code diff --git a/paper/compare_tools.ods b/paper/compare_tools.ods index 56df6263072866a3d8d6f23fd9d9ac5d3146b892..491791fcc55521bb1afae5d3d15bee9c472b7906 100644 GIT binary patch delta 28901 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 + %\VignetteIndexEntry{Import-export-track} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- \ No newline at end of file From a3399417b93ce74fa65c5773c654f60f56312850 Mon Sep 17 00:00:00 2001 From: Adrien Taudiere Date: Sat, 16 Sep 2023 09:36:54 +0200 Subject: [PATCH 13/16] Write first version of import_export_track vignette --- vignettes/import_export_track.Rmd | 48 ++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/vignettes/import_export_track.Rmd b/vignettes/import_export_track.Rmd index 2bbe5605..c56051aa 100644 --- a/vignettes/import_export_track.Rmd +++ b/vignettes/import_export_track.Rmd @@ -5,4 +5,50 @@ vignette: > %\VignetteIndexEntry{Import-export-track} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} ---- \ No newline at end of file +--- + + + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +```{r setup, message=FALSE} +library(MiscMetabar) +library(formattable) +``` + +## Export phyloseq object + +You can export a phyloseq object to csv (and txt for phylogenetic tree) files in a folder. It is possible to export each table into one file or to merge all slot (exept phytree) in one file (args `one_file = TRUE`). Finally, if `rdata` is set to TRUE, a `rdata` file containing the phyloseq object is also writed. + +```{r, eval = FALSE} +write_pq(data_fungi, path = "fungi_phyloseq") +write_pq(data_fungi, path = "fungi_phyloseq", one_file = TRUE) +write_pq(data_fungi, path = "fungi_phyloseq", rdata = TRUE) +``` + +Finally, you can use the function `save_pq()` to write the phyloseq object in all 3 versions (one table for each slot, a file merging each slot and an Rdata file). + +```{r, eval = FALSE} +save_pq(data_fungi) +``` + +## Import + +To import a Rdata file, juste use `load()` base function. In order to import phyloseq object from a folder create using `write_pq()` or `save_pq()`, please use the function `read_pq()`. + +```{r, eval = FALSE} +d <- read_pq(path = "fungi_phyloseq") +``` + +## Tracking sequences, clusters and samples + +In bioinformatic pipeline, we often need to track the number of samples, sequences and clusters across step in the pipeline. MiscMetabar propose two utilities to achieve this goal : `track_wkflow()` and a version to compute value per samples : `track_wkflow_samples()`. The function `track_wkflow()` can deal with (i) fastq and fastg.gz files, dada-class object, derep-class object, matrix of samples x clusters (e.g. `otu_table`) and phyloseq-class object. + +```{r} +track_wkflow(list(data_fungi, data_fungi_sp_known)) +``` \ No newline at end of file From 17de93a6f9149d0fdfc6f225250c584106bb355b Mon Sep 17 00:00:00 2001 From: Adrien Taudiere Date: Sat, 16 Sep 2023 09:37:46 +0200 Subject: [PATCH 14/16] Syntax correction --- vignettes/filter.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vignettes/filter.Rmd b/vignettes/filter.Rmd index 0eacdefc..5747253d 100644 --- a/vignettes/filter.Rmd +++ b/vignettes/filter.Rmd @@ -84,7 +84,7 @@ if (class(blast_error_or_not) != "try-error") { ### Filter taxa using a known taxa for control -To filter out contamination, one solution is to add a proportion of a known taxa which is not present in the environment of the study. In that case we can define some threshold for each sample to discard taxon based on pseudo-abundance. In the example code above, we select taxon using the ASV_50 as control through 6 differents algorithm. +To filter out contamination, one solution is to add a proportion of a known taxa which is not present in the environment of the study. In that case we can define some threshold for each sample to discard taxon based on pseudo-abundance. In the example code above, we select taxon using the ASV_50 as control through 6 differents algorithms. ```{r, results='hide'} data(data_fungi) From e1ac92ce605f425e5644277a12c4c26ee4ba6144 Mon Sep 17 00:00:00 2001 From: Adrien Taudiere Date: Sat, 16 Sep 2023 14:54:52 +0200 Subject: [PATCH 15/16] New dev version for pkgdown site --- NEWS.md | 1 + R/controls.R | 13 ++-- R/dada_phyloseq.R | 21 +++--- R/plot_functions.R | 74 +++++++++++++++++---- R/targets_misc.R | 2 +- README.Rmd | 25 +++++-- README.md | 79 ++++++++++++++++------- _pkgdown.yml | 2 +- man/clean_pq.Rd | 3 - man/diff_fct_diff_class.Rd | 3 +- man/dist_pos_control.Rd | 3 +- man/figures/README-unnamed-chunk-4-1.png | Bin 64484 -> 18380 bytes man/figures/README-unnamed-chunk-6-1.png | Bin 41828 -> 53650 bytes man/hill_pq.Rd | 12 +++- man/iNEXT_pq.Rd | 6 +- man/lulu_pq.Rd | 6 +- man/rename_samples_otu_table.Rd | 5 +- man/subset_samples_pq.Rd | 3 - man/subset_taxa_pq.Rd | 3 - man/subset_taxa_tax_control.Rd | 5 +- man/track_wkflow.Rd | 4 -- man/track_wkflow_samples.Rd | 6 +- man/upset_pq.Rd | 47 +++++++++++--- man/verify_pq.Rd | 3 - tests/testthat/test_figures_beta_div.R | 11 ++++ vignettes/Reclustering.Rmd | 20 ++++-- vignettes/beta-div.Rmd | 42 ++++++++++++ vignettes/import_export_track.Rmd | 4 +- 28 files changed, 295 insertions(+), 108 deletions(-) diff --git a/NEWS.md b/NEWS.md index 20ef2866..e0298faf 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,7 @@ - Add argument `paires` to `multi_biplot_pq()` in order to indicate all paires of samples we want to print. - Improve `compare_pairs_pq()` with information about the number of shared sequences among paires - Add function `upset_pq()` to plot upset of phyloseq object using the [ComplexUpset](https://krassowski.github.io/complex-upset/) package +- Add info (param `add_info`) in subtitle of the `hill_pq()` function # MiscMetabar 0.40 diff --git a/R/controls.R b/R/controls.R index ff9ac71c..beb232ab 100644 --- a/R/controls.R +++ b/R/controls.R @@ -43,16 +43,17 @@ search_exact_seq_pq <- function(physeq, sequences) { ################################################################################ #' Calculate ecological distance among positive controls vs #' distance for all samples -#' + +#' @description #' `r lifecycle::badge("experimental")` -#' -#' @aliases dist_pos_control -#' @details Compute distance among positive controls, +#' +#' Compute distance among positive controls, #' i.e. samples which are duplicated #' to test for variation, for example in #' (i) a step in the sampling, #' (ii) a step in the extraction, #' (iii) a step in the sequencing. +#' @aliases dist_pos_control #' @inheritParams clean_pq #' @param samples_names (required) a vector of names for samples with #' positives controls of the same samples having the same name @@ -141,7 +142,9 @@ dist_pos_control <- function(physeq, samples_names, method = "bray") { #' @examples #' data(data_fungi) #' -#' subset_taxa_tax_control(data_fungi, as.numeric(data_fungi@otu_table[, 300])) +#' subset_taxa_tax_control(data_fungi, +#' as.numeric(data_fungi@otu_table[, 300]), +#' min_diff_for_cutoff = 2) #' #' @author Adrien Taudière subset_taxa_tax_control <- diff --git a/R/dada_phyloseq.R b/R/dada_phyloseq.R index a551d7fd..1f0df6e7 100644 --- a/R/dada_phyloseq.R +++ b/R/dada_phyloseq.R @@ -30,7 +30,7 @@ add_dna_to_phyloseq <- function(physeq) { ################################################################################ #' Clean phyloseq object by removing empty samples and taxa #' -#' @details `r lifecycle::badge("experimental")` +#' @description `r lifecycle::badge("experimental")` #' #' In addition, this function check for discrepancy (and rename) between #' (i) taxa names in refseq, taxonomy table and otu_table and between @@ -172,7 +172,7 @@ clean_pq <- function(physeq, #' Track the number of reads (= sequences), samples and cluster (e.g. ASV) #' from various objects including dada-class and derep-class. #' -#' @details +#' @description #' `r lifecycle::badge("maturing")` #' #' * List of fastq and fastg.gz files -> nb of reads and samples @@ -381,9 +381,9 @@ track_wkflow <- function( ################################################################################ #' Track the number of reads (= sequences), samples and cluster (e.g. ASV) -#' for each samples. -#' -#' @description +#' for each samples. +#' +#' @description #' `r lifecycle::badge("experimental")` #' #' Contrary to [track_wkflow()], only phyloseq object are possible. @@ -410,7 +410,7 @@ track_wkflow_samples <- function(list_pq_obj, ...) { } res <- list() for (s in sample_names(list_pq_obj[[1]])) { - if(inherits(list_pq_obj[[1]]), "phyloseq") { + if (inherits(list_pq_obj[[1]], "phyloseq")) { list_pq_obj_samples <- lapply(list_pq_obj, select_one_sample, sam_name = s) res[[s]] <- track_wkflow(list_pq_obj_samples, ...) } else { @@ -427,6 +427,7 @@ track_wkflow_samples <- function(list_pq_obj, ...) { #' Recluster sequences of an object of class `physeq` #' (e.g. OTUs or ASV from dada) #' +#' @description #' `r lifecycle::badge("maturing")` #' #' @inheritParams clean_pq @@ -997,7 +998,7 @@ read_pq <- function(path = NULL, taxa_are_rows = FALSE, sam_names = NULL, sep_cs ################################################################################ #' Lulu reclustering of class `physeq` #' -#' @details +#' @description #' `r lifecycle::badge("experimental")` #' #' See https://www.nature.com/articles/s41467-017-01312-x for more information @@ -1129,7 +1130,7 @@ lulu_pq <- function(physeq, ################################################################################ #' Verify the validity of a phyloseq object #' -#' @details +#' @description #' `r lifecycle::badge("maturing")` #' #' Mostly for internal use in MiscMetabar functions. @@ -1150,7 +1151,7 @@ verify_pq <- function(physeq) { ################################################################################ #' Subset samples using a conditional boolean vector. #' -#' @details +#' @description #' `r lifecycle::badge("experimental")` #' #' The main objective of this function is to complete the [phyloseq::subset_samples()] @@ -1202,7 +1203,7 @@ subset_samples_pq <- function(physeq, condition) { ################################################################################ #' Subset taxa using a conditional named boolean vector. #' -#' @details +#' @description #' `r lifecycle::badge("experimental")` #' #' The main objective of this function is to complete the [phyloseq::subset_taxa()] diff --git a/R/plot_functions.R b/R/plot_functions.R index 32d071cb..7e683b13 100644 --- a/R/plot_functions.R +++ b/R/plot_functions.R @@ -1106,7 +1106,9 @@ multiplot <- #' \code{\link[multcompView]{multcompLetters}} function from the package #' multcompLetters. BROKEN for the moment. #' @param add_points (logical): add jitter point on boxplot -#' +#' @param add_info (logical, default TRUE) Do we add a subtitle with +#' information about the number of samples per modality. +#' #' @return A list of 4 ggplot2 plot. #' - plot_Hill_0 : the boxplot of Hill number 0 (= species richness) #' against the variable @@ -1137,7 +1139,8 @@ hill_pq <- variable, color_fac = NA, letters = FALSE, - add_points = FALSE) { + add_points = FALSE, + add_info = TRUE) { var <- sym(variable) if (is.na(color_fac)) { color_fac <- sym(variable) @@ -1184,6 +1187,21 @@ hill_pq <- p_2 + geom_jitter(aes(y = !!var, colour = as.factor(!!color_fac)), alpha = 0.5) } + if (add_info) { + subtitle_plot <- paste0( + "Nb of samples: '", + paste0(names(table(physeq@sam_data[[variable]])), + sep = "' : ", + table(physeq@sam_data[[variable]]), collapse = " - '" + ) + ) + + p_0 <- p_0 + labs(subtitle = subtitle_plot) + p_1 <- p_1 + labs(subtitle = subtitle_plot) + p_2 <- p_2 + labs(subtitle = subtitle_plot) + + } + if (letters) { ### HILL 0 data_h0 <- @@ -2284,8 +2302,10 @@ SRS_curve_pq <- function(physeq, clean_pq = FALSE, ...) { #' #' @examples #' library("iNEXT") -#' res_iNEXT <- iNEXT_pq(data_fungi, merge_sample_by = "Height", -#' q = 1, datatype = "abundance", nboot = 5) +#' res_iNEXT <- iNEXT_pq(data_fungi, +#' merge_sample_by = "Height", +#' q = 1, datatype = "abundance", nboot = 5 +#' ) #' ggiNEXT(res_iNEXT) #' ggiNEXT(res_iNEXT, type = 2) #' ggiNEXT(res_iNEXT, type = 3) @@ -2322,6 +2342,7 @@ iNEXT_pq <- function(physeq, merge_sample_by = NULL, ...) { #' @param na_remove : if TRUE (the default), NA values in fact are removed #' if FALSE, NA values are set to "NA" #' @param numeric_fonction (default : sum) the function for numeric vector +#' usefull only for complex plot (see examples) #' @param ... other arguments passed on to the [ComplexUpset::upset()] #' #' @return A \code{\link{ggplot}}2 plot @@ -2330,15 +2351,45 @@ iNEXT_pq <- function(physeq, merge_sample_by = NULL, ...) { #' #' @seealso [ggvenn_pq()] #' @examples -#' upset_pq(data_fungi, modality = "Height", width_ratio = 0.2) -#' upset_pq(data_fungi, modality = "Height", min_nb_seq = 1000) -#' upset_pq(data_fungi, modality = "Height", na_remove = FALSE) -#' upset_pq(data_fungi, modality = "Time", width_ratio = 0.2) +#' upset_pq(data_fungi, fact = "Height", width_ratio = 0.2) +#' upset_pq(data_fungi, fact = "Height", min_nb_seq = 1000) +#' upset_pq(data_fungi, fact = "Height", na_remove = FALSE) +#' upset_pq(data_fungi, fact = "Time", width_ratio = 0.2) +#' +#' upset_pq( +#' data_fungi, +#' fact = "Time", +#' width_ratio = 0.2, +#' annotations = list( +#' "Sequences per ASV \n (log10)" = ( +#' ggplot(mapping = aes(y = log10(Abundance))) +#' + +#' geom_jitter(aes( +#' color = +#' Abundance +#' ), na.rm = TRUE) +#' + +#' geom_violin(alpha = 0.5, na.rm = TRUE) + +#' theme(legend.key.size = unit(0.2, "cm")) + +#' theme(axis.text = element_text(size = 12)) +#' ), +#' "ASV per phylum" = ( +#' ggplot(mapping = aes(fill = Phylum)) +#' + +#' geom_bar() + +#' ylab("ASV per phylum") + +#' theme(legend.key.size = unit(0.2, "cm")) + +#' theme(axis.text = element_text(size = 12)) +#' ) +#' ) +#' ) #' +#' #' upset_pq( #' data_fungi, -#' modality = "Time", +#' fact = "Time", #' width_ratio = 0.2, +#' numeric_fonction = mean, #' annotations = list( #' "Sequences per ASV \n (log10)" = ( #' ggplot(mapping = aes(y = log10(Abundance))) @@ -2366,7 +2417,7 @@ iNEXT_pq <- function(physeq, merge_sample_by = NULL, ...) { #' #' upset_pq( #' subset_taxa(data_fungi, Phylum == "Basidiomycota"), -#' modality = "Time", +#' fact = "Time", #' width_ratio = 0.2, #' base_annotations = list(), #' annotations = list( @@ -2399,7 +2450,7 @@ iNEXT_pq <- function(physeq, merge_sample_by = NULL, ...) { #' paste0(data_fungi2@sam_data[["Height"]], "__", data_fungi2@sam_data[["Time_0"]]) #' data_fungi2@sam_data[["Height__Time_0"]][grepl("NA", data_fungi2@sam_data[["Height__Time_0"]])] <- #' NA -#' upset_pq(data_fungi2, modality = "Height__Time_0", width_ratio = 0.2) +#' upset_pq(data_fungi2, fact = "Height__Time_0", width_ratio = 0.2) upset_pq <- function(physeq, fact, @@ -2432,7 +2483,6 @@ upset_pq <- psm <- psm %>% filter(Abundance != 0) psm[[fact]] <- as.character(psm[[fact]]) - psm2 <- data.frame(lapply(psm, function(col) { tapply(col, paste0(psm$OTU), function(vec) { diff_fct_diff_class(vec, numeric_fonction = numeric_fonction, na.rm = TRUE) diff --git a/R/targets_misc.R b/R/targets_misc.R index c3dece8f..4aa509e2 100644 --- a/R/targets_misc.R +++ b/R/targets_misc.R @@ -65,7 +65,7 @@ list_fastq_files <- #' @examples #' data(data_fungi) #' rename_samples_otu_table(data_fungi, as.character(1:nsamples(data_fungi))) -#' +#' rename_samples_otu_table <- function(physeq, names_of_samples) { otu_tab <- physeq@otu_table tax_in_row <- taxa_are_rows(physeq) diff --git a/README.Rmd b/README.Rmd index fa70b7be..a447dc0e 100644 --- a/README.Rmd +++ b/README.Rmd @@ -28,20 +28,23 @@ There is no CRAN or bioconductor version of MiscMetabar for now (work in progres You can install the stable version from [GitHub](https://github.com/) with: -```{r, message=FALSE} +```{r, message=FALSE, eval=FALSE} install.packages("devtools") devtools::install_github("adrientaudiere/MiscMetabar") ``` You can install the developement version from [GitHub](https://github.com/) with: -```{r, message=FALSE} +```{r, message=FALSE, eval=FALSE} install.packages("devtools") devtools::install_github("adrientaudiere/MiscMetabar", ref = "dev") ``` ## Some use of MiscMetabar +See vignettes in the [MiscMetabar](https://adrientaudiere.github.io/MiscMetabar/) website for more examples. + + ### Summarize a physeq object ```{r example, message=FALSE} @@ -52,12 +55,24 @@ data("data_fungi") summary_plot_pq(data_fungi) ``` -### Circle for visualize distribution of taxa in function of samples variables +### Alpha-diversity analysis -```{r} -circle_pq(data_fungi, "Height", taxa = "Class", add_nb_seq = F) +```{r, fig.cap="Hill number 1"} +p <- MiscMetabar::hill_pq(data_fungi, variable = "Height") +p$plot_Hill_0 +``` + +```{r, fig.cap="Result of the Tuckey post-hoc test"} +p$plot_tuckey ``` +### Beta-diversity analysis + +```{r} +ggvenn_pq(data_fungi, fact = "Height") + + ggplot2::scale_fill_distiller(palette = "BuPu", direction = 1) + + labs(title = "Share number of ASV among Height in tree") +``` ### Installation of other softwares for debian Linux distributions diff --git a/README.md b/README.md index 23543f2f..7849b8f1 100644 --- a/README.md +++ b/README.md @@ -23,16 +23,6 @@ with: ``` r install.packages("devtools") devtools::install_github("adrientaudiere/MiscMetabar") -#> dplyr (1.1.2 -> 1.1.3) [CRAN] -#> ── R CMD build ───────────────────────────────────────────────────────────────── -#> * checking for file ‘/tmp/RtmpluOtzG/remotes62e682f7ffc53/adrientaudiere-MiscMetabar-2cb7839/DESCRIPTION’ ... OK -#> * preparing ‘MiscMetabar’: -#> * checking DESCRIPTION meta-information ... OK -#> Avis : read_pq.Rd:26: unknown macro '\t' -#> Avis : write_pq.Rd:74: unknown macro '\t' -#> * checking for LF line-endings in source and make files and shell scripts -#> * checking for empty or unneeded directories -#> * building ‘MiscMetabar_0.34.tar.gz’ ``` You can install the developement version from @@ -41,21 +31,14 @@ You can install the developement version from ``` r install.packages("devtools") devtools::install_github("adrientaudiere/MiscMetabar", ref = "dev") -#> -#> ── R CMD build ───────────────────────────────────────────────────────────────── -#> * checking for file ‘/tmp/RtmpluOtzG/remotes62e682b7bdb84/adrientaudiere-MiscMetabar-1dc2e0c/DESCRIPTION’ ... OK -#> * preparing ‘MiscMetabar’: -#> * checking DESCRIPTION meta-information ... OK -#> * checking for LF line-endings in source and make files and shell scripts -#> * checking for empty or unneeded directories -#> * building ‘MiscMetabar_0.40.tar.gz’ -#> Warning in i.p(...): l'installation du package -#> '/tmp/RtmpluOtzG/file62e683fb2fa28/MiscMetabar_0.40.tar.gz' a eu un statut de -#> sortie non nul ``` ## Some use of MiscMetabar +See vignettes in the +[MiscMetabar](https://adrientaudiere.github.io/MiscMetabar/) website for +more examples. + ### Summarize a physeq object ``` r @@ -68,11 +51,57 @@ summary_plot_pq(data_fungi) -### Circle for visualize distribution of taxa in function of samples variables +### Alpha-diversity analysis ``` r -circle_pq(data_fungi, "Height", taxa = "Class", add_nb_seq = F) -#> Only 10 taxa are plot (41.67%). Use 'min_prop_tax' to plot more taxa +p <- MiscMetabar::hill_pq(data_fungi, variable = "Height") +#> Taxa are now in rows. +#> Cleaning suppress 0 taxa and 0 samples. +p$plot_Hill_0 ``` - +
+ +Hill number 1 +

+Hill number 1 +

+ +
+ +``` r +p$plot_tuckey +``` + +
+ +Result of the Tuckey post-hoc test +

+Result of the Tuckey post-hoc test +

+ +
+ +### Beta-diversity analysis + +``` r +ggvenn_pq(data_fungi, fact = "Height") + + ggplot2::scale_fill_distiller(palette = "BuPu", direction = 1) + + labs(title = "Share number of ASV among Height in tree") +``` + + + +### Installation of other softwares for debian Linux distributions + +#### blastn + +``` sh +sudo apt-get install ncbi-blast+ +``` + +#### vsearch + +``` sh +sudo apt-get install vsearch +``` diff --git a/_pkgdown.yml b/_pkgdown.yml index 88ff57e4..4c708686 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -20,7 +20,7 @@ navbar: - text: Beta-diversity href: articles/beta-div.html - text: Import/export and track - href: articles/Import-export-track.html + href: articles/import_export_track.html - text: Filter taxa and samples href: articles/filter.html - text: ------- diff --git a/man/clean_pq.Rd b/man/clean_pq.Rd index b0083217..532a4d18 100644 --- a/man/clean_pq.Rd +++ b/man/clean_pq.Rd @@ -52,9 +52,6 @@ the ASV names in verbose information can be misleading.} A new \code{\link{phyloseq-class}} object } \description{ -Clean phyloseq object by removing empty samples and taxa -} -\details{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} In addition, this function check for discrepancy (and rename) between diff --git a/man/diff_fct_diff_class.Rd b/man/diff_fct_diff_class.Rd index d514bca0..8ec6bf8a 100644 --- a/man/diff_fct_diff_class.Rd +++ b/man/diff_fct_diff_class.Rd @@ -7,8 +7,7 @@ diff_fct_diff_class( x, numeric_fonction = mean, - na.rm = TRUE, - logical_method = "true_if_one", + logical_method = "TRUE_if_one", character_method = "unique_or_na", ... ) diff --git a/man/dist_pos_control.Rd b/man/dist_pos_control.Rd index ed3a5997..eedaff09 100644 --- a/man/dist_pos_control.Rd +++ b/man/dist_pos_control.Rd @@ -25,8 +25,7 @@ A list of two data-frames with } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -} -\details{ + Compute distance among positive controls, i.e. samples which are duplicated to test for variation, for example in diff --git a/man/figures/README-unnamed-chunk-4-1.png b/man/figures/README-unnamed-chunk-4-1.png index 1f0c16a90b1d512e61dff46872e28c1f312df7c1..031cb5e5396918c00690b47117417bb28fde3197 100644 GIT binary patch literal 18380 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 diff --git a/man/figures/README-unnamed-chunk-6-1.png b/man/figures/README-unnamed-chunk-6-1.png index 5d97dae12e7d6b9cc7c09a76ed617ef3482653b2..57d3a97ff7e97713a2f04e88e66b8699ba79e97c 100644 GIT binary patch literal 53650 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 literal 41828 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 nb of reads and samples diff --git a/man/track_wkflow_samples.Rd b/man/track_wkflow_samples.Rd index 896dcb7b..ba960af9 100644 --- a/man/track_wkflow_samples.Rd +++ b/man/track_wkflow_samples.Rd @@ -3,12 +3,13 @@ \name{track_wkflow_samples} \alias{track_wkflow_samples} \title{Track the number of reads (= sequences), samples and cluster (e.g. ASV) -for each samples} +for each samples.} \usage{ track_wkflow_samples(list_pq_obj, ...) } \arguments{ -\item{list_pq_obj}{(required): a list of object passed on to \code{\link[=track_wkflow]{track_wkflow()}}} +\item{list_pq_obj}{(required): a list of object passed on to \code{\link[=track_wkflow]{track_wkflow()}} +Only phyloseq object will return value because information of sample is needed} \item{...}{: other args passed on to \code{\link[=track_wkflow]{track_wkflow()}}} } @@ -18,6 +19,7 @@ A list of dataframe. cf \code{\link[=track_wkflow]{track_wkflow()}} for more inf \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} +Contrary to \code{\link[=track_wkflow]{track_wkflow()}}, only phyloseq object are possible. More information are available in the manual of the function \code{\link[=track_wkflow]{track_wkflow()}} } \examples{ diff --git a/man/upset_pq.Rd b/man/upset_pq.Rd index f7058edf..9365e854 100644 --- a/man/upset_pq.Rd +++ b/man/upset_pq.Rd @@ -28,7 +28,8 @@ will not count in the venn diagramm} \item{na_remove}{: if TRUE (the default), NA values in fact are removed if FALSE, NA values are set to "NA"} -\item{numeric_fonction}{(default : sum) the function for numeric vector} +\item{numeric_fonction}{(default : sum) the function for numeric vector +usefull only for complex plot (see examples)} \item{...}{other arguments passed on to the \code{\link[ComplexUpset:upset]{ComplexUpset::upset()}}} } @@ -41,14 +42,14 @@ A \code{\link{ggplot}}2 plot Alternative to venn plot. } \examples{ -upset_pq(data_fungi, modality = "Height", width_ratio = 0.2) -upset_pq(data_fungi, modality = "Height", min_nb_seq = 1000) -upset_pq(data_fungi, modality = "Height", na_remove = FALSE) -upset_pq(data_fungi, modality = "Time", width_ratio = 0.2) +upset_pq(data_fungi, fact = "Height", width_ratio = 0.2) +upset_pq(data_fungi, fact = "Height", min_nb_seq = 1000) +upset_pq(data_fungi, fact = "Height", na_remove = FALSE) +upset_pq(data_fungi, fact = "Time", width_ratio = 0.2) upset_pq( data_fungi, - modality = "Time", + fact = "Time", width_ratio = 0.2, annotations = list( "Sequences per ASV \n (log10)" = ( @@ -75,9 +76,39 @@ upset_pq( ) +upset_pq( + data_fungi, + fact = "Time", + width_ratio = 0.2, + numeric_fonction = mean, + annotations = list( + "Sequences per ASV \n (log10)" = ( + ggplot(mapping = aes(y = log10(Abundance))) + + + geom_jitter(aes( + color = + Abundance + ), na.rm = TRUE) + + + geom_violin(alpha = 0.5, na.rm = TRUE) + + theme(legend.key.size = unit(0.2, "cm")) + + theme(axis.text = element_text(size = 12)) + ), + "ASV per phylum" = ( + ggplot(mapping = aes(fill = Phylum)) + + + geom_bar() + + ylab("ASV per phylum") + + theme(legend.key.size = unit(0.2, "cm")) + + theme(axis.text = element_text(size = 12)) + ) + ) +) + + upset_pq( subset_taxa(data_fungi, Phylum == "Basidiomycota"), - modality = "Time", + fact = "Time", width_ratio = 0.2, base_annotations = list(), annotations = list( @@ -110,7 +141,7 @@ data_fungi2@sam_data[["Height__Time_0"]] <- paste0(data_fungi2@sam_data[["Height"]], "__", data_fungi2@sam_data[["Time_0"]]) data_fungi2@sam_data[["Height__Time_0"]][grepl("NA", data_fungi2@sam_data[["Height__Time_0"]])] <- NA -upset_pq(data_fungi2, modality = "Height__Time_0", width_ratio = 0.2) +upset_pq(data_fungi2, fact = "Height__Time_0", width_ratio = 0.2) } \seealso{ \code{\link[=ggvenn_pq]{ggvenn_pq()}} diff --git a/man/verify_pq.Rd b/man/verify_pq.Rd index e8860099..2dc3c86d 100644 --- a/man/verify_pq.Rd +++ b/man/verify_pq.Rd @@ -14,9 +14,6 @@ using the \code{phyloseq} package.} Nothing if the phyloseq object is valid. An error in the other case. } \description{ -Verify the validity of a phyloseq object -} -\details{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#maturing}{\figure{lifecycle-maturing.svg}{options: alt='[Maturing]'}}}{\strong{[Maturing]}} Mostly for internal use in MiscMetabar functions. diff --git a/tests/testthat/test_figures_beta_div.R b/tests/testthat/test_figures_beta_div.R index 81bceefe..4bd6cf06 100644 --- a/tests/testthat/test_figures_beta_div.R +++ b/tests/testthat/test_figures_beta_div.R @@ -83,3 +83,14 @@ test_that("ggvenn_pq works with data_fungi dataset", { expect_error(ggvenn_pq(data_fungi)) expect_s3_class(ggvenn_pq(data_fungi, "Height"), "ggplot") }) + + +test_that("upset_pq works with data_fungi dataset", { + expect_silent(suppressMessages(upset_pq(data_fungi, "Height"))) + expect_s3_class(upset_pq(data_fungi, "Height"), "ggplot") + expect_s3_class(upset_pq(data_fungi, "Time"), "ggplot") + expect_s3_class(upset_pq(data_fungi, "Time", min_nb_seq = 10), "ggplot") + expect_s3_class(upset_pq(data_fungi, "Time", numeric_fonction = mean), "ggplot") + expect_error(upset_pq(data_fungi)) +}) + diff --git a/vignettes/Reclustering.Rmd b/vignettes/Reclustering.Rmd index d44a6c40..a0cb3e45 100644 --- a/vignettes/Reclustering.Rmd +++ b/vignettes/Reclustering.Rmd @@ -26,8 +26,8 @@ data(data_fungi_sp_known) otu <- asv2otu(data_fungi_sp_known, method = "clusterize") ``` -```{r, eval = FALSE} -otu_vs <- asv2otu(data_fungi_sp_known, method = "vsearch", vsearch_cluster_method = "") +```{r} +otu_vs <- asv2otu(data_fungi_sp_known, method = "vsearch") ``` The vsearch method requires the installation of [Vsearch](https://github.com/torognes/vsearch). @@ -39,15 +39,23 @@ summary_plot_pq(otu) ## Using lulu algorithm ([link to LULU article](https://www.nature.com/articles/s41467-017-01312-x)) -```{r, message=FALSE, results="hide", eval = FALSE} -library(devtools) -install_github("adrientaudiere/lulu") +```{r, message=FALSE, results="hide"} library("lulu") data(data_fungi_sp_known) lulu_res <- lulu_pq(data_fungi_sp_known) ``` -```{r, eval = FALSE} +```{r} summary_plot_pq(data_fungi_sp_known) summary_plot_pq(lulu_res$new_physeq) ``` + +## Tracking number of samples, sequences and clusters + +```{r} +track_wkflow(list("Raw data" = data_fungi_sp_known, + "OTU" = otu, + "OTU_vsearch" = otu_vs, + "LULU" = lulu_res[[1]]) + ) +``` diff --git a/vignettes/beta-div.Rmd b/vignettes/beta-div.Rmd index 17bfe90d..7b398030 100644 --- a/vignettes/beta-div.Rmd +++ b/vignettes/beta-div.Rmd @@ -83,6 +83,48 @@ ggvenn_pq(data_fungi, fact = "Height", taxonomic_rank = "Genus", min_nb_seq = 10 labs(title = "Share number of Genus represented by at least one ASV with more than 100 seqs") ``` +## Upset plot + +Venn diagramm can quickly become complex to read when the number of modality increase. One graphical solution is upset plot. MiscMetabar propose a solution based on the package [ComplexUpset](https://krassowski.github.io/complex-upset/). +```{r} +upset_pq(data_fungi, fact = "Height") +``` + +```{r} +upset_pq(data_fungi, fact = "Time") +``` + +`ComplexUpset` package allow powerfull configuration of you plot as you can see in the following figure. + +```{r} +upset_pq( + data_fungi, + fact = "Time", + width_ratio = 0.2, + annotations = list( + "Sequences per ASV \n (log10)" = ( + ggplot(mapping = aes(y = log10(Abundance))) + + + geom_jitter(aes( + color = + Abundance + ), na.rm = TRUE) + + + geom_violin(alpha = 0.5, na.rm = TRUE) + + theme(legend.key.size = unit(0.2, "cm")) + + theme(axis.text = element_text(size = 12)) + ), + "ASV per phylum" = ( + ggplot(mapping = aes(fill = Phylum)) + + + geom_bar() + + ylab("ASV per phylum") + + theme(legend.key.size = unit(0.2, "cm")) + + theme(axis.text = element_text(size = 12)) + ) + ) +) +``` ## Change in abundance across a factor diff --git a/vignettes/import_export_track.Rmd b/vignettes/import_export_track.Rmd index c56051aa..557e941f 100644 --- a/vignettes/import_export_track.Rmd +++ b/vignettes/import_export_track.Rmd @@ -1,8 +1,8 @@ --- -title: "Import-export-track" +title: "import_export_track" output: rmarkdown::html_vignette vignette: > - %\VignetteIndexEntry{Import-export-track} + %\VignetteIndexEntry{import_export_track} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- From a72d87b629fc159d6b2a3cd7b5343279e7b6917d Mon Sep 17 00:00:00 2001 From: Adrien Taudiere Date: Sun, 17 Sep 2023 13:30:24 +0200 Subject: [PATCH 16/16] figures readme --- man/figures/README-unnamed-chunk-5-1.png | Bin 0 -> 12406 bytes man/subset_taxa_tax_control.Rd | 3 +-- 2 files changed, 1 insertion(+), 2 deletions(-) create mode 100644 man/figures/README-unnamed-chunk-5-1.png diff --git a/man/figures/README-unnamed-chunk-5-1.png b/man/figures/README-unnamed-chunk-5-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ee6674837a79d11b08baf07cab16285c961f7daa GIT binary patch literal 12406 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 literal 0 HcmV?d00001 diff --git a/man/subset_taxa_tax_control.Rd b/man/subset_taxa_tax_control.Rd index 272b7688..dd116758 100644 --- a/man/subset_taxa_tax_control.Rd +++ b/man/subset_taxa_tax_control.Rd @@ -44,9 +44,8 @@ A new \code{\link{phyloseq-class}} object. data(data_fungi) subset_taxa_tax_control(data_fungi, - as.numeric(data_fungi@otu_table[, 300], + as.numeric(data_fungi@otu_table[, 300]), min_diff_for_cutoff = 2) -) } \author{