From f3bcb066a29d23efb319e85905fe63f6605ea173 Mon Sep 17 00:00:00 2001 From: chilampoon Date: Sat, 16 Sep 2023 15:19:07 -0400 Subject: [PATCH 01/30] resolve tidyomics conflicts and docs clean up --- DESCRIPTION | 3 +- NAMESPACE | 18 +- R/attach.R | 22 + R/dplyr_methods.R | 738 +++--------------- R/functions.R | 9 +- R/functions_SE.R | 11 +- R/methods.R | 134 ++-- R/methods_SE.R | 30 +- R/tidyr_methods.R | 98 +-- R/zzz.R | 37 +- man/adjust_abundance-methods.Rd | 11 +- man/arrange-methods.Rd | 66 -- man/arrange.Rd | 91 +++ man/bind_rows.Rd | 28 +- man/distinct-methods.Rd | 24 - man/distinct.Rd | 55 ++ man/dplyr-methods.Rd | 31 - man/filter-methods.Rd | 85 -- man/filter.Rd | 116 +++ man/full_join.Rd | 172 ++++ man/group_by-methods.Rd | 47 -- man/group_by.Rd | 162 ++++ man/inner_join.Rd | 172 ++++ man/join-methods.Rd | 48 -- man/left_join.Rd | 172 ++++ man/mutate-methods.Rd | 103 --- man/mutate.Rd | 173 ++++ man/mutate.nested_tidybulk.Rd | 175 +++++ man/nest-methods.Rd | 61 -- man/nest.Rd | 84 ++ man/reexports.Rd | 2 +- man/rename-methods.Rd | 51 -- man/rename.Rd | 87 +++ man/right_join.Rd | 172 ++++ man/rotate_dimensions-methods.Rd | 8 +- man/rowwise-methods.Rd | 36 - man/rowwise.Rd | 78 ++ man/summarise-methods.Rd | 91 --- man/summarise.Rd | 139 ++++ man/symbol_to_entrez.Rd | 5 +- man/test_gene_enrichment-methods.Rd | 23 +- man/tidybulk-methods.Rd | 5 +- man/ungroup.Rd | 148 ++++ man/unnest.Rd | 111 +++ tests/testthat/test-bulk_methods.R | 2 +- .../test-bulk_methods_SummarizedExperiment.R | 2 +- 46 files changed, 2449 insertions(+), 1487 deletions(-) create mode 100644 R/attach.R delete mode 100644 man/arrange-methods.Rd create mode 100644 man/arrange.Rd delete mode 100644 man/distinct-methods.Rd create mode 100644 man/distinct.Rd delete mode 100644 man/dplyr-methods.Rd delete mode 100644 man/filter-methods.Rd create mode 100644 man/filter.Rd create mode 100644 man/full_join.Rd delete mode 100644 man/group_by-methods.Rd create mode 100644 man/group_by.Rd create mode 100644 man/inner_join.Rd delete mode 100644 man/join-methods.Rd create mode 100644 man/left_join.Rd delete mode 100644 man/mutate-methods.Rd create mode 100644 man/mutate.Rd create mode 100644 man/mutate.nested_tidybulk.Rd delete mode 100644 man/nest-methods.Rd create mode 100644 man/nest.Rd delete mode 100644 man/rename-methods.Rd create mode 100644 man/rename.Rd create mode 100644 man/right_join.Rd delete mode 100644 man/rowwise-methods.Rd create mode 100644 man/rowwise.Rd delete mode 100644 man/summarise-methods.Rd create mode 100644 man/summarise.Rd create mode 100644 man/ungroup.Rd create mode 100644 man/unnest.Rd diff --git a/DESCRIPTION b/DESCRIPTION index 1c97a1ae..cf67279f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -35,7 +35,8 @@ Imports: GenomicRanges, methods, S4Vectors, - crayon + crayon, + pkgconfig Suggests: BiocStyle, testthat, diff --git a/NAMESPACE b/NAMESPACE index 58ce8456..f77a86ca 100755 --- a/NAMESPACE +++ b/NAMESPACE @@ -16,49 +16,36 @@ S3method(rename,tidybulk) S3method(right_join,tidybulk) S3method(rowwise,tidybulk) S3method(summarise,tidybulk) +S3method(summarize,tidybulk) S3method(ungroup,tidybulk) S3method(unnest,nested_tidybulk) export("%>%") export(adjust_abundance) export(aggregate_duplicates) -export(arrange) export(as_SummarizedExperiment) export(as_matrix) export(as_tibble) -export(bind_cols) export(cluster_elements) export(deconvolve_cellularity) export(describe_transcript) -export(distinct) export(do) export(ensembl_to_symbol) export(fill_missing_abundance) -export(filter) -export(full_join) export(get_bibliography) -export(group_by) export(identify_abundant) export(impute_missing_abundance) -export(inner_join) export(keep_abundant) export(keep_variable) -export(left_join) export(log10_reverse_trans) export(logit_trans) -export(mutate) -export(nest) export(pivot_sample) export(pivot_transcript) export(quantile_normalise_abundance) export(reduce_dimensions) export(remove_redundancy) -export(rename) -export(right_join) export(rotate_dimensions) -export(rowwise) export(scale_abundance) export(select) -export(summarise) export(symbol_to_entrez) export(test_differential_abundance) export(test_differential_cellularity) @@ -69,7 +56,6 @@ export(test_stratification_cellularity) export(tibble) export(tidybulk) export(tidybulk_SAM_BAM) -export(unnest) exportMethods(as_SummarizedExperiment) exportMethods(quantile_normalise_abundance) exportMethods(scale_abundance) @@ -121,6 +107,7 @@ importFrom(dplyr,slice) importFrom(dplyr,starts_with) importFrom(dplyr,summarise) importFrom(dplyr,summarise_all) +importFrom(dplyr,summarize) importFrom(dplyr,ungroup) importFrom(lifecycle,deprecate_soft) importFrom(lifecycle,deprecate_warn) @@ -147,7 +134,6 @@ importFrom(rlang,":=") importFrom(rlang,dots_list) importFrom(rlang,dots_values) importFrom(rlang,enquo) -importFrom(rlang,enquos) importFrom(rlang,flatten_if) importFrom(rlang,inform) importFrom(rlang,is_spliced) diff --git a/R/attach.R b/R/attach.R new file mode 100644 index 00000000..0543a45c --- /dev/null +++ b/R/attach.R @@ -0,0 +1,22 @@ +core <- c("dplyr", "tidyr", "ttservice", "ggplot2") + +core_unloaded <- function() { + search <- paste0("package:", core) + core[!search %in% search()] +} + + +same_library <- function(pkg) { + loc <- if (pkg %in% loadedNamespaces()) + dirname(getNamespaceInfo(pkg, "path")) + library(pkg, lib.loc=loc, character.only=TRUE, warn.conflicts=FALSE) +} + +tidyverse_attach <- function() { + to_load <- core_unloaded() + + suppressPackageStartupMessages( + lapply(to_load, same_library)) + + invisible(to_load) +} diff --git a/R/dplyr_methods.R b/R/dplyr_methods.R index 0f43685b..d84ca57c 100755 --- a/R/dplyr_methods.R +++ b/R/dplyr_methods.R @@ -1,70 +1,13 @@ - -#' @export -dplyr::select - -#' Arrange rows by column values -#' -#' -#' @description -#' `arrange()` order the rows of a data frame rows by the values of selected -#' columns. -#' -#' Unlike other dplyr verbs, `arrange()` largely ignores grouping; you -#' need to explicit mention grouping variables (or use `by_group = TRUE`) -#' in order to group by them, and functions of variables are evaluated -#' once per data frame, not once per group. -#' -#' @details -#' ## Locales -#' The sort order for character vectors will depend on the collating sequence -#' of the locale in use: see [locales()]. -#' -#' ## Missing values -#' Unlike base sorting with `sort()`, `NA` are: -#' * always sorted to the end for local data, even when wrapped with `desc()`. -#' * treated differently for remote data, depending on the backend. -#' -#' @return -#' An object of the same type as `.data`. -#' -#' * All rows appear in the output, but (usually) in a different place. -#' * Columns are not modified. -#' * Groups are not modified. -#' * Data frame attributes are preserved. -#' @section Methods: -#' This function is a **generic**, which means that packages can provide -#' implementations (methods) for other classes. See the documentation of -#' individual methods for extra arguments and differences in behaviour. -#' -#' The following methods are currently available in loaded packages: -#' -#' @param .data A data frame, data frame extension (e.g. a tibble), or a -#' lazy data frame (e.g. from dbplyr or dtplyr). See *Methods*, below, for -#' more details. -#' @param ... <[`tidy-eval`][dplyr_tidy_eval]> Variables, or functions or -#' variables. Use [desc()] to sort a variable in descending order. -#' @param .by_group If TRUE, will sort first by grouping variable. Applies to grouped data frames only. -#' -#' @return A tibble -#' @family single table verbs -#' -#' @rdname arrange-methods #' @name arrange +#' @rdname arrange +#' @inherit dplyr::arrange +#' @family single table verbs #' @importFrom dplyr arrange -#' -#' @examples -#' -#' arrange(mtcars, cyl, disp) -#' -#' @export -NULL - #' @export arrange.tidybulk <- function(.data, ..., .by_group = FALSE) { - - .data |> - drop_class(c("tidybulk", "tt")) |> - dplyr::arrange( ..., .by_group = .by_group) |> + .data |> + drop_class(c("tidybulk", "tt")) |> + dplyr::arrange( ..., .by_group = .by_group) |> # Attach attributes reattach_internals(.data) |> @@ -72,130 +15,68 @@ arrange.tidybulk <- function(.data, ..., .by_group = FALSE) { # Add class add_class("tt") |> add_class("tidybulk") - } -#' Efficiently bind multiple data frames by row and column -#' -#' This is an efficient implementation of the common pattern of -#' `do.call(rbind, dfs)` or `do.call(cbind, dfs)` for binding many -#' data frames into one. -#' -#' The output of `bind_rows()` will contain a column if that column -#' appears in any of the inputs. -#' -#' @param ... Data frames to combine. -#' -#' Each argument can either be a data frame, a list that could be a data -#' frame, or a list of data frames. -#' -#' When row-binding, columns are matched by name, and any missing -#' columns will be filled with NA. -#' -#' When column-binding, rows are matched by position, so all data -#' frames must have the same number of rows. To match by value, not -#' position, see mutate-joins. -#' @param .id Data frame identifier. -#' -#' When `.id` is supplied, a new column of identifiers is -#' created to link each row to its original data frame. The labels -#' are taken from the named arguments to `bind_rows()`. When a -#' list of data frames is supplied, the labels are taken from the -#' names of the list. If no names are found a numeric sequence is -#' used instead. -#' @param add.cell.ids from Seurat 3.0 A character vector of length(x = c(x, y)). Appends the corresponding values to the start of each objects' cell names. -#' -#' @importFrom ttservice bind_rows +#' @name bind_rows +#' @rdname bind_rows +#' @inherit ttservice::bind_rows #' -#' @return `bind_rows()` and `bind_cols()` return the same type as -#' the first input, either a data frame, `tbl_df`, or `grouped_df`. #' @examples #' data(se_mini) #' -#' se_mini_tidybulk = se_mini |> tidybulk() -#' bind_rows( se_mini_tidybulk, se_mini_tidybulk ) +#' se_mini_tidybulk <- se_mini |> tidybulk() +#' bind_rows(se_mini_tidybulk, se_mini_tidybulk) #' -#' tt_bind = se_mini_tidybulk |> select(time, condition) +#' tt_bind <- se_mini_tidybulk |> select(time, condition) #' se_mini_tidybulk |> bind_cols(tt_bind) #' -#' @name bind_rows -NULL - #' @importFrom rlang dots_values #' @importFrom rlang flatten_if #' @importFrom rlang is_spliced -#' +#' @importFrom ttservice bind_rows #' @export -#' -bind_rows.tidybulk <- function(..., .id = NULL) -{ +bind_rows.tidybulk <- function(..., .id = NULL) { + tts <- flatten_if(dots_values(...), is_spliced) - tts = flatten_if(dots_values(...), is_spliced) # Original that fails Bioconductor dplyr:::flatten_bindable(rlang::dots_values(...)) - - par1 = tts[[1]] |> get_tt_columns() |> unlist() - par2 = tts[[2]] |> get_tt_columns() |> unlist() + par1 <- tts[[1]] |> get_tt_columns() |> unlist() + par2 <- tts[[2]] |> get_tt_columns() |> unlist() # # tt_columns of the two objects must match # error_if_parameters_not_match(par1, par2) ttservice:::bind_rows.data.frame(..., .id = .id) |> - # Attach attributes reattach_internals(tts[[1]]) - } -#' @export -#' -#' @importFrom ttservice bind_cols -#' @inheritParams bind_cols -#' -#' @rdname dplyr-methods -#' @name bind_cols -NULL - #' @importFrom rlang dots_values #' @importFrom rlang flatten_if #' @importFrom rlang is_spliced -#' -#' @export -#' -bind_cols.tidybulk <- function(..., .id = NULL) -{ - - tts = tts = flatten_if(dots_values(...), is_spliced) # Original that fails Bioconductor dplyr:::flatten_bindable(rlang::dots_values(...)) - - dplyr::bind_cols(..., .id = .id) |> - - # Attach attributes - reattach_internals(tts[[1]]) - +#' @importFrom ttservice bind_cols +bind_cols_ <- function(..., .id = NULL) { + tts <- tts <- flatten_if(dots_values(...), is_spliced) + + ttservice::bind_cols(..., .id = .id) |> + # Attach attributes + reattach_internals(tts[[1]]) } -#' distinct -#' @param .data A tbl. (See dplyr) -#' @param ... Data frames to combine (See dplyr) -#' @param .keep_all If TRUE, keep all variables in .data. If a combination of ... is not distinct, this keeps the first row of values. (See dplyr) -#' -#' @return A tt object -#' -#' @rdname distinct-methods +#' @rdname bind_rows +#' @aliases bind_cols +#' @export +bind_cols.tidybulk <- bind_cols_ + #' @name distinct -#' @importFrom dplyr distinct +#' @rdname distinct +#' @inherit dplyr::distinct #' #' @examples -#' -#' tidybulk::se_mini |> tidybulk() |> distinct() -#' -#' -#' @export -NULL - - -#' @inheritParams distinct +#' data(se_mini) +#' se_mini |> tidybulk() |> distinct() +#' +#' @importFrom dplyr distinct #' @export -distinct.tidybulk <- function (.data, ..., .keep_all = FALSE) -{ +distinct.tidybulk <- function (.data, ..., .keep_all = FALSE) { .data |> drop_class(c("tidybulk", "tt")) |> dplyr::distinct(..., .keep_all = .keep_all) |> @@ -206,84 +87,23 @@ distinct.tidybulk <- function (.data, ..., .keep_all = FALSE) # Add class add_class("tt") |> add_class("tidybulk") - } -#' Subset rows using column values -#' -#' `filter()` retains the rows where the conditions you provide a `TRUE`. Note -#' that, unlike base subsetting with `[`, rows where the condition evaluates -#' to `NA` are dropped. -#' -#' dplyr is not yet smart enough to optimise filtering optimisation -#' on grouped datasets that don't need grouped calculations. For this reason, -#' filtering is often considerably faster on [ungroup()]ed data. -#' -#' @section Useful filter functions: -#' -#' * [`==`], [`>`], [`>=`] etc -#' * [`&`], [`|`], [`!`], [xor()] -#' * [is.na()] -#' * [between()], [near()] -#' -#' @section Grouped tibbles: -#' -#' Because filtering expressions are computed within groups, they may -#' yield different results on grouped tibbles. This will be the case -#' as soon as an aggregating, lagging, or ranking function is -#' involved. Compare this ungrouped filtering: -#' -#' -#' The former keeps rows with `mass` greater than the global average -#' whereas the latter keeps rows with `mass` greater than the gender -#' -#' average. -#' @family single table verbs -#' @param .data A tbl. (See dplyr) -#' @param ... <[`tidy-eval`][dplyr_tidy_eval]> Logical predicates defined in -#' terms of the variables in `.data`. -#' Multiple conditions are combined with `&`. Only rows where the -#' condition evaluates to `TRUE` are kept. -#' @param .preserve when `FALSE` (the default), the grouping structure -#' is recalculated based on the resulting data, otherwise it is kept as is. -#' @return -#' An object of the same type as `.data`. -#' -#' * Rows are a subset of the input, but appear in the same order. -#' * Columns are not modified. -#' * The number of groups may be reduced (if `.preserve` is not `TRUE`). -#' * Data frame attributes are preserved. -#' @section Methods: -#' This function is a **generic**, which means that packages can provide -#' implementations (methods) for other classes. See the documentation of -#' individual methods for extra arguments and differences in behaviour. -#' -#' The following methods are currently available in loaded packages: -#' @seealso [filter_all()], [filter_if()] and [filter_at()]. -#' -#' @rdname filter-methods #' @name filter -#' -#' @importFrom dplyr filter -#' -#' @export +#' @rdname filter +#' @inherit dplyr::filter #' #' @examples -#' #' data(se) -#' #' se |> tidybulk() |> filter(dex=="untrt") -#' #' # Learn more in ?dplyr_tidy_eval -NULL - -#' @inheritParams filter +#' +#' @importFrom dplyr filter #' @export -filter.tidybulk <- function (.data, ..., .preserve = FALSE) -{ +filter.tidybulk <- function (.data, ..., .preserve = FALSE) { .data |> drop_class(c("tidybulk", "tt")) |> - dplyr::filter( ..., .preserve = .preserve) |> + dplyr::filter(..., .preserve = .preserve) |> # Attach attributes reattach_internals(.data) |> @@ -291,55 +111,16 @@ filter.tidybulk <- function (.data, ..., .preserve = FALSE) # Add class add_class("tt") |> add_class("tidybulk") - } -#' Group by one or more variables -#' -#' @description -#' Most data operations are done on groups defined by variables. -#' `group_by()` takes an existing tbl and converts it into a grouped tbl -#' where operations are performed "by group". `ungroup()` removes grouping. -#' -#' @family grouping functions -#' @param .data A tbl. (See dplyr) -#' @param ... In `group_by()`, variables or computations to group by. -#' In `ungroup()`, variables to remove from the grouping. -#' @param .add When `FALSE`, the default, `group_by()` will -#' override existing groups. To add to the existing groups, use -#' `.add = TRUE`. -#' -#' This argument was previously called `add`, but that prevented -#' creating a new grouping variable called `add`, and conflicts with -#' our naming conventions. -#' @param .drop When `.drop = TRUE`, empty groups are dropped. See [group_by_drop_default()] for -#' what the default value is for this argument. -#' @return A [grouped data frame][grouped_df()], unless the combination of `...` and `add` -#' yields a non empty set of grouping columns, a regular (ungrouped) data frame -#' otherwise. -#' @section Methods: -#' These function are **generic**s, which means that packages can provide -#' implementations (methods) for other classes. See the documentation of -#' individual methods for extra arguments and differences in behaviour. -#' -#' Methods available in currently loaded packages: -#' -#' @rdname group_by-methods #' @name group_by -#' @importFrom dplyr group_by -#' -#' @export -#' -#' @examples -#' -#' by_cyl <- mtcars |> group_by(cyl) -#' -NULL - +#' @rdname group_by +#' @inherit dplyr::group_by #' @importFrom dplyr group_by_drop_default +#' @importFrom dplyr group_by #' @export -group_by.tidybulk <- function (.data, ..., .add = FALSE, .drop = group_by_drop_default(.data)) -{ +group_by.tidybulk <- function (.data, ..., .add = FALSE, + .drop = group_by_drop_default(.data)) { .data |> drop_class(c("tidybulk", "tt")) |> dplyr::group_by( ..., .drop = .drop) |> @@ -350,20 +131,14 @@ group_by.tidybulk <- function (.data, ..., .add = FALSE, .drop = group_by_drop_d # Add class add_class("tt") |> add_class("tidybulk") - } - -#' @rdname ungroup-methods #' @name ungroup +#' @rdname ungroup +#' @inherit dplyr::ungroup #' @importFrom dplyr ungroup -#' -#' @param x A [tbl()] -#' @param ... See dplyr -#' #' @export -ungroup.tidybulk <- function (x, ...) -{ +ungroup.tidybulk <- function (x, ...) { x |> drop_class(c("tidybulk", "tt")) |> dplyr::ungroup( ...) |> @@ -374,89 +149,15 @@ ungroup.tidybulk <- function (x, ...) # Add class add_class("tt") |> add_class("tidybulk") - } -#' Summarise each group to fewer rows -#' -#' @description -#' `summarise()` creates a new data frame. It will have one (or more) rows for -#' each combination of grouping variables; if there are no grouping variables, -#' the output will have a single row summarising all observations in the input. -#' It will contain one column for each grouping variable and one column -#' for each of the summary statistics that you have specified. -#' -#' `summarise()` and `summarize()` are synonyms. -#' -#' @section Useful functions: -#' -#' * Center: [mean()], [median()] -#' * Spread: [sd()], [IQR()], [mad()] -#' * Range: [min()], [max()], [quantile()] -#' * Position: [first()], [last()], [nth()], -#' * Count: [n()], [n_distinct()] -#' * Logical: [any()], [all()] -#' -#' @section Backend variations: -#' -#' The data frame backend supports creating a variable and using it in the -#' same summary. This means that previously created summary variables can be -#' further transformed or combined within the summary, as in [mutate()]. -#' However, it also means that summary variables with the same names as previous -#' variables overwrite them, making those variables unavailable to later summary -#' variables. -#' -#' This behaviour may not be supported in other backends. To avoid unexpected -#' results, consider using new names for your summary variables, especially when -#' creating multiple summaries. -#' -#' @export -#' @param .data A tbl. (See dplyr) -#' @param ... <[`tidy-eval`][dplyr_tidy_eval]> Name-value pairs of summary -#' functions. The name will be the name of the variable in the result. -#' -#' The value can be: -#' -#' * A vector of length 1, e.g. `min(x)`, `n()`, or `sum(is.na(y))`. -#' * A vector of length `n`, e.g. `quantile()`. -#' * A data frame, to add multiple columns from a single expression. -#' @family single table verbs -#' @return -#' An object _usually_ of the same type as `.data`. -#' -#' * The rows come from the underlying `group_keys()`. -#' * The columns are a combination of the grouping keys and the summary -#' expressions that you provide. -#' * If `x` is grouped by more than one variable, the output will be another -#' [grouped_df] with the right-most group removed. -#' * If `x` is grouped by one variable, or is not grouped, the output will -#' be a [tibble]. -#' * Data frame attributes are **not** preserved, because `summarise()` -#' fundamentally creates a new data frame. -#' @section Methods: -#' This function is a **generic**, which means that packages can provide -#' implementations (methods) for other classes. See the documentation of -#' individual methods for extra arguments and differences in behaviour. -#' -#' The following methods are currently available in loaded packages: -#' @examples -#' -#' # A summary applied to ungrouped tbl returns a single row -#' -#' mtcars |> -#' summarise(mean = mean(disp)) -#' -#' -#' @rdname summarise-methods #' @name summarise +#' @aliases summarize +#' @inherit dplyr::summarise +#' @family single table verbs #' @importFrom dplyr summarise #' @export -NULL - -#' @inheritParams summarise -#' @export -summarise.tidybulk <- function (.data, ...) -{ +summarise.tidybulk <- function (.data, ...) { .data |> drop_class(c("tidybulk", "tt")) |> dplyr::summarise( ...) |> @@ -467,102 +168,21 @@ summarise.tidybulk <- function (.data, ...) # Add class add_class("tt") |> add_class("tidybulk") - } -#' Create, modify, and delete columns -#' -#' `mutate()` adds new variables and preserves existing ones; -#' `transmute()` adds new variables and drops existing ones. -#' New variables overwrite existing variables of the same name. -#' Variables can be removed by setting their value to `NULL`. -#' -#' @section Useful mutate functions: -#' -#' * [`+`], [`-`], [log()], etc., for their usual mathematical meanings -#' -#' * [lead()], [lag()] -#' -#' * [dense_rank()], [min_rank()], [percent_rank()], [row_number()], -#' [cume_dist()], [ntile()] -#' -#' * [cumsum()], [cummean()], [cummin()], [cummax()], [cumany()], [cumall()] -#' -#' * [na_if()], [coalesce()] -#' -#' * [if_else()], [recode()], [case_when()] -#' -#' @section Grouped tibbles: -#' -#' Because mutating expressions are computed within groups, they may -#' yield different results on grouped tibbles. This will be the case -#' as soon as an aggregating, lagging, or ranking function is -#' involved. Compare this ungrouped mutate: -#' -#' With the grouped equivalent: -#' -#' The former normalises `mass` by the global average whereas the -#' latter normalises by the averages within gender levels. -#' +#' @name summarise +#' @rdname summarise +#' @importFrom dplyr summarize #' @export -#' @param .data A tbl. (See dplyr) -#' @param ... <[`tidy-eval`][dplyr_tidy_eval]> Name-value pairs. -#' The name gives the name of the column in the output. -#' -#' The value can be: -#' -#' * A vector of length 1, which will be recycled to the correct length. -#' * A vector the same length as the current group (or the whole data frame -#' if ungrouped). -#' * `NULL`, to remove the column. -#' * A data frame or tibble, to create multiple columns in the output. -#' -#' @family single table verbs -#' @return -#' An object of the same type as `.data`. -#' -#' For `mutate()`: -#' -#' * Rows are not affected. -#' * Existing columns will be preserved unless explicitly modified. -#' * New columns will be added to the right of existing columns. -#' * Columns given value `NULL` will be removed -#' * Groups will be recomputed if a grouping variable is mutated. -#' * Data frame attributes are preserved. -#' -#' For `transmute()`: -#' -#' * Rows are not affected. -#' * Apart from grouping variables, existing columns will be remove unless -#' explicitly kept. -#' * Column order matches order of expressions. -#' * Groups will be recomputed if a grouping variable is mutated. -#' * Data frame attributes are preserved. -#' @section Methods: -#' These function are **generic**s, which means that packages can provide -#' implementations (methods) for other classes. See the documentation of -#' individual methods for extra arguments and differences in behaviour. -#' -#' Methods available in currently loaded packages: -#' -#' @examples -#' -#' # Newly created variables are available immediately -#' mtcars |> as_tibble() |> mutate( -#' cyl2 = cyl * 2, -#' cyl4 = cyl2 * 2 -#' ) -#' -#' @rdname mutate-methods +summarize.tidybulk <- summarise.tidybulk + #' @name mutate +#' @rdname mutate +#' @inherit dplyr::mutate +#' @family single table verbs #' @importFrom dplyr mutate #' @export -NULL - -#' @inheritParams mutate -#' @export -mutate.tidybulk <- function(.data, ...) -{ +mutate.tidybulk <- function(.data, ...) { .data |> drop_class(c("tidybulk", "tt")) |> dplyr::mutate(...) |> @@ -573,14 +193,12 @@ mutate.tidybulk <- function(.data, ...) # Add class add_class("tt") |> add_class("tidybulk") - - } -#' @inheritParams mutate +#' @inherit dplyr::mutate +#' @importFrom dplyr mutate #' @export -mutate.nested_tidybulk <- function(.data, ...) -{ +mutate.nested_tidybulk <- function(.data, ...) { .data |> drop_class(c("nested_tidybulk", "tt")) |> dplyr::mutate(...) |> @@ -591,52 +209,15 @@ mutate.nested_tidybulk <- function(.data, ...) # Add class add_class("tt") |> add_class("nested_tidybulk") - - } -#' Rename columns -#' -#' Rename individual variables using `new_name = old_name` syntax. -#' -#' @section Scoped selection and renaming: -#' -#' Use the three scoped variants ([rename_all()], [rename_if()], [rename_at()]) -#' to renaming a set of variables with a function. -#' -#' @param .data A tbl. (See dplyr) -#' @param ... <[`tidy-select`][dplyr_tidy_select]> Use `new_name = old_name` -#' to rename selected variables. -#' @return -#' An object of the same type as `.data`. -#' * Rows are not affected. -#' * Column names are changed; column order is preserved -#' * Data frame attributes are preserved. -#' * Groups are updated to reflect new names. -#' @section Methods: -#' This function is a **generic**, which means that packages can provide -#' implementations (methods) for other classes. See the documentation of -#' individual methods for extra arguments and differences in behaviour. -#' -#' The following methods are currently available in loaded packages: -#' @family single table verbs -#' @export -#' -#' @examples -#' -#' iris <- as_tibble(iris) # so it prints a little nicer -#' rename(iris, petal_length = Petal.Length) -#' -#' @rdname rename-methods #' @name rename +#' @rdname rename +#' @inherit dplyr::rename +#' @family single table verbs #' @importFrom dplyr rename #' @export -NULL - -#' @inheritParams rename -#' @export -rename.tidybulk <- function(.data, ...) -{ +rename.tidybulk <- function(.data, ...) { .data |> drop_class(c("tidybulk", "tt")) |> dplyr::rename(...) |> @@ -647,49 +228,14 @@ rename.tidybulk <- function(.data, ...) # Add class add_class("tt") |> add_class("tidybulk") - - } -#' Group input by rows -#' -#' -#' See [this repository](https://github.com/jennybc/row-oriented-workflows) -#' for alternative ways to perform row-wise operations. -#' -#' `rowwise()` is used for the results of [do()] when you -#' create list-variables. It is also useful to support arbitrary -#' complex operations that need to be applied to each row. -#' -#' Currently, rowwise grouping only works with data frames. Its -#' main impact is to allow you to work with list-variables in -#' [summarise()] and [mutate()] without having to -#' use \code{[[1]]}. This makes `summarise()` on a rowwise tbl -#' effectively equivalent to [plyr::ldply()]. -#' -#' @param data Input data frame. -#' @param ... Variables to be preserved when calling summarise(). This is typically a set of variables whose combination uniquely identify each row. NB: unlike group_by() you can not create new variables here but instead you can select multiple variables with (e.g.) everything(). -#' -#' @return A consistent object (to the input) -#' -#' A `tbl` -#' -#' @export -#' @examples -#' -#' df <- expand.grid(x = 1:3, y = 3:1) -#' df_done <- df |> rowwise() -#' -#' @rdname rowwise-methods #' @name rowwise +#' @rdname rowwise +#' @inherit dplyr::rowwise #' @importFrom dplyr rowwise #' @export -NULL - -#' @inheritParams rowwise -#' @export -rowwise.tidybulk <- function(data, ...) -{ +rowwise.tidybulk <- function(data, ...) { data |> drop_class(c("tidybulk", "tt")) |> dplyr::rowwise() |> @@ -700,37 +246,22 @@ rowwise.tidybulk <- function(data, ...) # Add class add_class("tt") |> add_class("tidybulk") - - } -#' Left join datasets -#' -#' @param x tbls to join. (See dplyr) -#' @param y tbls to join. (See dplyr) -#' @param by A character vector of variables to join by. (See dplyr) -#' @param copy If x and y are not from the same data source, and copy is TRUE, then y will be copied into the same src as x. (See dplyr) -#' @param suffix If there are non-joined duplicate variables in x and y, these suffixes will be added to the output to disambiguate them. Should be a character vector of length 2. (See dplyr) -#' @param ... Data frames to combine (See dplyr) -#' -#' @return A tt object -#' +#' @name left_join +#' @rdname left_join +#' @inherit dplyr::left_join +#' #' @examples +#' data(se_mini) +#' annotation <- se_mini |> tidybulk() |> as_tibble() |> +#' distinct(.sample) |> mutate(source = "AU") +#' se_mini |> tidybulk() |> as_tibble() |> left_join(annotation) #' -#' annotation = tidybulk::se_mini |> tidybulk() |> as_tibble() |> distinct(.sample) |> mutate(source = "AU") -#' tidybulk::se_mini |> tidybulk() |> as_tibble() |> left_join(annotation) -#' -#' @rdname dplyr-methods -#' @name left_join #' @importFrom dplyr left_join #' @export -NULL - -#' @inheritParams left_join -#' @export -left_join.tidybulk <- function (x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), - ...) -{ +left_join.tidybulk <- function (x, y, by = NULL, copy = FALSE, + suffix = c(".x", ".y"), ...) { x |> drop_class(c("tidybulk", "tt")) |> dplyr::left_join(y, by = by, copy = copy, suffix = suffix, ...) |> @@ -741,35 +272,22 @@ left_join.tidybulk <- function (x, y, by = NULL, copy = FALSE, suffix = c(".x", # Add class add_class("tt") |> add_class("tidybulk") - } -#' Inner join datasets -#' -#' @param x tbls to join. (See dplyr) -#' @param y tbls to join. (See dplyr) -#' @param by A character vector of variables to join by. (See dplyr) -#' @param copy If x and y are not from the same data source, and copy is TRUE, then y will be copied into the same src as x. (See dplyr) -#' @param suffix If there are non-joined duplicate variables in x and y, these suffixes will be added to the output to disambiguate them. Should be a character vector of length 2. (See dplyr) -#' @param ... Data frames to combine (See dplyr) -#' -#' @return A tt object +#' @name inner_join +#' @rdname inner_join +#' @inherit dplyr::inner_join #' #' @examples -#' -#' annotation = tidybulk::se_mini |> tidybulk() |> as_tibble() |> distinct(.sample) |> mutate(source = "AU") -#' tidybulk::se_mini |> tidybulk() |> as_tibble() |> inner_join(annotation) +#' data(se_mini) +#' annotation <- tidybulk::se_mini |> tidybulk() |> as_tibble() |> +#' distinct(.sample) |> mutate(source = "AU") +#' se_mini |> tidybulk() |> as_tibble() |> inner_join(annotation) #' -#' @rdname join-methods -#' @name inner_join #' @importFrom dplyr inner_join #' @export -NULL - -#' @inheritParams inner_join -#' @export -inner_join.tidybulk <- function (x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) -{ +inner_join.tidybulk <- function (x, y, by = NULL, copy = FALSE, + suffix = c(".x", ".y"), ...) { x |> drop_class(c("tidybulk", "tt")) |> dplyr::inner_join(y, by = by, copy = copy, suffix = suffix, ...) |> @@ -780,36 +298,22 @@ inner_join.tidybulk <- function (x, y, by = NULL, copy = FALSE, suffix = c(".x", # Add class add_class("tt") |> add_class("tidybulk") - } -#' Right join datasets -#' -#' @param x tbls to join. (See dplyr) -#' @param y tbls to join. (See dplyr) -#' @param by A character vector of variables to join by. (See dplyr) -#' @param copy If x and y are not from the same data source, and copy is TRUE, then y will be copied into the same src as x. (See dplyr) -#' @param suffix If there are non-joined duplicate variables in x and y, these suffixes will be added to the output to disambiguate them. Should be a character vector of length 2. (See dplyr) -#' @param ... Data frames to combine (See dplyr) -#' -#' @return A tt object -#' -#' @examples +#' @name right_join +#' @rdname right_join +#' @inherit dplyr::right_join #' -#' annotation = tidybulk::se_mini |> tidybulk() |> as_tibble() |> distinct(.sample) |> mutate(source = "AU") -#' tidybulk::se_mini |> tidybulk() |> as_tibble() |> right_join(annotation) +#' @examples +#' data(se_mini) +#' annotation <- se_mini |> tidybulk() |> as_tibble() |> +#' distinct(.sample) |> mutate(source = "AU") +#' se_mini |> tidybulk() |> as_tibble() |> right_join(annotation) #' -#' @rdname join-methods -#' @name right_join #' @importFrom dplyr right_join #' @export -NULL - -#' @inheritParams right_join -#' @export -right_join.tidybulk <- function (x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), - ...) -{ +right_join.tidybulk <- function (x, y, by = NULL, copy = FALSE, + suffix = c(".x", ".y"), ...) { x |> drop_class(c("tidybulk", "tt")) |> dplyr::right_join(y, by = by, copy = copy, suffix = suffix, ...) |> @@ -820,37 +324,22 @@ right_join.tidybulk <- function (x, y, by = NULL, copy = FALSE, suffix = c(".x", # Add class add_class("tt") |> add_class("tidybulk") - } - -#' Full join datasets -#' -#' @param x tbls to join. (See dplyr) -#' @param y tbls to join. (See dplyr) -#' @param by A character vector of variables to join by. (See dplyr) -#' @param copy If x and y are not from the same data source, and copy is TRUE, then y will be copied into the same src as x. (See dplyr) -#' @param suffix If there are non-joined duplicate variables in x and y, these suffixes will be added to the output to disambiguate them. Should be a character vector of length 2. (See dplyr) -#' @param ... Data frames to combine (See dplyr) -#' -#' @return A tt object +#' @name full_join +#' @rdname full_join +#' @inherit dplyr::full_join #' #' @examples -#' -#' annotation = tidybulk::se_mini |> tidybulk() |> as_tibble() |> distinct(.sample) |> mutate(source = "AU") -#' tidybulk::se_mini |> tidybulk() |> as_tibble() |> full_join(annotation) +#' data(se_mini) +#' annotation <- se_mini |> tidybulk() |> as_tibble() |> +#' distinct(.sample) |> mutate(source = "AU") +#' se_mini |> tidybulk() |> as_tibble() |> full_join(annotation) #' -#' @rdname join-methods -#' @name full_join #' @importFrom dplyr full_join #' @export -NULL - -#' @inheritParams full_join -#' @export -full_join.tidybulk <- function (x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), - ...) -{ +full_join.tidybulk <- function (x, y, by = NULL, copy = FALSE, + suffix = c(".x", ".y"), ...) { x |> drop_class(c("tidybulk", "tt")) |> dplyr::full_join(y, by = by, copy = copy, suffix = suffix, ...) |> @@ -861,9 +350,12 @@ full_join.tidybulk <- function (x, y, by = NULL, copy = FALSE, suffix = c(".x", # Add class add_class("tt") |> add_class("tidybulk") - } #' @importFrom dplyr do #' @export dplyr::do + +#' @importFrom dplyr select +#' @export +dplyr::select diff --git a/R/functions.R b/R/functions.R index 7129b2df..25d127cc 100755 --- a/R/functions.R +++ b/R/functions.R @@ -2170,10 +2170,11 @@ get_reduced_dimensions_TSNE_bulk <- } # Set perprexity to not be too high - if (!"perplexity" %in% names(arguments)) - arguments = arguments %>% c(perplexity = (( - .data %>% distinct(!!.element) %>% nrow() %>% sum(-1) - ) / 3 / 2) %>% floor() %>% min(30)) + if (!"perplexity" %in% names(arguments)) { + perplexity_value <- (ncol(.data) - 1 / 3 / 2) + perplexity_value <- pmin(floor(perplexity_value), 30) + arguments$perplexity <- perplexity_value + } # If not enough samples stop if (arguments$perplexity <= 2) diff --git a/R/functions_SE.R b/R/functions_SE.R index fcee85d0..e275e5e0 100755 --- a/R/functions_SE.R +++ b/R/functions_SE.R @@ -360,10 +360,11 @@ get_reduced_dimensions_TSNE_bulk_SE <- } # Set perprexity to not be too high - if (!"perplexity" %in% names(arguments)) - arguments = arguments %>% c(perplexity = (( - .data %>% ncol() %>% sum(-1) - ) / 3 / 2) %>% floor() %>% min(30)) + if (!"perplexity" %in% names(arguments)) { + perplexity_value <- (ncol(.data) - 1 / 3 / 2) + perplexity_value <- pmin(floor(perplexity_value), 30) + arguments$perplexity <- perplexity_value + } # If not enough samples stop if (arguments$perplexity <= 2) @@ -372,8 +373,6 @@ get_reduced_dimensions_TSNE_bulk_SE <- # Calculate the most variable genes, from plotMDS Limma tsne_obj = do.call(Rtsne::Rtsne, c(list(t(.data)), arguments)) - - list( raw_result = tsne_obj, result = tsne_obj %$% diff --git a/R/methods.R b/R/methods.R index e06b5ad4..d82fec6a 100755 --- a/R/methods.R +++ b/R/methods.R @@ -4,7 +4,10 @@ setOldClass("tidybulk") #' #' `r lifecycle::badge("maturing")` #' -#' @description tidybulk() creates an annotated `tidybulk` tibble from a `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @description tidybulk() creates an annotated `tidybulk` tibble from a `tbl` +#' (with at least three columns for sample, feature and transcript abundance) +#' or `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) #' #' @importFrom rlang enquo #' @importFrom rlang quo_is_missing @@ -1271,7 +1274,9 @@ setMethod("reduce_dimensions", "tidybulk", .reduce_dimensions) #' #' `r lifecycle::badge("maturing")` #' -#' @description rotate_dimensions() takes as input a `tbl` formatted as | | | <...> | and calculates the rotated dimensional space of the transcript abundance. +#' @description rotate_dimensions() takes as input a `tbl` formatted as +#' | | | <...> | and calculates the rotated +#' dimensional space of the transcript abundance. #' #' @importFrom rlang enquo #' @importFrom magrittr "%>%" @@ -1313,7 +1318,9 @@ setMethod("reduce_dimensions", "tidybulk", .reduce_dimensions) #' identify_abundant() |> #' reduce_dimensions( method="MDS", .dims = 3) #' -#' counts.MDS.rotated = rotate_dimensions(counts.MDS, `Dim1`, `Dim2`, rotation_degrees = 45, .element = sample) +#' counts.MDS.rotated = rotate_dimensions(counts.MDS, `Dim1`, `Dim2`, +#' rotation_degrees = 45, +#' .element = sample) #' #' #' @docType methods @@ -1667,7 +1674,12 @@ setMethod("remove_redundancy", "tidybulk", .remove_redundancy) #' #' `r lifecycle::badge("maturing")` #' -#' @description adjust_abundance() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with an additional adjusted abundance column. This method uses scaled counts if present. +#' @description adjust_abundance() takes as input A `tbl` +#' (with at least three columns for sample, feature and transcript abundance) +#' or `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a consistent object +#' (to the input) with an additional adjusted abundance column. +#' This method uses scaled counts if present. #' #' @importFrom rlang enquo #' @importFrom magrittr "%>%" @@ -1711,7 +1723,9 @@ setMethod("remove_redundancy", "tidybulk", .remove_redundancy) #' #' cm |> #' identify_abundant() |> -#' adjust_abundance( .factor_unwanted = batch, .factor_of_interest = condition, method="combat" ) +#' adjust_abundance(.factor_unwanted = batch, +#' .factor_of_interest = condition, +#' method="combat") #' #' #' @docType methods @@ -1776,7 +1790,8 @@ setGeneric("adjust_abundance", function(.data, if (is_present(log_transform) & !is.null(log_transform)) { # Signal the deprecation to the user - deprecate_warn("1.7.4", "tidybulk::test_differential_abundance(log_transform = )", details = "The argument log_transform is now deprecated, please use transform.") + deprecate_warn("1.7.4", "tidybulk::test_differential_abundance(log_transform = )", + details = "The argument log_transform is now deprecated, please use transform.") if(log_transform){ transform = log1p @@ -2257,8 +2272,9 @@ setMethod("deconvolve_cellularity", #' #' # This function was designed for data.frame #' # Convert from SummarizedExperiment for this example. It is NOT reccomended. -#' -#' tidybulk::se_mini |> tidybulk() |> as_tibble() |> symbol_to_entrez(.transcript = .feature, .sample = .sample) +#' data(se_mini) +#' se_mini |> tidybulk() |> as_tibble() |> +#' symbol_to_entrez(.transcript = .feature, .sample = .sample) #' #' @export #' @@ -3429,7 +3445,10 @@ setMethod("keep_abundant", "tidybulk", .keep_abundant) #' #' `r lifecycle::badge("maturing")` #' -#' @description test_gene_enrichment() takes as input a `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a `tbl` of gene set information +#' @description test_gene_enrichment() takes as input a `tbl` +#' (with at least three columns for sample, feature and transcript abundance) +#' or `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a `tbl` of gene set information #' #' @importFrom rlang enquo #' @importFrom magrittr "%>%" @@ -3453,7 +3472,7 @@ setMethod("keep_abundant", "tidybulk", .keep_abundant) #' @details This wrapper executes ensemble gene enrichment analyses of the dataset using EGSEA (DOI:0.12688/f1000research.12544.1) #' #' -#' dge = +#' dge <- #' data |> #' keep_abundant( #' factor_of_interest = !!as.symbol(parse_formula(.formula)[[1]]), @@ -3465,11 +3484,11 @@ setMethod("keep_abundant", "tidybulk", .keep_abundant) #' as_matrix(rownames = !!.entrez) %>% #' edgeR::DGEList(counts = .) #' -#' idx = buildIdx(entrezIDs = rownames(dge), species = species, msigdb.gsets = msigdb.gsets, +#' idx <- buildIdx(entrezIDs = rownames(dge), species = species, +#' msigdb.gsets = msigdb.gsets, #' kegg.exclude = kegg.exclude) #' #' dge |> -#' #' # Calculate weights #' limma::voom(design, plot = FALSE) |> #' @@ -3484,17 +3503,15 @@ setMethod("keep_abundant", "tidybulk", .keep_abundant) #' ) #' #' @return A consistent object (to the input) -#' -#' -#' + #' #' @examples #' \dontrun{ #' #' library(SummarizedExperiment) -#' se = tidybulk::se_mini -#' rowData( se)$entrez = rownames(se ) -#' df_entrez = aggregate_duplicates(se,.transcript = entrez ) +#' se <- tidybulk::se_mini +#' rowData(se)$entrez <- rownames(se) +#' df_entrez <- aggregate_duplicates(se, .transcript = entrez) #' #' library("EGSEA") #' @@ -3504,8 +3521,10 @@ setMethod("keep_abundant", "tidybulk", .keep_abundant) #' .sample = sample, #' .entrez = entrez, #' .abundance = count, -#' methods = c("roast" , "safe", "gage" , "padog" , "globaltest", "ora" ), -#' gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "kegg_disease", "kegg_metabolism", "kegg_signaling"), +#' methods = c("roast", "safe", "gage", +#' "padog", "globaltest", "ora"), +#' gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", +#' "kegg_disease", "kegg_metabolism", "kegg_signaling"), #' species="human", #' cores = 2 #' ) @@ -3517,40 +3536,47 @@ setMethod("keep_abundant", "tidybulk", .keep_abundant) #' @export #' #' -setGeneric("test_gene_enrichment", function(.data, - .formula, - .sample = NULL, - .entrez, - .abundance = NULL, - contrasts = NULL, - methods = c("camera" , "roast" , "safe", "gage" , "padog" , "globaltest", "ora" ), - gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "kegg_disease", "kegg_metabolism", "kegg_signaling"), - species, - cores = 10, - - # DEPRECATED - method = NULL, - .contrasts = NULL - ) - standardGeneric("test_gene_enrichment")) +setGeneric("test_gene_enrichment", function( + .data, + .formula, + .sample = NULL, + .entrez, + .abundance = NULL, + contrasts = NULL, + methods = c("camera", "roast", "safe", "gage", + "padog", "globaltest", "ora"), + gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", + "kegg_disease", "kegg_metabolism", "kegg_signaling"), + species, + cores = 10, + + # DEPRECATED + method = NULL, + .contrasts = NULL) + standardGeneric("test_gene_enrichment") +) + # Set internal #' @importFrom lifecycle deprecate_warn -.test_gene_enrichment = function(.data, - .formula, - .sample = NULL, - .entrez, - .abundance = NULL, - contrasts = NULL, - methods = c("camera" , "roast" , "safe", "gage" , "padog" , "globaltest", "ora" ), - gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "kegg_disease", "kegg_metabolism", "kegg_signaling"), - species, - cores = 10, - - # DEPRECATED - method = NULL, - .contrasts = NULL - ) { +.test_gene_enrichment <- function( + .data, + .formula, + .sample = NULL, + .entrez, + .abundance = NULL, + contrasts = NULL, + methods = c("camera" , "roast" , "safe", "gage", + "padog", "globaltest", "ora" ), + gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", + "kegg_disease", "kegg_metabolism", "kegg_signaling"), + species, + cores = 10, + + # DEPRECATED + method = NULL, + .contrasts = NULL +) { # Fix NOTEs . = NULL @@ -3559,7 +3585,8 @@ setGeneric("test_gene_enrichment", function(.data, if (is_present(method) & !is.null(method)) { # Signal the deprecation to the user - deprecate_warn("1.3.2", "tidybulk::test_gene_enrichment(method = )", details = "The argument method is now deprecated please use methods") + deprecate_warn("1.3.2", "tidybulk::test_gene_enrichment(method = )", + details = "The argument method is now deprecated please use methods") methods = method } @@ -3567,7 +3594,8 @@ setGeneric("test_gene_enrichment", function(.data, if (is_present(.contrasts) & !is.null(.contrasts)) { # Signal the deprecation to the user - deprecate_warn("1.7.4", "tidybulk::test_differential_abundance(.contrasts = )", details = "The argument .contrasts is now deprecated please use contrasts (without the dot).") + deprecate_warn("1.7.4", "tidybulk::test_differential_abundance(.contrasts = )", + details = "The argument .contrasts is now deprecated please use contrasts (without the dot).") contrasts = .contrasts } diff --git a/R/methods_SE.R b/R/methods_SE.R index 7c86345d..cff12cc3 100755 --- a/R/methods_SE.R +++ b/R/methods_SE.R @@ -871,8 +871,7 @@ setMethod("remove_redundancy", get_assay_scaled_if_exists_SE(.data) ) - if(tolower(method) == "combat"){ - + if(tolower(method) == "combat") { my_assay_adjusted = .data |> assay(my_assay) |> # Check if log transform is needed @@ -881,8 +880,8 @@ setMethod("remove_redundancy", `+` (rnorm(length(.), 0, 0.000001)) - for(i in colnames(my_batch)){ - my_assay_adjusted = + for (i in colnames(my_batch)) { + my_assay_adjusted <- my_assay_adjusted %>% # Run combat @@ -895,11 +894,9 @@ setMethod("remove_redundancy", } # Tranfrom back - my_assay_adjusted = + my_assay_adjusted <- my_assay_adjusted %>% - expm1() |> - apply(2, pmax, 0) - + apply(MARGIN=2, FUN=function(col) pmax(expm1(col), 0)) } else if(tolower(method) == "combat_seq"){ @@ -919,16 +916,15 @@ setMethod("remove_redundancy", } } - else if(tolower(method) == "limma_remove_batch_effect") { - - unwanted_covariate_matrix = + else if (tolower(method) == "limma_remove_batch_effect") { + unwanted_covariate_matrix <- model.matrix( object = as.formula(sprintf("~ 0 + %s", colData(.data) |> as_tibble() |> select(!!.factor_unwanted) |> colnames() |> str_c(collapse = '+'))), # get first argument of the .formula data = colData(.data) ) - my_assay_adjusted = + my_assay_adjusted <- .data |> assay(my_assay) |> edgeR::cpm(log = T) |> @@ -937,25 +933,21 @@ setMethod("remove_redundancy", covariates = unwanted_covariate_matrix, ... ) |> - expm1() |> - apply(2, pmax, 0) - + apply(MARGIN=2, FUN=function(col) pmax(expm1(col), 0)) } else { stop("tidybulk says: the argument \"method\" must be combat_seq, combat, or limma_remove_batch_effect") } # Add the assay - my_assay_scaled = list(my_assay_adjusted) %>% setNames(value_adjusted) + my_assay_scaled <- list(my_assay_adjusted) %>% setNames(value_adjusted) - assays(.data) = assays(.data) %>% c(my_assay_scaled) + assays(.data) <- assays(.data) %>% c(my_assay_scaled) # Return .data %>% - # Add methods memorise_methods_used("sva") %>% - # Attach column internals add_tt_columns(.abundance_adjusted = !!(function(x, v) enquo(v))(x, !!as.symbol(value_adjusted))) diff --git a/R/tidyr_methods.R b/R/tidyr_methods.R index 0065c08d..7a6dfa8b 100755 --- a/R/tidyr_methods.R +++ b/R/tidyr_methods.R @@ -1,62 +1,20 @@ -#' unnest -#' -#' @importFrom tidyr unnest -#' -#' @param data A tbl. (See tidyr) -#' @param cols <[`tidy-select`][tidyr_tidy_select]> Columns to unnest. -#' If you `unnest()` multiple columns, parallel entries must be of -#' compatibble sizes, i.e. they're either equal or length 1 (following the -#' standard tidyverse recycling rules). -#' @param ... <[`tidy-select`][tidyr_tidy_select]> Columns to nest, specified -#' using name-variable pairs of the form `new_col=c(col1, col2, col3)`. -#' The right hand side can be any valid tidy select expression. -#' -#' \Sexpr[results=rd, stage=render]{lifecycle::badge("deprecated")}: -#' previously you could write `df %>% nest(x, y, z)` and `df %>% -#' unnest(x, y, z)`. Convert to `df %>% nest(data=c(x, y, z))`. -#' and `df %>% unnest(c(x, y, z))`. -#' -#' If you previously created new variable in `unnest()` you'll now need to -#' do it explicitly with `mutate()`. Convert `df %>% unnest(y=fun(x, y, z))` -#' to `df %>% mutate(y=fun(x, y, z)) %>% unnest(y)`. -#' @param names_sep If `NULL`, the default, the names will be left -#' as is. In `nest()`, inner names will come from the former outer names; -#' in `unnest()`, the new outer names will come from the inner names. -#' -#' If a string, the inner and outer names will be used together. In `nest()`, -#' the names of the new outer columns will be formed by pasting together the -#' outer and the inner column names, separated by `names_sep`. In `unnest()`, -#' the new inner names will have the outer names (+ `names_sep`) automatically -#' stripped. This makes `names_sep` roughly symmetric between nesting and unnesting. -#' @param keep_empty See tidyr::unnest -#' @param names_repair See tidyr::unnest -#' @param ptype See tidyr::unnest -#' @param .drop See tidyr::unnest -#' @param .id tidyr::unnest -#' @param .sep tidyr::unnest -#' @param .preserve See tidyr::unnest -#' -#' -#' @return A tidySummarizedExperiment objector a tibble depending on input +#' @name unnest +#' @rdname unnest +#' @inherit tidyr::unnest +#' @return `tidySingleCellExperiment` #' #' @examples +#' data(se_mini) +#' se_mini |> tidybulk() |> nest( data = -.feature) |> unnest(data) #' -#' -#' tidybulk::se_mini |> tidybulk() |> nest( data = -.feature) |> unnest(data) -#' -#' @rdname nest-methods -#' @name unnest -#' -#' @export -NULL - +#' @importFrom tidyr unnest +#' @importFrom rlang enquo #' @export -unnest.nested_tidybulk <- function (data, cols, ..., keep_empty=FALSE, ptype=NULL, names_sep=NULL, names_repair="check_unique", .drop, .id, .sep, .preserve) -{ +unnest.nested_tidybulk <- function (data, cols, ..., keep_empty=FALSE, + ptype=NULL, names_sep=NULL, names_repair="check_unique", + .drop, .id, .sep, .preserve) { cols <- enquo(cols) - - data %>% drop_class(c("nested_tidybulk", "tt")) %>% tidyr::unnest(!!cols, ..., keep_empty = keep_empty, ptype = ptype, @@ -68,41 +26,24 @@ unnest.nested_tidybulk <- function (data, cols, ..., keep_empty=FALSE, ptype=NUL # Add class add_class("tt") %>% add_class("tidybulk") - } -#' nest -#' -#' @importFrom tidyr nest -#' -#' @param .data A tbl. (See tidyr) -#' @param ... Name-variable pairs of the form new_col = c(col1, col2, col3) (See tidyr) -#' -#' @return A tt object -#' -#' @examples -#' -#' tidybulk::se_mini %>% tidybulk() %>% nest( data = -.feature) -#' -#' @rdname nest-methods #' @name nest +#' @rdname nest +#' @inherit tidyr::nest #' -#' @export -NULL - -#' @importFrom rlang enquos +#' @examples +#' data(se_mini) +#' se_mini %>% tidybulk() %>% nest(data = -.feature) #' +#' @importFrom tidyr nest +#' @importFrom rlang enquo #' @export -#' -#' -#' -nest.tidybulk <- function (.data, ..., .names_sep = NULL) -{ +nest.tidybulk <- function (.data, ..., .names_sep = NULL) { cols <- enquos(...) col_name_data = names(cols) .data %>% - # This is needed otherwise nest goes into loop and fails drop_class(c("tidybulk", "tt")) %>% tidyr::nest(...) %>% @@ -121,5 +62,4 @@ nest.tidybulk <- function (.data, ..., .names_sep = NULL) # Add class add_class("tt") %>% add_class("nested_tidybulk") - } diff --git a/R/zzz.R b/R/zzz.R index cfa9fcb7..170b9430 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -3,24 +3,25 @@ version = packageDescription(pkgname, fields = "Version") msg = paste0("======================================== -", pkgname, " version ", version, " -If you use TIDYBULK in published research, please cite: - -Mangiola et al. tidybulk: an R tidy framework for modular -transcriptomic data analysis. Genome Biology 2021. - -This message can be suppressed by: - suppressPackageStartupMessages(library(tidybulk)) -======================================== -") + ", pkgname, " version ", version, " + If you use TIDYBULK in published research, please cite: + + Mangiola et al. tidybulk: an R tidy framework for modular + transcriptomic data analysis. Genome Biology 2021. + + This message can be suppressed by: + suppressPackageStartupMessages(library(tidybulk)) + ======================================== + ") - packageStartupMessage(msg) + # Attach tidyverse + attached <- tidyverse_attach() } -rv = R.Version() - -if(getRversion() >= "4.0.0" && as.numeric(rv$`svn rev`) >= 77889) { - unitType = get("unitType", envir = asNamespace("grid")) -} else { - unitType = function(x, recurse = TRUE) attr(x, "unit") -} \ No newline at end of file +# rv = R.Version() +# +# if(getRversion() >= "4.0.0" && as.numeric(rv$`svn rev`) >= 77889) { +# unitType = get("unitType", envir = asNamespace("grid")) +# } else { +# unitType = function(x, recurse = TRUE) attr(x, "unit") +# } \ No newline at end of file diff --git a/man/adjust_abundance-methods.Rd b/man/adjust_abundance-methods.Rd index 8ee70a84..7eac35aa 100644 --- a/man/adjust_abundance-methods.Rd +++ b/man/adjust_abundance-methods.Rd @@ -147,7 +147,12 @@ A `SummarizedExperiment` object A `SummarizedExperiment` object } \description{ -adjust_abundance() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with an additional adjusted abundance column. This method uses scaled counts if present. +adjust_abundance() takes as input A `tbl` +(with at least three columns for sample, feature and transcript abundance) +or `SummarizedExperiment` (more convenient if abstracted to tibble with +library(tidySummarizedExperiment)) and returns a consistent object +(to the input) with an additional adjusted abundance column. +This method uses scaled counts if present. } \details{ `r lifecycle::badge("maturing")` @@ -168,7 +173,9 @@ cm$batch[colnames(cm) \%in\% c("SRR1740035", "SRR1740043")] = 1 cm |> identify_abundant() |> -adjust_abundance( .factor_unwanted = batch, .factor_of_interest = condition, method="combat" ) +adjust_abundance(.factor_unwanted = batch, + .factor_of_interest = condition, + method="combat") } diff --git a/man/arrange-methods.Rd b/man/arrange-methods.Rd deleted file mode 100644 index 477fb465..00000000 --- a/man/arrange-methods.Rd +++ /dev/null @@ -1,66 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/dplyr_methods.R -\name{arrange} -\alias{arrange} -\title{Arrange rows by column values} -\arguments{ -\item{.data}{A data frame, data frame extension (e.g. a tibble), or a -lazy data frame (e.g. from dbplyr or dtplyr). See *Methods*, below, for -more details.} - -\item{...}{<[`tidy-eval`][dplyr_tidy_eval]> Variables, or functions or -variables. Use [desc()] to sort a variable in descending order.} - -\item{.by_group}{If TRUE, will sort first by grouping variable. Applies to grouped data frames only.} -} -\value{ -An object of the same type as `.data`. - -* All rows appear in the output, but (usually) in a different place. -* Columns are not modified. -* Groups are not modified. -* Data frame attributes are preserved. - -A tibble -} -\description{ -`arrange()` order the rows of a data frame rows by the values of selected -columns. - -Unlike other dplyr verbs, `arrange()` largely ignores grouping; you -need to explicit mention grouping variables (or use `by_group = TRUE`) -in order to group by them, and functions of variables are evaluated -once per data frame, not once per group. -} -\details{ -## Locales -The sort order for character vectors will depend on the collating sequence -of the locale in use: see [locales()]. - -## Missing values -Unlike base sorting with `sort()`, `NA` are: -* always sorted to the end for local data, even when wrapped with `desc()`. -* treated differently for remote data, depending on the backend. -} -\section{Methods}{ - -This function is a **generic**, which means that packages can provide -implementations (methods) for other classes. See the documentation of -individual methods for extra arguments and differences in behaviour. - -The following methods are currently available in loaded packages: -} - -\examples{ - -arrange(mtcars, cyl, disp) - -} -\seealso{ -Other single table verbs: -\code{\link{filter}()}, -\code{\link{mutate}()}, -\code{\link{rename}()}, -\code{\link{summarise}()} -} -\concept{single table verbs} diff --git a/man/arrange.Rd b/man/arrange.Rd new file mode 100644 index 00000000..58180ef4 --- /dev/null +++ b/man/arrange.Rd @@ -0,0 +1,91 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dplyr_methods.R +\name{arrange} +\alias{arrange} +\alias{arrange.tidybulk} +\title{Order rows using column values} +\usage{ +\method{arrange}{tidybulk}(.data, ..., .by_group = FALSE) +} +\arguments{ +\item{.data}{A data frame, data frame extension (e.g. a tibble), or a +lazy data frame (e.g. from dbplyr or dtplyr). See \emph{Methods}, below, for +more details.} + +\item{...}{<\code{\link[rlang:args_data_masking]{data-masking}}> Variables, or +functions of variables. Use \code{\link[dplyr:desc]{desc()}} to sort a variable in descending +order.} + +\item{.by_group}{If \code{TRUE}, will sort first by grouping variable. Applies to +grouped data frames only.} +} +\value{ +An object of the same type as \code{.data}. The output has the following +properties: +\itemize{ +\item All rows appear in the output, but (usually) in a different place. +\item Columns are not modified. +\item Groups are not modified. +\item Data frame attributes are preserved. +} +} +\description{ +\code{arrange()} orders the rows of a data frame by the values of selected +columns. + +Unlike other dplyr verbs, \code{arrange()} largely ignores grouping; you +need to explicitly mention grouping variables (or use \code{.by_group = TRUE}) +in order to group by them, and functions of variables are evaluated +once per data frame, not once per group. +} +\details{ +\subsection{Missing values}{ + +Unlike base sorting with \code{sort()}, \code{NA} are: +\itemize{ +\item always sorted to the end for local data, even when wrapped with \code{desc()}. +\item treated differently for remote data, depending on the backend. +} +} +} +\section{Methods}{ + + +This function is a \strong{generic}, which means that packages can provide +implementations (methods) for other classes. See the documentation of +individual methods for extra arguments and differences in behaviour. + +The following methods are currently available in loaded packages: +\Sexpr[stage=render,results=rd]{dplyr:::methods_rd("arrange")}. + +} + +\examples{ +arrange(mtcars, cyl, disp) +arrange(mtcars, desc(disp)) + +# grouped arrange ignores groups +by_cyl <- mtcars \%>\% group_by(cyl) +by_cyl \%>\% arrange(desc(wt)) +# Unless you specifically ask: +by_cyl \%>\% arrange(desc(wt), .by_group = TRUE) + +# use embracing when wrapping in a function; +# see ?rlang::args_data_masking for more details +tidy_eval_arrange <- function(.data, var) { + .data \%>\% + arrange({{ var }}) +} +tidy_eval_arrange(mtcars, mpg) + +# Use `across()` or `pick()` to select columns with tidy-select +iris \%>\% arrange(pick(starts_with("Sepal"))) +iris \%>\% arrange(across(starts_with("Sepal"), desc)) +} +\seealso{ +Other single table verbs: +\code{\link{mutate}()}, +\code{\link{rename}()}, +\code{\link{summarise}()} +} +\concept{single table verbs} diff --git a/man/bind_rows.Rd b/man/bind_rows.Rd index b98c804e..a2c3110d 100644 --- a/man/bind_rows.Rd +++ b/man/bind_rows.Rd @@ -2,7 +2,15 @@ % Please edit documentation in R/dplyr_methods.R \name{bind_rows} \alias{bind_rows} -\title{Efficiently bind multiple data frames by row and column} +\alias{bind_rows.tidybulk} +\alias{bind_cols.tidybulk} +\alias{bind_cols} +\title{#' Efficiently bind multiple data frames by row and column} +\usage{ +\method{bind_rows}{tidybulk}(..., .id = NULL) + +\method{bind_cols}{tidybulk}(..., .id = NULL) +} \arguments{ \item{...}{Data frames to combine. @@ -24,29 +32,37 @@ list of data frames is supplied, the labels are taken from the names of the list. If no names are found a numeric sequence is used instead.} - -\item{add.cell.ids}{from Seurat 3.0 A character vector of length(x = c(x, y)). Appends the corresponding values to the start of each objects' cell names.} } \value{ +`bind_rows()` and `bind_cols()` return the same type as + the first input, either a data frame, `tbl_df`, or `grouped_df`. + `bind_rows()` and `bind_cols()` return the same type as the first input, either a data frame, `tbl_df`, or `grouped_df`. } \description{ +This is an efficient implementation of the common pattern of +`do.call(rbind, dfs)` or `do.call(cbind, dfs)` for binding many +data frames into one. + This is an efficient implementation of the common pattern of `do.call(rbind, dfs)` or `do.call(cbind, dfs)` for binding many data frames into one. } \details{ +The output of `bind_rows()` will contain a column if that column +appears in any of the inputs. + The output of `bind_rows()` will contain a column if that column appears in any of the inputs. } \examples{ data(se_mini) -se_mini_tidybulk = se_mini |> tidybulk() -bind_rows( se_mini_tidybulk, se_mini_tidybulk ) +se_mini_tidybulk <- se_mini |> tidybulk() +bind_rows(se_mini_tidybulk, se_mini_tidybulk) -tt_bind = se_mini_tidybulk |> select(time, condition) +tt_bind <- se_mini_tidybulk |> select(time, condition) se_mini_tidybulk |> bind_cols(tt_bind) } diff --git a/man/distinct-methods.Rd b/man/distinct-methods.Rd deleted file mode 100644 index 6bf62635..00000000 --- a/man/distinct-methods.Rd +++ /dev/null @@ -1,24 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/dplyr_methods.R -\name{distinct} -\alias{distinct} -\title{distinct} -\arguments{ -\item{.data}{A tbl. (See dplyr)} - -\item{...}{Data frames to combine (See dplyr)} - -\item{.keep_all}{If TRUE, keep all variables in .data. If a combination of ... is not distinct, this keeps the first row of values. (See dplyr)} -} -\value{ -A tt object -} -\description{ -distinct -} -\examples{ - -tidybulk::se_mini |> tidybulk() |> distinct() - - -} diff --git a/man/distinct.Rd b/man/distinct.Rd new file mode 100644 index 00000000..b362a370 --- /dev/null +++ b/man/distinct.Rd @@ -0,0 +1,55 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dplyr_methods.R +\name{distinct} +\alias{distinct} +\alias{distinct.tidybulk} +\title{Keep distinct/unique rows} +\usage{ +\method{distinct}{tidybulk}(.data, ..., .keep_all = FALSE) +} +\arguments{ +\item{.data}{A data frame, data frame extension (e.g. a tibble), or a +lazy data frame (e.g. from dbplyr or dtplyr). See \emph{Methods}, below, for +more details.} + +\item{...}{<\code{\link[rlang:args_data_masking]{data-masking}}> Optional variables to +use when determining uniqueness. If there are multiple rows for a given +combination of inputs, only the first row will be preserved. If omitted, +will use all variables in the data frame.} + +\item{.keep_all}{If \code{TRUE}, keep all variables in \code{.data}. +If a combination of \code{...} is not distinct, this keeps the +first row of values.} +} +\value{ +An object of the same type as \code{.data}. The output has the following +properties: +\itemize{ +\item Rows are a subset of the input but appear in the same order. +\item Columns are not modified if \code{...} is empty or \code{.keep_all} is \code{TRUE}. +Otherwise, \code{distinct()} first calls \code{mutate()} to create new columns. +\item Groups are not modified. +\item Data frame attributes are preserved. +} +} +\description{ +Keep only unique/distinct rows from a data frame. This is similar +to \code{\link[=unique.data.frame]{unique.data.frame()}} but considerably faster. +} +\section{Methods}{ + + +This function is a \strong{generic}, which means that packages can provide +implementations (methods) for other classes. See the documentation of +individual methods for extra arguments and differences in behaviour. + +The following methods are currently available in loaded packages: +\Sexpr[stage=render,results=rd]{dplyr:::methods_rd("distinct")}. + +} + +\examples{ +data(se_mini) +se_mini |> tidybulk() |> distinct() + +} diff --git a/man/dplyr-methods.Rd b/man/dplyr-methods.Rd deleted file mode 100644 index fbdf8de4..00000000 --- a/man/dplyr-methods.Rd +++ /dev/null @@ -1,31 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/dplyr_methods.R -\name{bind_cols} -\alias{bind_cols} -\alias{left_join} -\title{Left join datasets} -\arguments{ -\item{x}{tbls to join. (See dplyr)} - -\item{y}{tbls to join. (See dplyr)} - -\item{by}{A character vector of variables to join by. (See dplyr)} - -\item{copy}{If x and y are not from the same data source, and copy is TRUE, then y will be copied into the same src as x. (See dplyr)} - -\item{suffix}{If there are non-joined duplicate variables in x and y, these suffixes will be added to the output to disambiguate them. Should be a character vector of length 2. (See dplyr)} - -\item{...}{Data frames to combine (See dplyr)} -} -\value{ -A tt object -} -\description{ -Left join datasets -} -\examples{ - -annotation = tidybulk::se_mini |> tidybulk() |> as_tibble() |> distinct(.sample) |> mutate(source = "AU") -tidybulk::se_mini |> tidybulk() |> as_tibble() |> left_join(annotation) - -} diff --git a/man/filter-methods.Rd b/man/filter-methods.Rd deleted file mode 100644 index c9a6c68b..00000000 --- a/man/filter-methods.Rd +++ /dev/null @@ -1,85 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/dplyr_methods.R -\name{filter} -\alias{filter} -\title{Subset rows using column values} -\arguments{ -\item{.data}{A tbl. (See dplyr)} - -\item{...}{<[`tidy-eval`][dplyr_tidy_eval]> Logical predicates defined in -terms of the variables in `.data`. -Multiple conditions are combined with `&`. Only rows where the -condition evaluates to `TRUE` are kept.} - -\item{.preserve}{when `FALSE` (the default), the grouping structure -is recalculated based on the resulting data, otherwise it is kept as is.} -} -\value{ -An object of the same type as `.data`. - -* Rows are a subset of the input, but appear in the same order. -* Columns are not modified. -* The number of groups may be reduced (if `.preserve` is not `TRUE`). -* Data frame attributes are preserved. -} -\description{ -`filter()` retains the rows where the conditions you provide a `TRUE`. Note -that, unlike base subsetting with `[`, rows where the condition evaluates -to `NA` are dropped. -} -\details{ -dplyr is not yet smart enough to optimise filtering optimisation -on grouped datasets that don't need grouped calculations. For this reason, -filtering is often considerably faster on [ungroup()]ed data. -} -\section{Useful filter functions}{ - - -* [`==`], [`>`], [`>=`] etc -* [`&`], [`|`], [`!`], [xor()] -* [is.na()] -* [between()], [near()] -} - -\section{Grouped tibbles}{ - - -Because filtering expressions are computed within groups, they may -yield different results on grouped tibbles. This will be the case -as soon as an aggregating, lagging, or ranking function is -involved. Compare this ungrouped filtering: - - -The former keeps rows with `mass` greater than the global average -whereas the latter keeps rows with `mass` greater than the gender - -average. -} - -\section{Methods}{ - -This function is a **generic**, which means that packages can provide -implementations (methods) for other classes. See the documentation of -individual methods for extra arguments and differences in behaviour. - -The following methods are currently available in loaded packages: -} - -\examples{ - -data(se) - -se |> tidybulk() |> filter(dex=="untrt") - -# Learn more in ?dplyr_tidy_eval -} -\seealso{ -[filter_all()], [filter_if()] and [filter_at()]. - -Other single table verbs: -\code{\link{arrange}()}, -\code{\link{mutate}()}, -\code{\link{rename}()}, -\code{\link{summarise}()} -} -\concept{single table verbs} diff --git a/man/filter.Rd b/man/filter.Rd new file mode 100644 index 00000000..7f568a20 --- /dev/null +++ b/man/filter.Rd @@ -0,0 +1,116 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dplyr_methods.R +\name{filter} +\alias{filter} +\alias{filter.tidybulk} +\title{Keep rows that match a condition} +\usage{ +\method{filter}{tidybulk}(.data, ..., .preserve = FALSE) +} +\arguments{ +\item{.data}{A data frame, data frame extension (e.g. a tibble), or a +lazy data frame (e.g. from dbplyr or dtplyr). See \emph{Methods}, below, for +more details.} + +\item{...}{<\code{\link[rlang:args_data_masking]{data-masking}}> Expressions that +return a logical value, and are defined in terms of the variables in +\code{.data}. If multiple expressions are included, they are combined with the +\code{&} operator. Only rows for which all conditions evaluate to \code{TRUE} are +kept.} + +\item{.preserve}{Relevant when the \code{.data} input is grouped. +If \code{.preserve = FALSE} (the default), the grouping structure +is recalculated based on the resulting data, otherwise the grouping is kept as is.} +} +\value{ +An object of the same type as \code{.data}. The output has the following properties: +\itemize{ +\item Rows are a subset of the input, but appear in the same order. +\item Columns are not modified. +\item The number of groups may be reduced (if \code{.preserve} is not \code{TRUE}). +\item Data frame attributes are preserved. +} +} +\description{ +The \code{filter()} function is used to subset a data frame, +retaining all rows that satisfy your conditions. +To be retained, the row must produce a value of \code{TRUE} for all conditions. +Note that when a condition evaluates to \code{NA} +the row will be dropped, unlike base subsetting with \code{[}. +} +\details{ +The \code{filter()} function is used to subset the rows of +\code{.data}, applying the expressions in \code{...} to the column values to determine which +rows should be retained. It can be applied to both grouped and ungrouped data (see \code{\link[dplyr:group_by]{group_by()}} and +\code{\link[dplyr:ungroup]{ungroup()}}). However, dplyr is not yet smart enough to optimise the filtering +operation on grouped datasets that do not need grouped calculations. For this +reason, filtering is often considerably faster on ungrouped data. +} +\section{Useful filter functions}{ + + + +There are many functions and operators that are useful when constructing the +expressions used to filter the data: +\itemize{ +\item \code{\link{==}}, \code{\link{>}}, \code{\link{>=}} etc +\item \code{\link{&}}, \code{\link{|}}, \code{\link{!}}, \code{\link[=xor]{xor()}} +\item \code{\link[=is.na]{is.na()}} +\item \code{\link[dplyr:between]{between()}}, \code{\link[dplyr:near]{near()}} +} + +} + +\section{Grouped tibbles}{ + + + +Because filtering expressions are computed within groups, they may +yield different results on grouped tibbles. This will be the case +as soon as an aggregating, lagging, or ranking function is +involved. Compare this ungrouped filtering: + +\if{html}{\out{
}}\preformatted{starwars \%>\% filter(mass > mean(mass, na.rm = TRUE)) +}\if{html}{\out{
}} + +With the grouped equivalent: + +\if{html}{\out{
}}\preformatted{starwars \%>\% group_by(gender) \%>\% filter(mass > mean(mass, na.rm = TRUE)) +}\if{html}{\out{
}} + +In the ungrouped version, \code{filter()} compares the value of \code{mass} in each row to +the global average (taken over the whole data set), keeping only the rows with +\code{mass} greater than this global average. In contrast, the grouped version calculates +the average mass separately for each \code{gender} group, and keeps rows with \code{mass} greater +than the relevant within-gender average. + +} + +\section{Methods}{ + + +This function is a \strong{generic}, which means that packages can provide +implementations (methods) for other classes. See the documentation of +individual methods for extra arguments and differences in behaviour. + +The following methods are currently available in loaded packages: +\Sexpr[stage=render,results=rd]{dplyr:::methods_rd("filter")}. + +} + +\examples{ +data(se) +se |> tidybulk() |> filter(dex=="untrt") +# Learn more in ?dplyr_tidy_eval + +} +\seealso{ +Other single table verbs: +\code{\link[dplyr]{arrange}()}, +\code{\link[dplyr]{mutate}()}, +\code{\link[dplyr]{reframe}()}, +\code{\link[dplyr]{rename}()}, +\code{\link[dplyr]{select}()}, +\code{\link[dplyr]{slice}()}, +\code{\link[dplyr]{summarise}()} +} diff --git a/man/full_join.Rd b/man/full_join.Rd new file mode 100644 index 00000000..1a60ee82 --- /dev/null +++ b/man/full_join.Rd @@ -0,0 +1,172 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dplyr_methods.R +\name{full_join} +\alias{full_join} +\alias{full_join.tidybulk} +\title{Mutating joins} +\usage{ +\method{full_join}{tidybulk}(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) +} +\arguments{ +\item{x, y}{A pair of data frames, data frame extensions (e.g. a tibble), or +lazy data frames (e.g. from dbplyr or dtplyr). See \emph{Methods}, below, for +more details.} + +\item{by}{A join specification created with \code{\link[dplyr:join_by]{join_by()}}, or a character +vector of variables to join by. + +If \code{NULL}, the default, \verb{*_join()} will perform a natural join, using all +variables in common across \code{x} and \code{y}. A message lists the variables so +that you can check they're correct; suppress the message by supplying \code{by} +explicitly. + +To join on different variables between \code{x} and \code{y}, use a \code{\link[dplyr:join_by]{join_by()}} +specification. For example, \code{join_by(a == b)} will match \code{x$a} to \code{y$b}. + +To join by multiple variables, use a \code{\link[dplyr:join_by]{join_by()}} specification with +multiple expressions. For example, \code{join_by(a == b, c == d)} will match +\code{x$a} to \code{y$b} and \code{x$c} to \code{y$d}. If the column names are the same between +\code{x} and \code{y}, you can shorten this by listing only the variable names, like +\code{join_by(a, c)}. + +\code{\link[dplyr:join_by]{join_by()}} can also be used to perform inequality, rolling, and overlap +joins. See the documentation at \link[dplyr:join_by]{?join_by} for details on +these types of joins. + +For simple equality joins, you can alternatively specify a character vector +of variable names to join by. For example, \code{by = c("a", "b")} joins \code{x$a} +to \code{y$a} and \code{x$b} to \code{y$b}. If variable names differ between \code{x} and \code{y}, +use a named character vector like \code{by = c("x_a" = "y_a", "x_b" = "y_b")}. + +To perform a cross-join, generating all combinations of \code{x} and \code{y}, see +\code{\link[dplyr:cross_join]{cross_join()}}.} + +\item{copy}{If \code{x} and \code{y} are not from the same data source, +and \code{copy} is \code{TRUE}, then \code{y} will be copied into the +same src as \code{x}. This allows you to join tables across srcs, but +it is a potentially expensive operation so you must opt into it.} + +\item{suffix}{If there are non-joined duplicate variables in \code{x} and +\code{y}, these suffixes will be added to the output to disambiguate them. +Should be a character vector of length 2.} + +\item{...}{Other parameters passed onto methods.} +} +\value{ +An object of the same type as \code{x} (including the same groups). The order of +the rows and columns of \code{x} is preserved as much as possible. The output has +the following properties: +\itemize{ +\item The rows are affect by the join type. +\itemize{ +\item \code{inner_join()} returns matched \code{x} rows. +\item \code{left_join()} returns all \code{x} rows. +\item \code{right_join()} returns matched of \code{x} rows, followed by unmatched \code{y} rows. +\item \code{full_join()} returns all \code{x} rows, followed by unmatched \code{y} rows. +} +\item Output columns include all columns from \code{x} and all non-key columns from +\code{y}. If \code{keep = TRUE}, the key columns from \code{y} are included as well. +\item If non-key columns in \code{x} and \code{y} have the same name, \code{suffix}es are added +to disambiguate. If \code{keep = TRUE} and key columns in \code{x} and \code{y} have +the same name, \code{suffix}es are added to disambiguate these as well. +\item If \code{keep = FALSE}, output columns included in \code{by} are coerced to their +common type between \code{x} and \code{y}. +} +} +\description{ +Mutating joins add columns from \code{y} to \code{x}, matching observations based on +the keys. There are four mutating joins: the inner join, and the three outer +joins. +\subsection{Inner join}{ + +An \code{inner_join()} only keeps observations from \code{x} that have a matching key +in \code{y}. + +The most important property of an inner join is that unmatched rows in either +input are not included in the result. This means that generally inner joins +are not appropriate in most analyses, because it is too easy to lose +observations. +} + +\subsection{Outer joins}{ + +The three outer joins keep observations that appear in at least one of the +data frames: +\itemize{ +\item A \code{left_join()} keeps all observations in \code{x}. +\item A \code{right_join()} keeps all observations in \code{y}. +\item A \code{full_join()} keeps all observations in \code{x} and \code{y}. +} +} +} +\section{Many-to-many relationships}{ + + + +By default, dplyr guards against many-to-many relationships in equality joins +by throwing a warning. These occur when both of the following are true: +\itemize{ +\item A row in \code{x} matches multiple rows in \code{y}. +\item A row in \code{y} matches multiple rows in \code{x}. +} + +This is typically surprising, as most joins involve a relationship of +one-to-one, one-to-many, or many-to-one, and is often the result of an +improperly specified join. Many-to-many relationships are particularly +problematic because they can result in a Cartesian explosion of the number of +rows returned from the join. + +If a many-to-many relationship is expected, silence this warning by +explicitly setting \code{relationship = "many-to-many"}. + +In production code, it is best to preemptively set \code{relationship} to whatever +relationship you expect to exist between the keys of \code{x} and \code{y}, as this +forces an error to occur immediately if the data doesn't align with your +expectations. + +Inequality joins typically result in many-to-many relationships by nature, so +they don't warn on them by default, but you should still take extra care when +specifying an inequality join, because they also have the capability to +return a large number of rows. + +Rolling joins don't warn on many-to-many relationships either, but many +rolling joins follow a many-to-one relationship, so it is often useful to +set \code{relationship = "many-to-one"} to enforce this. + +Note that in SQL, most database providers won't let you specify a +many-to-many relationship between two tables, instead requiring that you +create a third \emph{junction table} that results in two one-to-many relationships +instead. + +} + +\section{Methods}{ + + +These functions are \strong{generic}s, which means that packages can provide +implementations (methods) for other classes. See the documentation of +individual methods for extra arguments and differences in behaviour. + +Methods available in currently loaded packages: +\itemize{ +\item \code{inner_join()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("inner_join")}. +\item \code{left_join()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("left_join")}. +\item \code{right_join()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("right_join")}. +\item \code{full_join()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("full_join")}. +} + +} + +\examples{ +data(se_mini) +annotation <- se_mini |> tidybulk() |> as_tibble() |> + distinct(.sample) |> mutate(source = "AU") +se_mini |> tidybulk() |> as_tibble() |> full_join(annotation) + +} +\seealso{ +Other joins: +\code{\link[dplyr]{cross_join}()}, +\code{\link[dplyr]{filter-joins}}, +\code{\link[dplyr]{nest_join}()} +} diff --git a/man/group_by-methods.Rd b/man/group_by-methods.Rd deleted file mode 100644 index 3fcd8adc..00000000 --- a/man/group_by-methods.Rd +++ /dev/null @@ -1,47 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/dplyr_methods.R -\name{group_by} -\alias{group_by} -\title{Group by one or more variables} -\arguments{ -\item{.data}{A tbl. (See dplyr)} - -\item{...}{In `group_by()`, variables or computations to group by. -In `ungroup()`, variables to remove from the grouping.} - -\item{.add}{When `FALSE`, the default, `group_by()` will - override existing groups. To add to the existing groups, use - `.add = TRUE`. - - This argument was previously called `add`, but that prevented - creating a new grouping variable called `add`, and conflicts with - our naming conventions.} - -\item{.drop}{When `.drop = TRUE`, empty groups are dropped. See [group_by_drop_default()] for -what the default value is for this argument.} -} -\value{ -A [grouped data frame][grouped_df()], unless the combination of `...` and `add` - yields a non empty set of grouping columns, a regular (ungrouped) data frame - otherwise. -} -\description{ -Most data operations are done on groups defined by variables. -`group_by()` takes an existing tbl and converts it into a grouped tbl -where operations are performed "by group". `ungroup()` removes grouping. -} -\section{Methods}{ - -These function are **generic**s, which means that packages can provide -implementations (methods) for other classes. See the documentation of -individual methods for extra arguments and differences in behaviour. - -Methods available in currently loaded packages: -} - -\examples{ - -by_cyl <- mtcars |> group_by(cyl) - -} -\concept{grouping functions} diff --git a/man/group_by.Rd b/man/group_by.Rd new file mode 100644 index 00000000..5ff1f037 --- /dev/null +++ b/man/group_by.Rd @@ -0,0 +1,162 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dplyr_methods.R +\name{group_by} +\alias{group_by} +\alias{group_by.tidybulk} +\title{Group by one or more variables} +\usage{ +\method{group_by}{tidybulk}(.data, ..., .add = FALSE, .drop = group_by_drop_default(.data)) +} +\arguments{ +\item{.data}{A data frame, data frame extension (e.g. a tibble), or a +lazy data frame (e.g. from dbplyr or dtplyr). See \emph{Methods}, below, for +more details.} + +\item{...}{In \code{group_by()}, variables or computations to group by. +Computations are always done on the ungrouped data frame. +To perform computations on the grouped data, you need to use +a separate \code{mutate()} step before the \code{group_by()}. +Computations are not allowed in \code{nest_by()}. +In \code{ungroup()}, variables to remove from the grouping.} + +\item{.add}{When \code{FALSE}, the default, \code{group_by()} will +override existing groups. To add to the existing groups, use +\code{.add = TRUE}. + +This argument was previously called \code{add}, but that prevented +creating a new grouping variable called \code{add}, and conflicts with +our naming conventions.} + +\item{.drop}{Drop groups formed by factor levels that don't appear in the +data? The default is \code{TRUE} except when \code{.data} has been previously +grouped with \code{.drop = FALSE}. See \code{\link[dplyr:group_by_drop_default]{group_by_drop_default()}} for details.} +} +\value{ +A grouped data frame with class \code{\link[dplyr]{grouped_df}}, +unless the combination of \code{...} and \code{add} yields a empty set of +grouping columns, in which case a tibble will be returned. +} +\description{ +Most data operations are done on groups defined by variables. +\code{group_by()} takes an existing tbl and converts it into a grouped tbl +where operations are performed "by group". \code{ungroup()} removes grouping. +} +\section{Methods}{ + + +These function are \strong{generic}s, which means that packages can provide +implementations (methods) for other classes. See the documentation of +individual methods for extra arguments and differences in behaviour. + +Methods available in currently loaded packages: +\itemize{ +\item \code{group_by()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("group_by")}. +\item \code{ungroup()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("ungroup")}. +} + +} + +\section{Ordering}{ + + +Currently, \code{group_by()} internally orders the groups in ascending order. This +results in ordered output from functions that aggregate groups, such as +\code{\link[dplyr:summarise]{summarise()}}. + +When used as grouping columns, character vectors are ordered in the C locale +for performance and reproducibility across R sessions. If the resulting +ordering of your grouped operation matters and is dependent on the locale, +you should follow up the grouped operation with an explicit call to +\code{\link[dplyr:arrange]{arrange()}} and set the \code{.locale} argument. For example: + +\if{html}{\out{
}}\preformatted{data \%>\% + group_by(chr) \%>\% + summarise(avg = mean(x)) \%>\% + arrange(chr, .locale = "en") +}\if{html}{\out{
}} + +This is often useful as a preliminary step before generating content intended +for humans, such as an HTML table. +\subsection{Legacy behavior}{ + +Prior to dplyr 1.1.0, character vector grouping columns were ordered in the +system locale. If you need to temporarily revert to this behavior, you can +set the global option \code{dplyr.legacy_locale} to \code{TRUE}, but this should be +used sparingly and you should expect this option to be removed in a future +version of dplyr. It is better to update existing code to explicitly call +\code{arrange(.locale = )} instead. Note that setting \code{dplyr.legacy_locale} will +also force calls to \code{\link[dplyr:arrange]{arrange()}} to use the system locale. +} + +} + +\examples{ +by_cyl <- mtcars \%>\% group_by(cyl) + +# grouping doesn't change how the data looks (apart from listing +# how it's grouped): +by_cyl + +# It changes how it acts with the other dplyr verbs: +by_cyl \%>\% summarise( + disp = mean(disp), + hp = mean(hp) +) +by_cyl \%>\% filter(disp == max(disp)) + +# Each call to summarise() removes a layer of grouping +by_vs_am <- mtcars \%>\% group_by(vs, am) +by_vs <- by_vs_am \%>\% summarise(n = n()) +by_vs +by_vs \%>\% summarise(n = sum(n)) + +# To removing grouping, use ungroup +by_vs \%>\% + ungroup() \%>\% + summarise(n = sum(n)) + +# By default, group_by() overrides existing grouping +by_cyl \%>\% + group_by(vs, am) \%>\% + group_vars() + +# Use add = TRUE to instead append +by_cyl \%>\% + group_by(vs, am, .add = TRUE) \%>\% + group_vars() + +# You can group by expressions: this is a short-hand +# for a mutate() followed by a group_by() +mtcars \%>\% + group_by(vsam = vs + am) + +# The implicit mutate() step is always performed on the +# ungrouped data. Here we get 3 groups: +mtcars \%>\% + group_by(vs) \%>\% + group_by(hp_cut = cut(hp, 3)) + +# If you want it to be performed by groups, +# you have to use an explicit mutate() call. +# Here we get 3 groups per value of vs +mtcars \%>\% + group_by(vs) \%>\% + mutate(hp_cut = cut(hp, 3)) \%>\% + group_by(hp_cut) + +# when factors are involved and .drop = FALSE, groups can be empty +tbl <- tibble( + x = 1:10, + y = factor(rep(c("a", "c"), each = 5), levels = c("a", "b", "c")) +) +tbl \%>\% + group_by(y, .drop = FALSE) \%>\% + group_rows() +} +\seealso{ +Other grouping functions: +\code{\link[dplyr]{group_map}()}, +\code{\link[dplyr]{group_nest}()}, +\code{\link[dplyr]{group_split}()}, +\code{\link[dplyr]{group_trim}()} +} diff --git a/man/inner_join.Rd b/man/inner_join.Rd new file mode 100644 index 00000000..1556c9f4 --- /dev/null +++ b/man/inner_join.Rd @@ -0,0 +1,172 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dplyr_methods.R +\name{inner_join} +\alias{inner_join} +\alias{inner_join.tidybulk} +\title{Mutating joins} +\usage{ +\method{inner_join}{tidybulk}(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) +} +\arguments{ +\item{x, y}{A pair of data frames, data frame extensions (e.g. a tibble), or +lazy data frames (e.g. from dbplyr or dtplyr). See \emph{Methods}, below, for +more details.} + +\item{by}{A join specification created with \code{\link[dplyr:join_by]{join_by()}}, or a character +vector of variables to join by. + +If \code{NULL}, the default, \verb{*_join()} will perform a natural join, using all +variables in common across \code{x} and \code{y}. A message lists the variables so +that you can check they're correct; suppress the message by supplying \code{by} +explicitly. + +To join on different variables between \code{x} and \code{y}, use a \code{\link[dplyr:join_by]{join_by()}} +specification. For example, \code{join_by(a == b)} will match \code{x$a} to \code{y$b}. + +To join by multiple variables, use a \code{\link[dplyr:join_by]{join_by()}} specification with +multiple expressions. For example, \code{join_by(a == b, c == d)} will match +\code{x$a} to \code{y$b} and \code{x$c} to \code{y$d}. If the column names are the same between +\code{x} and \code{y}, you can shorten this by listing only the variable names, like +\code{join_by(a, c)}. + +\code{\link[dplyr:join_by]{join_by()}} can also be used to perform inequality, rolling, and overlap +joins. See the documentation at \link[dplyr:join_by]{?join_by} for details on +these types of joins. + +For simple equality joins, you can alternatively specify a character vector +of variable names to join by. For example, \code{by = c("a", "b")} joins \code{x$a} +to \code{y$a} and \code{x$b} to \code{y$b}. If variable names differ between \code{x} and \code{y}, +use a named character vector like \code{by = c("x_a" = "y_a", "x_b" = "y_b")}. + +To perform a cross-join, generating all combinations of \code{x} and \code{y}, see +\code{\link[dplyr:cross_join]{cross_join()}}.} + +\item{copy}{If \code{x} and \code{y} are not from the same data source, +and \code{copy} is \code{TRUE}, then \code{y} will be copied into the +same src as \code{x}. This allows you to join tables across srcs, but +it is a potentially expensive operation so you must opt into it.} + +\item{suffix}{If there are non-joined duplicate variables in \code{x} and +\code{y}, these suffixes will be added to the output to disambiguate them. +Should be a character vector of length 2.} + +\item{...}{Other parameters passed onto methods.} +} +\value{ +An object of the same type as \code{x} (including the same groups). The order of +the rows and columns of \code{x} is preserved as much as possible. The output has +the following properties: +\itemize{ +\item The rows are affect by the join type. +\itemize{ +\item \code{inner_join()} returns matched \code{x} rows. +\item \code{left_join()} returns all \code{x} rows. +\item \code{right_join()} returns matched of \code{x} rows, followed by unmatched \code{y} rows. +\item \code{full_join()} returns all \code{x} rows, followed by unmatched \code{y} rows. +} +\item Output columns include all columns from \code{x} and all non-key columns from +\code{y}. If \code{keep = TRUE}, the key columns from \code{y} are included as well. +\item If non-key columns in \code{x} and \code{y} have the same name, \code{suffix}es are added +to disambiguate. If \code{keep = TRUE} and key columns in \code{x} and \code{y} have +the same name, \code{suffix}es are added to disambiguate these as well. +\item If \code{keep = FALSE}, output columns included in \code{by} are coerced to their +common type between \code{x} and \code{y}. +} +} +\description{ +Mutating joins add columns from \code{y} to \code{x}, matching observations based on +the keys. There are four mutating joins: the inner join, and the three outer +joins. +\subsection{Inner join}{ + +An \code{inner_join()} only keeps observations from \code{x} that have a matching key +in \code{y}. + +The most important property of an inner join is that unmatched rows in either +input are not included in the result. This means that generally inner joins +are not appropriate in most analyses, because it is too easy to lose +observations. +} + +\subsection{Outer joins}{ + +The three outer joins keep observations that appear in at least one of the +data frames: +\itemize{ +\item A \code{left_join()} keeps all observations in \code{x}. +\item A \code{right_join()} keeps all observations in \code{y}. +\item A \code{full_join()} keeps all observations in \code{x} and \code{y}. +} +} +} +\section{Many-to-many relationships}{ + + + +By default, dplyr guards against many-to-many relationships in equality joins +by throwing a warning. These occur when both of the following are true: +\itemize{ +\item A row in \code{x} matches multiple rows in \code{y}. +\item A row in \code{y} matches multiple rows in \code{x}. +} + +This is typically surprising, as most joins involve a relationship of +one-to-one, one-to-many, or many-to-one, and is often the result of an +improperly specified join. Many-to-many relationships are particularly +problematic because they can result in a Cartesian explosion of the number of +rows returned from the join. + +If a many-to-many relationship is expected, silence this warning by +explicitly setting \code{relationship = "many-to-many"}. + +In production code, it is best to preemptively set \code{relationship} to whatever +relationship you expect to exist between the keys of \code{x} and \code{y}, as this +forces an error to occur immediately if the data doesn't align with your +expectations. + +Inequality joins typically result in many-to-many relationships by nature, so +they don't warn on them by default, but you should still take extra care when +specifying an inequality join, because they also have the capability to +return a large number of rows. + +Rolling joins don't warn on many-to-many relationships either, but many +rolling joins follow a many-to-one relationship, so it is often useful to +set \code{relationship = "many-to-one"} to enforce this. + +Note that in SQL, most database providers won't let you specify a +many-to-many relationship between two tables, instead requiring that you +create a third \emph{junction table} that results in two one-to-many relationships +instead. + +} + +\section{Methods}{ + + +These functions are \strong{generic}s, which means that packages can provide +implementations (methods) for other classes. See the documentation of +individual methods for extra arguments and differences in behaviour. + +Methods available in currently loaded packages: +\itemize{ +\item \code{inner_join()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("inner_join")}. +\item \code{left_join()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("left_join")}. +\item \code{right_join()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("right_join")}. +\item \code{full_join()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("full_join")}. +} + +} + +\examples{ +data(se_mini) +annotation <- tidybulk::se_mini |> tidybulk() |> as_tibble() |> + distinct(.sample) |> mutate(source = "AU") +se_mini |> tidybulk() |> as_tibble() |> inner_join(annotation) + +} +\seealso{ +Other joins: +\code{\link[dplyr]{cross_join}()}, +\code{\link[dplyr]{filter-joins}}, +\code{\link[dplyr]{nest_join}()} +} diff --git a/man/join-methods.Rd b/man/join-methods.Rd deleted file mode 100644 index 0e4d8ac6..00000000 --- a/man/join-methods.Rd +++ /dev/null @@ -1,48 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/dplyr_methods.R -\name{inner_join} -\alias{inner_join} -\alias{right_join} -\alias{full_join} -\title{Inner join datasets} -\arguments{ -\item{x}{tbls to join. (See dplyr)} - -\item{y}{tbls to join. (See dplyr)} - -\item{by}{A character vector of variables to join by. (See dplyr)} - -\item{copy}{If x and y are not from the same data source, and copy is TRUE, then y will be copied into the same src as x. (See dplyr)} - -\item{suffix}{If there are non-joined duplicate variables in x and y, these suffixes will be added to the output to disambiguate them. Should be a character vector of length 2. (See dplyr)} - -\item{...}{Data frames to combine (See dplyr)} -} -\value{ -A tt object - -A tt object - -A tt object -} -\description{ -Inner join datasets - -Right join datasets - -Full join datasets -} -\examples{ - -annotation = tidybulk::se_mini |> tidybulk() |> as_tibble() |> distinct(.sample) |> mutate(source = "AU") -tidybulk::se_mini |> tidybulk() |> as_tibble() |> inner_join(annotation) - - -annotation = tidybulk::se_mini |> tidybulk() |> as_tibble() |> distinct(.sample) |> mutate(source = "AU") -tidybulk::se_mini |> tidybulk() |> as_tibble() |> right_join(annotation) - - -annotation = tidybulk::se_mini |> tidybulk() |> as_tibble() |> distinct(.sample) |> mutate(source = "AU") -tidybulk::se_mini |> tidybulk() |> as_tibble() |> full_join(annotation) - -} diff --git a/man/left_join.Rd b/man/left_join.Rd new file mode 100644 index 00000000..58657133 --- /dev/null +++ b/man/left_join.Rd @@ -0,0 +1,172 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dplyr_methods.R +\name{left_join} +\alias{left_join} +\alias{left_join.tidybulk} +\title{Mutating joins} +\usage{ +\method{left_join}{tidybulk}(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) +} +\arguments{ +\item{x, y}{A pair of data frames, data frame extensions (e.g. a tibble), or +lazy data frames (e.g. from dbplyr or dtplyr). See \emph{Methods}, below, for +more details.} + +\item{by}{A join specification created with \code{\link[dplyr:join_by]{join_by()}}, or a character +vector of variables to join by. + +If \code{NULL}, the default, \verb{*_join()} will perform a natural join, using all +variables in common across \code{x} and \code{y}. A message lists the variables so +that you can check they're correct; suppress the message by supplying \code{by} +explicitly. + +To join on different variables between \code{x} and \code{y}, use a \code{\link[dplyr:join_by]{join_by()}} +specification. For example, \code{join_by(a == b)} will match \code{x$a} to \code{y$b}. + +To join by multiple variables, use a \code{\link[dplyr:join_by]{join_by()}} specification with +multiple expressions. For example, \code{join_by(a == b, c == d)} will match +\code{x$a} to \code{y$b} and \code{x$c} to \code{y$d}. If the column names are the same between +\code{x} and \code{y}, you can shorten this by listing only the variable names, like +\code{join_by(a, c)}. + +\code{\link[dplyr:join_by]{join_by()}} can also be used to perform inequality, rolling, and overlap +joins. See the documentation at \link[dplyr:join_by]{?join_by} for details on +these types of joins. + +For simple equality joins, you can alternatively specify a character vector +of variable names to join by. For example, \code{by = c("a", "b")} joins \code{x$a} +to \code{y$a} and \code{x$b} to \code{y$b}. If variable names differ between \code{x} and \code{y}, +use a named character vector like \code{by = c("x_a" = "y_a", "x_b" = "y_b")}. + +To perform a cross-join, generating all combinations of \code{x} and \code{y}, see +\code{\link[dplyr:cross_join]{cross_join()}}.} + +\item{copy}{If \code{x} and \code{y} are not from the same data source, +and \code{copy} is \code{TRUE}, then \code{y} will be copied into the +same src as \code{x}. This allows you to join tables across srcs, but +it is a potentially expensive operation so you must opt into it.} + +\item{suffix}{If there are non-joined duplicate variables in \code{x} and +\code{y}, these suffixes will be added to the output to disambiguate them. +Should be a character vector of length 2.} + +\item{...}{Other parameters passed onto methods.} +} +\value{ +An object of the same type as \code{x} (including the same groups). The order of +the rows and columns of \code{x} is preserved as much as possible. The output has +the following properties: +\itemize{ +\item The rows are affect by the join type. +\itemize{ +\item \code{inner_join()} returns matched \code{x} rows. +\item \code{left_join()} returns all \code{x} rows. +\item \code{right_join()} returns matched of \code{x} rows, followed by unmatched \code{y} rows. +\item \code{full_join()} returns all \code{x} rows, followed by unmatched \code{y} rows. +} +\item Output columns include all columns from \code{x} and all non-key columns from +\code{y}. If \code{keep = TRUE}, the key columns from \code{y} are included as well. +\item If non-key columns in \code{x} and \code{y} have the same name, \code{suffix}es are added +to disambiguate. If \code{keep = TRUE} and key columns in \code{x} and \code{y} have +the same name, \code{suffix}es are added to disambiguate these as well. +\item If \code{keep = FALSE}, output columns included in \code{by} are coerced to their +common type between \code{x} and \code{y}. +} +} +\description{ +Mutating joins add columns from \code{y} to \code{x}, matching observations based on +the keys. There are four mutating joins: the inner join, and the three outer +joins. +\subsection{Inner join}{ + +An \code{inner_join()} only keeps observations from \code{x} that have a matching key +in \code{y}. + +The most important property of an inner join is that unmatched rows in either +input are not included in the result. This means that generally inner joins +are not appropriate in most analyses, because it is too easy to lose +observations. +} + +\subsection{Outer joins}{ + +The three outer joins keep observations that appear in at least one of the +data frames: +\itemize{ +\item A \code{left_join()} keeps all observations in \code{x}. +\item A \code{right_join()} keeps all observations in \code{y}. +\item A \code{full_join()} keeps all observations in \code{x} and \code{y}. +} +} +} +\section{Many-to-many relationships}{ + + + +By default, dplyr guards against many-to-many relationships in equality joins +by throwing a warning. These occur when both of the following are true: +\itemize{ +\item A row in \code{x} matches multiple rows in \code{y}. +\item A row in \code{y} matches multiple rows in \code{x}. +} + +This is typically surprising, as most joins involve a relationship of +one-to-one, one-to-many, or many-to-one, and is often the result of an +improperly specified join. Many-to-many relationships are particularly +problematic because they can result in a Cartesian explosion of the number of +rows returned from the join. + +If a many-to-many relationship is expected, silence this warning by +explicitly setting \code{relationship = "many-to-many"}. + +In production code, it is best to preemptively set \code{relationship} to whatever +relationship you expect to exist between the keys of \code{x} and \code{y}, as this +forces an error to occur immediately if the data doesn't align with your +expectations. + +Inequality joins typically result in many-to-many relationships by nature, so +they don't warn on them by default, but you should still take extra care when +specifying an inequality join, because they also have the capability to +return a large number of rows. + +Rolling joins don't warn on many-to-many relationships either, but many +rolling joins follow a many-to-one relationship, so it is often useful to +set \code{relationship = "many-to-one"} to enforce this. + +Note that in SQL, most database providers won't let you specify a +many-to-many relationship between two tables, instead requiring that you +create a third \emph{junction table} that results in two one-to-many relationships +instead. + +} + +\section{Methods}{ + + +These functions are \strong{generic}s, which means that packages can provide +implementations (methods) for other classes. See the documentation of +individual methods for extra arguments and differences in behaviour. + +Methods available in currently loaded packages: +\itemize{ +\item \code{inner_join()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("inner_join")}. +\item \code{left_join()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("left_join")}. +\item \code{right_join()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("right_join")}. +\item \code{full_join()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("full_join")}. +} + +} + +\examples{ +data(se_mini) +annotation <- se_mini |> tidybulk() |> as_tibble() |> + distinct(.sample) |> mutate(source = "AU") +se_mini |> tidybulk() |> as_tibble() |> left_join(annotation) + +} +\seealso{ +Other joins: +\code{\link[dplyr]{cross_join}()}, +\code{\link[dplyr]{filter-joins}}, +\code{\link[dplyr]{nest_join}()} +} diff --git a/man/mutate-methods.Rd b/man/mutate-methods.Rd deleted file mode 100644 index cc79af02..00000000 --- a/man/mutate-methods.Rd +++ /dev/null @@ -1,103 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/dplyr_methods.R -\name{mutate} -\alias{mutate} -\title{Create, modify, and delete columns} -\arguments{ -\item{.data}{A tbl. (See dplyr)} - -\item{...}{<[`tidy-eval`][dplyr_tidy_eval]> Name-value pairs. - The name gives the name of the column in the output. - - The value can be: - - * A vector of length 1, which will be recycled to the correct length. - * A vector the same length as the current group (or the whole data frame - if ungrouped). - * `NULL`, to remove the column. - * A data frame or tibble, to create multiple columns in the output.} -} -\value{ -An object of the same type as `.data`. - -For `mutate()`: - -* Rows are not affected. -* Existing columns will be preserved unless explicitly modified. -* New columns will be added to the right of existing columns. -* Columns given value `NULL` will be removed -* Groups will be recomputed if a grouping variable is mutated. -* Data frame attributes are preserved. - -For `transmute()`: - -* Rows are not affected. -* Apart from grouping variables, existing columns will be remove unless - explicitly kept. -* Column order matches order of expressions. -* Groups will be recomputed if a grouping variable is mutated. -* Data frame attributes are preserved. -} -\description{ -`mutate()` adds new variables and preserves existing ones; -`transmute()` adds new variables and drops existing ones. -New variables overwrite existing variables of the same name. -Variables can be removed by setting their value to `NULL`. -} -\section{Useful mutate functions}{ - - -* [`+`], [`-`], [log()], etc., for their usual mathematical meanings - -* [lead()], [lag()] - -* [dense_rank()], [min_rank()], [percent_rank()], [row_number()], - [cume_dist()], [ntile()] - -* [cumsum()], [cummean()], [cummin()], [cummax()], [cumany()], [cumall()] - -* [na_if()], [coalesce()] - -* [if_else()], [recode()], [case_when()] -} - -\section{Grouped tibbles}{ - - -Because mutating expressions are computed within groups, they may -yield different results on grouped tibbles. This will be the case -as soon as an aggregating, lagging, or ranking function is -involved. Compare this ungrouped mutate: - -With the grouped equivalent: - -The former normalises `mass` by the global average whereas the -latter normalises by the averages within gender levels. -} - -\section{Methods}{ - -These function are **generic**s, which means that packages can provide -implementations (methods) for other classes. See the documentation of -individual methods for extra arguments and differences in behaviour. - -Methods available in currently loaded packages: -} - -\examples{ - -# Newly created variables are available immediately -mtcars |> as_tibble() |> mutate( - cyl2 = cyl * 2, - cyl4 = cyl2 * 2 -) - -} -\seealso{ -Other single table verbs: -\code{\link{arrange}()}, -\code{\link{filter}()}, -\code{\link{rename}()}, -\code{\link{summarise}()} -} -\concept{single table verbs} diff --git a/man/mutate.Rd b/man/mutate.Rd new file mode 100644 index 00000000..b2b48431 --- /dev/null +++ b/man/mutate.Rd @@ -0,0 +1,173 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dplyr_methods.R +\name{mutate} +\alias{mutate} +\alias{mutate.tidybulk} +\title{Create, modify, and delete columns} +\usage{ +\method{mutate}{tidybulk}(.data, ...) +} +\arguments{ +\item{.data}{A data frame, data frame extension (e.g. a tibble), or a +lazy data frame (e.g. from dbplyr or dtplyr). See \emph{Methods}, below, for +more details.} + +\item{...}{<\code{\link[rlang:args_data_masking]{data-masking}}> Name-value pairs. +The name gives the name of the column in the output. + +The value can be: +\itemize{ +\item A vector of length 1, which will be recycled to the correct length. +\item A vector the same length as the current group (or the whole data frame +if ungrouped). +\item \code{NULL}, to remove the column. +\item A data frame or tibble, to create multiple columns in the output. +}} +} +\value{ +An object of the same type as \code{.data}. The output has the following +properties: +\itemize{ +\item Columns from \code{.data} will be preserved according to the \code{.keep} argument. +\item Existing columns that are modified by \code{...} will always be returned in +their original location. +\item New columns created through \code{...} will be placed according to the +\code{.before} and \code{.after} arguments. +\item The number of rows is not affected. +\item Columns given the value \code{NULL} will be removed. +\item Groups will be recomputed if a grouping variable is mutated. +\item Data frame attributes are preserved. +} +} +\description{ +\code{mutate()} creates new columns that are functions of existing variables. +It can also modify (if the name is the same as an existing +column) and delete columns (by setting their value to \code{NULL}). +} +\section{Useful mutate functions}{ + + +\itemize{ +\item \code{\link{+}}, \code{\link{-}}, \code{\link[=log]{log()}}, etc., for their usual mathematical meanings +\item \code{\link[dplyr:lead]{lead()}}, \code{\link[dplyr:lag]{lag()}} +\item \code{\link[dplyr:dense_rank]{dense_rank()}}, \code{\link[dplyr:min_rank]{min_rank()}}, \code{\link[dplyr:percent_rank]{percent_rank()}}, \code{\link[dplyr:row_number]{row_number()}}, +\code{\link[dplyr:cume_dist]{cume_dist()}}, \code{\link[dplyr:ntile]{ntile()}} +\item \code{\link[=cumsum]{cumsum()}}, \code{\link[dplyr:cummean]{cummean()}}, \code{\link[=cummin]{cummin()}}, \code{\link[=cummax]{cummax()}}, \code{\link[dplyr:cumany]{cumany()}}, \code{\link[dplyr:cumall]{cumall()}} +\item \code{\link[dplyr:na_if]{na_if()}}, \code{\link[dplyr:coalesce]{coalesce()}} +\item \code{\link[dplyr:if_else]{if_else()}}, \code{\link[dplyr:recode]{recode()}}, \code{\link[dplyr:case_when]{case_when()}} +} + +} + +\section{Grouped tibbles}{ + + + +Because mutating expressions are computed within groups, they may +yield different results on grouped tibbles. This will be the case +as soon as an aggregating, lagging, or ranking function is +involved. Compare this ungrouped mutate: + +\if{html}{\out{
}}\preformatted{starwars \%>\% + select(name, mass, species) \%>\% + mutate(mass_norm = mass / mean(mass, na.rm = TRUE)) +}\if{html}{\out{
}} + +With the grouped equivalent: + +\if{html}{\out{
}}\preformatted{starwars \%>\% + select(name, mass, species) \%>\% + group_by(species) \%>\% + mutate(mass_norm = mass / mean(mass, na.rm = TRUE)) +}\if{html}{\out{
}} + +The former normalises \code{mass} by the global average whereas the +latter normalises by the averages within species levels. + +} + +\section{Methods}{ + + +This function is a \strong{generic}, which means that packages can provide +implementations (methods) for other classes. See the documentation of +individual methods for extra arguments and differences in behaviour. + +Methods available in currently loaded packages: +\Sexpr[stage=render,results=rd]{dplyr:::methods_rd("mutate")}. + +} + +\examples{ +# Newly created variables are available immediately +starwars \%>\% + select(name, mass) \%>\% + mutate( + mass2 = mass * 2, + mass2_squared = mass2 * mass2 + ) + +# As well as adding new variables, you can use mutate() to +# remove variables and modify existing variables. +starwars \%>\% + select(name, height, mass, homeworld) \%>\% + mutate( + mass = NULL, + height = height * 0.0328084 # convert to feet + ) + +# Use across() with mutate() to apply a transformation +# to multiple columns in a tibble. +starwars \%>\% + select(name, homeworld, species) \%>\% + mutate(across(!name, as.factor)) +# see more in ?across + +# Window functions are useful for grouped mutates: +starwars \%>\% + select(name, mass, homeworld) \%>\% + group_by(homeworld) \%>\% + mutate(rank = min_rank(desc(mass))) +# see `vignette("window-functions")` for more details + +# By default, new columns are placed on the far right. +df <- tibble(x = 1, y = 2) +df \%>\% mutate(z = x + y) +df \%>\% mutate(z = x + y, .before = 1) +df \%>\% mutate(z = x + y, .after = x) + +# By default, mutate() keeps all columns from the input data. +df <- tibble(x = 1, y = 2, a = "a", b = "b") +df \%>\% mutate(z = x + y, .keep = "all") # the default +df \%>\% mutate(z = x + y, .keep = "used") +df \%>\% mutate(z = x + y, .keep = "unused") +df \%>\% mutate(z = x + y, .keep = "none") + +# Grouping ---------------------------------------- +# The mutate operation may yield different results on grouped +# tibbles because the expressions are computed within groups. +# The following normalises `mass` by the global average: +starwars \%>\% + select(name, mass, species) \%>\% + mutate(mass_norm = mass / mean(mass, na.rm = TRUE)) + +# Whereas this normalises `mass` by the averages within species +# levels: +starwars \%>\% + select(name, mass, species) \%>\% + group_by(species) \%>\% + mutate(mass_norm = mass / mean(mass, na.rm = TRUE)) + +# Indirection ---------------------------------------- +# Refer to column names stored as strings with the `.data` pronoun: +vars <- c("mass", "height") +mutate(starwars, prod = .data[[vars[[1]]]] * .data[[vars[[2]]]]) +# Learn more in ?rlang::args_data_masking +} +\seealso{ +Other single table verbs: +\code{\link{arrange}()}, +\code{\link{rename}()}, +\code{\link{summarise}()} +} +\concept{single table verbs} diff --git a/man/mutate.nested_tidybulk.Rd b/man/mutate.nested_tidybulk.Rd new file mode 100644 index 00000000..f388c83b --- /dev/null +++ b/man/mutate.nested_tidybulk.Rd @@ -0,0 +1,175 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dplyr_methods.R +\name{mutate.nested_tidybulk} +\alias{mutate.nested_tidybulk} +\title{Create, modify, and delete columns} +\usage{ +\method{mutate}{nested_tidybulk}(.data, ...) +} +\arguments{ +\item{.data}{A data frame, data frame extension (e.g. a tibble), or a +lazy data frame (e.g. from dbplyr or dtplyr). See \emph{Methods}, below, for +more details.} + +\item{...}{<\code{\link[rlang:args_data_masking]{data-masking}}> Name-value pairs. +The name gives the name of the column in the output. + +The value can be: +\itemize{ +\item A vector of length 1, which will be recycled to the correct length. +\item A vector the same length as the current group (or the whole data frame +if ungrouped). +\item \code{NULL}, to remove the column. +\item A data frame or tibble, to create multiple columns in the output. +}} +} +\value{ +An object of the same type as \code{.data}. The output has the following +properties: +\itemize{ +\item Columns from \code{.data} will be preserved according to the \code{.keep} argument. +\item Existing columns that are modified by \code{...} will always be returned in +their original location. +\item New columns created through \code{...} will be placed according to the +\code{.before} and \code{.after} arguments. +\item The number of rows is not affected. +\item Columns given the value \code{NULL} will be removed. +\item Groups will be recomputed if a grouping variable is mutated. +\item Data frame attributes are preserved. +} +} +\description{ +\code{mutate()} creates new columns that are functions of existing variables. +It can also modify (if the name is the same as an existing +column) and delete columns (by setting their value to \code{NULL}). +} +\section{Useful mutate functions}{ + + +\itemize{ +\item \code{\link{+}}, \code{\link{-}}, \code{\link[=log]{log()}}, etc., for their usual mathematical meanings +\item \code{\link[dplyr:lead]{lead()}}, \code{\link[dplyr:lag]{lag()}} +\item \code{\link[dplyr:dense_rank]{dense_rank()}}, \code{\link[dplyr:min_rank]{min_rank()}}, \code{\link[dplyr:percent_rank]{percent_rank()}}, \code{\link[dplyr:row_number]{row_number()}}, +\code{\link[dplyr:cume_dist]{cume_dist()}}, \code{\link[dplyr:ntile]{ntile()}} +\item \code{\link[=cumsum]{cumsum()}}, \code{\link[dplyr:cummean]{cummean()}}, \code{\link[=cummin]{cummin()}}, \code{\link[=cummax]{cummax()}}, \code{\link[dplyr:cumany]{cumany()}}, \code{\link[dplyr:cumall]{cumall()}} +\item \code{\link[dplyr:na_if]{na_if()}}, \code{\link[dplyr:coalesce]{coalesce()}} +\item \code{\link[dplyr:if_else]{if_else()}}, \code{\link[dplyr:recode]{recode()}}, \code{\link[dplyr:case_when]{case_when()}} +} + +} + +\section{Grouped tibbles}{ + + + +Because mutating expressions are computed within groups, they may +yield different results on grouped tibbles. This will be the case +as soon as an aggregating, lagging, or ranking function is +involved. Compare this ungrouped mutate: + +\if{html}{\out{
}}\preformatted{starwars \%>\% + select(name, mass, species) \%>\% + mutate(mass_norm = mass / mean(mass, na.rm = TRUE)) +}\if{html}{\out{
}} + +With the grouped equivalent: + +\if{html}{\out{
}}\preformatted{starwars \%>\% + select(name, mass, species) \%>\% + group_by(species) \%>\% + mutate(mass_norm = mass / mean(mass, na.rm = TRUE)) +}\if{html}{\out{
}} + +The former normalises \code{mass} by the global average whereas the +latter normalises by the averages within species levels. + +} + +\section{Methods}{ + + +This function is a \strong{generic}, which means that packages can provide +implementations (methods) for other classes. See the documentation of +individual methods for extra arguments and differences in behaviour. + +Methods available in currently loaded packages: +\Sexpr[stage=render,results=rd]{dplyr:::methods_rd("mutate")}. + +} + +\examples{ +# Newly created variables are available immediately +starwars \%>\% + select(name, mass) \%>\% + mutate( + mass2 = mass * 2, + mass2_squared = mass2 * mass2 + ) + +# As well as adding new variables, you can use mutate() to +# remove variables and modify existing variables. +starwars \%>\% + select(name, height, mass, homeworld) \%>\% + mutate( + mass = NULL, + height = height * 0.0328084 # convert to feet + ) + +# Use across() with mutate() to apply a transformation +# to multiple columns in a tibble. +starwars \%>\% + select(name, homeworld, species) \%>\% + mutate(across(!name, as.factor)) +# see more in ?across + +# Window functions are useful for grouped mutates: +starwars \%>\% + select(name, mass, homeworld) \%>\% + group_by(homeworld) \%>\% + mutate(rank = min_rank(desc(mass))) +# see `vignette("window-functions")` for more details + +# By default, new columns are placed on the far right. +df <- tibble(x = 1, y = 2) +df \%>\% mutate(z = x + y) +df \%>\% mutate(z = x + y, .before = 1) +df \%>\% mutate(z = x + y, .after = x) + +# By default, mutate() keeps all columns from the input data. +df <- tibble(x = 1, y = 2, a = "a", b = "b") +df \%>\% mutate(z = x + y, .keep = "all") # the default +df \%>\% mutate(z = x + y, .keep = "used") +df \%>\% mutate(z = x + y, .keep = "unused") +df \%>\% mutate(z = x + y, .keep = "none") + +# Grouping ---------------------------------------- +# The mutate operation may yield different results on grouped +# tibbles because the expressions are computed within groups. +# The following normalises `mass` by the global average: +starwars \%>\% + select(name, mass, species) \%>\% + mutate(mass_norm = mass / mean(mass, na.rm = TRUE)) + +# Whereas this normalises `mass` by the averages within species +# levels: +starwars \%>\% + select(name, mass, species) \%>\% + group_by(species) \%>\% + mutate(mass_norm = mass / mean(mass, na.rm = TRUE)) + +# Indirection ---------------------------------------- +# Refer to column names stored as strings with the `.data` pronoun: +vars <- c("mass", "height") +mutate(starwars, prod = .data[[vars[[1]]]] * .data[[vars[[2]]]]) +# Learn more in ?rlang::args_data_masking +} +\seealso{ +Other single table verbs: +\code{\link[dplyr]{arrange}()}, +\code{\link[dplyr]{filter}()}, +\code{\link[dplyr]{reframe}()}, +\code{\link[dplyr]{rename}()}, +\code{\link[dplyr]{select}()}, +\code{\link[dplyr]{slice}()}, +\code{\link[dplyr]{summarise}()} +} diff --git a/man/nest-methods.Rd b/man/nest-methods.Rd deleted file mode 100644 index 3e86e90d..00000000 --- a/man/nest-methods.Rd +++ /dev/null @@ -1,61 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/tidyr_methods.R -\name{unnest} -\alias{unnest} -\alias{nest} -\title{unnest} -\arguments{ -\item{data}{A tbl. (See tidyr)} - -\item{cols}{<[`tidy-select`][tidyr_tidy_select]> Columns to unnest. -If you `unnest()` multiple columns, parallel entries must be of -compatibble sizes, i.e. they're either equal or length 1 (following the -standard tidyverse recycling rules).} - -\item{names_sep}{If `NULL`, the default, the names will be left - as is. In `nest()`, inner names will come from the former outer names; - in `unnest()`, the new outer names will come from the inner names. - - If a string, the inner and outer names will be used together. In `nest()`, - the names of the new outer columns will be formed by pasting together the - outer and the inner column names, separated by `names_sep`. In `unnest()`, - the new inner names will have the outer names (+ `names_sep`) automatically - stripped. This makes `names_sep` roughly symmetric between nesting and unnesting.} - -\item{keep_empty}{See tidyr::unnest} - -\item{names_repair}{See tidyr::unnest} - -\item{ptype}{See tidyr::unnest} - -\item{.drop}{See tidyr::unnest} - -\item{.id}{tidyr::unnest} - -\item{.sep}{tidyr::unnest} - -\item{.preserve}{See tidyr::unnest} - -\item{.data}{A tbl. (See tidyr)} - -\item{...}{Name-variable pairs of the form new_col = c(col1, col2, col3) (See tidyr)} -} -\value{ -A tidySummarizedExperiment objector a tibble depending on input - -A tt object -} -\description{ -unnest - -nest -} -\examples{ - - -tidybulk::se_mini |> tidybulk() |> nest( data = -.feature) |> unnest(data) - - -tidybulk::se_mini \%>\% tidybulk() \%>\% nest( data = -.feature) - -} diff --git a/man/nest.Rd b/man/nest.Rd new file mode 100644 index 00000000..d244d59a --- /dev/null +++ b/man/nest.Rd @@ -0,0 +1,84 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/tidyr_methods.R +\name{nest} +\alias{nest} +\alias{nest.tidybulk} +\title{Nest rows into a list-column of data frames} +\usage{ +\method{nest}{tidybulk}(.data, ..., .names_sep = NULL) +} +\arguments{ +\item{.data}{A data frame.} + +\item{...}{<\code{\link[tidyr:tidyr_tidy_select]{tidy-select}}> Columns to nest; these will +appear in the inner data frames. + +Specified using name-variable pairs of the form +\code{new_col = c(col1, col2, col3)}. The right hand side can be any valid +tidyselect expression. + +If not supplied, then \code{...} is derived as all columns \emph{not} selected by +\code{.by}, and will use the column name from \code{.key}. + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}}: +previously you could write \code{df \%>\% nest(x, y, z)}. +Convert to \code{df \%>\% nest(data = c(x, y, z))}.} + +\item{.names_sep}{If \code{NULL}, the default, the inner names will come from +the former outer names. If a string, the new inner names will use the +outer names with \code{names_sep} automatically stripped. This makes +\code{names_sep} roughly symmetric between nesting and unnesting.} +} +\description{ +Nesting creates a list-column of data frames; unnesting flattens it back out +into regular columns. Nesting is implicitly a summarising operation: you +get one row for each group defined by the non-nested columns. This is useful +in conjunction with other summaries that work with whole datasets, most +notably models. + +Learn more in \code{vignette("nest")}. +} +\details{ +If neither \code{...} nor \code{.by} are supplied, \code{nest()} will nest all variables, +and will use the column name supplied through \code{.key}. +} +\section{New syntax}{ + + +tidyr 1.0.0 introduced a new syntax for \code{nest()} and \code{unnest()} that's +designed to be more similar to other functions. Converting to the new syntax +should be straightforward (guided by the message you'll receive) but if +you just need to run an old analysis, you can easily revert to the previous +behaviour using \code{\link[tidyr:nest_legacy]{nest_legacy()}} and \code{\link[tidyr:unnest_legacy]{unnest_legacy()}} as follows: + +\if{html}{\out{
}}\preformatted{library(tidyr) +nest <- nest_legacy +unnest <- unnest_legacy +}\if{html}{\out{
}} + +} + +\section{Grouped data frames}{ + + +\code{df \%>\% nest(data = c(x, y))} specifies the columns to be nested; i.e. the +columns that will appear in the inner data frame. \code{df \%>\% nest(.by = c(x, y))} specifies the columns to nest \emph{by}; i.e. the columns that will remain in +the outer data frame. An alternative way to achieve the latter is to \code{nest()} +a grouped data frame created by \code{\link[dplyr:group_by]{dplyr::group_by()}}. The grouping variables +remain in the outer data frame and the others are nested. The result +preserves the grouping of the input. + +Variables supplied to \code{nest()} will override grouping variables so that +\code{df \%>\% group_by(x, y) \%>\% nest(data = !z)} will be equivalent to +\code{df \%>\% nest(data = !z)}. + +You can't supply \code{.by} with a grouped data frame, as the groups already +represent what you are nesting by. + +} + +\examples{ +data(se_mini) +se_mini \%>\% tidybulk() \%>\% nest(data = -.feature) + +} diff --git a/man/reexports.Rd b/man/reexports.Rd index 8bc39e1e..10ab6d8b 100644 --- a/man/reexports.Rd +++ b/man/reexports.Rd @@ -3,8 +3,8 @@ \docType{import} \name{reexports} \alias{reexports} -\alias{select} \alias{do} +\alias{select} \alias{tibble} \alias{as_tibble} \title{Objects exported from other packages} diff --git a/man/rename-methods.Rd b/man/rename-methods.Rd deleted file mode 100644 index db4defc0..00000000 --- a/man/rename-methods.Rd +++ /dev/null @@ -1,51 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/dplyr_methods.R -\name{rename} -\alias{rename} -\title{Rename columns} -\arguments{ -\item{.data}{A tbl. (See dplyr)} - -\item{...}{<[`tidy-select`][dplyr_tidy_select]> Use `new_name = old_name` -to rename selected variables.} -} -\value{ -An object of the same type as `.data`. -* Rows are not affected. -* Column names are changed; column order is preserved -* Data frame attributes are preserved. -* Groups are updated to reflect new names. -} -\description{ -Rename individual variables using `new_name = old_name` syntax. -} -\section{Scoped selection and renaming}{ - - -Use the three scoped variants ([rename_all()], [rename_if()], [rename_at()]) -to renaming a set of variables with a function. -} - -\section{Methods}{ - -This function is a **generic**, which means that packages can provide -implementations (methods) for other classes. See the documentation of -individual methods for extra arguments and differences in behaviour. - -The following methods are currently available in loaded packages: -} - -\examples{ - -iris <- as_tibble(iris) # so it prints a little nicer -rename(iris, petal_length = Petal.Length) - -} -\seealso{ -Other single table verbs: -\code{\link{arrange}()}, -\code{\link{filter}()}, -\code{\link{mutate}()}, -\code{\link{summarise}()} -} -\concept{single table verbs} diff --git a/man/rename.Rd b/man/rename.Rd new file mode 100644 index 00000000..3d593bda --- /dev/null +++ b/man/rename.Rd @@ -0,0 +1,87 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dplyr_methods.R +\name{rename} +\alias{rename} +\alias{rename.tidybulk} +\title{Rename columns} +\usage{ +\method{rename}{tidybulk}(.data, ...) +} +\arguments{ +\item{.data}{A data frame, data frame extension (e.g. a tibble), or a +lazy data frame (e.g. from dbplyr or dtplyr). See \emph{Methods}, below, for +more details.} + +\item{...}{For \code{rename()}: <\code{\link[dplyr:dplyr_tidy_select]{tidy-select}}> Use +\code{new_name = old_name} to rename selected variables. + +For \code{rename_with()}: additional arguments passed onto \code{.fn}.} +} +\value{ +An object of the same type as \code{.data}. The output has the following +properties: +\itemize{ +\item Rows are not affected. +\item Column names are changed; column order is preserved. +\item Data frame attributes are preserved. +\item Groups are updated to reflect new names. +} +} +\description{ +\code{rename()} changes the names of individual variables using +\code{new_name = old_name} syntax; \code{rename_with()} renames columns using a +function. +} +\section{Methods}{ + + +This function is a \strong{generic}, which means that packages can provide +implementations (methods) for other classes. See the documentation of +individual methods for extra arguments and differences in behaviour. + +The following methods are currently available in loaded packages: +\Sexpr[stage=render,results=rd]{dplyr:::methods_rd("rename")}. + +} + +\examples{ +iris <- as_tibble(iris) # so it prints a little nicer +rename(iris, petal_length = Petal.Length) + +# Rename using a named vector and `all_of()` +lookup <- c(pl = "Petal.Length", sl = "Sepal.Length") +rename(iris, all_of(lookup)) + +# If your named vector might contain names that don't exist in the data, +# use `any_of()` instead +lookup <- c(lookup, new = "unknown") +try(rename(iris, all_of(lookup))) +rename(iris, any_of(lookup)) + +rename_with(iris, toupper) +rename_with(iris, toupper, starts_with("Petal")) +rename_with(iris, ~ tolower(gsub(".", "_", .x, fixed = TRUE))) + +\dontshow{if (getRversion() > "4.0.1") (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} +# If your renaming function uses `paste0()`, make sure to set +# `recycle0 = TRUE` to ensure that empty selections are recycled correctly +try(rename_with( + iris, + ~ paste0("prefix_", .x), + starts_with("nonexistent") +)) + +rename_with( + iris, + ~ paste0("prefix_", .x, recycle0 = TRUE), + starts_with("nonexistent") +) +\dontshow{\}) # examplesIf} +} +\seealso{ +Other single table verbs: +\code{\link{arrange}()}, +\code{\link{mutate}()}, +\code{\link{summarise}()} +} +\concept{single table verbs} diff --git a/man/right_join.Rd b/man/right_join.Rd new file mode 100644 index 00000000..88594f4f --- /dev/null +++ b/man/right_join.Rd @@ -0,0 +1,172 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dplyr_methods.R +\name{right_join} +\alias{right_join} +\alias{right_join.tidybulk} +\title{Mutating joins} +\usage{ +\method{right_join}{tidybulk}(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) +} +\arguments{ +\item{x, y}{A pair of data frames, data frame extensions (e.g. a tibble), or +lazy data frames (e.g. from dbplyr or dtplyr). See \emph{Methods}, below, for +more details.} + +\item{by}{A join specification created with \code{\link[dplyr:join_by]{join_by()}}, or a character +vector of variables to join by. + +If \code{NULL}, the default, \verb{*_join()} will perform a natural join, using all +variables in common across \code{x} and \code{y}. A message lists the variables so +that you can check they're correct; suppress the message by supplying \code{by} +explicitly. + +To join on different variables between \code{x} and \code{y}, use a \code{\link[dplyr:join_by]{join_by()}} +specification. For example, \code{join_by(a == b)} will match \code{x$a} to \code{y$b}. + +To join by multiple variables, use a \code{\link[dplyr:join_by]{join_by()}} specification with +multiple expressions. For example, \code{join_by(a == b, c == d)} will match +\code{x$a} to \code{y$b} and \code{x$c} to \code{y$d}. If the column names are the same between +\code{x} and \code{y}, you can shorten this by listing only the variable names, like +\code{join_by(a, c)}. + +\code{\link[dplyr:join_by]{join_by()}} can also be used to perform inequality, rolling, and overlap +joins. See the documentation at \link[dplyr:join_by]{?join_by} for details on +these types of joins. + +For simple equality joins, you can alternatively specify a character vector +of variable names to join by. For example, \code{by = c("a", "b")} joins \code{x$a} +to \code{y$a} and \code{x$b} to \code{y$b}. If variable names differ between \code{x} and \code{y}, +use a named character vector like \code{by = c("x_a" = "y_a", "x_b" = "y_b")}. + +To perform a cross-join, generating all combinations of \code{x} and \code{y}, see +\code{\link[dplyr:cross_join]{cross_join()}}.} + +\item{copy}{If \code{x} and \code{y} are not from the same data source, +and \code{copy} is \code{TRUE}, then \code{y} will be copied into the +same src as \code{x}. This allows you to join tables across srcs, but +it is a potentially expensive operation so you must opt into it.} + +\item{suffix}{If there are non-joined duplicate variables in \code{x} and +\code{y}, these suffixes will be added to the output to disambiguate them. +Should be a character vector of length 2.} + +\item{...}{Other parameters passed onto methods.} +} +\value{ +An object of the same type as \code{x} (including the same groups). The order of +the rows and columns of \code{x} is preserved as much as possible. The output has +the following properties: +\itemize{ +\item The rows are affect by the join type. +\itemize{ +\item \code{inner_join()} returns matched \code{x} rows. +\item \code{left_join()} returns all \code{x} rows. +\item \code{right_join()} returns matched of \code{x} rows, followed by unmatched \code{y} rows. +\item \code{full_join()} returns all \code{x} rows, followed by unmatched \code{y} rows. +} +\item Output columns include all columns from \code{x} and all non-key columns from +\code{y}. If \code{keep = TRUE}, the key columns from \code{y} are included as well. +\item If non-key columns in \code{x} and \code{y} have the same name, \code{suffix}es are added +to disambiguate. If \code{keep = TRUE} and key columns in \code{x} and \code{y} have +the same name, \code{suffix}es are added to disambiguate these as well. +\item If \code{keep = FALSE}, output columns included in \code{by} are coerced to their +common type between \code{x} and \code{y}. +} +} +\description{ +Mutating joins add columns from \code{y} to \code{x}, matching observations based on +the keys. There are four mutating joins: the inner join, and the three outer +joins. +\subsection{Inner join}{ + +An \code{inner_join()} only keeps observations from \code{x} that have a matching key +in \code{y}. + +The most important property of an inner join is that unmatched rows in either +input are not included in the result. This means that generally inner joins +are not appropriate in most analyses, because it is too easy to lose +observations. +} + +\subsection{Outer joins}{ + +The three outer joins keep observations that appear in at least one of the +data frames: +\itemize{ +\item A \code{left_join()} keeps all observations in \code{x}. +\item A \code{right_join()} keeps all observations in \code{y}. +\item A \code{full_join()} keeps all observations in \code{x} and \code{y}. +} +} +} +\section{Many-to-many relationships}{ + + + +By default, dplyr guards against many-to-many relationships in equality joins +by throwing a warning. These occur when both of the following are true: +\itemize{ +\item A row in \code{x} matches multiple rows in \code{y}. +\item A row in \code{y} matches multiple rows in \code{x}. +} + +This is typically surprising, as most joins involve a relationship of +one-to-one, one-to-many, or many-to-one, and is often the result of an +improperly specified join. Many-to-many relationships are particularly +problematic because they can result in a Cartesian explosion of the number of +rows returned from the join. + +If a many-to-many relationship is expected, silence this warning by +explicitly setting \code{relationship = "many-to-many"}. + +In production code, it is best to preemptively set \code{relationship} to whatever +relationship you expect to exist between the keys of \code{x} and \code{y}, as this +forces an error to occur immediately if the data doesn't align with your +expectations. + +Inequality joins typically result in many-to-many relationships by nature, so +they don't warn on them by default, but you should still take extra care when +specifying an inequality join, because they also have the capability to +return a large number of rows. + +Rolling joins don't warn on many-to-many relationships either, but many +rolling joins follow a many-to-one relationship, so it is often useful to +set \code{relationship = "many-to-one"} to enforce this. + +Note that in SQL, most database providers won't let you specify a +many-to-many relationship between two tables, instead requiring that you +create a third \emph{junction table} that results in two one-to-many relationships +instead. + +} + +\section{Methods}{ + + +These functions are \strong{generic}s, which means that packages can provide +implementations (methods) for other classes. See the documentation of +individual methods for extra arguments and differences in behaviour. + +Methods available in currently loaded packages: +\itemize{ +\item \code{inner_join()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("inner_join")}. +\item \code{left_join()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("left_join")}. +\item \code{right_join()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("right_join")}. +\item \code{full_join()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("full_join")}. +} + +} + +\examples{ +data(se_mini) +annotation <- se_mini |> tidybulk() |> as_tibble() |> + distinct(.sample) |> mutate(source = "AU") +se_mini |> tidybulk() |> as_tibble() |> right_join(annotation) + +} +\seealso{ +Other joins: +\code{\link[dplyr]{cross_join}()}, +\code{\link[dplyr]{filter-joins}}, +\code{\link[dplyr]{nest_join}()} +} diff --git a/man/rotate_dimensions-methods.Rd b/man/rotate_dimensions-methods.Rd index c87c1cca..8825daa9 100644 --- a/man/rotate_dimensions-methods.Rd +++ b/man/rotate_dimensions-methods.Rd @@ -115,7 +115,9 @@ A `SummarizedExperiment` object A `SummarizedExperiment` object } \description{ -rotate_dimensions() takes as input a `tbl` formatted as | | | <...> | and calculates the rotated dimensional space of the transcript abundance. +rotate_dimensions() takes as input a `tbl` formatted as + | | | <...> | and calculates the rotated + dimensional space of the transcript abundance. } \details{ `r lifecycle::badge("maturing")` @@ -140,7 +142,9 @@ counts.MDS = identify_abundant() |> reduce_dimensions( method="MDS", .dims = 3) -counts.MDS.rotated = rotate_dimensions(counts.MDS, `Dim1`, `Dim2`, rotation_degrees = 45, .element = sample) +counts.MDS.rotated = rotate_dimensions(counts.MDS, `Dim1`, `Dim2`, + rotation_degrees = 45, + .element = sample) } diff --git a/man/rowwise-methods.Rd b/man/rowwise-methods.Rd deleted file mode 100644 index 3ff5fecf..00000000 --- a/man/rowwise-methods.Rd +++ /dev/null @@ -1,36 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/dplyr_methods.R -\name{rowwise} -\alias{rowwise} -\title{Group input by rows} -\arguments{ -\item{data}{Input data frame.} - -\item{...}{Variables to be preserved when calling summarise(). This is typically a set of variables whose combination uniquely identify each row. NB: unlike group_by() you can not create new variables here but instead you can select multiple variables with (e.g.) everything().} -} -\value{ -A consistent object (to the input) - - A `tbl` -} -\description{ -See [this repository](https://github.com/jennybc/row-oriented-workflows) -for alternative ways to perform row-wise operations. -} -\details{ -`rowwise()` is used for the results of [do()] when you -create list-variables. It is also useful to support arbitrary -complex operations that need to be applied to each row. - -Currently, rowwise grouping only works with data frames. Its -main impact is to allow you to work with list-variables in -[summarise()] and [mutate()] without having to -use \code{[[1]]}. This makes `summarise()` on a rowwise tbl -effectively equivalent to [plyr::ldply()]. -} -\examples{ - -df <- expand.grid(x = 1:3, y = 3:1) -df_done <- df |> rowwise() - -} diff --git a/man/rowwise.Rd b/man/rowwise.Rd new file mode 100644 index 00000000..28d150da --- /dev/null +++ b/man/rowwise.Rd @@ -0,0 +1,78 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dplyr_methods.R +\name{rowwise} +\alias{rowwise} +\alias{rowwise.tidybulk} +\title{Group input by rows} +\usage{ +\method{rowwise}{tidybulk}(data, ...) +} +\arguments{ +\item{data}{Input data frame.} + +\item{...}{<\code{\link[dplyr:dplyr_tidy_select]{tidy-select}}> Variables to be preserved +when calling \code{\link[dplyr:summarise]{summarise()}}. This is typically a set of variables whose +combination uniquely identify each row. + +\strong{NB}: unlike \code{group_by()} you can not create new variables here but +instead you can select multiple variables with (e.g.) \code{everything()}.} +} +\value{ +A row-wise data frame with class \code{rowwise_df}. Note that a +\code{rowwise_df} is implicitly grouped by row, but is not a \code{grouped_df}. +} +\description{ +\code{rowwise()} allows you to compute on a data frame a row-at-a-time. +This is most useful when a vectorised function doesn't exist. + +Most dplyr verbs preserve row-wise grouping. The exception is \code{\link[dplyr:summarise]{summarise()}}, +which return a \link[dplyr]{grouped_df}. You can explicitly ungroup with \code{\link[dplyr:ungroup]{ungroup()}} +or \code{\link[dplyr:as_tibble]{as_tibble()}}, or convert to a \link[dplyr]{grouped_df} with \code{\link[dplyr:group_by]{group_by()}}. +} +\section{List-columns}{ + + +Because a rowwise has exactly one row per group it offers a small +convenience for working with list-columns. Normally, \code{summarise()} and +\code{mutate()} extract a groups worth of data with \code{[}. But when you index +a list in this way, you get back another list. When you're working with +a \code{rowwise} tibble, then dplyr will use \code{[[} instead of \code{[} to make your +life a little easier. + +} + +\examples{ +df <- tibble(x = runif(6), y = runif(6), z = runif(6)) +# Compute the mean of x, y, z in each row +df \%>\% rowwise() \%>\% mutate(m = mean(c(x, y, z))) +# use c_across() to more easily select many variables +df \%>\% rowwise() \%>\% mutate(m = mean(c_across(x:z))) + +# Compute the minimum of x and y in each row +df \%>\% rowwise() \%>\% mutate(m = min(c(x, y, z))) +# In this case you can use an existing vectorised function: +df \%>\% mutate(m = pmin(x, y, z)) +# Where these functions exist they'll be much faster than rowwise +# so be on the lookout for them. + +# rowwise() is also useful when doing simulations +params <- tribble( + ~sim, ~n, ~mean, ~sd, + 1, 1, 1, 1, + 2, 2, 2, 4, + 3, 3, -1, 2 +) +# Here I supply variables to preserve after the computation +params \%>\% + rowwise(sim) \%>\% + reframe(z = rnorm(n, mean, sd)) + +# If you want one row per simulation, put the results in a list() +params \%>\% + rowwise(sim) \%>\% + summarise(z = list(rnorm(n, mean, sd)), .groups = "keep") +} +\seealso{ +\code{\link[dplyr:nest_by]{nest_by()}} for a convenient way of creating rowwise data frames +with nested data. +} diff --git a/man/summarise-methods.Rd b/man/summarise-methods.Rd deleted file mode 100644 index 56907289..00000000 --- a/man/summarise-methods.Rd +++ /dev/null @@ -1,91 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/dplyr_methods.R -\name{summarise} -\alias{summarise} -\title{Summarise each group to fewer rows} -\arguments{ -\item{.data}{A tbl. (See dplyr)} - -\item{...}{<[`tidy-eval`][dplyr_tidy_eval]> Name-value pairs of summary - functions. The name will be the name of the variable in the result. - - The value can be: - - * A vector of length 1, e.g. `min(x)`, `n()`, or `sum(is.na(y))`. - * A vector of length `n`, e.g. `quantile()`. - * A data frame, to add multiple columns from a single expression.} -} -\value{ -An object _usually_ of the same type as `.data`. - -* The rows come from the underlying `group_keys()`. -* The columns are a combination of the grouping keys and the summary - expressions that you provide. -* If `x` is grouped by more than one variable, the output will be another - [grouped_df] with the right-most group removed. -* If `x` is grouped by one variable, or is not grouped, the output will - be a [tibble]. -* Data frame attributes are **not** preserved, because `summarise()` - fundamentally creates a new data frame. -} -\description{ -`summarise()` creates a new data frame. It will have one (or more) rows for -each combination of grouping variables; if there are no grouping variables, -the output will have a single row summarising all observations in the input. -It will contain one column for each grouping variable and one column -for each of the summary statistics that you have specified. - -`summarise()` and `summarize()` are synonyms. -} -\section{Useful functions}{ - - -* Center: [mean()], [median()] -* Spread: [sd()], [IQR()], [mad()] -* Range: [min()], [max()], [quantile()] -* Position: [first()], [last()], [nth()], -* Count: [n()], [n_distinct()] -* Logical: [any()], [all()] -} - -\section{Backend variations}{ - - -The data frame backend supports creating a variable and using it in the -same summary. This means that previously created summary variables can be -further transformed or combined within the summary, as in [mutate()]. -However, it also means that summary variables with the same names as previous -variables overwrite them, making those variables unavailable to later summary -variables. - -This behaviour may not be supported in other backends. To avoid unexpected -results, consider using new names for your summary variables, especially when -creating multiple summaries. -} - -\section{Methods}{ - -This function is a **generic**, which means that packages can provide -implementations (methods) for other classes. See the documentation of -individual methods for extra arguments and differences in behaviour. - -The following methods are currently available in loaded packages: -} - -\examples{ - -# A summary applied to ungrouped tbl returns a single row - -mtcars |> - summarise(mean = mean(disp)) - - -} -\seealso{ -Other single table verbs: -\code{\link{arrange}()}, -\code{\link{filter}()}, -\code{\link{mutate}()}, -\code{\link{rename}()} -} -\concept{single table verbs} diff --git a/man/summarise.Rd b/man/summarise.Rd new file mode 100644 index 00000000..cf23fdc1 --- /dev/null +++ b/man/summarise.Rd @@ -0,0 +1,139 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dplyr_methods.R +\name{summarise} +\alias{summarise} +\alias{summarise.tidybulk} +\alias{summarize} +\alias{summarize.tidybulk} +\title{Summarise each group down to one row} +\usage{ +\method{summarise}{tidybulk}(.data, ...) + +\method{summarize}{tidybulk}(.data, ...) +} +\arguments{ +\item{.data}{A data frame, data frame extension (e.g. a tibble), or a +lazy data frame (e.g. from dbplyr or dtplyr). See \emph{Methods}, below, for +more details.} + +\item{...}{<\code{\link[rlang:args_data_masking]{data-masking}}> Name-value pairs of +summary functions. The name will be the name of the variable in the result. + +The value can be: +\itemize{ +\item A vector of length 1, e.g. \code{min(x)}, \code{n()}, or \code{sum(is.na(y))}. +\item A data frame, to add multiple columns from a single expression. +} + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Returning values with size 0 or >1 was +deprecated as of 1.1.0. Please use \code{\link[dplyr:reframe]{reframe()}} for this instead.} +} +\value{ +An object \emph{usually} of the same type as \code{.data}. +\itemize{ +\item The rows come from the underlying \code{\link[dplyr:group_keys]{group_keys()}}. +\item The columns are a combination of the grouping keys and the summary +expressions that you provide. +\item The grouping structure is controlled by the \verb{.groups=} argument, the +output may be another \link[dplyr]{grouped_df}, a \link[dplyr]{tibble} or a \link[dplyr]{rowwise} data frame. +\item Data frame attributes are \strong{not} preserved, because \code{summarise()} +fundamentally creates a new data frame. +} +} +\description{ +\code{summarise()} creates a new data frame. It returns one row for each +combination of grouping variables; if there are no grouping variables, the +output will have a single row summarising all observations in the input. It +will contain one column for each grouping variable and one column for each of +the summary statistics that you have specified. + +\code{summarise()} and \code{summarize()} are synonyms. +} +\section{Useful functions}{ + + +\itemize{ +\item Center: \code{\link[=mean]{mean()}}, \code{\link[=median]{median()}} +\item Spread: \code{\link[=sd]{sd()}}, \code{\link[=IQR]{IQR()}}, \code{\link[=mad]{mad()}} +\item Range: \code{\link[=min]{min()}}, \code{\link[=max]{max()}}, +\item Position: \code{\link[dplyr:first]{first()}}, \code{\link[dplyr:last]{last()}}, \code{\link[dplyr:nth]{nth()}}, +\item Count: \code{\link[dplyr:n]{n()}}, \code{\link[dplyr:n_distinct]{n_distinct()}} +\item Logical: \code{\link[=any]{any()}}, \code{\link[=all]{all()}} +} + +} + +\section{Backend variations}{ + + + +The data frame backend supports creating a variable and using it in the +same summary. This means that previously created summary variables can be +further transformed or combined within the summary, as in \code{\link[dplyr:mutate]{mutate()}}. +However, it also means that summary variables with the same names as previous +variables overwrite them, making those variables unavailable to later summary +variables. + +This behaviour may not be supported in other backends. To avoid unexpected +results, consider using new names for your summary variables, especially when +creating multiple summaries. + +} + +\section{Methods}{ + + +This function is a \strong{generic}, which means that packages can provide +implementations (methods) for other classes. See the documentation of +individual methods for extra arguments and differences in behaviour. + +The following methods are currently available in loaded packages: +\Sexpr[stage=render,results=rd]{dplyr:::methods_rd("summarise")}. + +} + +\examples{ +# A summary applied to ungrouped tbl returns a single row +mtcars \%>\% + summarise(mean = mean(disp), n = n()) + +# Usually, you'll want to group first +mtcars \%>\% + group_by(cyl) \%>\% + summarise(mean = mean(disp), n = n()) + +# Each summary call removes one grouping level (since that group +# is now just a single row) +mtcars \%>\% + group_by(cyl, vs) \%>\% + summarise(cyl_n = n()) \%>\% + group_vars() + +# BEWARE: reusing variables may lead to unexpected results +mtcars \%>\% + group_by(cyl) \%>\% + summarise(disp = mean(disp), sd = sd(disp)) + +# Refer to column names stored as strings with the `.data` pronoun: +var <- "mass" +summarise(starwars, avg = mean(.data[[var]], na.rm = TRUE)) +# Learn more in ?rlang::args_data_masking + +# In dplyr 1.1.0, returning multiple rows per group was deprecated in favor +# of `reframe()`, which never messages and always returns an ungrouped +# result: +mtcars \%>\% + group_by(cyl) \%>\% + summarise(qs = quantile(disp, c(0.25, 0.75)), prob = c(0.25, 0.75)) +# -> +mtcars \%>\% + group_by(cyl) \%>\% + reframe(qs = quantile(disp, c(0.25, 0.75)), prob = c(0.25, 0.75)) +} +\seealso{ +Other single table verbs: +\code{\link{arrange}()}, +\code{\link{mutate}()}, +\code{\link{rename}()} +} +\concept{single table verbs} diff --git a/man/symbol_to_entrez.Rd b/man/symbol_to_entrez.Rd index f02ca98d..d61a335b 100644 --- a/man/symbol_to_entrez.Rd +++ b/man/symbol_to_entrez.Rd @@ -23,7 +23,8 @@ Get ENTREZ id from gene SYMBOL # This function was designed for data.frame # Convert from SummarizedExperiment for this example. It is NOT reccomended. - -tidybulk::se_mini |> tidybulk() |> as_tibble() |> symbol_to_entrez(.transcript = .feature, .sample = .sample) +data(se_mini) +se_mini |> tidybulk() |> as_tibble() |> + symbol_to_entrez(.transcript = .feature, .sample = .sample) } diff --git a/man/test_gene_enrichment-methods.Rd b/man/test_gene_enrichment-methods.Rd index b21525d8..43180fc0 100644 --- a/man/test_gene_enrichment-methods.Rd +++ b/man/test_gene_enrichment-methods.Rd @@ -145,7 +145,10 @@ A consistent object (to the input) A consistent object (to the input) } \description{ -test_gene_enrichment() takes as input a `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a `tbl` of gene set information +test_gene_enrichment() takes as input a `tbl` +(with at least three columns for sample, feature and transcript abundance) +or `SummarizedExperiment` (more convenient if abstracted to tibble with +library(tidySummarizedExperiment)) and returns a `tbl` of gene set information } \details{ `r lifecycle::badge("maturing")` @@ -153,7 +156,7 @@ test_gene_enrichment() takes as input a `tbl` (with at least three columns for s This wrapper executes ensemble gene enrichment analyses of the dataset using EGSEA (DOI:0.12688/f1000research.12544.1) -dge = +dge <- data |> keep_abundant( factor_of_interest = !!as.symbol(parse_formula(.formula)[[1]]), @@ -165,11 +168,11 @@ dge = as_matrix(rownames = !!.entrez) %>% edgeR::DGEList(counts = .) -idx = buildIdx(entrezIDs = rownames(dge), species = species, msigdb.gsets = msigdb.gsets, +idx <- buildIdx(entrezIDs = rownames(dge), species = species, + msigdb.gsets = msigdb.gsets, kegg.exclude = kegg.exclude) dge |> - # Calculate weights limma::voom(design, plot = FALSE) |> @@ -187,9 +190,9 @@ dge |> \dontrun{ library(SummarizedExperiment) -se = tidybulk::se_mini -rowData( se)$entrez = rownames(se ) -df_entrez = aggregate_duplicates(se,.transcript = entrez ) +se <- tidybulk::se_mini +rowData(se)$entrez <- rownames(se) +df_entrez <- aggregate_duplicates(se, .transcript = entrez) library("EGSEA") @@ -199,8 +202,10 @@ library("EGSEA") .sample = sample, .entrez = entrez, .abundance = count, - methods = c("roast" , "safe", "gage" , "padog" , "globaltest", "ora" ), - gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "kegg_disease", "kegg_metabolism", "kegg_signaling"), + methods = c("roast", "safe", "gage", + "padog", "globaltest", "ora"), + gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", + "kegg_disease", "kegg_metabolism", "kegg_signaling"), species="human", cores = 2 ) diff --git a/man/tidybulk-methods.Rd b/man/tidybulk-methods.Rd index 0ef4e838..b7439c81 100644 --- a/man/tidybulk-methods.Rd +++ b/man/tidybulk-methods.Rd @@ -42,7 +42,10 @@ A `tidybulk` object A `tidybulk` object } \description{ -tidybulk() creates an annotated `tidybulk` tibble from a `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +tidybulk() creates an annotated `tidybulk` tibble from a `tbl` +(with at least three columns for sample, feature and transcript abundance) +or `SummarizedExperiment` (more convenient if abstracted to tibble with +library(tidySummarizedExperiment)) } \details{ `r lifecycle::badge("maturing")` diff --git a/man/ungroup.Rd b/man/ungroup.Rd new file mode 100644 index 00000000..d634c6df --- /dev/null +++ b/man/ungroup.Rd @@ -0,0 +1,148 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dplyr_methods.R +\name{ungroup} +\alias{ungroup} +\alias{ungroup.tidybulk} +\title{Group by one or more variables} +\usage{ +\method{ungroup}{tidybulk}(x, ...) +} +\arguments{ +\item{x}{A \code{\link[dplyr:tbl]{tbl()}}} + +\item{...}{In \code{group_by()}, variables or computations to group by. +Computations are always done on the ungrouped data frame. +To perform computations on the grouped data, you need to use +a separate \code{mutate()} step before the \code{group_by()}. +Computations are not allowed in \code{nest_by()}. +In \code{ungroup()}, variables to remove from the grouping.} +} +\value{ +A grouped data frame with class \code{\link[dplyr]{grouped_df}}, +unless the combination of \code{...} and \code{add} yields a empty set of +grouping columns, in which case a tibble will be returned. +} +\description{ +Most data operations are done on groups defined by variables. +\code{group_by()} takes an existing tbl and converts it into a grouped tbl +where operations are performed "by group". \code{ungroup()} removes grouping. +} +\section{Methods}{ + + +These function are \strong{generic}s, which means that packages can provide +implementations (methods) for other classes. See the documentation of +individual methods for extra arguments and differences in behaviour. + +Methods available in currently loaded packages: +\itemize{ +\item \code{group_by()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("group_by")}. +\item \code{ungroup()}: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("ungroup")}. +} + +} + +\section{Ordering}{ + + +Currently, \code{group_by()} internally orders the groups in ascending order. This +results in ordered output from functions that aggregate groups, such as +\code{\link[dplyr:summarise]{summarise()}}. + +When used as grouping columns, character vectors are ordered in the C locale +for performance and reproducibility across R sessions. If the resulting +ordering of your grouped operation matters and is dependent on the locale, +you should follow up the grouped operation with an explicit call to +\code{\link[dplyr:arrange]{arrange()}} and set the \code{.locale} argument. For example: + +\if{html}{\out{
}}\preformatted{data \%>\% + group_by(chr) \%>\% + summarise(avg = mean(x)) \%>\% + arrange(chr, .locale = "en") +}\if{html}{\out{
}} + +This is often useful as a preliminary step before generating content intended +for humans, such as an HTML table. +\subsection{Legacy behavior}{ + +Prior to dplyr 1.1.0, character vector grouping columns were ordered in the +system locale. If you need to temporarily revert to this behavior, you can +set the global option \code{dplyr.legacy_locale} to \code{TRUE}, but this should be +used sparingly and you should expect this option to be removed in a future +version of dplyr. It is better to update existing code to explicitly call +\code{arrange(.locale = )} instead. Note that setting \code{dplyr.legacy_locale} will +also force calls to \code{\link[dplyr:arrange]{arrange()}} to use the system locale. +} + +} + +\examples{ +by_cyl <- mtcars \%>\% group_by(cyl) + +# grouping doesn't change how the data looks (apart from listing +# how it's grouped): +by_cyl + +# It changes how it acts with the other dplyr verbs: +by_cyl \%>\% summarise( + disp = mean(disp), + hp = mean(hp) +) +by_cyl \%>\% filter(disp == max(disp)) + +# Each call to summarise() removes a layer of grouping +by_vs_am <- mtcars \%>\% group_by(vs, am) +by_vs <- by_vs_am \%>\% summarise(n = n()) +by_vs +by_vs \%>\% summarise(n = sum(n)) + +# To removing grouping, use ungroup +by_vs \%>\% + ungroup() \%>\% + summarise(n = sum(n)) + +# By default, group_by() overrides existing grouping +by_cyl \%>\% + group_by(vs, am) \%>\% + group_vars() + +# Use add = TRUE to instead append +by_cyl \%>\% + group_by(vs, am, .add = TRUE) \%>\% + group_vars() + +# You can group by expressions: this is a short-hand +# for a mutate() followed by a group_by() +mtcars \%>\% + group_by(vsam = vs + am) + +# The implicit mutate() step is always performed on the +# ungrouped data. Here we get 3 groups: +mtcars \%>\% + group_by(vs) \%>\% + group_by(hp_cut = cut(hp, 3)) + +# If you want it to be performed by groups, +# you have to use an explicit mutate() call. +# Here we get 3 groups per value of vs +mtcars \%>\% + group_by(vs) \%>\% + mutate(hp_cut = cut(hp, 3)) \%>\% + group_by(hp_cut) + +# when factors are involved and .drop = FALSE, groups can be empty +tbl <- tibble( + x = 1:10, + y = factor(rep(c("a", "c"), each = 5), levels = c("a", "b", "c")) +) +tbl \%>\% + group_by(y, .drop = FALSE) \%>\% + group_rows() +} +\seealso{ +Other grouping functions: +\code{\link[dplyr]{group_map}()}, +\code{\link[dplyr]{group_nest}()}, +\code{\link[dplyr]{group_split}()}, +\code{\link[dplyr]{group_trim}()} +} diff --git a/man/unnest.Rd b/man/unnest.Rd new file mode 100644 index 00000000..68da1d78 --- /dev/null +++ b/man/unnest.Rd @@ -0,0 +1,111 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/tidyr_methods.R +\name{unnest} +\alias{unnest} +\alias{unnest.nested_tidybulk} +\title{Unnest a list-column of data frames into rows and columns} +\usage{ +\method{unnest}{nested_tidybulk}( + data, + cols, + ..., + keep_empty = FALSE, + ptype = NULL, + names_sep = NULL, + names_repair = "check_unique", + .drop, + .id, + .sep, + .preserve +) +} +\arguments{ +\item{data}{A data frame.} + +\item{cols}{<\code{\link[tidyr:tidyr_tidy_select]{tidy-select}}> List-columns to unnest. + +When selecting multiple columns, values from the same row will be recycled +to their common size.} + +\item{...}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}}: +previously you could write \code{df \%>\% unnest(x, y, z)}. +Convert to \code{df \%>\% unnest(c(x, y, z))}. If you previously created a new +variable in \code{unnest()} you'll now need to do it explicitly with \code{mutate()}. +Convert \code{df \%>\% unnest(y = fun(x, y, z))} +to \code{df \%>\% mutate(y = fun(x, y, z)) \%>\% unnest(y)}.} + +\item{keep_empty}{By default, you get one row of output for each element +of the list that you are unchopping/unnesting. This means that if there's a +size-0 element (like \code{NULL} or an empty data frame or vector), then that +entire row will be dropped from the output. If you want to preserve all +rows, use \code{keep_empty = TRUE} to replace size-0 elements with a single row +of missing values.} + +\item{ptype}{Optionally, a named list of column name-prototype pairs to +coerce \code{cols} to, overriding the default that will be guessed from +combining the individual values. Alternatively, a single empty ptype +can be supplied, which will be applied to all \code{cols}.} + +\item{names_sep}{If \code{NULL}, the default, the outer names will come from the +inner names. If a string, the outer names will be formed by pasting +together the outer and the inner column names, separated by \code{names_sep}.} + +\item{names_repair}{Used to check that output data frame has valid +names. Must be one of the following options: +\itemize{ +\item \verb{"minimal}": no name repair or checks, beyond basic existence, +\item \verb{"unique}": make sure names are unique and not empty, +\item \verb{"check_unique}": (the default), no name repair, but check they are unique, +\item \verb{"universal}": make the names unique and syntactic +\item a function: apply custom name repair. +\item \link[tidyr]{tidyr_legacy}: use the name repair from tidyr 0.8. +\item a formula: a purrr-style anonymous function (see \code{\link[rlang:as_function]{rlang::as_function()}}) +} + +See \code{\link[vctrs:vec_as_names]{vctrs::vec_as_names()}} for more details on these terms and the +strategies used to enforce them.} + +\item{.drop, .preserve}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}}: +all list-columns are now preserved; If there are any that you +don't want in the output use \code{select()} to remove them prior to +unnesting.} + +\item{.id}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}}: +convert \code{df \%>\% unnest(x, .id = "id")} to \verb{df \%>\% mutate(id = names(x)) \%>\% unnest(x))}.} + +\item{.sep}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}}: +use \code{names_sep} instead.} +} +\value{ +`tidySingleCellExperiment` +} +\description{ +Unnest expands a list-column containing data frames into rows and columns. +} +\section{New syntax}{ + + +tidyr 1.0.0 introduced a new syntax for \code{nest()} and \code{unnest()} that's +designed to be more similar to other functions. Converting to the new syntax +should be straightforward (guided by the message you'll receive) but if +you just need to run an old analysis, you can easily revert to the previous +behaviour using \code{\link[tidyr:nest_legacy]{nest_legacy()}} and \code{\link[tidyr:unnest_legacy]{unnest_legacy()}} as follows: + +\if{html}{\out{
}}\preformatted{library(tidyr) +nest <- nest_legacy +unnest <- unnest_legacy +}\if{html}{\out{
}} + +} + +\examples{ +data(se_mini) +se_mini |> tidybulk() |> nest( data = -.feature) |> unnest(data) + +} +\seealso{ +Other rectangling: +\code{\link[tidyr]{hoist}()}, +\code{\link[tidyr]{unnest_longer}()}, +\code{\link[tidyr]{unnest_wider}()} +} diff --git a/tests/testthat/test-bulk_methods.R b/tests/testthat/test-bulk_methods.R index 417c5827..e8023418 100755 --- a/tests/testthat/test-bulk_methods.R +++ b/tests/testthat/test-bulk_methods.R @@ -883,7 +883,7 @@ test_that("differential trancript abundance - random effects",{ head(4) |> expect_equal( c(0.1081176, 0.1303558, 0.1303558, 0.1693276), - tolerance=1e-3 + tolerance=1e-2 ) }) diff --git a/tests/testthat/test-bulk_methods_SummarizedExperiment.R b/tests/testthat/test-bulk_methods_SummarizedExperiment.R index 067bd6bc..49366aed 100755 --- a/tests/testthat/test-bulk_methods_SummarizedExperiment.R +++ b/tests/testthat/test-bulk_methods_SummarizedExperiment.R @@ -518,7 +518,7 @@ test_that("differential trancript abundance - random effects SE",{ head(4) |> expect_equal( c(0.1153254, 0.1668555, 0.1668555 , NA), - tolerance=1e-3 + tolerance=1e-2 ) }) From bd82a3c86cf10539fa8737089dbf8cc9f08c56eb Mon Sep 17 00:00:00 2001 From: chilampoon Date: Sat, 16 Sep 2023 22:48:54 -0400 Subject: [PATCH 02/30] rm ggplot2 dep and add .Rinstignore --- .Rinstignore | 1 + R/attach.R | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 .Rinstignore diff --git a/.Rinstignore b/.Rinstignore new file mode 100644 index 00000000..caf01ec9 --- /dev/null +++ b/.Rinstignore @@ -0,0 +1 @@ +dev/ \ No newline at end of file diff --git a/R/attach.R b/R/attach.R index 0543a45c..8e58b773 100644 --- a/R/attach.R +++ b/R/attach.R @@ -1,4 +1,4 @@ -core <- c("dplyr", "tidyr", "ttservice", "ggplot2") +core <- c("dplyr", "tidyr", "ttservice") core_unloaded <- function() { search <- paste0("package:", core) From 89b106f2df5e9f8453cc1c8361ea39683d14d192 Mon Sep 17 00:00:00 2001 From: chilampoon Date: Sun, 17 Sep 2023 11:06:07 -0400 Subject: [PATCH 03/30] try to find the warning source --- dev/dplyr-master-methods.R | 1177 ------------------------------------ 1 file changed, 1177 deletions(-) delete mode 100755 dev/dplyr-master-methods.R diff --git a/dev/dplyr-master-methods.R b/dev/dplyr-master-methods.R deleted file mode 100755 index e24ef031..00000000 --- a/dev/dplyr-master-methods.R +++ /dev/null @@ -1,1177 +0,0 @@ - -#' Arrange rows by column values -#' -#' See \code{dpyr::\link[dpyr:arrange]{arrange}} for details. -#' -#' @description -#' `arrange()` order the rows of a data frame rows by the values of selected -#' columns. -#' -#' Unlike other dplyr verbs, `arrange()` largely ignores grouping; you -#' need to explicit mention grouping variables (or use `by_group = TRUE`) -#' in order to group by them, and functions of variables are evaluated -#' once per data frame, not once per group. -#' -#' @details -#' ## Locales -#' The sort order for character vectors will depend on the collating sequence -#' of the locale in use: see [locales()]. -#' -#' ## Missing values -#' Unlike base sorting with `sort()`, `NA` are: -#' * always sorted to the end for local data, even when wrapped with `desc()`. -#' * treated differently for remote data, depending on the backend. -#' -#' @return -#' An object of the same type as `.data`. -#' -#' * All rows appear in the output, but (usually) in a different place. -#' * Columns are not modified. -#' * Groups are not modified. -#' * Data frame attributes are preserved. -#' @section Methods: -#' This function is a **generic**, which means that packages can provide -#' implementations (methods) for other classes. See the documentation of -#' individual methods for extra arguments and differences in behaviour. -#' -#' The following methods are currently available in loaded packages: -#' \Sexpr[stage=render,results=Rd]{dplyr:::methods_rd("arrange")}. -#' @export -#' @param .data A data frame, data frame extension (e.g. a tibble), or a -#' lazy data frame (e.g. from dbplyr or dtplyr). See *Methods*, below, for -#' more details. -#' @param ... <[`tidy-eval`][dplyr_tidy_eval]> Variables, or functions or -#' variables. Use [desc()] to sort a variable in descending order. -#' @family single table verbs -#' @examples -#' arrange(mtcars, cyl, disp) -#' arrange(mtcars, desc(disp)) -#' -#' # grouped arrange ignores groups -#' by_cyl <- mtcars %>% group_by(cyl) -#' by_cyl %>% arrange(desc(wt)) -#' # Unless you specifically ask: -#' by_cyl %>% arrange(desc(wt), .by_group = TRUE) -arrange <- function(.data, ..., .by_group = FALSE) { - UseMethod("arrange") -} - -#' @param .by_group If `TRUE`, will sort first by grouping variable. Applies to -#' grouped data frames only. -#' @rdname arrange -#' @export -#' -############# START ADDED tidybulk ################################### - -arrange.default <- function(.data, ..., .by_group = FALSE) { - - dplyr::arrange(.data, ..., .by_group = .by_group) - -} - -#' @export -arrange.tidybulk <- function(.data, ..., .by_group = FALSE) { - - .data %>% - drop_class(c("tidybulk", "tt")) %>% - dplyr::arrange( ..., .by_group = .by_group) %>% - - # Attach attributes - reattach_internals() %>% - - # Add class - add_class("tt") %>% - add_class("tidybulk") - -} - -############# END ADDED tidybulk ##################################### - -#' Efficiently bind multiple data frames by row and column -#' -#' This is an efficient implementation of the common pattern of -#' `do.call(rbind, dfs)` or `do.call(cbind, dfs)` for binding many -#' data frames into one. -#' -#' The output of `bind_rows()` will contain a column if that column -#' appears in any of the inputs. -#' -#' @param ... Data frames to combine. -#' -#' Each argument can either be a data frame, a list that could be a data -#' frame, or a list of data frames. -#' -#' When row-binding, columns are matched by name, and any missing -#' columns will be filled with NA. -#' -#' When column-binding, rows are matched by position, so all data -#' frames must have the same number of rows. To match by value, not -#' position, see [mutate-joins]. -#' @param .id Data frame identifier. -#' -#' When `.id` is supplied, a new column of identifiers is -#' created to link each row to its original data frame. The labels -#' are taken from the named arguments to `bind_rows()`. When a -#' list of data frames is supplied, the labels are taken from the -#' names of the list. If no names are found a numeric sequence is -#' used instead. -#' @return `bind_rows()` and `bind_cols()` return the same type as -#' the first input, either a data frame, `tbl_df`, or `grouped_df`. -#' @examples -#' one <- mtcars[1:4, ] -#' two <- mtcars[11:14, ] -#' -#' # You can supply data frames as arguments: -#' bind_rows(one, two) -#' -#' # The contents of lists are spliced automatically: -#' bind_rows(list(one, two)) -#' bind_rows(split(mtcars, mtcars$cyl)) -#' bind_rows(list(one, two), list(two, one)) -#' -#' -#' # In addition to data frames, you can supply vectors. In the rows -#' # direction, the vectors represent rows and should have inner -#' # names: -#' bind_rows( -#' c(a = 1, b = 2), -#' c(a = 3, b = 4) -#' ) -#' -#' # You can mix vectors and data frames: -#' bind_rows( -#' c(a = 1, b = 2), -#' tibble(a = 3:4, b = 5:6), -#' c(a = 7, b = 8) -#' ) -#' -#' -#' # Note that for historical reasons, lists containing vectors are -#' # always treated as data frames. Thus their vectors are treated as -#' # columns rather than rows, and their inner names are ignored: -#' ll <- list( -#' a = c(A = 1, B = 2), -#' b = c(A = 3, B = 4) -#' ) -#' bind_rows(ll) -#' -#' # You can circumvent that behaviour with explicit splicing: -#' bind_rows(!!!ll) -#' -#' -#' # When you supply a column name with the `.id` argument, a new -#' # column is created to link each row to its original data frame -#' bind_rows(list(one, two), .id = "id") -#' bind_rows(list(a = one, b = two), .id = "id") -#' bind_rows("group 1" = one, "group 2" = two, .id = "groups") -#' -#' # Columns don't need to match when row-binding -#' bind_rows(data.frame(x = 1:3), data.frame(y = 1:4)) -#' \dontrun{ -#' # Rows do need to match when column-binding -#' bind_cols(data.frame(x = 1), data.frame(y = 1:2)) -#' } -#' -#' bind_cols(one, two) -#' bind_cols(list(one, two)) -#' @name bind -NULL - -#' @export -#' @rdname bind -#' @export -#' -############# START ADDED tidybulk ##################################### - -bind_rows <- function(..., .id = NULL) { - UseMethod("bind_rows") -} - -#' @export -bind_rows.default <- function(..., .id = NULL) -{ - bind_rows(..., .id = .id) -} - -#' @export -bind_rows.tidybulk <- function(..., .id = NULL) -{ - - tts = flatten_if(dots_values(...), is_spliced) # Original that fails Bioconductor dplyr:::flatten_bindable(rlang::dots_values(...)) - - par1 = tts[[1]] %>% get_tt_columns() %>% unlist - par2 = tts[[2]] %>% get_tt_columns() %>% unlist - - # tt_columns of the two objects must match - error_if_parameters_not_match(par1, par2) - - bind_rows(..., .id = .id) %>% - - # Attach attributes from the first object - add_attr(tts[[1]] %>% attr("internals"), "internals") - -} - -############# END ADDED tidybulk ##################################### - -#' @export -#' @rdname bind -############# START ADDED tidybulk ##################################### - -bind_cols <- function(..., .id = NULL) { - UseMethod("bind_cols") -} - -#' @export -bind_cols.default <- function(..., .id = NULL) -{ - bind_cols(..., .id = .id) -} - -#' @export -bind_cols.tidybulk <- function(..., .id = NULL) -{ - - tts = flatten_if(dots_values(...), is_spliced) # Original that fails Bioconductor dplyr:::flatten_bindable(rlang::dots_values(...)) - - bind_cols(..., .id = .id) %>% - - # Attach attributes - add_attr(tts[[1]] %>% attr("internals"), "internals") - -} - -############# END ADDED tidybulk ##################################### -############# START ADDED tidybulk ##################################### - -#' @importFrom dplyr arrange_all -#' @export -dplyr::arrange_all - -#' @importFrom dplyr arrange_at -#' @export -dplyr::arrange_at - -#' @importFrom dplyr arrange_if -#' @export -dplyr::arrange_if - -############# END ADDED tidybulk ##################################### -############# START ADDED tidybulk ##################################### - -#' distinct -#' @param .data A tbl. (See dplyr) -#' @param ... Data frames to combine (See dplyr) -#' @param .keep_all If TRUE, keep all variables in .data. If a combination of ... is not distinct, this keeps the first row of values. (See dplyr) -#' -#' @return A tt object -#' -#' @examples -#' -#' tidybulk::se_mini %>% tidybulk() %>% distinct() -#' -#' -#' @export -distinct <- function (.data, ..., .keep_all = FALSE) { - UseMethod("distinct") -} - -#' @export -distinct.default <- function (.data, ..., .keep_all = FALSE) -{ - dplyr::distinct(.data, ..., .keep_all = FALSE) -} - -#' @export -distinct.tidybulk <- function (.data, ..., .keep_all = FALSE) -{ - .data %>% - drop_class(c("tidybulk", "tt")) %>% - dplyr::distinct(..., .keep_all = .keep_all) %>% - - # Attach attributes - reattach_internals() %>% - - # Add class - add_class("tt") %>% - add_class("tidybulk") - -} -############# END ADDED tidybulk ##################################### - -############# START ADDED tidybulk ##################################### - -#' @importFrom dplyr distinct_all -#' @export -dplyr::distinct_all - -#' @importFrom dplyr distinct_at -#' @export -dplyr::distinct_at - -#' @importFrom dplyr distinct_if -#' @export -dplyr::distinct_if - -############# END ADDED tidybulk ##################################### - -#' Subset rows using column values -#' -#' `filter()` retains the rows where the conditions you provide a `TRUE`. Note -#' that, unlike base subsetting with `[`, rows where the condition evaluates -#' to `NA` are dropped. -#' -#' dplyr is not yet smart enough to optimise filtering optimisation -#' on grouped datasets that don't need grouped calculations. For this reason, -#' filtering is often considerably faster on [ungroup()]ed data. -#' -#' @section Useful filter functions: -#' -#' * [`==`], [`>`], [`>=`] etc -#' * [`&`], [`|`], [`!`], [xor()] -#' * [is.na()] -#' * [between()], [near()] -#' -#' @section Grouped tibbles: -#' -#' Because filtering expressions are computed within groups, they may -#' yield different results on grouped tibbles. This will be the case -#' as soon as an aggregating, lagging, or ranking function is -#' involved. Compare this ungrouped filtering: -#' -#' ``` -#' starwars %>% filter(mass > mean(mass, na.rm = TRUE)) -#' ``` -#' -#' With the grouped equivalent: -#' -#' ``` -#' starwars %>% group_by(gender) %>% filter(mass > mean(mass, na.rm = TRUE)) -#' ``` -#' -#' The former keeps rows with `mass` greater than the global average -#' whereas the latter keeps rows with `mass` greater than the gender -#' -#' average. -#' @family single table verbs -#' @inheritParams arrange -#' @param ... <[`tidy-eval`][dplyr_tidy_eval]> Logical predicates defined in -#' terms of the variables in `.data`. -#' Multiple conditions are combined with `&`. Only rows where the -#' condition evaluates to `TRUE` are kept. -#' @param .preserve when `FALSE` (the default), the grouping structure -#' is recalculated based on the resulting data, otherwise it is kept as is. -#' @return -#' An object of the same type as `.data`. -#' -#' * Rows are a subset of the input, but appear in the same order. -#' * Columns are not modified. -#' * The number of groups may be reduced (if `.preserve` is not `TRUE`). -#' * Data frame attributes are preserved. -#' @section Methods: -#' This function is a **generic**, which means that packages can provide -#' implementations (methods) for other classes. See the documentation of -#' individual methods for extra arguments and differences in behaviour. -#' -#' The following methods are currently available in loaded packages: -#' \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("filter")}. -#' @seealso [filter_all()], [filter_if()] and [filter_at()]. -#' @export -#' @examples -#' filter(starwars, species == "Human") -#' filter(starwars, mass > 1000) -#' -#' # Multiple criteria -#' filter(starwars, hair_color == "none" & eye_color == "black") -#' filter(starwars, hair_color == "none" | eye_color == "black") -#' -#' # Multiple arguments are equivalent to and -#' filter(starwars, hair_color == "none", eye_color == "black") -#' -#' -#' # The filtering operation may yield different results on grouped -#' # tibbles because the expressions are computed within groups. -#' # -#' # The following filters rows where `mass` is greater than the -#' # global average: -#' starwars %>% filter(mass > mean(mass, na.rm = TRUE)) -#' -#' # Whereas this keeps rows with `mass` greater than the gender -#' # average: -#' starwars %>% group_by(gender) %>% filter(mass > mean(mass, na.rm = TRUE)) -#' -#' -#' # Refer to column names stored as strings with the `.data` pronoun: -#' vars <- c("mass", "height") -#' cond <- c(80, 150) -#' starwars %>% -#' filter( -#' .data[[vars[[1]]]] > cond[[1]], -#' .data[[vars[[2]]]] > cond[[2]] -#' ) -#' # Learn more in ?dplyr_tidy_eval -############# START ADDED tidybulk ##################################### -#' @export -filter <- function (.data, ..., .preserve = FALSE) { - UseMethod("filter") -} - -#' @export -filter.default <- function (.data, ..., .preserve = FALSE) -{ - dplyr::filter(.data, ..., .preserve = .preserve) -} - -#' @export -filter.tidybulk <- function (.data, ..., .preserve = FALSE) -{ - .data %>% - drop_class(c("tidybulk", "tt")) %>% - dplyr::filter( ..., .preserve = .preserve) %>% - - # Attach attributes - reattach_internals() %>% - - # Add class - add_class("tt") %>% - add_class("tidybulk") - -} -############# END ADDED tidybulk ##################################### - - -############# START ADDED tidybulk ##################################### - -#' @importFrom dplyr filter_all -#' @export -dplyr::filter_all - -#' @importFrom dplyr filter_at -#' @export -dplyr::filter_at - -#' @importFrom dplyr filter_if -#' @export -dplyr::filter_if - -############# END ADDED tidybulk ##################################### - -#' Group by one or more variables -#' -#' @description -#' Most data operations are done on groups defined by variables. -#' `group_by()` takes an existing tbl and converts it into a grouped tbl -#' where operations are performed "by group". `ungroup()` removes grouping. -#' -#' @family grouping functions -#' @inheritParams arrange -#' @param ... In `group_by()`, variables or computations to group by. -#' In `ungroup()`, variables to remove from the grouping. -#' @param .add When `FALSE`, the default, `group_by()` will -#' override existing groups. To add to the existing groups, use -#' `.add = TRUE`. -#' -#' This argument was previously called `add`, but that prevented -#' creating a new grouping variable called `add`, and conflicts with -#' our naming conventions. -#' @param .drop When `.drop = TRUE`, empty groups are dropped. See [group_by_drop_default()] for -#' what the default value is for this argument. -#' @return A [grouped data frame][grouped_df()], unless the combination of `...` and `add` -#' yields a non empty set of grouping columns, a regular (ungrouped) data frame -#' otherwise. -#' @section Methods: -#' These function are **generic**s, which means that packages can provide -#' implementations (methods) for other classes. See the documentation of -#' individual methods for extra arguments and differences in behaviour. -#' -#' Methods available in currently loaded packages: -#' -#' * `group_by()`: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("group_by")}. -#' * `ungroup()`: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("ungroup")}. -#' @export -#' @examples -#' by_cyl <- mtcars %>% group_by(cyl) -#' -#' # grouping doesn't change how the data looks (apart from listing -#' # how it's grouped): -#' by_cyl -#' -#' # It changes how it acts with the other dplyr verbs: -#' by_cyl %>% summarise( -#' disp = mean(disp), -#' hp = mean(hp) -#' ) -#' by_cyl %>% filter(disp == max(disp)) -#' -#' # Each call to summarise() removes a layer of grouping -#' by_vs_am <- mtcars %>% group_by(vs, am) -#' by_vs <- by_vs_am %>% summarise(n = n()) -#' by_vs -#' by_vs %>% summarise(n = sum(n)) -#' -#' # To removing grouping, use ungroup -#' by_vs %>% -#' ungroup() %>% -#' summarise(n = sum(n)) -#' -#' # You can group by expressions: this is just short-hand for -#' # a mutate() followed by a group_by() -#' mtcars %>% group_by(vsam = vs + am) -#' -#' # By default, group_by() overrides existing grouping -#' by_cyl %>% -#' group_by(vs, am) %>% -#' group_vars() -#' -#' # Use add = TRUE to instead append -#' by_cyl %>% -#' group_by(vs, am, .add = TRUE) %>% -#' group_vars() -#' -#' -#' # when factors are involved, groups can be empty -#' tbl <- tibble( -#' x = 1:10, -#' y = factor(rep(c("a", "c"), each = 5), levels = c("a", "b", "c")) -#' ) -#' tbl %>% -#' group_by(y) %>% -#' group_rows() -#' -############# START ADDED tidybulk ##################################### -#' @export -filter <- function (.data, ..., .preserve = FALSE) { - UseMethod("filter") -} - -#' @export -filter.default <- function (.data, ..., .preserve = FALSE) -{ - dplyr::filter(.data, ..., .preserve = .preserve) -} - -#' @export -filter.tidybulk <- function (.data, ..., .preserve = FALSE) -{ - .data %>% - drop_class(c("tidybulk", "tt")) %>% - dplyr::filter(..., .preserve = .preserve) %>% - - # Attach attributes - reattach_internals() %>% - - # Add class - add_class("tt") %>% - add_class("tidybulk") - -} -############# END ADDED tidybulk ##################################### - -#' Group by one or more variables -#' -#' @description -#' Most data operations are done on groups defined by variables. -#' `group_by()` takes an existing tbl and converts it into a grouped tbl -#' where operations are performed "by group". `ungroup()` removes grouping. -#' -#' @family grouping functions -#' @inheritParams arrange -#' @param ... In `group_by()`, variables or computations to group by. -#' In `ungroup()`, variables to remove from the grouping. -#' @param .add When `FALSE`, the default, `group_by()` will -#' override existing groups. To add to the existing groups, use -#' `.add = TRUE`. -#' -#' This argument was previously called `add`, but that prevented -#' creating a new grouping variable called `add`, and conflicts with -#' our naming conventions. -#' @param .drop When `.drop = TRUE`, empty groups are dropped. See [group_by_drop_default()] for -#' what the default value is for this argument. -#' @return A [grouped data frame][grouped_df()], unless the combination of `...` and `add` -#' yields a non empty set of grouping columns, a regular (ungrouped) data frame -#' otherwise. -#' @section Methods: -#' These function are **generic**s, which means that packages can provide -#' implementations (methods) for other classes. See the documentation of -#' individual methods for extra arguments and differences in behaviour. -#' -#' Methods available in currently loaded packages: -#' -#' * `group_by()`: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("group_by")}. -#' * `ungroup()`: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("ungroup")}. -#' @export -#' @examples -#' by_cyl <- mtcars %>% group_by(cyl) -#' -#' # grouping doesn't change how the data looks (apart from listing -#' # how it's grouped): -#' by_cyl -#' -#' # It changes how it acts with the other dplyr verbs: -#' by_cyl %>% summarise( -#' disp = mean(disp), -#' hp = mean(hp) -#' ) -#' by_cyl %>% filter(disp == max(disp)) -#' -#' # Each call to summarise() removes a layer of grouping -#' by_vs_am <- mtcars %>% group_by(vs, am) -#' by_vs <- by_vs_am %>% summarise(n = n()) -#' by_vs -#' by_vs %>% summarise(n = sum(n)) -#' -#' # To removing grouping, use ungroup -#' by_vs %>% -#' ungroup() %>% -#' summarise(n = sum(n)) -#' -#' # You can group by expressions: this is just short-hand for -#' # a mutate() followed by a group_by() -#' mtcars %>% group_by(vsam = vs + am) -#' -#' # By default, group_by() overrides existing grouping -#' by_cyl %>% -#' group_by(vs, am) %>% -#' group_vars() -#' -#' # Use add = TRUE to instead append -#' by_cyl %>% -#' group_by(vs, am, .add = TRUE) %>% -#' group_vars() -#' -#' -#' # when factors are involved, groups can be empty -#' tbl <- tibble( -#' x = 1:10, -#' y = factor(rep(c("a", "c"), each = 5), levels = c("a", "b", "c")) -#' ) -#' tbl %>% -#' group_by(y) %>% -#' group_rows() -############# START ADDED tidybulk ##################################### -#' @export -group_by <- function (.data, ..., .add = FALSE, .drop = group_by_drop_default(.data)) { - UseMethod("group_by") -} - -#' @export -group_by.default <- function (.data, ..., .add = FALSE, .drop = group_by_drop_default(.data)) -{ - dplyr::group_by(.data, ..., .add = .add, .drop = .drop) -} - -#' @export -group_by.tidybulk <- function (.data, ..., .add = FALSE, .drop = group_by_drop_default(.data)) -{ - .data %>% - drop_class(c("tidybulk", "tt")) %>% - dplyr::group_by( ..., .add = .add, .drop = .drop) %>% - - # Attach attributes - reattach_internals() %>% - - # Add class - add_class("tt") %>% - add_class("tidybulk") - -} -############# END ADDED tidybulk ##################################### - - -#' @rdname group_by -#' @export -#' @param x A [tbl()] -ungroup <- function(x, ...) { - UseMethod("ungroup") -} -############# START ADDED tidybulk ##################################### - -#' @export -ungroup.tidybulk <- function (.data, ...) -{ - .data %>% - drop_class(c("tidybulk", "tt")) %>% - dplyr::ungroup( ...) %>% - - # Attach attributes - reattach_internals() %>% - - # Add class - add_class("tt") %>% - add_class("tidybulk") - -} -############# END ADDED tidybulk ##################################### - -############# START ADDED tidybulk ##################################### - -#' @importFrom dplyr group_by_all -#' @export -dplyr::group_by_all - -#' @importFrom dplyr group_by_at -#' @export -dplyr::group_by_at - -#' @importFrom dplyr group_by_if -#' @export -dplyr::group_by_if - -############# END ADDED tidybulk ##################################### - -#' Summarise each group to fewer rows -#' -#' @description -#' `summarise()` creates a new data frame. It will have one (or more) rows for -#' each combination of grouping variables; if there are no grouping variables, -#' the output will have a single row summarising all observations in the input. -#' It will contain one column for each grouping variable and one column -#' for each of the summary statistics that you have specified. -#' -#' `summarise()` and `summarize()` are synonyms. -#' -#' @section Useful functions: -#' -#' * Center: [mean()], [median()] -#' * Spread: [sd()], [IQR()], [mad()] -#' * Range: [min()], [max()], [quantile()] -#' * Position: [first()], [last()], [nth()], -#' * Count: [n()], [n_distinct()] -#' * Logical: [any()], [all()] -#' -#' @section Backend variations: -#' -#' The data frame backend supports creating a variable and using it in the -#' same summary. This means that previously created summary variables can be -#' further transformed or combined within the summary, as in [mutate()]. -#' However, it also means that summary variables with the same names as previous -#' variables overwrite them, making those variables unavailable to later summary -#' variables. -#' -#' This behaviour may not be supported in other backends. To avoid unexpected -#' results, consider using new names for your summary variables, especially when -#' creating multiple summaries. -#' -#' @export -#' @inheritParams arrange -#' @param ... <[`tidy-eval`][dplyr_tidy_eval]> Name-value pairs of summary -#' functions. The name will be the name of the variable in the result. -#' -#' The value can be: -#' -#' * A vector of length 1, e.g. `min(x)`, `n()`, or `sum(is.na(y))`. -#' * A vector of length `n`, e.g. `quantile()`. -#' * A data frame, to add multiple columns from a single expression. -#' @family single table verbs -#' @return -#' An object _usually_ of the same type as `.data`. -#' -#' * The rows come from the underlying `group_keys()`. -#' * The columns are a combination of the grouping keys and the summary -#' expressions that you provide. -#' * If `x` is grouped by more than one variable, the output will be another -#' [grouped_df] with the right-most group removed. -#' * If `x` is grouped by one variable, or is not grouped, the output will -#' be a [tibble]. -#' * Data frame attributes are **not** preserved, because `summarise()` -#' fundamentally creates a new data frame. -#' @section Methods: -#' This function is a **generic**, which means that packages can provide -#' implementations (methods) for other classes. See the documentation of -#' individual methods for extra arguments and differences in behaviour. -#' -#' The following methods are currently available in loaded packages: -#' \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("summarise")}. -#' @examples -#' # A summary applied to ungrouped tbl returns a single row -#' mtcars %>% -#' summarise(mean = mean(disp), n = n()) -#' -#' # Usually, you'll want to group first -#' mtcars %>% -#' group_by(cyl) %>% -#' summarise(mean = mean(disp), n = n()) -#' -#' # dplyr 1.0.0 allows to summarise to more than one value: -#' mtcars %>% -#' group_by(cyl) %>% -#' summarise(qs = quantile(disp, c(0.25, 0.75)), prob = c(0.25, 0.75)) -#' -#' # You use a data frame to create multiple columns so you can wrap -#' # this up into a function: -#' my_quantile <- function(x, probs) { -#' tibble(x = quantile(x, probs), probs = probs) -#' } -#' mtcars %>% -#' group_by(cyl) %>% -#' summarise(my_quantile(disp, c(0.25, 0.75))) -#' -#' # Each summary call removes one grouping level (since that group -#' # is now just a single row) -#' mtcars %>% -#' group_by(cyl, vs) %>% -#' summarise(cyl_n = n()) %>% -#' group_vars() -#' -#' # BEWARE: reusing variables may lead to unexpected results -#' mtcars %>% -#' group_by(cyl) %>% -#' summarise(disp = mean(disp), sd = sd(disp)) -#' -#' # Refer to column names stored as strings with the `.data` pronoun: -#' var <- "mass" -#' summarise(starwars, avg = mean(.data[[var]], na.rm = TRUE)) -#' # Learn more in ?dplyr_tidy_eval -############# START ADDED tidybulk ##################################### -#' @export -summarise <- function (.data, ...) { - UseMethod("summarise") -} - -#' @export -summarise.default <- function (.data, ...) -{ - dplyr::summarise(.data, ...) -} - -#' @export -summarise.tidybulk <- function (.data, ...) -{ - .data %>% - drop_class(c("tidybulk", "tt")) %>% - dplyr::summarise( ...) %>% - - # Attach attributes - reattach_internals() %>% - - # Add class - add_class("tt") %>% - add_class("tidybulk") - -} -############# END ADDED tidybulk ##################################### - -############# START ADDED tidybulk ##################################### - -#' @importFrom dplyr summarize_all -#' @export -dplyr::summarize_all - -#' @importFrom dplyr summarize_at -#' @export -dplyr::summarize_at - -#' @importFrom dplyr summarize_if -#' @export -dplyr::summarize_if - -############# END ADDED tidybulk ##################################### - -#' @rdname summarise_all -#' @export -summarize_all <- summarise_all -#' @rdname summarise_all -#' @export -summarize_if <- summarise_if -#' @rdname summarise_all -#' @export -summarize_at <- summarise_at - -#' Create, modify, and delete columns -#' -#' `mutate()` adds new variables and preserves existing ones; -#' `transmute()` adds new variables and drops existing ones. -#' New variables overwrite existing variables of the same name. -#' Variables can be removed by setting their value to `NULL`. -#' -#' @section Useful mutate functions: -#' -#' * [`+`], [`-`], [log()], etc., for their usual mathematical meanings -#' -#' * [lead()], [lag()] -#' -#' * [dense_rank()], [min_rank()], [percent_rank()], [row_number()], -#' [cume_dist()], [ntile()] -#' -#' * [cumsum()], [cummean()], [cummin()], [cummax()], [cumany()], [cumall()] -#' -#' * [na_if()], [coalesce()] -#' -#' * [if_else()], [recode()], [case_when()] -#' -#' @section Grouped tibbles: -#' -#' Because mutating expressions are computed within groups, they may -#' yield different results on grouped tibbles. This will be the case -#' as soon as an aggregating, lagging, or ranking function is -#' involved. Compare this ungrouped mutate: -#' -#' ``` -#' starwars %>% -#' mutate(mass / mean(mass, na.rm = TRUE)) %>% -#' pull() -#' ``` -#' -#' With the grouped equivalent: -#' -#' ``` -#' starwars %>% -#' group_by(gender) %>% -#' mutate(mass / mean(mass, na.rm = TRUE)) %>% -#' pull() -#' ``` -#' -#' The former normalises `mass` by the global average whereas the -#' latter normalises by the averages within gender levels. -#' -#' @export -#' @inheritParams arrange -#' @param ... <[`tidy-eval`][dplyr_tidy_eval]> Name-value pairs. -#' The name gives the name of the column in the output. -#' -#' The value can be: -#' -#' * A vector of length 1, which will be recycled to the correct length. -#' * A vector the same length as the current group (or the whole data frame -#' if ungrouped). -#' * `NULL`, to remove the column. -#' * A data frame or tibble, to create multiple columns in the output. -#' -#' @family single table verbs -#' @return -#' An object of the same type as `.data`. -#' -#' For `mutate()`: -#' -#' * Rows are not affected. -#' * Existing columns will be preserved unless explicitly modified. -#' * New columns will be added to the right of existing columns. -#' * Columns given value `NULL` will be removed -#' * Groups will be recomputed if a grouping variable is mutated. -#' * Data frame attributes are preserved. -#' -#' For `transmute()`: -#' -#' * Rows are not affected. -#' * Apart from grouping variables, existing columns will be remove unless -#' explicitly kept. -#' * Column order matches order of expressions. -#' * Groups will be recomputed if a grouping variable is mutated. -#' * Data frame attributes are preserved. -#' @section Methods: -#' These function are **generic**s, which means that packages can provide -#' implementations (methods) for other classes. See the documentation of -#' individual methods for extra arguments and differences in behaviour. -#' -#' Methods available in currently loaded packages: -#' -#' * `mutate()`: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("mutate")}. -#' * `transmute()`: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("transmute")}. -#' @examples -#' # Newly created variables are available immediately -#' mtcars %>% as_tibble() %>% mutate( -#' cyl2 = cyl * 2, -#' cyl4 = cyl2 * 2 -#' ) -#' -#' # As well as adding new variables, you can use mutate() to -#' # remove variables and modify existing variables. -#' mtcars %>% as_tibble() %>% mutate( -#' mpg = NULL, -#' disp = disp * 0.0163871 # convert to litres -#' ) -#' -#' # window functions are useful for grouped mutates -#' mtcars %>% -#' group_by(cyl) %>% -#' mutate(rank = min_rank(desc(mpg))) -#' # see `vignette("window-functions")` for more details -#' -#' # mutate() vs transmute -------------------------- -#' # mutate() keeps all existing variables -#' mtcars %>% -#' mutate(displ_l = disp / 61.0237) -#' -#' # transmute keeps only the variables you create -#' mtcars %>% -#' transmute(displ_l = disp / 61.0237) -#' -#' # Grouping ---------------------------------------- -#' # The mutate operation may yield different results on grouped -#' # tibbles because the expressions are computed within groups. -#' # The following normalises `mass` by the global average: -#' starwars %>% -#' mutate(mass / mean(mass, na.rm = TRUE)) %>% -#' pull() -#' -#' # Whereas this normalises `mass` by the averages within gender -#' # levels: -#' starwars %>% -#' group_by(gender) %>% -#' mutate(mass / mean(mass, na.rm = TRUE)) %>% -#' pull() -#' -#' # Indirection ---------------------------------------- -#' # Refer to column names stored as strings with the `.data` pronoun: -#' vars <- c("mass", "height") -#' mutate(starwars, prod = .data[[vars[[1]]]] * .data[[vars[[2]]]]) -#' # Learn more in ?dplyr_tidy_eval -############# START ADDED tidybulk ##################################### -#' @export -mutate <- function(.data, ...) { - UseMethod("mutate") -} - -#' @export -mutate.default <- function(.data, ...) -{ - dplyr::mutate(.data, ...) -} - -#' @export -mutate.tidybulk <- function(.data, ...) -{ - .data %>% - drop_class(c("tidybulk", "tt")) %>% - dplyr::mutate(...) %>% - - # Attach attributes - reattach_internals() %>% - - # Add class - add_class("tt") %>% - add_class("tidybulk") - - -} -############# END ADDED tidybulk ##################################### - -############# START ADDED tidybulk ##################################### - -#' @importFrom dplyr mutate_all -#' @export -dplyr::mutate_all - -#' @importFrom dplyr mutate_at -#' @export -dplyr::mutate_at - -#' @importFrom dplyr mutate_if -#' @export -dplyr::mutate_if - -############# END ADDED tidybulk ##################################### - -#' Rename columns -#' -#' Rename individual variables using `new_name = old_name` syntax. -#' -#' @section Scoped selection and renaming: -#' -#' Use the three scoped variants ([rename_all()], [rename_if()], [rename_at()]) -#' to renaming a set of variables with a function. -#' -#' @inheritParams arrange -#' @param ... <[`tidy-select`][dplyr_tidy_select]> Use `new_name = old_name` -#' to rename selected variables. -#' @return -#' An object of the same type as `.data`. -#' * Rows are not affected. -#' * Column names are changed; column order is preserved -#' * Data frame attributes are preserved. -#' * Groups are updated to reflect new names. -#' @section Methods: -#' This function is a **generic**, which means that packages can provide -#' implementations (methods) for other classes. See the documentation of -#' individual methods for extra arguments and differences in behaviour. -#' -#' The following methods are currently available in loaded packages: -#' \Sexpr[stage=render,results=Rd]{dplyr:::methods_rd("rename")}. -#' @family single table verbs -#' @export -#' @examples -#' iris <- as_tibble(iris) # so it prints a little nicer -#' rename(iris, petal_length = Petal.Length) -############# START ADDED tidybulk ##################################### -#' @export -rename <- function(.data, ...) { - UseMethod("rename") -} - -#' @export -rename.default <- function(.data, ...) -{ - dplyr::rename(.data, ...) -} - -#' @export -rename.tidybulk <- function(.data, ...) -{ - .data %>% - drop_class(c("tidybulk", "tt")) %>% - dplyr::rename(...) %>% - - # Attach attributes - reattach_internals() %>% - - # Add class - add_class("tt") %>% - add_class("tidybulk") - - -} -############# END ADDED tidybulk ##################################### - -#' Group input by rows -#' -#' \Sexpr[results=rd, stage=render]{lifecycle::badge("questioning")} -#' -#' See [this repository](https://github.com/jennybc/row-oriented-workflows) -#' for alternative ways to perform row-wise operations. -#' -#' `rowwise()` is used for the results of [do()] when you -#' create list-variables. It is also useful to support arbitrary -#' complex operations that need to be applied to each row. -#' -#' Currently, rowwise grouping only works with data frames. Its -#' main impact is to allow you to work with list-variables in -#' [summarise()] and [mutate()] without having to -#' use \code{[[1]]}. This makes `summarise()` on a rowwise tbl -#' effectively equivalent to [plyr::ldply()]. -#' -#' @param data Input data frame. -#' @export -#' @examples -#' df <- expand.grid(x = 1:3, y = 3:1) -#' df_done <- df %>% rowwise() %>% do(i = seq(.$x, .$y)) -#' df_done -#' df_done %>% summarise(n = length(i)) -############# START ADDED tidybulk ##################################### -#' @export -rowwise <- function(.data) { - UseMethod("rowwise") -} - -#' @export -rowwise.default <- function(.data) -{ - dplyr::rowwise(.data) -} - -#' @export -rowwise.tidybulk <- function(.data) -{ - .data %>% - drop_class(c("tidybulk", "tt")) %>% - dplyr::rowwise() %>% - - # Attach attributes - reattach_internals() %>% - - # Add class - add_class("tt") %>% - add_class("tidybulk") - - -} -############# END ADDED tidybulk ##################################### From d7690dd212b7a1d6b68813f9be3b9445138b72a6 Mon Sep 17 00:00:00 2001 From: chilampoon Date: Mon, 18 Sep 2023 23:11:59 -0400 Subject: [PATCH 04/30] update R ver and check-bioc --- .github/workflows/check-bioc.yml | 158 ++-- DESCRIPTION | 4 +- dev/dplyr-master-methods.R | 1177 ++++++++++++++++++++++++++++++ 3 files changed, 1288 insertions(+), 51 deletions(-) create mode 100644 dev/dplyr-master-methods.R diff --git a/.github/workflows/check-bioc.yml b/.github/workflows/check-bioc.yml index 7c7151e4..e432bb90 100644 --- a/.github/workflows/check-bioc.yml +++ b/.github/workflows/check-bioc.yml @@ -39,6 +39,7 @@ env: run_pkgdown: 'true' has_RUnit: 'false' cache-version: 'cache-v1' + run_docker: 'false' jobs: build-check: @@ -51,9 +52,11 @@ jobs: fail-fast: false matrix: config: - - { os: ubuntu-latest, r: '4.2', bioc: '3.16', cont: "bioconductor/bioconductor_docker:RELEASE_3_16", rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest" } - - { os: macOS-latest, r: '4.2', bioc: '3.16'} - - { os: windows-latest, r: '4.2', bioc: '3.16'} + - { os: ubuntu-latest, r: '4.3', bioc: '3.18', cont: "bioconductor/bioconductor_docker:devel", rspm: "https://packagemanager.rstudio.com/cran/__linux__/jammy/latest" } + - { os: macOS-latest, r: '4.3', bioc: '3.18'} + - { os: windows-latest, r: '4.3', bioc: '3.18'} + ## Check https://github.com/r-lib/actions/tree/master/examples + ## for examples using the http-user-agent env: R_REMOTES_NO_ERRORS_FROM_WARNINGS: true RSPM: ${{ matrix.config.rspm }} @@ -76,7 +79,7 @@ jobs: ## https://github.com/r-lib/actions/blob/master/examples/check-standard.yaml ## If they update their steps, we will also need to update ours. - name: Checkout Repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 ## R is already included in the Bioconductor docker images - name: Setup R from r-lib @@ -84,6 +87,7 @@ jobs: uses: r-lib/actions/setup-r@v2 with: r-version: ${{ matrix.config.r }} + http-user-agent: ${{ matrix.config.http-user-agent }} ## pandoc is already included in the Bioconductor docker images - name: Setup pandoc from r-lib @@ -96,28 +100,28 @@ jobs: saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) shell: Rscript {0} - - name: Cache R packages + - name: Restore R package cache if: "!contains(github.event.head_commit.message, '/nocache') && runner.os != 'Linux'" uses: actions/cache@v3 with: path: ${{ env.R_LIBS_USER }} - key: ${{ env.cache-version }}-${{ runner.os }}-biocversion-RELEASE_3_16-r-4.2-${{ hashFiles('.github/depends.Rds') }} - restore-keys: ${{ env.cache-version }}-${{ runner.os }}-biocversion-RELEASE_3_16-r-4.2- + key: ${{ env.cache-version }}-${{ runner.os }}-biocversion-devel-r-4.3-${{ hashFiles('.github/depends.Rds') }} + restore-keys: ${{ env.cache-version }}-${{ runner.os }}-biocversion-devel-r-4.3- - name: Cache R packages on Linux if: "!contains(github.event.head_commit.message, '/nocache') && runner.os == 'Linux' " uses: actions/cache@v3 with: path: /home/runner/work/_temp/Library - key: ${{ env.cache-version }}-${{ runner.os }}-biocversion-RELEASE_3_16-r-4.2-${{ hashFiles('.github/depends.Rds') }} - restore-keys: ${{ env.cache-version }}-${{ runner.os }}-biocversion-RELEASE_3_16-r-4.2- + key: ${{ env.cache-version }}-${{ runner.os }}-biocversion-devel-r-4.3-${{ hashFiles('.github/depends.Rds') }} + restore-keys: ${{ env.cache-version }}-${{ runner.os }}-biocversion-devel-r-4.3- - - name: Install Linux system dependencies - if: runner.os == 'Linux' - run: | - sysreqs=$(Rscript -e 'cat("apt-get update -y && apt-get install -y", paste(gsub("apt-get install -y ", "", remotes::system_requirements("ubuntu", "20.04")), collapse = " "))') - echo $sysreqs - sudo -s eval "$sysreqs" + # - name: Install Linux system dependencies + # if: runner.os == 'Linux' + # run: | + # sysreqs=$(Rscript -e 'cat("apt-get update -y && apt-get install -y", paste(gsub("apt-get install -y ", "", remotes::system_requirements("ubuntu", "20.04")), collapse = " "))') + # echo $sysreqs + # sudo -s eval "$sysreqs" - name: Install macOS system dependencies if: matrix.config.os == 'macOS-latest' @@ -135,10 +139,9 @@ jobs: ## For installing usethis's dependency gert brew install libgit2 - - ## To fix x11/cairo error with tidyHeatmap/Complexheatmap here https://github.com/stemangiola/tidybulk/runs/1388237421?check_suite_focus=true#step:14:2134 - ## Suggested here https://stackoverflow.com/questions/63648591/how-to-install-x11-before-testing-with-github-actions-for-macos - brew install --cask xquartz + + ## Required for tcltk + brew install xquartz --cask - name: Install Windows system dependencies if: runner.os == 'Windows' @@ -154,7 +157,7 @@ jobs: - name: Set BiocVersion run: | - BiocManager::install(version = "${{ matrix.config.bioc }}", ask = FALSE) + BiocManager::install(version = "${{ matrix.config.bioc }}", ask = FALSE, force = TRUE) shell: Rscript {0} - name: Install dependencies pass 1 @@ -166,9 +169,13 @@ jobs: ## https://github.com/r-lib/remotes/issues/296 ## Ideally, all dependencies should get installed in the first pass. + ## For running the checks + message(paste('****', Sys.time(), 'installing rcmdcheck and BiocCheck ****')) + install.packages(c("rcmdcheck", "BiocCheck"), repos = BiocManager::repositories()) + ## Pass #1 at installing dependencies message(paste('****', Sys.time(), 'pass number 1 at installing dependencies: local dependencies ****')) - remotes::install_local(dependencies = TRUE, repos = BiocManager::repositories(), build_vignettes = TRUE, upgrade = TRUE) + remotes::install_local(dependencies = TRUE, repos = BiocManager::repositories(), build_vignettes = FALSE, upgrade = TRUE) continue-on-error: true shell: Rscript {0} @@ -176,12 +183,7 @@ jobs: run: | ## Pass #2 at installing dependencies message(paste('****', Sys.time(), 'pass number 2 at installing dependencies: any remaining dependencies ****')) - remotes::install_local(dependencies = TRUE, repos = BiocManager::repositories(), build_vignettes = TRUE, upgrade = TRUE) - - ## For running the checks - message(paste('****', Sys.time(), 'installing rcmdcheck and BiocCheck ****')) - remotes::install_cran("rcmdcheck") - BiocManager::install("BiocCheck") + remotes::install_local(dependencies = TRUE, repos = BiocManager::repositories(), build_vignettes = TRUE, upgrade = TRUE, force = TRUE) shell: Rscript {0} - name: Install BiocGenerics @@ -192,15 +194,15 @@ jobs: shell: Rscript {0} - name: Install covr - if: github.ref == 'refs/heads/master' && env.run_covr == 'true' && runner.os == 'Linux' + if: github.ref == 'refs/heads/devel' && env.run_covr == 'true' && runner.os == 'Linux' run: | remotes::install_cran("covr") shell: Rscript {0} - name: Install pkgdown - if: github.ref == 'refs/heads/master' && env.run_pkgdown == 'true' && runner.os == 'Linux' + if: github.ref == 'refs/heads/devel' && env.run_pkgdown == 'true' && runner.os == 'Linux' run: | - remotes::install_cran("pkgdown") + remotes::install_github("r-lib/pkgdown") shell: Rscript {0} - name: Session info @@ -213,10 +215,12 @@ jobs: - name: Run CMD check env: _R_CHECK_CRAN_INCOMING_: false + DISPLAY: 99.0 run: | + options(crayon.enabled = TRUE) rcmdcheck::rcmdcheck( - args = c("--no-build-vignettes", "--no-manual", "--timings"), - build_args = c("--no-manual", "--no-resave-data"), + args = c("--no-manual", "--no-vignettes", "--timings"), + build_args = c("--no-manual", "--keep-empty-dirs", "--no-resave-data"), error_on = "warning", check_dir = "check" ) @@ -234,45 +238,101 @@ jobs: shell: Rscript {0} - name: Run BiocCheck + env: + DISPLAY: 99.0 run: | BiocCheck::BiocCheck( dir('check', 'tar.gz$', full.names = TRUE), `quit-with-status` = TRUE, `no-check-R-ver` = TRUE, - `no-check-bioc-help` = TRUE, - `no-check-library-calls` = TRUE, - `no-check-coding-practices` = TRUE + `no-check-bioc-help` = TRUE ) shell: Rscript {0} - name: Test coverage - if: github.ref == 'refs/heads/master' && env.run_covr == 'true' && runner.os == 'Linux' + if: github.ref == 'refs/heads/devel' && env.run_covr == 'true' && runner.os == 'Linux' run: | covr::codecov() shell: Rscript {0} - name: Install package - if: github.ref == 'refs/heads/master' && env.run_pkgdown == 'true' && runner.os == 'Linux' + if: github.ref == 'refs/heads/devel' && env.run_pkgdown == 'true' && runner.os == 'Linux' run: R CMD INSTALL . - - name: Deploy package - if: github.ref == 'refs/heads/master' && env.run_pkgdown == 'true' && runner.os == 'Linux' - run: | - ## Temporary workaround for https://github.com/actions/checkout/issues/766 - git config --global --add safe.directory "$GITHUB_WORKSPACE" - - git config --local user.email "actions@github.com" - git config --local user.name "GitHub Actions" - Rscript -e "pkgdown::deploy_to_branch(new_process = FALSE)" - shell: bash {0} + - name: Build pkgdown site + if: github.ref == 'refs/heads/devel' && env.run_pkgdown == 'true' && runner.os == 'Linux' + run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE) + shell: Rscript {0} ## Note that you need to run pkgdown::deploy_to_branch(new_process = FALSE) ## at least one locally before this will work. This creates the gh-pages ## branch (erasing anything you haven't version controlled!) and ## makes the git history recognizable by pkgdown. + - name: Install deploy dependencies + if: github.ref == 'refs/heads/devel' && env.run_pkgdown == 'true' && runner.os == 'Linux' + run: | + apt-get update && apt-get -y install rsync + + - name: Deploy pkgdown site to GitHub pages 🚀 + if: github.ref == 'refs/heads/devel' && env.run_pkgdown == 'true' && runner.os == 'Linux' + uses: JamesIves/github-pages-deploy-action@releases/v4 + with: + clean: false + branch: gh-pages + folder: docs + - name: Upload check results if: failure() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@master with: - name: ${{ runner.os }}-biocversion-RELEASE_3_16-r-4.2-results + name: ${{ runner.os }}-biocversion-devel-r-4.3-results path: check + + + ## Code adapted from + ## https://github.com/waldronlab/cBioPortalData/blob/e0440a4445f0cc731e426363a76faa22ee5e0f9d/.github/workflows/devel_check_dock.yml#L65-L92 + docker-build-and-push: + runs-on: ubuntu-latest + needs: build-check + steps: + - name: Checkout Repository + if: "!contains(github.event.head_commit.message, '/nodocker') && env.run_docker == 'true' && github.ref == 'refs/heads/devel'" + uses: actions/checkout@v3 + + - name: Register repo name + if: "!contains(github.event.head_commit.message, '/nodocker') && env.run_docker == 'true' && github.ref == 'refs/heads/devel'" + id: reg_repo_name + run: | + echo CONT_IMG_NAME=$(echo ${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV + + - name: Set up QEMU + if: "!contains(github.event.head_commit.message, '/nodocker') && env.run_docker == 'true' && github.ref == 'refs/heads/devel'" + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + if: "!contains(github.event.head_commit.message, '/nodocker') && env.run_docker == 'true' && github.ref == 'refs/heads/devel'" + uses: docker/setup-buildx-action@v2 + + - name: Login to Docker Hub + if: "!contains(github.event.head_commit.message, '/nodocker') && env.run_docker == 'true' && github.ref == 'refs/heads/devel'" + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + ## Note that DOCKERHUB_TOKEN is really a token for your dockerhub + ## account, not your actual dockerhub account password. You can get it + ## from https://hub.docker.com/settings/security. + ## Check https://github.com/docker/build-push-action/tree/v4.0.0 + ## for more details. + ## Alternatively, try checking + ## https://seandavi.github.io/BuildABiocWorkshop/articles/HOWTO_BUILD_WORKSHOP.html. + + - name: Build and Push Docker + if: "!contains(github.event.head_commit.message, '/nodocker') && env.run_docker == 'true' && github.ref == 'refs/heads/devel' && success()" + uses: docker/build-push-action@v4 + with: + context: . + push: true + tags: > + ${{ secrets.DOCKERHUB_USERNAME }}/${{ env.CONT_IMG_NAME }}:latest, + ${{ secrets.DOCKERHUB_USERNAME }}/${{ env.CONT_IMG_NAME }}:devel \ No newline at end of file diff --git a/DESCRIPTION b/DESCRIPTION index ecbd460e..b5604bdb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -12,8 +12,8 @@ Description: This is a collection of utility functions that allow a modular, pipe-friendly and tidy fashion. License: GPL-3 Depends: - R (>= 4.1.0), - ttservice (>= 0.3.6) + R (>= 4.3.0), + ttservice Imports: tibble, readr, diff --git a/dev/dplyr-master-methods.R b/dev/dplyr-master-methods.R new file mode 100644 index 00000000..e24ef031 --- /dev/null +++ b/dev/dplyr-master-methods.R @@ -0,0 +1,1177 @@ + +#' Arrange rows by column values +#' +#' See \code{dpyr::\link[dpyr:arrange]{arrange}} for details. +#' +#' @description +#' `arrange()` order the rows of a data frame rows by the values of selected +#' columns. +#' +#' Unlike other dplyr verbs, `arrange()` largely ignores grouping; you +#' need to explicit mention grouping variables (or use `by_group = TRUE`) +#' in order to group by them, and functions of variables are evaluated +#' once per data frame, not once per group. +#' +#' @details +#' ## Locales +#' The sort order for character vectors will depend on the collating sequence +#' of the locale in use: see [locales()]. +#' +#' ## Missing values +#' Unlike base sorting with `sort()`, `NA` are: +#' * always sorted to the end for local data, even when wrapped with `desc()`. +#' * treated differently for remote data, depending on the backend. +#' +#' @return +#' An object of the same type as `.data`. +#' +#' * All rows appear in the output, but (usually) in a different place. +#' * Columns are not modified. +#' * Groups are not modified. +#' * Data frame attributes are preserved. +#' @section Methods: +#' This function is a **generic**, which means that packages can provide +#' implementations (methods) for other classes. See the documentation of +#' individual methods for extra arguments and differences in behaviour. +#' +#' The following methods are currently available in loaded packages: +#' \Sexpr[stage=render,results=Rd]{dplyr:::methods_rd("arrange")}. +#' @export +#' @param .data A data frame, data frame extension (e.g. a tibble), or a +#' lazy data frame (e.g. from dbplyr or dtplyr). See *Methods*, below, for +#' more details. +#' @param ... <[`tidy-eval`][dplyr_tidy_eval]> Variables, or functions or +#' variables. Use [desc()] to sort a variable in descending order. +#' @family single table verbs +#' @examples +#' arrange(mtcars, cyl, disp) +#' arrange(mtcars, desc(disp)) +#' +#' # grouped arrange ignores groups +#' by_cyl <- mtcars %>% group_by(cyl) +#' by_cyl %>% arrange(desc(wt)) +#' # Unless you specifically ask: +#' by_cyl %>% arrange(desc(wt), .by_group = TRUE) +arrange <- function(.data, ..., .by_group = FALSE) { + UseMethod("arrange") +} + +#' @param .by_group If `TRUE`, will sort first by grouping variable. Applies to +#' grouped data frames only. +#' @rdname arrange +#' @export +#' +############# START ADDED tidybulk ################################### + +arrange.default <- function(.data, ..., .by_group = FALSE) { + + dplyr::arrange(.data, ..., .by_group = .by_group) + +} + +#' @export +arrange.tidybulk <- function(.data, ..., .by_group = FALSE) { + + .data %>% + drop_class(c("tidybulk", "tt")) %>% + dplyr::arrange( ..., .by_group = .by_group) %>% + + # Attach attributes + reattach_internals() %>% + + # Add class + add_class("tt") %>% + add_class("tidybulk") + +} + +############# END ADDED tidybulk ##################################### + +#' Efficiently bind multiple data frames by row and column +#' +#' This is an efficient implementation of the common pattern of +#' `do.call(rbind, dfs)` or `do.call(cbind, dfs)` for binding many +#' data frames into one. +#' +#' The output of `bind_rows()` will contain a column if that column +#' appears in any of the inputs. +#' +#' @param ... Data frames to combine. +#' +#' Each argument can either be a data frame, a list that could be a data +#' frame, or a list of data frames. +#' +#' When row-binding, columns are matched by name, and any missing +#' columns will be filled with NA. +#' +#' When column-binding, rows are matched by position, so all data +#' frames must have the same number of rows. To match by value, not +#' position, see [mutate-joins]. +#' @param .id Data frame identifier. +#' +#' When `.id` is supplied, a new column of identifiers is +#' created to link each row to its original data frame. The labels +#' are taken from the named arguments to `bind_rows()`. When a +#' list of data frames is supplied, the labels are taken from the +#' names of the list. If no names are found a numeric sequence is +#' used instead. +#' @return `bind_rows()` and `bind_cols()` return the same type as +#' the first input, either a data frame, `tbl_df`, or `grouped_df`. +#' @examples +#' one <- mtcars[1:4, ] +#' two <- mtcars[11:14, ] +#' +#' # You can supply data frames as arguments: +#' bind_rows(one, two) +#' +#' # The contents of lists are spliced automatically: +#' bind_rows(list(one, two)) +#' bind_rows(split(mtcars, mtcars$cyl)) +#' bind_rows(list(one, two), list(two, one)) +#' +#' +#' # In addition to data frames, you can supply vectors. In the rows +#' # direction, the vectors represent rows and should have inner +#' # names: +#' bind_rows( +#' c(a = 1, b = 2), +#' c(a = 3, b = 4) +#' ) +#' +#' # You can mix vectors and data frames: +#' bind_rows( +#' c(a = 1, b = 2), +#' tibble(a = 3:4, b = 5:6), +#' c(a = 7, b = 8) +#' ) +#' +#' +#' # Note that for historical reasons, lists containing vectors are +#' # always treated as data frames. Thus their vectors are treated as +#' # columns rather than rows, and their inner names are ignored: +#' ll <- list( +#' a = c(A = 1, B = 2), +#' b = c(A = 3, B = 4) +#' ) +#' bind_rows(ll) +#' +#' # You can circumvent that behaviour with explicit splicing: +#' bind_rows(!!!ll) +#' +#' +#' # When you supply a column name with the `.id` argument, a new +#' # column is created to link each row to its original data frame +#' bind_rows(list(one, two), .id = "id") +#' bind_rows(list(a = one, b = two), .id = "id") +#' bind_rows("group 1" = one, "group 2" = two, .id = "groups") +#' +#' # Columns don't need to match when row-binding +#' bind_rows(data.frame(x = 1:3), data.frame(y = 1:4)) +#' \dontrun{ +#' # Rows do need to match when column-binding +#' bind_cols(data.frame(x = 1), data.frame(y = 1:2)) +#' } +#' +#' bind_cols(one, two) +#' bind_cols(list(one, two)) +#' @name bind +NULL + +#' @export +#' @rdname bind +#' @export +#' +############# START ADDED tidybulk ##################################### + +bind_rows <- function(..., .id = NULL) { + UseMethod("bind_rows") +} + +#' @export +bind_rows.default <- function(..., .id = NULL) +{ + bind_rows(..., .id = .id) +} + +#' @export +bind_rows.tidybulk <- function(..., .id = NULL) +{ + + tts = flatten_if(dots_values(...), is_spliced) # Original that fails Bioconductor dplyr:::flatten_bindable(rlang::dots_values(...)) + + par1 = tts[[1]] %>% get_tt_columns() %>% unlist + par2 = tts[[2]] %>% get_tt_columns() %>% unlist + + # tt_columns of the two objects must match + error_if_parameters_not_match(par1, par2) + + bind_rows(..., .id = .id) %>% + + # Attach attributes from the first object + add_attr(tts[[1]] %>% attr("internals"), "internals") + +} + +############# END ADDED tidybulk ##################################### + +#' @export +#' @rdname bind +############# START ADDED tidybulk ##################################### + +bind_cols <- function(..., .id = NULL) { + UseMethod("bind_cols") +} + +#' @export +bind_cols.default <- function(..., .id = NULL) +{ + bind_cols(..., .id = .id) +} + +#' @export +bind_cols.tidybulk <- function(..., .id = NULL) +{ + + tts = flatten_if(dots_values(...), is_spliced) # Original that fails Bioconductor dplyr:::flatten_bindable(rlang::dots_values(...)) + + bind_cols(..., .id = .id) %>% + + # Attach attributes + add_attr(tts[[1]] %>% attr("internals"), "internals") + +} + +############# END ADDED tidybulk ##################################### +############# START ADDED tidybulk ##################################### + +#' @importFrom dplyr arrange_all +#' @export +dplyr::arrange_all + +#' @importFrom dplyr arrange_at +#' @export +dplyr::arrange_at + +#' @importFrom dplyr arrange_if +#' @export +dplyr::arrange_if + +############# END ADDED tidybulk ##################################### +############# START ADDED tidybulk ##################################### + +#' distinct +#' @param .data A tbl. (See dplyr) +#' @param ... Data frames to combine (See dplyr) +#' @param .keep_all If TRUE, keep all variables in .data. If a combination of ... is not distinct, this keeps the first row of values. (See dplyr) +#' +#' @return A tt object +#' +#' @examples +#' +#' tidybulk::se_mini %>% tidybulk() %>% distinct() +#' +#' +#' @export +distinct <- function (.data, ..., .keep_all = FALSE) { + UseMethod("distinct") +} + +#' @export +distinct.default <- function (.data, ..., .keep_all = FALSE) +{ + dplyr::distinct(.data, ..., .keep_all = FALSE) +} + +#' @export +distinct.tidybulk <- function (.data, ..., .keep_all = FALSE) +{ + .data %>% + drop_class(c("tidybulk", "tt")) %>% + dplyr::distinct(..., .keep_all = .keep_all) %>% + + # Attach attributes + reattach_internals() %>% + + # Add class + add_class("tt") %>% + add_class("tidybulk") + +} +############# END ADDED tidybulk ##################################### + +############# START ADDED tidybulk ##################################### + +#' @importFrom dplyr distinct_all +#' @export +dplyr::distinct_all + +#' @importFrom dplyr distinct_at +#' @export +dplyr::distinct_at + +#' @importFrom dplyr distinct_if +#' @export +dplyr::distinct_if + +############# END ADDED tidybulk ##################################### + +#' Subset rows using column values +#' +#' `filter()` retains the rows where the conditions you provide a `TRUE`. Note +#' that, unlike base subsetting with `[`, rows where the condition evaluates +#' to `NA` are dropped. +#' +#' dplyr is not yet smart enough to optimise filtering optimisation +#' on grouped datasets that don't need grouped calculations. For this reason, +#' filtering is often considerably faster on [ungroup()]ed data. +#' +#' @section Useful filter functions: +#' +#' * [`==`], [`>`], [`>=`] etc +#' * [`&`], [`|`], [`!`], [xor()] +#' * [is.na()] +#' * [between()], [near()] +#' +#' @section Grouped tibbles: +#' +#' Because filtering expressions are computed within groups, they may +#' yield different results on grouped tibbles. This will be the case +#' as soon as an aggregating, lagging, or ranking function is +#' involved. Compare this ungrouped filtering: +#' +#' ``` +#' starwars %>% filter(mass > mean(mass, na.rm = TRUE)) +#' ``` +#' +#' With the grouped equivalent: +#' +#' ``` +#' starwars %>% group_by(gender) %>% filter(mass > mean(mass, na.rm = TRUE)) +#' ``` +#' +#' The former keeps rows with `mass` greater than the global average +#' whereas the latter keeps rows with `mass` greater than the gender +#' +#' average. +#' @family single table verbs +#' @inheritParams arrange +#' @param ... <[`tidy-eval`][dplyr_tidy_eval]> Logical predicates defined in +#' terms of the variables in `.data`. +#' Multiple conditions are combined with `&`. Only rows where the +#' condition evaluates to `TRUE` are kept. +#' @param .preserve when `FALSE` (the default), the grouping structure +#' is recalculated based on the resulting data, otherwise it is kept as is. +#' @return +#' An object of the same type as `.data`. +#' +#' * Rows are a subset of the input, but appear in the same order. +#' * Columns are not modified. +#' * The number of groups may be reduced (if `.preserve` is not `TRUE`). +#' * Data frame attributes are preserved. +#' @section Methods: +#' This function is a **generic**, which means that packages can provide +#' implementations (methods) for other classes. See the documentation of +#' individual methods for extra arguments and differences in behaviour. +#' +#' The following methods are currently available in loaded packages: +#' \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("filter")}. +#' @seealso [filter_all()], [filter_if()] and [filter_at()]. +#' @export +#' @examples +#' filter(starwars, species == "Human") +#' filter(starwars, mass > 1000) +#' +#' # Multiple criteria +#' filter(starwars, hair_color == "none" & eye_color == "black") +#' filter(starwars, hair_color == "none" | eye_color == "black") +#' +#' # Multiple arguments are equivalent to and +#' filter(starwars, hair_color == "none", eye_color == "black") +#' +#' +#' # The filtering operation may yield different results on grouped +#' # tibbles because the expressions are computed within groups. +#' # +#' # The following filters rows where `mass` is greater than the +#' # global average: +#' starwars %>% filter(mass > mean(mass, na.rm = TRUE)) +#' +#' # Whereas this keeps rows with `mass` greater than the gender +#' # average: +#' starwars %>% group_by(gender) %>% filter(mass > mean(mass, na.rm = TRUE)) +#' +#' +#' # Refer to column names stored as strings with the `.data` pronoun: +#' vars <- c("mass", "height") +#' cond <- c(80, 150) +#' starwars %>% +#' filter( +#' .data[[vars[[1]]]] > cond[[1]], +#' .data[[vars[[2]]]] > cond[[2]] +#' ) +#' # Learn more in ?dplyr_tidy_eval +############# START ADDED tidybulk ##################################### +#' @export +filter <- function (.data, ..., .preserve = FALSE) { + UseMethod("filter") +} + +#' @export +filter.default <- function (.data, ..., .preserve = FALSE) +{ + dplyr::filter(.data, ..., .preserve = .preserve) +} + +#' @export +filter.tidybulk <- function (.data, ..., .preserve = FALSE) +{ + .data %>% + drop_class(c("tidybulk", "tt")) %>% + dplyr::filter( ..., .preserve = .preserve) %>% + + # Attach attributes + reattach_internals() %>% + + # Add class + add_class("tt") %>% + add_class("tidybulk") + +} +############# END ADDED tidybulk ##################################### + + +############# START ADDED tidybulk ##################################### + +#' @importFrom dplyr filter_all +#' @export +dplyr::filter_all + +#' @importFrom dplyr filter_at +#' @export +dplyr::filter_at + +#' @importFrom dplyr filter_if +#' @export +dplyr::filter_if + +############# END ADDED tidybulk ##################################### + +#' Group by one or more variables +#' +#' @description +#' Most data operations are done on groups defined by variables. +#' `group_by()` takes an existing tbl and converts it into a grouped tbl +#' where operations are performed "by group". `ungroup()` removes grouping. +#' +#' @family grouping functions +#' @inheritParams arrange +#' @param ... In `group_by()`, variables or computations to group by. +#' In `ungroup()`, variables to remove from the grouping. +#' @param .add When `FALSE`, the default, `group_by()` will +#' override existing groups. To add to the existing groups, use +#' `.add = TRUE`. +#' +#' This argument was previously called `add`, but that prevented +#' creating a new grouping variable called `add`, and conflicts with +#' our naming conventions. +#' @param .drop When `.drop = TRUE`, empty groups are dropped. See [group_by_drop_default()] for +#' what the default value is for this argument. +#' @return A [grouped data frame][grouped_df()], unless the combination of `...` and `add` +#' yields a non empty set of grouping columns, a regular (ungrouped) data frame +#' otherwise. +#' @section Methods: +#' These function are **generic**s, which means that packages can provide +#' implementations (methods) for other classes. See the documentation of +#' individual methods for extra arguments and differences in behaviour. +#' +#' Methods available in currently loaded packages: +#' +#' * `group_by()`: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("group_by")}. +#' * `ungroup()`: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("ungroup")}. +#' @export +#' @examples +#' by_cyl <- mtcars %>% group_by(cyl) +#' +#' # grouping doesn't change how the data looks (apart from listing +#' # how it's grouped): +#' by_cyl +#' +#' # It changes how it acts with the other dplyr verbs: +#' by_cyl %>% summarise( +#' disp = mean(disp), +#' hp = mean(hp) +#' ) +#' by_cyl %>% filter(disp == max(disp)) +#' +#' # Each call to summarise() removes a layer of grouping +#' by_vs_am <- mtcars %>% group_by(vs, am) +#' by_vs <- by_vs_am %>% summarise(n = n()) +#' by_vs +#' by_vs %>% summarise(n = sum(n)) +#' +#' # To removing grouping, use ungroup +#' by_vs %>% +#' ungroup() %>% +#' summarise(n = sum(n)) +#' +#' # You can group by expressions: this is just short-hand for +#' # a mutate() followed by a group_by() +#' mtcars %>% group_by(vsam = vs + am) +#' +#' # By default, group_by() overrides existing grouping +#' by_cyl %>% +#' group_by(vs, am) %>% +#' group_vars() +#' +#' # Use add = TRUE to instead append +#' by_cyl %>% +#' group_by(vs, am, .add = TRUE) %>% +#' group_vars() +#' +#' +#' # when factors are involved, groups can be empty +#' tbl <- tibble( +#' x = 1:10, +#' y = factor(rep(c("a", "c"), each = 5), levels = c("a", "b", "c")) +#' ) +#' tbl %>% +#' group_by(y) %>% +#' group_rows() +#' +############# START ADDED tidybulk ##################################### +#' @export +filter <- function (.data, ..., .preserve = FALSE) { + UseMethod("filter") +} + +#' @export +filter.default <- function (.data, ..., .preserve = FALSE) +{ + dplyr::filter(.data, ..., .preserve = .preserve) +} + +#' @export +filter.tidybulk <- function (.data, ..., .preserve = FALSE) +{ + .data %>% + drop_class(c("tidybulk", "tt")) %>% + dplyr::filter(..., .preserve = .preserve) %>% + + # Attach attributes + reattach_internals() %>% + + # Add class + add_class("tt") %>% + add_class("tidybulk") + +} +############# END ADDED tidybulk ##################################### + +#' Group by one or more variables +#' +#' @description +#' Most data operations are done on groups defined by variables. +#' `group_by()` takes an existing tbl and converts it into a grouped tbl +#' where operations are performed "by group". `ungroup()` removes grouping. +#' +#' @family grouping functions +#' @inheritParams arrange +#' @param ... In `group_by()`, variables or computations to group by. +#' In `ungroup()`, variables to remove from the grouping. +#' @param .add When `FALSE`, the default, `group_by()` will +#' override existing groups. To add to the existing groups, use +#' `.add = TRUE`. +#' +#' This argument was previously called `add`, but that prevented +#' creating a new grouping variable called `add`, and conflicts with +#' our naming conventions. +#' @param .drop When `.drop = TRUE`, empty groups are dropped. See [group_by_drop_default()] for +#' what the default value is for this argument. +#' @return A [grouped data frame][grouped_df()], unless the combination of `...` and `add` +#' yields a non empty set of grouping columns, a regular (ungrouped) data frame +#' otherwise. +#' @section Methods: +#' These function are **generic**s, which means that packages can provide +#' implementations (methods) for other classes. See the documentation of +#' individual methods for extra arguments and differences in behaviour. +#' +#' Methods available in currently loaded packages: +#' +#' * `group_by()`: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("group_by")}. +#' * `ungroup()`: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("ungroup")}. +#' @export +#' @examples +#' by_cyl <- mtcars %>% group_by(cyl) +#' +#' # grouping doesn't change how the data looks (apart from listing +#' # how it's grouped): +#' by_cyl +#' +#' # It changes how it acts with the other dplyr verbs: +#' by_cyl %>% summarise( +#' disp = mean(disp), +#' hp = mean(hp) +#' ) +#' by_cyl %>% filter(disp == max(disp)) +#' +#' # Each call to summarise() removes a layer of grouping +#' by_vs_am <- mtcars %>% group_by(vs, am) +#' by_vs <- by_vs_am %>% summarise(n = n()) +#' by_vs +#' by_vs %>% summarise(n = sum(n)) +#' +#' # To removing grouping, use ungroup +#' by_vs %>% +#' ungroup() %>% +#' summarise(n = sum(n)) +#' +#' # You can group by expressions: this is just short-hand for +#' # a mutate() followed by a group_by() +#' mtcars %>% group_by(vsam = vs + am) +#' +#' # By default, group_by() overrides existing grouping +#' by_cyl %>% +#' group_by(vs, am) %>% +#' group_vars() +#' +#' # Use add = TRUE to instead append +#' by_cyl %>% +#' group_by(vs, am, .add = TRUE) %>% +#' group_vars() +#' +#' +#' # when factors are involved, groups can be empty +#' tbl <- tibble( +#' x = 1:10, +#' y = factor(rep(c("a", "c"), each = 5), levels = c("a", "b", "c")) +#' ) +#' tbl %>% +#' group_by(y) %>% +#' group_rows() +############# START ADDED tidybulk ##################################### +#' @export +group_by <- function (.data, ..., .add = FALSE, .drop = group_by_drop_default(.data)) { + UseMethod("group_by") +} + +#' @export +group_by.default <- function (.data, ..., .add = FALSE, .drop = group_by_drop_default(.data)) +{ + dplyr::group_by(.data, ..., .add = .add, .drop = .drop) +} + +#' @export +group_by.tidybulk <- function (.data, ..., .add = FALSE, .drop = group_by_drop_default(.data)) +{ + .data %>% + drop_class(c("tidybulk", "tt")) %>% + dplyr::group_by( ..., .add = .add, .drop = .drop) %>% + + # Attach attributes + reattach_internals() %>% + + # Add class + add_class("tt") %>% + add_class("tidybulk") + +} +############# END ADDED tidybulk ##################################### + + +#' @rdname group_by +#' @export +#' @param x A [tbl()] +ungroup <- function(x, ...) { + UseMethod("ungroup") +} +############# START ADDED tidybulk ##################################### + +#' @export +ungroup.tidybulk <- function (.data, ...) +{ + .data %>% + drop_class(c("tidybulk", "tt")) %>% + dplyr::ungroup( ...) %>% + + # Attach attributes + reattach_internals() %>% + + # Add class + add_class("tt") %>% + add_class("tidybulk") + +} +############# END ADDED tidybulk ##################################### + +############# START ADDED tidybulk ##################################### + +#' @importFrom dplyr group_by_all +#' @export +dplyr::group_by_all + +#' @importFrom dplyr group_by_at +#' @export +dplyr::group_by_at + +#' @importFrom dplyr group_by_if +#' @export +dplyr::group_by_if + +############# END ADDED tidybulk ##################################### + +#' Summarise each group to fewer rows +#' +#' @description +#' `summarise()` creates a new data frame. It will have one (or more) rows for +#' each combination of grouping variables; if there are no grouping variables, +#' the output will have a single row summarising all observations in the input. +#' It will contain one column for each grouping variable and one column +#' for each of the summary statistics that you have specified. +#' +#' `summarise()` and `summarize()` are synonyms. +#' +#' @section Useful functions: +#' +#' * Center: [mean()], [median()] +#' * Spread: [sd()], [IQR()], [mad()] +#' * Range: [min()], [max()], [quantile()] +#' * Position: [first()], [last()], [nth()], +#' * Count: [n()], [n_distinct()] +#' * Logical: [any()], [all()] +#' +#' @section Backend variations: +#' +#' The data frame backend supports creating a variable and using it in the +#' same summary. This means that previously created summary variables can be +#' further transformed or combined within the summary, as in [mutate()]. +#' However, it also means that summary variables with the same names as previous +#' variables overwrite them, making those variables unavailable to later summary +#' variables. +#' +#' This behaviour may not be supported in other backends. To avoid unexpected +#' results, consider using new names for your summary variables, especially when +#' creating multiple summaries. +#' +#' @export +#' @inheritParams arrange +#' @param ... <[`tidy-eval`][dplyr_tidy_eval]> Name-value pairs of summary +#' functions. The name will be the name of the variable in the result. +#' +#' The value can be: +#' +#' * A vector of length 1, e.g. `min(x)`, `n()`, or `sum(is.na(y))`. +#' * A vector of length `n`, e.g. `quantile()`. +#' * A data frame, to add multiple columns from a single expression. +#' @family single table verbs +#' @return +#' An object _usually_ of the same type as `.data`. +#' +#' * The rows come from the underlying `group_keys()`. +#' * The columns are a combination of the grouping keys and the summary +#' expressions that you provide. +#' * If `x` is grouped by more than one variable, the output will be another +#' [grouped_df] with the right-most group removed. +#' * If `x` is grouped by one variable, or is not grouped, the output will +#' be a [tibble]. +#' * Data frame attributes are **not** preserved, because `summarise()` +#' fundamentally creates a new data frame. +#' @section Methods: +#' This function is a **generic**, which means that packages can provide +#' implementations (methods) for other classes. See the documentation of +#' individual methods for extra arguments and differences in behaviour. +#' +#' The following methods are currently available in loaded packages: +#' \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("summarise")}. +#' @examples +#' # A summary applied to ungrouped tbl returns a single row +#' mtcars %>% +#' summarise(mean = mean(disp), n = n()) +#' +#' # Usually, you'll want to group first +#' mtcars %>% +#' group_by(cyl) %>% +#' summarise(mean = mean(disp), n = n()) +#' +#' # dplyr 1.0.0 allows to summarise to more than one value: +#' mtcars %>% +#' group_by(cyl) %>% +#' summarise(qs = quantile(disp, c(0.25, 0.75)), prob = c(0.25, 0.75)) +#' +#' # You use a data frame to create multiple columns so you can wrap +#' # this up into a function: +#' my_quantile <- function(x, probs) { +#' tibble(x = quantile(x, probs), probs = probs) +#' } +#' mtcars %>% +#' group_by(cyl) %>% +#' summarise(my_quantile(disp, c(0.25, 0.75))) +#' +#' # Each summary call removes one grouping level (since that group +#' # is now just a single row) +#' mtcars %>% +#' group_by(cyl, vs) %>% +#' summarise(cyl_n = n()) %>% +#' group_vars() +#' +#' # BEWARE: reusing variables may lead to unexpected results +#' mtcars %>% +#' group_by(cyl) %>% +#' summarise(disp = mean(disp), sd = sd(disp)) +#' +#' # Refer to column names stored as strings with the `.data` pronoun: +#' var <- "mass" +#' summarise(starwars, avg = mean(.data[[var]], na.rm = TRUE)) +#' # Learn more in ?dplyr_tidy_eval +############# START ADDED tidybulk ##################################### +#' @export +summarise <- function (.data, ...) { + UseMethod("summarise") +} + +#' @export +summarise.default <- function (.data, ...) +{ + dplyr::summarise(.data, ...) +} + +#' @export +summarise.tidybulk <- function (.data, ...) +{ + .data %>% + drop_class(c("tidybulk", "tt")) %>% + dplyr::summarise( ...) %>% + + # Attach attributes + reattach_internals() %>% + + # Add class + add_class("tt") %>% + add_class("tidybulk") + +} +############# END ADDED tidybulk ##################################### + +############# START ADDED tidybulk ##################################### + +#' @importFrom dplyr summarize_all +#' @export +dplyr::summarize_all + +#' @importFrom dplyr summarize_at +#' @export +dplyr::summarize_at + +#' @importFrom dplyr summarize_if +#' @export +dplyr::summarize_if + +############# END ADDED tidybulk ##################################### + +#' @rdname summarise_all +#' @export +summarize_all <- summarise_all +#' @rdname summarise_all +#' @export +summarize_if <- summarise_if +#' @rdname summarise_all +#' @export +summarize_at <- summarise_at + +#' Create, modify, and delete columns +#' +#' `mutate()` adds new variables and preserves existing ones; +#' `transmute()` adds new variables and drops existing ones. +#' New variables overwrite existing variables of the same name. +#' Variables can be removed by setting their value to `NULL`. +#' +#' @section Useful mutate functions: +#' +#' * [`+`], [`-`], [log()], etc., for their usual mathematical meanings +#' +#' * [lead()], [lag()] +#' +#' * [dense_rank()], [min_rank()], [percent_rank()], [row_number()], +#' [cume_dist()], [ntile()] +#' +#' * [cumsum()], [cummean()], [cummin()], [cummax()], [cumany()], [cumall()] +#' +#' * [na_if()], [coalesce()] +#' +#' * [if_else()], [recode()], [case_when()] +#' +#' @section Grouped tibbles: +#' +#' Because mutating expressions are computed within groups, they may +#' yield different results on grouped tibbles. This will be the case +#' as soon as an aggregating, lagging, or ranking function is +#' involved. Compare this ungrouped mutate: +#' +#' ``` +#' starwars %>% +#' mutate(mass / mean(mass, na.rm = TRUE)) %>% +#' pull() +#' ``` +#' +#' With the grouped equivalent: +#' +#' ``` +#' starwars %>% +#' group_by(gender) %>% +#' mutate(mass / mean(mass, na.rm = TRUE)) %>% +#' pull() +#' ``` +#' +#' The former normalises `mass` by the global average whereas the +#' latter normalises by the averages within gender levels. +#' +#' @export +#' @inheritParams arrange +#' @param ... <[`tidy-eval`][dplyr_tidy_eval]> Name-value pairs. +#' The name gives the name of the column in the output. +#' +#' The value can be: +#' +#' * A vector of length 1, which will be recycled to the correct length. +#' * A vector the same length as the current group (or the whole data frame +#' if ungrouped). +#' * `NULL`, to remove the column. +#' * A data frame or tibble, to create multiple columns in the output. +#' +#' @family single table verbs +#' @return +#' An object of the same type as `.data`. +#' +#' For `mutate()`: +#' +#' * Rows are not affected. +#' * Existing columns will be preserved unless explicitly modified. +#' * New columns will be added to the right of existing columns. +#' * Columns given value `NULL` will be removed +#' * Groups will be recomputed if a grouping variable is mutated. +#' * Data frame attributes are preserved. +#' +#' For `transmute()`: +#' +#' * Rows are not affected. +#' * Apart from grouping variables, existing columns will be remove unless +#' explicitly kept. +#' * Column order matches order of expressions. +#' * Groups will be recomputed if a grouping variable is mutated. +#' * Data frame attributes are preserved. +#' @section Methods: +#' These function are **generic**s, which means that packages can provide +#' implementations (methods) for other classes. See the documentation of +#' individual methods for extra arguments and differences in behaviour. +#' +#' Methods available in currently loaded packages: +#' +#' * `mutate()`: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("mutate")}. +#' * `transmute()`: \Sexpr[stage=render,results=rd]{dplyr:::methods_rd("transmute")}. +#' @examples +#' # Newly created variables are available immediately +#' mtcars %>% as_tibble() %>% mutate( +#' cyl2 = cyl * 2, +#' cyl4 = cyl2 * 2 +#' ) +#' +#' # As well as adding new variables, you can use mutate() to +#' # remove variables and modify existing variables. +#' mtcars %>% as_tibble() %>% mutate( +#' mpg = NULL, +#' disp = disp * 0.0163871 # convert to litres +#' ) +#' +#' # window functions are useful for grouped mutates +#' mtcars %>% +#' group_by(cyl) %>% +#' mutate(rank = min_rank(desc(mpg))) +#' # see `vignette("window-functions")` for more details +#' +#' # mutate() vs transmute -------------------------- +#' # mutate() keeps all existing variables +#' mtcars %>% +#' mutate(displ_l = disp / 61.0237) +#' +#' # transmute keeps only the variables you create +#' mtcars %>% +#' transmute(displ_l = disp / 61.0237) +#' +#' # Grouping ---------------------------------------- +#' # The mutate operation may yield different results on grouped +#' # tibbles because the expressions are computed within groups. +#' # The following normalises `mass` by the global average: +#' starwars %>% +#' mutate(mass / mean(mass, na.rm = TRUE)) %>% +#' pull() +#' +#' # Whereas this normalises `mass` by the averages within gender +#' # levels: +#' starwars %>% +#' group_by(gender) %>% +#' mutate(mass / mean(mass, na.rm = TRUE)) %>% +#' pull() +#' +#' # Indirection ---------------------------------------- +#' # Refer to column names stored as strings with the `.data` pronoun: +#' vars <- c("mass", "height") +#' mutate(starwars, prod = .data[[vars[[1]]]] * .data[[vars[[2]]]]) +#' # Learn more in ?dplyr_tidy_eval +############# START ADDED tidybulk ##################################### +#' @export +mutate <- function(.data, ...) { + UseMethod("mutate") +} + +#' @export +mutate.default <- function(.data, ...) +{ + dplyr::mutate(.data, ...) +} + +#' @export +mutate.tidybulk <- function(.data, ...) +{ + .data %>% + drop_class(c("tidybulk", "tt")) %>% + dplyr::mutate(...) %>% + + # Attach attributes + reattach_internals() %>% + + # Add class + add_class("tt") %>% + add_class("tidybulk") + + +} +############# END ADDED tidybulk ##################################### + +############# START ADDED tidybulk ##################################### + +#' @importFrom dplyr mutate_all +#' @export +dplyr::mutate_all + +#' @importFrom dplyr mutate_at +#' @export +dplyr::mutate_at + +#' @importFrom dplyr mutate_if +#' @export +dplyr::mutate_if + +############# END ADDED tidybulk ##################################### + +#' Rename columns +#' +#' Rename individual variables using `new_name = old_name` syntax. +#' +#' @section Scoped selection and renaming: +#' +#' Use the three scoped variants ([rename_all()], [rename_if()], [rename_at()]) +#' to renaming a set of variables with a function. +#' +#' @inheritParams arrange +#' @param ... <[`tidy-select`][dplyr_tidy_select]> Use `new_name = old_name` +#' to rename selected variables. +#' @return +#' An object of the same type as `.data`. +#' * Rows are not affected. +#' * Column names are changed; column order is preserved +#' * Data frame attributes are preserved. +#' * Groups are updated to reflect new names. +#' @section Methods: +#' This function is a **generic**, which means that packages can provide +#' implementations (methods) for other classes. See the documentation of +#' individual methods for extra arguments and differences in behaviour. +#' +#' The following methods are currently available in loaded packages: +#' \Sexpr[stage=render,results=Rd]{dplyr:::methods_rd("rename")}. +#' @family single table verbs +#' @export +#' @examples +#' iris <- as_tibble(iris) # so it prints a little nicer +#' rename(iris, petal_length = Petal.Length) +############# START ADDED tidybulk ##################################### +#' @export +rename <- function(.data, ...) { + UseMethod("rename") +} + +#' @export +rename.default <- function(.data, ...) +{ + dplyr::rename(.data, ...) +} + +#' @export +rename.tidybulk <- function(.data, ...) +{ + .data %>% + drop_class(c("tidybulk", "tt")) %>% + dplyr::rename(...) %>% + + # Attach attributes + reattach_internals() %>% + + # Add class + add_class("tt") %>% + add_class("tidybulk") + + +} +############# END ADDED tidybulk ##################################### + +#' Group input by rows +#' +#' \Sexpr[results=rd, stage=render]{lifecycle::badge("questioning")} +#' +#' See [this repository](https://github.com/jennybc/row-oriented-workflows) +#' for alternative ways to perform row-wise operations. +#' +#' `rowwise()` is used for the results of [do()] when you +#' create list-variables. It is also useful to support arbitrary +#' complex operations that need to be applied to each row. +#' +#' Currently, rowwise grouping only works with data frames. Its +#' main impact is to allow you to work with list-variables in +#' [summarise()] and [mutate()] without having to +#' use \code{[[1]]}. This makes `summarise()` on a rowwise tbl +#' effectively equivalent to [plyr::ldply()]. +#' +#' @param data Input data frame. +#' @export +#' @examples +#' df <- expand.grid(x = 1:3, y = 3:1) +#' df_done <- df %>% rowwise() %>% do(i = seq(.$x, .$y)) +#' df_done +#' df_done %>% summarise(n = length(i)) +############# START ADDED tidybulk ##################################### +#' @export +rowwise <- function(.data) { + UseMethod("rowwise") +} + +#' @export +rowwise.default <- function(.data) +{ + dplyr::rowwise(.data) +} + +#' @export +rowwise.tidybulk <- function(.data) +{ + .data %>% + drop_class(c("tidybulk", "tt")) %>% + dplyr::rowwise() %>% + + # Attach attributes + reattach_internals() %>% + + # Add class + add_class("tt") %>% + add_class("tidybulk") + + +} +############# END ADDED tidybulk ##################################### From 8709db96acfc945f87b107e2fd617a35b2c47b71 Mon Sep 17 00:00:00 2001 From: chilampoon Date: Mon, 18 Sep 2023 23:14:26 -0400 Subject: [PATCH 05/30] imports conflict --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index b5604bdb..572f0deb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -36,7 +36,7 @@ Imports: methods, S4Vectors, crayon, - pkgconfig + Matrix Suggests: BiocStyle, testthat, From b6fdbc40f79a492a4ddd5f7fe7a91a74b08cbf9e Mon Sep 17 00:00:00 2001 From: chilampoon Date: Tue, 19 Sep 2023 00:01:37 -0400 Subject: [PATCH 06/30] set _R_CHECK_FORCE_SUGGESTS_ to false --- .github/workflows/check-bioc.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/check-bioc.yml b/.github/workflows/check-bioc.yml index e432bb90..d5ac53e6 100644 --- a/.github/workflows/check-bioc.yml +++ b/.github/workflows/check-bioc.yml @@ -59,6 +59,7 @@ jobs: ## for examples using the http-user-agent env: R_REMOTES_NO_ERRORS_FROM_WARNINGS: true + _R_CHECK_FORCE_SUGGESTS_: false RSPM: ${{ matrix.config.rspm }} NOT_CRAN: true TZ: UTC From 0c1670a5ccf38110570b578008663adb6acdc977 Mon Sep 17 00:00:00 2001 From: chilampoon Date: Tue, 19 Sep 2023 00:59:32 -0400 Subject: [PATCH 07/30] add pkgconfig --- DESCRIPTION | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 572f0deb..f38f2d3e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -36,7 +36,8 @@ Imports: methods, S4Vectors, crayon, - Matrix + Matrix, + pkgconfig Suggests: BiocStyle, testthat, From c5649349ab38d9e0e1ed01493c2f0d115d529e9e Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Thu, 4 Jan 2024 15:40:50 +1100 Subject: [PATCH 08/30] Set automatic Bioconductor and R build-check versions --- .github/workflows/check-bioc.yml | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/.github/workflows/check-bioc.yml b/.github/workflows/check-bioc.yml index d5ac53e6..61dce12a 100644 --- a/.github/workflows/check-bioc.yml +++ b/.github/workflows/check-bioc.yml @@ -52,9 +52,21 @@ jobs: fail-fast: false matrix: config: - - { os: ubuntu-latest, r: '4.3', bioc: '3.18', cont: "bioconductor/bioconductor_docker:devel", rspm: "https://packagemanager.rstudio.com/cran/__linux__/jammy/latest" } - - { os: macOS-latest, r: '4.3', bioc: '3.18'} - - { os: windows-latest, r: '4.3', bioc: '3.18'} + - os: ubuntu-latest + bioc: devel + r: auto + cont: ghcr.io/bioconductor/bioconductor_docker:devel + rspm: ~ + - os: macOS-latest + bioc: release + r: auto + cont: ~ + rspm: ~ + - os: windows-latest + bioc: release + r: auto + cont: ~ + rspm: ~ ## Check https://github.com/r-lib/actions/tree/master/examples ## for examples using the http-user-agent env: From 243532c861e0827357f980140cfac6b085b52c91 Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Thu, 4 Jan 2024 15:51:44 +1100 Subject: [PATCH 09/30] Replace check-bioc with rworkflows workflow file --- .github/workflows/check-bioc.yml | 351 ------------------------------- .github/workflows/rworkflows.yml | 57 +++++ 2 files changed, 57 insertions(+), 351 deletions(-) delete mode 100644 .github/workflows/check-bioc.yml create mode 100644 .github/workflows/rworkflows.yml diff --git a/.github/workflows/check-bioc.yml b/.github/workflows/check-bioc.yml deleted file mode 100644 index 61dce12a..00000000 --- a/.github/workflows/check-bioc.yml +++ /dev/null @@ -1,351 +0,0 @@ -## Read more about GitHub actions the features of this GitHub Actions workflow -## at https://lcolladotor.github.io/biocthis/articles/biocthis.html#use_bioc_github_action -## -## For more details, check the biocthis developer notes vignette at -## https://lcolladotor.github.io/biocthis/articles/biocthis_dev_notes.html -## -## You can add this workflow to other packages using: -## > biocthis::use_bioc_github_action() -## -## Using GitHub Actions exposes you to many details about how R packages are -## compiled and installed in several operating system.s -### If you need help, please follow the steps listed at -## https://github.com/r-lib/actions#where-to-find-help -## -## If you found an issue specific to biocthis's GHA workflow, please report it -## with the information that will make it easier for others to help you. -## Thank you! - -## Acronyms: -## * GHA: GitHub Action -## * OS: operating system - -on: - push: - pull_request: - -name: R-CMD-check-bioc - -## These environment variables control whether to run GHA code later on that is -## specific to testthat, covr, and pkgdown. -## -## If you need to clear the cache of packages, update the number inside -## cache-version as discussed at https://github.com/r-lib/actions/issues/86. -## Note that you can always run a GHA test without the cache by using the word -## "/nocache" in the commit message. -env: - has_testthat: 'false' - run_covr: 'false' - run_pkgdown: 'true' - has_RUnit: 'false' - cache-version: 'cache-v1' - run_docker: 'false' - -jobs: - build-check: - runs-on: ${{ matrix.config.os }} - name: ${{ matrix.config.os }} (${{ matrix.config.r }}) - container: ${{ matrix.config.cont }} - ## Environment variables unique to this job. - - strategy: - fail-fast: false - matrix: - config: - - os: ubuntu-latest - bioc: devel - r: auto - cont: ghcr.io/bioconductor/bioconductor_docker:devel - rspm: ~ - - os: macOS-latest - bioc: release - r: auto - cont: ~ - rspm: ~ - - os: windows-latest - bioc: release - r: auto - cont: ~ - rspm: ~ - ## Check https://github.com/r-lib/actions/tree/master/examples - ## for examples using the http-user-agent - env: - R_REMOTES_NO_ERRORS_FROM_WARNINGS: true - _R_CHECK_FORCE_SUGGESTS_: false - RSPM: ${{ matrix.config.rspm }} - NOT_CRAN: true - TZ: UTC - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - - steps: - - ## Set the R library to the directory matching the - ## R packages cache step further below when running on Docker (Linux). - - name: Set R Library home on Linux - if: runner.os == 'Linux' - run: | - mkdir /__w/_temp/Library - echo ".libPaths('/__w/_temp/Library')" > ~/.Rprofile - - ## Most of these steps are the same as the ones in - ## https://github.com/r-lib/actions/blob/master/examples/check-standard.yaml - ## If they update their steps, we will also need to update ours. - - name: Checkout Repository - uses: actions/checkout@v3 - - ## R is already included in the Bioconductor docker images - - name: Setup R from r-lib - if: runner.os != 'Linux' - uses: r-lib/actions/setup-r@v2 - with: - r-version: ${{ matrix.config.r }} - http-user-agent: ${{ matrix.config.http-user-agent }} - - ## pandoc is already included in the Bioconductor docker images - - name: Setup pandoc from r-lib - if: runner.os != 'Linux' - uses: r-lib/actions/setup-pandoc@v2 - - - name: Query dependencies - run: | - install.packages('remotes') - saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) - shell: Rscript {0} - - - name: Restore R package cache - if: "!contains(github.event.head_commit.message, '/nocache') && runner.os != 'Linux'" - uses: actions/cache@v3 - with: - path: ${{ env.R_LIBS_USER }} - key: ${{ env.cache-version }}-${{ runner.os }}-biocversion-devel-r-4.3-${{ hashFiles('.github/depends.Rds') }} - restore-keys: ${{ env.cache-version }}-${{ runner.os }}-biocversion-devel-r-4.3- - - - name: Cache R packages on Linux - if: "!contains(github.event.head_commit.message, '/nocache') && runner.os == 'Linux' " - uses: actions/cache@v3 - with: - path: /home/runner/work/_temp/Library - key: ${{ env.cache-version }}-${{ runner.os }}-biocversion-devel-r-4.3-${{ hashFiles('.github/depends.Rds') }} - restore-keys: ${{ env.cache-version }}-${{ runner.os }}-biocversion-devel-r-4.3- - - # - name: Install Linux system dependencies - # if: runner.os == 'Linux' - # run: | - # sysreqs=$(Rscript -e 'cat("apt-get update -y && apt-get install -y", paste(gsub("apt-get install -y ", "", remotes::system_requirements("ubuntu", "20.04")), collapse = " "))') - # echo $sysreqs - # sudo -s eval "$sysreqs" - - - name: Install macOS system dependencies - if: matrix.config.os == 'macOS-latest' - run: | - ## Enable installing XML from source if needed - brew install libxml2 - echo "XML_CONFIG=/usr/local/opt/libxml2/bin/xml2-config" >> $GITHUB_ENV - - ## Required to install magick as noted at - ## https://github.com/r-lib/usethis/commit/f1f1e0d10c1ebc75fd4c18fa7e2de4551fd9978f#diff-9bfee71065492f63457918efcd912cf2 - brew install imagemagick@6 - - ## For textshaping, required by ragg, and required by pkgdown - brew install harfbuzz fribidi - - ## For installing usethis's dependency gert - brew install libgit2 - - ## Required for tcltk - brew install xquartz --cask - - - name: Install Windows system dependencies - if: runner.os == 'Windows' - run: | - ## Edit below if you have any Windows system dependencies - shell: Rscript {0} - - - name: Install BiocManager - run: | - message(paste('****', Sys.time(), 'installing BiocManager ****')) - remotes::install_cran("BiocManager") - shell: Rscript {0} - - - name: Set BiocVersion - run: | - BiocManager::install(version = "${{ matrix.config.bioc }}", ask = FALSE, force = TRUE) - shell: Rscript {0} - - - name: Install dependencies pass 1 - run: | - ## Try installing the package dependencies in steps. First the local - ## dependencies, then any remaining dependencies to avoid the - ## issues described at - ## https://stat.ethz.ch/pipermail/bioc-devel/2020-April/016675.html - ## https://github.com/r-lib/remotes/issues/296 - ## Ideally, all dependencies should get installed in the first pass. - - ## For running the checks - message(paste('****', Sys.time(), 'installing rcmdcheck and BiocCheck ****')) - install.packages(c("rcmdcheck", "BiocCheck"), repos = BiocManager::repositories()) - - ## Pass #1 at installing dependencies - message(paste('****', Sys.time(), 'pass number 1 at installing dependencies: local dependencies ****')) - remotes::install_local(dependencies = TRUE, repos = BiocManager::repositories(), build_vignettes = FALSE, upgrade = TRUE) - continue-on-error: true - shell: Rscript {0} - - - name: Install dependencies pass 2 - run: | - ## Pass #2 at installing dependencies - message(paste('****', Sys.time(), 'pass number 2 at installing dependencies: any remaining dependencies ****')) - remotes::install_local(dependencies = TRUE, repos = BiocManager::repositories(), build_vignettes = TRUE, upgrade = TRUE, force = TRUE) - shell: Rscript {0} - - - name: Install BiocGenerics - if: env.has_RUnit == 'true' - run: | - ## Install BiocGenerics - BiocManager::install("BiocGenerics") - shell: Rscript {0} - - - name: Install covr - if: github.ref == 'refs/heads/devel' && env.run_covr == 'true' && runner.os == 'Linux' - run: | - remotes::install_cran("covr") - shell: Rscript {0} - - - name: Install pkgdown - if: github.ref == 'refs/heads/devel' && env.run_pkgdown == 'true' && runner.os == 'Linux' - run: | - remotes::install_github("r-lib/pkgdown") - shell: Rscript {0} - - - name: Session info - run: | - options(width = 100) - pkgs <- installed.packages()[, "Package"] - sessioninfo::session_info(pkgs, include_base = TRUE) - shell: Rscript {0} - - - name: Run CMD check - env: - _R_CHECK_CRAN_INCOMING_: false - DISPLAY: 99.0 - run: | - options(crayon.enabled = TRUE) - rcmdcheck::rcmdcheck( - args = c("--no-manual", "--no-vignettes", "--timings"), - build_args = c("--no-manual", "--keep-empty-dirs", "--no-resave-data"), - error_on = "warning", - check_dir = "check" - ) - shell: Rscript {0} - - ## Might need an to add this to the if: && runner.os == 'Linux' - - name: Reveal testthat details - if: env.has_testthat == 'true' - run: find . -name testthat.Rout -exec cat '{}' ';' - - - name: Run RUnit tests - if: env.has_RUnit == 'true' - run: | - BiocGenerics:::testPackage() - shell: Rscript {0} - - - name: Run BiocCheck - env: - DISPLAY: 99.0 - run: | - BiocCheck::BiocCheck( - dir('check', 'tar.gz$', full.names = TRUE), - `quit-with-status` = TRUE, - `no-check-R-ver` = TRUE, - `no-check-bioc-help` = TRUE - ) - shell: Rscript {0} - - - name: Test coverage - if: github.ref == 'refs/heads/devel' && env.run_covr == 'true' && runner.os == 'Linux' - run: | - covr::codecov() - shell: Rscript {0} - - - name: Install package - if: github.ref == 'refs/heads/devel' && env.run_pkgdown == 'true' && runner.os == 'Linux' - run: R CMD INSTALL . - - - name: Build pkgdown site - if: github.ref == 'refs/heads/devel' && env.run_pkgdown == 'true' && runner.os == 'Linux' - run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE) - shell: Rscript {0} - ## Note that you need to run pkgdown::deploy_to_branch(new_process = FALSE) - ## at least one locally before this will work. This creates the gh-pages - ## branch (erasing anything you haven't version controlled!) and - ## makes the git history recognizable by pkgdown. - - - name: Install deploy dependencies - if: github.ref == 'refs/heads/devel' && env.run_pkgdown == 'true' && runner.os == 'Linux' - run: | - apt-get update && apt-get -y install rsync - - - name: Deploy pkgdown site to GitHub pages 🚀 - if: github.ref == 'refs/heads/devel' && env.run_pkgdown == 'true' && runner.os == 'Linux' - uses: JamesIves/github-pages-deploy-action@releases/v4 - with: - clean: false - branch: gh-pages - folder: docs - - - name: Upload check results - if: failure() - uses: actions/upload-artifact@master - with: - name: ${{ runner.os }}-biocversion-devel-r-4.3-results - path: check - - - ## Code adapted from - ## https://github.com/waldronlab/cBioPortalData/blob/e0440a4445f0cc731e426363a76faa22ee5e0f9d/.github/workflows/devel_check_dock.yml#L65-L92 - docker-build-and-push: - runs-on: ubuntu-latest - needs: build-check - steps: - - name: Checkout Repository - if: "!contains(github.event.head_commit.message, '/nodocker') && env.run_docker == 'true' && github.ref == 'refs/heads/devel'" - uses: actions/checkout@v3 - - - name: Register repo name - if: "!contains(github.event.head_commit.message, '/nodocker') && env.run_docker == 'true' && github.ref == 'refs/heads/devel'" - id: reg_repo_name - run: | - echo CONT_IMG_NAME=$(echo ${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV - - - name: Set up QEMU - if: "!contains(github.event.head_commit.message, '/nodocker') && env.run_docker == 'true' && github.ref == 'refs/heads/devel'" - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - if: "!contains(github.event.head_commit.message, '/nodocker') && env.run_docker == 'true' && github.ref == 'refs/heads/devel'" - uses: docker/setup-buildx-action@v2 - - - name: Login to Docker Hub - if: "!contains(github.event.head_commit.message, '/nodocker') && env.run_docker == 'true' && github.ref == 'refs/heads/devel'" - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - ## Note that DOCKERHUB_TOKEN is really a token for your dockerhub - ## account, not your actual dockerhub account password. You can get it - ## from https://hub.docker.com/settings/security. - ## Check https://github.com/docker/build-push-action/tree/v4.0.0 - ## for more details. - ## Alternatively, try checking - ## https://seandavi.github.io/BuildABiocWorkshop/articles/HOWTO_BUILD_WORKSHOP.html. - - - name: Build and Push Docker - if: "!contains(github.event.head_commit.message, '/nodocker') && env.run_docker == 'true' && github.ref == 'refs/heads/devel' && success()" - uses: docker/build-push-action@v4 - with: - context: . - push: true - tags: > - ${{ secrets.DOCKERHUB_USERNAME }}/${{ env.CONT_IMG_NAME }}:latest, - ${{ secrets.DOCKERHUB_USERNAME }}/${{ env.CONT_IMG_NAME }}:devel \ No newline at end of file diff --git a/.github/workflows/rworkflows.yml b/.github/workflows/rworkflows.yml new file mode 100644 index 00000000..94d43eb8 --- /dev/null +++ b/.github/workflows/rworkflows.yml @@ -0,0 +1,57 @@ +name: rworkflows +'on': + push: + branches: + - master + - main + - devel + - RELEASE_** + pull_request: + branches: + - master + - main + - devel + - RELEASE_** +jobs: + rworkflows: + permissions: write-all + runs-on: ${{ matrix.config.os }} + name: ${{ matrix.config.os }} (${{ matrix.config.r }}) + container: ${{ matrix.config.cont }} + strategy: + fail-fast: ${{ false }} + matrix: + config: + - os: ubuntu-latest + bioc: devel + r: auto + cont: ghcr.io/bioconductor/bioconductor_docker:devel + rspm: ~ + - os: macOS-latest + bioc: release + r: auto + cont: ~ + rspm: ~ + - os: windows-latest + bioc: release + r: auto + cont: ~ + rspm: ~ + steps: + - uses: neurogenomics/rworkflows@master + with: + run_bioccheck: ${{ false }} + run_rcmdcheck: ${{ true }} + as_cran: ${{ true }} + run_vignettes: ${{ true }} + has_testthat: ${{ true }} + run_covr: ${{ true }} + run_pkgdown: ${{ true }} + has_runit: ${{ false }} + has_latex: ${{ false }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run_docker: ${{ false }} + DOCKER_TOKEN: ${{ secrets.DOCKER_TOKEN }} + runner_os: ${{ runner.os }} + cache_version: cache-v1 + docker_registry: ghcr.io From 25c605d863265ecf959e7d46a4cf3e5a71ade331 Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Thu, 4 Jan 2024 16:04:14 +1100 Subject: [PATCH 10/30] Update workflow branch triggers --- .github/workflows/rworkflows.yml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/.github/workflows/rworkflows.yml b/.github/workflows/rworkflows.yml index 94d43eb8..c9dbb044 100644 --- a/.github/workflows/rworkflows.yml +++ b/.github/workflows/rworkflows.yml @@ -1,17 +1,7 @@ name: rworkflows -'on': +on: push: - branches: - - master - - main - - devel - - RELEASE_** pull_request: - branches: - - master - - main - - devel - - RELEASE_** jobs: rworkflows: permissions: write-all From bfe5ac8dd279d72973de890cd0faa2be782d2233 Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Fri, 5 Jan 2024 12:05:53 +1100 Subject: [PATCH 11/30] Update function imports --- DESCRIPTION | 30 ++- NAMESPACE | 50 +++- R/cibersort.R | 11 +- R/functions.R | 258 +++----------------- R/functions_SE.R | 136 ++--------- R/ggplot.R | 9 +- R/glmmSeq.R | 39 +-- R/methods.R | 115 ++------- R/methods_SE.R | 146 ++--------- R/utilities.R | 74 +----- man/bind_rows.Rd | 2 +- man/quantile_normalise_abundance-methods.Rd | 3 - tests/testthat/test-bulk_methods.R | 6 - 13 files changed, 178 insertions(+), 701 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index f38f2d3e..802c4bba 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -37,7 +37,35 @@ Imports: S4Vectors, crayon, Matrix, - pkgconfig + pkgconfig, + AnnotationDbi, + DESeq2, + EPIC, + Rtsne, + Seurat, + betareg, + boot, + broom, + class, + clusterProfiler, + e1071, + edgeR, + functional, + glmmSeq, + glmmTMB, + limma, + lme4, + matrixStats, + msigdbr, + org.Hs.eg.db, + org.Mm.eg.db, + pbapply, + pbmcapply, + survival, + survminer, + sva, + uwot, + widyr Suggests: BiocStyle, testthat, diff --git a/NAMESPACE b/NAMESPACE index 43582a22..25148a3d 100755 --- a/NAMESPACE +++ b/NAMESPACE @@ -61,21 +61,40 @@ exportMethods(quantile_normalise_abundance) exportMethods(scale_abundance) exportMethods(tidybulk) exportMethods(tidybulk_SAM_BAM) +import(DESeq2) +import(S4Vectors) +import(Seurat) import(SummarizedExperiment) +import(broom) +import(class) +import(dplyr) +import(e1071) +import(edgeR) import(lifecycle) +import(limma) +import(lme4) import(methods) import(parallel) import(preprocessCore) import(readr) +import(sva) import(tibble) +importFrom(AnnotationDbi,mapIds) +importFrom(EPIC,EPIC) importFrom(GenomicRanges,makeGRangesListFromDataFrame) importFrom(Matrix,colSums) +importFrom(Rtsne,Rtsne) importFrom(S4Vectors,metadata) importFrom(SummarizedExperiment,SummarizedExperiment) importFrom(SummarizedExperiment,assays) importFrom(SummarizedExperiment,colData) importFrom(SummarizedExperiment,rowData) importFrom(SummarizedExperiment,rowRanges) +importFrom(betareg,betareg) +importFrom(boot,logit) +importFrom(broom,tidy) +importFrom(clusterProfiler,GSEA) +importFrom(clusterProfiler,enricher) importFrom(dplyr,across) importFrom(dplyr,anti_join) importFrom(dplyr,arrange) @@ -110,8 +129,17 @@ importFrom(dplyr,summarise) importFrom(dplyr,summarise_all) importFrom(dplyr,summarize) importFrom(dplyr,ungroup) +importFrom(edgeR,DGEList) +importFrom(edgeR,calcNormFactors) +importFrom(edgeR,estimateDisp) +importFrom(edgeR,filterByExpr) +importFrom(functional,Compose) +importFrom(glmmSeq,glmmSeq) +importFrom(glmmTMB,glmmTMBControl) importFrom(lifecycle,deprecate_soft) importFrom(lifecycle,deprecate_warn) +importFrom(limma,makeContrasts) +importFrom(limma,normalizeQuantiles) importFrom(magrittr,"%$%") importFrom(magrittr,"%>%") importFrom(magrittr,divide_by) @@ -120,7 +148,18 @@ importFrom(magrittr,extract2) importFrom(magrittr,multiply_by) importFrom(magrittr,set_colnames) importFrom(magrittr,set_rownames) +importFrom(matrixStats,colSds) +importFrom(msigdbr,msigdbr) +importFrom(msigdbr,msigdbr_species) +importFrom(org.Hs.eg.db,org.Hs.eg.db) +importFrom(org.Mm.eg.db,org.Mm.eg.db) +importFrom(parallel,clusterExport) +importFrom(parallel,makeCluster) importFrom(parallel,mclapply) +importFrom(pbapply,pblapply) +importFrom(pbmcapply,pbmclapply) +importFrom(preprocessCore,normalize.quantiles.determine.target) +importFrom(preprocessCore,normalize.quantiles.use.target) importFrom(purrr,as_mapper) importFrom(purrr,map) importFrom(purrr,map2) @@ -160,9 +199,7 @@ importFrom(stats,model.matrix) importFrom(stats,na.omit) importFrom(stats,p.adjust) importFrom(stats,pchisq) -importFrom(stats,plogis) importFrom(stats,prcomp) -importFrom(stats,qlogis) importFrom(stats,rnorm) importFrom(stats,sd) importFrom(stats,setNames) @@ -174,6 +211,12 @@ importFrom(stringr,str_remove) importFrom(stringr,str_replace) importFrom(stringr,str_replace_all) importFrom(stringr,str_split) +importFrom(survival,coxph) +importFrom(survival,survdiff) +importFrom(survminer,ggsurvplot) +importFrom(survminer,surv_fit) +importFrom(sva,ComBat) +importFrom(sva,ComBat_seq) importFrom(tibble,as_tibble) importFrom(tibble,enframe) importFrom(tibble,rowid_to_column) @@ -194,6 +237,7 @@ importFrom(ttservice,bind_rows) importFrom(utils,capture.output) importFrom(utils,data) importFrom(utils,head) -importFrom(utils,install.packages) importFrom(utils,packageDescription) importFrom(utils,tail) +importFrom(uwot,tumap) +importFrom(widyr,pairwise_cor) diff --git a/R/cibersort.R b/R/cibersort.R index 4694c04a..b396d5a9 100755 --- a/R/cibersort.R +++ b/R/cibersort.R @@ -202,8 +202,11 @@ call_core = function(itor, Y, X, P, pval, CoreAlg){ } +#' @import e1071 +#' @import parallel +#' @import preprocessCore #' @importFrom stats sd -#' @importFrom utils install.packages +#' @importFrom matrixStats colSds #' #' @keywords internal #' @@ -255,12 +258,6 @@ my_CIBERSORT <- function(Y, X, perm=0, QN=TRUE, cores = 3, exp_transform = FALSE )) Y=Y[,colSums(Y)>0, drop=FALSE] - # Check if package is installed, otherwise install - if (find.package("matrixStats", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing matrixStats needed for cibersort") - install.packages("matrixStats", repos = "https://cloud.r-project.org") - } - # Eliminate sd == 0 if(length(which(matrixStats::colSds(Y)==0))>0) warning(sprintf( diff --git a/R/functions.R b/R/functions.R index 6cac3881..d31ee4f1 100755 --- a/R/functions.R +++ b/R/functions.R @@ -154,8 +154,10 @@ create_tt_from_bam_sam_bulk <- #' #' #' @import tibble +#' @import dplyr #' @importFrom rlang := #' @importFrom stats setNames +#' @importFrom edgeR calcNormFactors #' #' @param .data A tibble #' @param reference A reference matrix, not sure if used anymore @@ -239,10 +241,10 @@ add_scaled_counts_bulk.calcNormFactor <- function(.data, #' #' #' @import tibble +#' @import dplyr #' @importFrom magrittr equals #' @importFrom rlang := #' @importFrom stats median -#' @importFrom utils install.packages #' #' @param .data A tibble #' @param .sample The name of the sample column @@ -266,14 +268,6 @@ get_scaled_counts_bulk <- function(.data, .transcript = enquo(.transcript) .abundance = enquo(.abundance) - # Check if package is installed, otherwise install - if (find.package("edgeR", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing edgeR needed for analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("edgeR", ask = FALSE) - } - # Reformat input data set df <- .data %>% @@ -360,18 +354,16 @@ get_scaled_counts_bulk <- function(.data, #' @keywords internal #' @noRd #' -#' -#' #' @import tibble +#' @import edgeR #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix -#' @importFrom utils install.packages #' @importFrom purrr when #' @importFrom rlang inform #' @importFrom tidyr spread #' @importFrom tidyr pivot_wider #' @importFrom dplyr slice -#' +#' @importFrom limma makeContrasts #' #' @param .data A tibble #' @param .formula a formula with no response variable, referring only to numeric variables @@ -501,16 +493,6 @@ get_differential_transcript_abundance_bulk <- function(.data, ~ limma::makeContrasts(contrasts = .x, levels = design), ~ NULL) - # Check if package is installed, otherwise install - if (find.package("edgeR", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing edgeR needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("edgeR", ask = FALSE) - } - - - edgeR_object = df_for_edgeR %>% select(!!.transcript,!!.sample,!!.abundance) %>% @@ -651,13 +633,13 @@ get_differential_transcript_abundance_bulk <- function(.data, #' @import tibble #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix -#' @importFrom utils install.packages #' @importFrom purrr when #' @importFrom rlang inform #' @importFrom tidyr spread #' @importFrom tidyr pivot_wider #' @importFrom dplyr slice -#' +#' @importFrom edgeR estimateDisp +#' @importFrom glmmSeq glmmSeq #' #' @param .data A tibble #' @param .formula a formula with no response variable, referring only to numeric variables @@ -728,22 +710,6 @@ get_differential_transcript_abundance_glmmSeq <- function(.data, # ~ limma::makeContrasts(contrasts = .x, levels = design), # ~ NULL) - # Check if package is installed, otherwise install - if (find.package("edgeR", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing edgeR needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("edgeR", ask = FALSE) - } - - # Check if package is installed, otherwise install - if (find.package("glmmSeq", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing glmmSeq needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("glmmSeq", ask = FALSE) - } - metadata = .data |> pivot_sample(!!.sample) |> @@ -773,7 +739,7 @@ get_differential_transcript_abundance_glmmSeq <- function(.data, dispersion = dispersion[rownames(counts)] glmmSeq_object = - glmmSeq( .formula, + glmmSeq::glmmSeq( .formula, countdata = counts , metadata = metadata, dispersion = dispersion, @@ -815,15 +781,14 @@ get_differential_transcript_abundance_glmmSeq <- function(.data, #' @keywords internal #' @noRd #' -#' -#' #' @import tibble +#' @import limma #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix -#' @importFrom utils install.packages #' @importFrom purrr when #' @importFrom rlang inform #' @importFrom dplyr arrange +#' @importFrom edgeR DGEList #' #' @param .data A tibble #' @param .formula a formula with no response variable, referring only to numeric variables @@ -894,14 +859,6 @@ get_differential_transcript_abundance_bulk_voom <- function(.data, ~ limma::makeContrasts(contrasts = .x, levels = design), ~ NULL) - # Check if package is installed, otherwise install - if (find.package("limma", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing limma needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("limma", ask = FALSE) - } - voom_object = df_for_voom %>% select(!!.transcript,!!.sample,!!.abundance) %>% @@ -1017,18 +974,15 @@ get_differential_transcript_abundance_bulk_voom <- function(.data, } } - #' Get differential transcription information to a tibble using DESeq2 #' #' @keywords internal #' @noRd #' -#' -#' #' @import tibble +#' @import DESeq2 #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix -#' @importFrom utils install.packages #' @importFrom purrr when #' @importFrom rlang inform #' @importFrom dplyr mutate_if @@ -1077,14 +1031,6 @@ get_differential_transcript_abundance_deseq2 <- function(.data, omit_contrast_in_colnames = FALSE } - # Check if package is installed, otherwise install - if (find.package("DESeq2", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing DESeq2 needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("DESeq2", ask = FALSE) - } - if (is.null(test_above_log2_fold_change)) { test_above_log2_fold_change <- 0 } @@ -1204,12 +1150,10 @@ get_differential_transcript_abundance_deseq2 <- function(.data, #' @keywords internal #' @noRd #' -#' -#' #' @import tibble +#' @import broom #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix -#' @importFrom utils install.packages #' @importFrom purrr when #' @importFrom purrr map_lgl #' @importFrom stringr str_replace @@ -1218,7 +1162,6 @@ get_differential_transcript_abundance_deseq2 <- function(.data, #' @importFrom stringr str_remove #' @importFrom dplyr starts_with #' -#' #' @param .data A tibble #' @param .formula a formula with no response variable, referring only to numeric variables #' @param .sample The name of the sample column @@ -1246,12 +1189,6 @@ test_differential_cellularity_ <- function(.data, .transcript = enquo(.transcript) .abundance = enquo(.abundance) - - if (find.package("broom", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing broom needed for analyses") - install.packages("broom", repos = "https://cloud.r-project.org") - } - deconvoluted = .data %>% @@ -1371,7 +1308,6 @@ test_differential_cellularity_ <- function(.data, #' @import tibble #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix -#' @importFrom utils install.packages #' @importFrom purrr when #' @importFrom purrr map_lgl #' @importFrom stringr str_replace @@ -1450,21 +1386,15 @@ test_stratification_cellularity_ <- function(.data, } - - #' Get gene enrichment analyses using EGSEA #' #' @keywords internal #' @noRd #' -#' -#' #' @import tibble #' @importFrom magrittr set_colnames #' @importFrom purrr map2_dfr #' @importFrom stats model.matrix -#' @importFrom utils install.packages -#' #' #' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) #' @param .formula A formula with no response variable, representing the desired linear model @@ -1776,8 +1706,8 @@ get_clusters_kmeans_bulk <- #' #' #' @import tibble +#' @import Seurat #' @importFrom rlang := -#' @importFrom utils install.packages #' #' @param .data A tibble #' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) @@ -1801,21 +1731,7 @@ get_clusters_SNN_bulk <- .element = enquo(.element) .feature = enquo(.feature) .abundance = enquo(.abundance) - - # Check if package is installed, otherwise install - if (find.package("cluster", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing cluster") - install.packages("cluster", repos = "https://cloud.r-project.org") - } - if (find.package("Seurat", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing Seurat") - install.packages("Seurat", repos = "https://cloud.r-project.org") - } - if (find.package("KernSmooth", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing KernSmooth") - install.packages("KernSmooth", repos = "https://cloud.r-project.org") - } - + my_df = .data %>% @@ -2120,7 +2036,7 @@ we suggest to partition the dataset for sample clusters. #' @import tibble #' @importFrom rlang := #' @importFrom stats setNames -#' @importFrom utils install.packages +#' @importFrom Rtsne Rtsne #' #' @param .data A tibble #' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) @@ -2162,13 +2078,6 @@ get_reduced_dimensions_TSNE_bulk <- if (!"dims" %in% names(arguments)) arguments = arguments %>% c(dims = .dims) - - # Check if package is installed, otherwise install - if (find.package("Rtsne", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing Rtsne") - install.packages("Rtsne", repos = "https://cloud.r-project.org") - } - # Set perprexity to not be too high if (!"perplexity" %in% names(arguments)) { perplexity_value <- (ncol(.data) - 1 / 3 / 2) @@ -2234,7 +2143,7 @@ get_reduced_dimensions_TSNE_bulk <- #' @import tibble #' @importFrom rlang := #' @importFrom stats setNames -#' @importFrom utils install.packages +#' @importFrom uwot tumap #' #' @param .data A tibble #' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) @@ -2286,12 +2195,6 @@ get_reduced_dimensions_UMAP_bulk <- if (!"init" %in% names(arguments)) arguments = arguments %>% c(init = "spca") - # Check if package is installed, otherwise install - if (find.package("uwot", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing uwot") - install.packages("uwot", repos = "https://cloud.r-project.org") - } - df_source = .data %>% @@ -2722,8 +2625,10 @@ aggregate_duplicated_transcripts_DT = #' #' #' @import tibble +#' @import dplyr #' @importFrom rlang := #' @importFrom dplyr anti_join +#' @importFrom widyr pairwise_cor #' #' @param .data A tibble #' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) @@ -2761,12 +2666,6 @@ remove_redundancy_elements_through_correlation <- function(.data, if(.data %>% distinct(!!.element) %>% nrow() <= 1 ) stop("tidybulk says: You must have more than one element (trancripts if of_samples == FALSE) to perform remove_redundancy") - # Check if package is installed, otherwise install - if (find.package("widyr", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing widyr needed for correlation analyses") - install.packages("widyr", repos = "https://cloud.r-project.org") - } - # Get the redundant data frame .data.correlated = .data %>% @@ -3078,6 +2977,7 @@ run_llsr = function(mix, reference = X_cibersort, intercept= TRUE) { #' @noRd #' #' @importFrom stats lsfit +#' @importFrom EPIC EPIC #' #' @param mix A data frame #' @param reference A data frame @@ -3087,20 +2987,6 @@ run_llsr = function(mix, reference = X_cibersort, intercept= TRUE) { #' run_epic = function(mix, reference = NULL) { - # Check if package is installed, otherwise install - if (find.package("devtools", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing class needed for EPIC") - install.packages("devtools", repos = "https://cloud.r-project.org", dependencies = c("Depends", "Imports")) - } - - # Check if package is installed, otherwise install - if (find.package("EPIC", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing class needed for EPIC") - devtools::install_github("GfellerLab/EPIC") - } - - if("EPIC" %in% .packages() %>% not) stop("tidybulk says: Please install and then load the package EPIC manually (i.e. library(EPIC)). This is because EPIC is not in Bioconductor or CRAN so it is not possible to seamlessly make EPIC part of the dependencies.") - # Get common markers if( reference |> is("data.frame") | reference |> is("matrix")){ markers = intersect(rownames(mix), rownames(reference)) @@ -3119,7 +3005,7 @@ run_epic = function(mix, reference = NULL) { if(!is(Y, "matrix") & !is(Y, "data.frame")) Y = as.matrix(Y) - results <- EPIC(Y, reference = reference)$cellFractions %>% data.frame() + results <- EPIC::EPIC(Y, reference = reference)$cellFractions %>% data.frame() #results[results < 0] <- 0 #results <- results / apply(results, 1, sum) rownames(results) = colnames(Y) @@ -3135,10 +3021,11 @@ run_epic = function(mix, reference = NULL) { #' #' @import parallel #' @import preprocessCore +#' @import class +#' @import e1071 #' @importFrom stats setNames #' @importFrom rlang dots_list #' @importFrom magrittr equals -#' @importFrom utils install.packages #' #' @param .data A tibble #' @param .sample The name of the sample column @@ -3186,27 +3073,6 @@ get_cell_type_proportions = function(.data, # Execute do.call because I have to deal with ... method %>% tolower %>% equals("cibersort") ~ { - # Check if package is installed, otherwise install - if (find.package("class", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing class needed for Cibersort") - install.packages("class", repos = "https://cloud.r-project.org", dependencies = c("Depends", "Imports")) - } - - # Check if package is installed, otherwise install - if (find.package("e1071", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing e1071 needed for Cibersort") - install.packages("e1071", repos = "https://cloud.r-project.org", dependencies = c("Depends", "Imports")) - } - - # Check if package is installed, otherwise install - if (find.package("preprocessCore", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing preprocessCore needed for Cibersort") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("preprocessCore", ask = FALSE) - - } - # Choose reference reference = reference %>% when(is.null(.) ~ X_cibersort, ~ .) @@ -3247,12 +3113,6 @@ get_cell_type_proportions = function(.data, # Other (hidden for the moment) methods using third party wrapper https://icbi-lab.github.io/immunedeconv method %>% tolower %in% c("mcp_counter", "quantiseq", "xcell") ~ { - # # Check if package is installed, otherwise install - if (find.package("immunedeconv", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing immunedeconv") - devtools::install_github("icbi-lab/immunedeconv", upgrade = FALSE) - } - if(method %in% c("mcp_counter", "quantiseq", "xcell") & !"immunedeconv" %in% (.packages())) stop("tidybulk says: for xcell, mcp_counter, or quantiseq deconvolution you should have the package immunedeconv attached. Please execute library(immunedeconv)") @@ -3286,13 +3146,11 @@ get_cell_type_proportions = function(.data, #' @keywords internal #' @noRd #' -#' -#' #' @import tibble +#' @import sva #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix #' @importFrom stats as.formula -#' @importFrom utils install.packages #' @importFrom stats rnorm #' @importFrom stringr str_c #' @@ -3322,15 +3180,6 @@ get_adjusted_counts_for_unwanted_variation_bulk <- function(.data, .factor_of_interest = enquo(.factor_of_interest) .factor_unwanted = enquo(.factor_unwanted) - # Check if package is installed, otherwise install - if (find.package("sva", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing sva - Combat needed for adjustment for unwanted variation") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("sva", ask = FALSE) - } - - # New column name value_adjusted = as.symbol(sprintf("%s%s", quo_name(.abundance), adjusted_string)) @@ -3539,6 +3388,8 @@ keep_variable_transcripts = function(.data, #' @keywords internal #' @noRd #' +#' @import SummarizedExperiment +#' @import S4Vectors #' @importFrom utils data #' @importFrom tidyr pivot_longer #' @@ -3562,20 +3413,7 @@ tidybulk_to_SummarizedExperiment = function(.data, .sample = col_names$.sample .transcript = col_names$.transcript .abundance = col_names$.abundance - - # Check if package is installed, otherwise install - if (find.package("SummarizedExperiment", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing SummarizedExperiment") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("SummarizedExperiment", ask = FALSE) - } - if (find.package("S4Vectors", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing S4Vectors") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("S4Vectors", ask = FALSE) - } + # If present get the scaled abundance .abundance_scaled = .data %>% @@ -3641,7 +3479,6 @@ tidybulk_to_SummarizedExperiment = function(.data, #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix #' @importFrom stats as.formula -#' @importFrom utils install.packages #' @importFrom tidyr complete #' @importFrom rlang quo_is_symbol #' @@ -3983,25 +3820,13 @@ fill_NA_using_value = function(.data, #' @noRd #' #' @importFrom stats p.adjust +#' @importFrom msigdbr msigdbr +#' @importFrom clusterProfiler enricher entrez_over_to_gsea = function(my_entrez_rank, species, gene_collections = NULL){ # From the page # https://yulab-smu.github.io/clusterProfiler-book/chapter5.html - # Check if package is installed, otherwise install - if (find.package("fastmatch", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing fastmatch needed for analyses") - install.packages("fastmatch", repos = "https://cloud.r-project.org") - } - - if (find.package("clusterProfiler", quiet = TRUE) %>% length %>% equals(0)) { - message("clusterProfiler not installed. Installing.") - BiocManager::install("clusterProfiler", ask = FALSE) - } - - - - # Get gene sets signatures msigdbr::msigdbr(species = species) %>% @@ -4032,7 +3857,6 @@ entrez_over_to_gsea = function(my_entrez_rank, species, gene_collections = NULL # format transcripts mutate(entrez = strsplit(geneID, "/")) %>% select(-geneID) - } @@ -4045,33 +3869,11 @@ entrez_over_to_gsea = function(my_entrez_rank, species, gene_collections = NULL #' @importFrom tibble rowid_to_column #' @importFrom stats p.adjust #' @importFrom purrr map +#' @importFrom clusterProfiler GSEA +#' @importFrom msigdbr msigdbr #' entrez_rank_to_gsea = function(my_entrez_rank, species, gene_collections = NULL){ - # From the page - # https://yulab-smu.github.io/clusterProfiler-book/chapter5.html - - # Check if package is installed, otherwise install - if (find.package("fastmatch", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing fastmatch needed for analyses") - install.packages("fastmatch", repos = "https://cloud.r-project.org") - } - - if (find.package("clusterProfiler", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: clusterProfiler not installed. Installing.") - BiocManager::install("clusterProfiler", ask = FALSE) - } - - if (find.package("enrichplot", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: enrichplot not installed. tidybulk says: Installing.") - BiocManager::install("enrichplot", ask = FALSE) - } - - if (find.package("ggplot2", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing ggplot2 needed for analyses") - install.packages("ggplot2", repos = "https://cloud.r-project.org") - } - # Get gene sets signatures if(is.null(gene_collections ) ) my_gene_collection = msigdbr::msigdbr(species = species) diff --git a/R/functions_SE.R b/R/functions_SE.R index b0b21f42..8425b3d8 100755 --- a/R/functions_SE.R +++ b/R/functions_SE.R @@ -3,8 +3,6 @@ #' @keywords internal #' @noRd #' -#' -#' #' @import tibble #' @importFrom stats kmeans #' @importFrom rlang := @@ -55,11 +53,9 @@ get_clusters_kmeans_bulk_SE <- #' @keywords internal #' @noRd #' -#' -#' #' @import tibble +#' @import Seurat #' @importFrom rlang := -#' @importFrom utils install.packages #' #' @param .data A tibble #' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) @@ -77,21 +73,6 @@ get_clusters_SNN_bulk_SE <- transform = log1p, ...) { - - # Check if package is installed, otherwise install - if (find.package("cluster", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing cluster") - install.packages("cluster", repos = "https://cloud.r-project.org") - } - if (find.package("Seurat", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing Seurat") - install.packages("Seurat", repos = "https://cloud.r-project.org") - } - if (find.package("KernSmooth", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing KernSmooth") - install.packages("KernSmooth", repos = "https://cloud.r-project.org") - } - ndims = min(c(nrow(.data), ncol(.data), 30))-1 .data %>% @@ -314,7 +295,7 @@ we suggest to partition the dataset for sample clusters. #' @import tibble #' @importFrom rlang := #' @importFrom stats setNames -#' @importFrom utils install.packages +#' @importFrom Rtsne Rtsne #' #' @param .data A tibble #' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) @@ -352,13 +333,6 @@ get_reduced_dimensions_TSNE_bulk_SE <- if (!"dims" %in% names(arguments)) arguments = arguments %>% c(dims = .dims) - - # Check if package is installed, otherwise install - if (find.package("Rtsne", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing Rtsne") - install.packages("Rtsne", repos = "https://cloud.r-project.org") - } - # Set perprexity to not be too high if (!"perplexity" %in% names(arguments)) { perplexity_value <- (ncol(.data) - 1 / 3 / 2) @@ -396,7 +370,7 @@ get_reduced_dimensions_TSNE_bulk_SE <- #' @import tibble #' @importFrom rlang := #' @importFrom stats setNames -#' @importFrom utils install.packages +#' @importFrom uwot tumap #' #' @param .data A tibble #' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) @@ -434,14 +408,6 @@ get_reduced_dimensions_UMAP_bulk_SE <- if (!"init" %in% names(arguments)) arguments = arguments %>% c(init = "spca") - - # Check if package is installed, otherwise install - if (find.package("uwot", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing uwot") - install.packages("uwot", repos = "https://cloud.r-project.org") - } - - # Calculate based on PCA if(!is.null(calculate_for_pca_dimensions)) df_UMAP = @@ -563,10 +529,9 @@ keep_variable_transcripts_SE = function(.data, #' @keywords internal #' @noRd #' -#' -#' #' @import tibble #' @importFrom rlang := +#' @importFrom widyr pairwise_cor #' #' @param .data A tibble #' @param correlation_threshold A real number between 0 and 1 @@ -582,12 +547,6 @@ remove_redundancy_elements_through_correlation_SE <- function(.data, # Comply with CRAN NOTES . = NULL - # Check if package is installed, otherwise install - if (find.package("widyr", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing widyr needed for correlation analyses") - install.packages("widyr", repos = "https://cloud.r-project.org") - } - # Get the redundant data frame .data %>% @@ -696,11 +655,12 @@ remove_redundancy_elements_though_reduced_dimensions_SE <- #' #' #' @import tibble +#' @import edgeR #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix -#' @importFrom utils install.packages #' @importFrom purrr when #' @importFrom magrittr extract2 +#' @importFrom limma makeContrasts #' #' #' @param .data A tibble @@ -754,13 +714,6 @@ get_differential_transcript_abundance_bulk_SE <- function(.data, ~ limma::makeContrasts(contrasts = .x, levels = design), ~ NULL) - # Check if package is installed, otherwise install - if (find.package("edgeR", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing edgeR needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("edgeR", ask = FALSE) - } # If no assay is specified take first my_assay = ifelse( @@ -868,14 +821,12 @@ get_differential_transcript_abundance_bulk_SE <- function(.data, #' @keywords internal #' @noRd #' -#' -#' #' @import tibble +#' @import limma #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix -#' @importFrom utils install.packages #' @importFrom purrr when -#' +#' @importFrom edgeR DGEList #' #' @param .data A tibble #' @param .formula a formula with no response variable, referring only to numeric variables @@ -927,14 +878,6 @@ get_differential_transcript_abundance_bulk_voom_SE <- function(.data, ~ limma::makeContrasts(contrasts = .x, levels = design), ~ NULL) - # Check if package is installed, otherwise install - if (find.package("limma", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing limma needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("limma", ask = FALSE) - } - # If no assay is specified take first my_assay = ifelse( quo_is_symbol(.abundance), @@ -1049,14 +992,12 @@ get_differential_transcript_abundance_bulk_voom_SE <- function(.data, #' @keywords internal #' @noRd #' -#' -#' #' @import tibble #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix -#' @importFrom utils install.packages #' @importFrom purrr when -#' +#' @importFrom edgeR estimateDisp +#' @importFrom glmmSeq glmmSeq #' #' @param .data A tibble #' @param .formula a formula with no response variable, referring only to numeric variables @@ -1099,22 +1040,6 @@ get_differential_transcript_abundance_glmmSeq_SE <- function(.data, omit_contrast_in_colnames = FALSE } - # Check if package is installed, otherwise install - if (find.package("edgeR", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing edgeR needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("edgeR", ask = FALSE) - } - - # Check if package is installed, otherwise install - if (find.package("glmmSeq", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing glmmSeq needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("glmmSeq", ask = FALSE) - } - # If no assay is specified take first my_assay = ifelse( quo_is_symbol(.abundance), @@ -1147,7 +1072,7 @@ get_differential_transcript_abundance_glmmSeq_SE <- function(.data, dispersion = dispersion[rownames(counts)] glmmSeq_object = - glmmSeq( .formula, + glmmSeq::glmmSeq( .formula, countdata = counts , metadata = metadata |> as.data.frame(), dispersion = dispersion, @@ -1198,12 +1123,11 @@ get_differential_transcript_abundance_glmmSeq_SE <- function(.data, #' #' #' @import tibble +#' @import DESeq2 #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix -#' @importFrom utils install.packages #' @importFrom purrr when #' -#' #' @param .data A tibble #' @param .formula a formula with no response variable, referring only to numeric variables #' @param .contrasts A character vector. See edgeR makeContrasts specification for the parameter `contrasts`. If contrasts are not present the first covariate is the one the model is tested against (e.g., ~ factor_of_interest) @@ -1242,14 +1166,6 @@ get_differential_transcript_abundance_deseq2_SE <- function(.data, omit_contrast_in_colnames = FALSE } - # Check if package is installed, otherwise install - if (find.package("DESeq2", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing DESeq2 needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("DESeq2", ask = FALSE) - } - if (is.null(test_above_log2_fold_change)) { test_above_log2_fold_change <- 0 } @@ -1346,6 +1262,9 @@ get_differential_transcript_abundance_deseq2_SE <- function(.data, #' #' @importFrom stringr str_remove #' @importFrom stringr str_replace_all +#' @importFrom broom tidy +#' @importFrom survival coxph +#' @importFrom betareg betareg #' multivariable_differential_tissue_composition_SE = function( deconvoluted, @@ -1370,16 +1289,6 @@ multivariable_differential_tissue_composition_SE = function( # Beta or Cox when( grepl("Surv", .my_formula) %>% any ~ { - # Check if package is installed, otherwise install - if (find.package("survival", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing betareg needed for analyses") - install.packages("survival", repos = "https://cloud.r-project.org") - } - - if (find.package("boot", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing boot needed for analyses") - install.packages("boot", repos = "https://cloud.r-project.org") - } (.) %>% survival::coxph(.my_formula, .) %>% @@ -1440,16 +1349,6 @@ univariable_differential_tissue_composition_SE = function( .x %>% when( grepl("Surv", .my_formula) %>% any ~ { - # Check if package is installed, otherwise install - if (find.package("survival", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing betareg needed for analyses") - install.packages("survival", repos = "https://cloud.r-project.org") - } - - if (find.package("boot", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing boot needed for analyses") - install.packages("boot", repos = "https://cloud.r-project.org") - } (.) %>% mutate(.proportion_0_corrected = .proportion_0_corrected %>% boot::logit()) %>% @@ -1458,11 +1357,6 @@ univariable_differential_tissue_composition_SE = function( select(-term) } , ~ { - # Check if package is installed, otherwise install - if (find.package("betareg", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing betareg needed for analyses") - install.packages("betareg", repos = "https://cloud.r-project.org") - } (.) %>% betareg::betareg(.my_formula, .) %>% broom::tidy() %>% diff --git a/R/ggplot.R b/R/ggplot.R index 489c3f62..1a020c58 100644 --- a/R/ggplot.R +++ b/R/ggplot.R @@ -34,8 +34,9 @@ log10_reverse_trans <- function() { #' @description it perform logit scaling with right axis formatting. To not be used directly but with ggplot (e.g. scale_y_continuous(trans = "log10_reverse") ) #' #' @importFrom scales label_scientific +#' @importFrom scales trans_new #' @importFrom scales extended_breaks -#' @importFrom stats qlogis plogis +#' @importFrom functional Compose #' #' @return A scales object #' @@ -52,12 +53,6 @@ log10_reverse_trans <- function() { #' @export logit_trans <- function(){ - - if (find.package("functional", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing functional needed for analyses") - install.packages("functional", repos = "https://cloud.r-project.org") - } - trans <- qlogis inv <- plogis diff --git a/R/glmmSeq.R b/R/glmmSeq.R index 268d6907..44924740 100644 --- a/R/glmmSeq.R +++ b/R/glmmSeq.R @@ -420,6 +420,13 @@ setClassUnion("formulaOrNULL", c("formula", "NULL")) #' #' @keywords internal #' @noRd +#' +#' @import lme4 +#' @importFrom glmmTMB glmmTMBControl +#' @importFrom parallel makeCluster +#' @importFrom parallel clusterExport +#' @importFrom pbapply pblapply +#' @importFrom pbmcapply pbmclapply #' #' @slot info List including the matched call, dispersions, offset, designMatrix #' @slot formula The model formula @@ -580,14 +587,6 @@ glmmSeq = function (modelFormula, countdata, metadata, id = NULL, dispersion = N clusterExport(cl, varlist = varlist, envir = environment()) if (progress) { - # Check if package is installed, otherwise install - if (find.package("pblapply", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing pblapply needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("pblapply", ask = FALSE) - } - resultList <- pbapply::pblapply(fullList, function(geneList) { args <- c(list(geneList = geneList, fullFormula = fullFormula, reduced = reduced, data = subsetMetadata, @@ -619,14 +618,6 @@ glmmSeq = function (modelFormula, countdata, metadata, id = NULL, dispersion = N else { if (progress) { - # Check if package is installed, otherwise install - if (find.package("pbmcapply", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing pbmcapply needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("pbmcapply", ask = FALSE) - } - resultList <- pbmcapply::pbmclapply(fullList, function(geneList) { glmerCore(geneList, fullFormula, reduced, subsetMetadata, control, offset, modelData, @@ -672,14 +663,6 @@ glmmSeq = function (modelFormula, countdata, metadata, id = NULL, dispersion = N parallel::clusterExport(cl, varlist = varlist, envir = environment()) if (progress) { - # Check if package is installed, otherwise install - if (find.package("pblapply", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing pblapply needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("pblapply", ask = FALSE) - } - resultList <- pbapply::pblapply(fullList, function(geneList) { args <- c(list(geneList = geneList, fullFormula = fullFormula, reduced = reduced, data = subsetMetadata, @@ -705,14 +688,6 @@ glmmSeq = function (modelFormula, countdata, metadata, id = NULL, dispersion = N else { if (progress) { - # Check if package is installed, otherwise install - if (find.package("pbmcapply", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing pbmcapply needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("pbmcapply", ask = FALSE) - } - resultList <- pbmcapply::pbmclapply(fullList, function(geneList) { glmmTMBcore(geneList, fullFormula, reduced, subsetMetadata, family, control, offset, diff --git a/R/methods.R b/R/methods.R index d3411fb3..6d167cd7 100755 --- a/R/methods.R +++ b/R/methods.R @@ -113,7 +113,8 @@ setMethod("tidybulk", "tbl_df", .tidybulk) #' #' @description as_SummarizedExperiment() creates a `SummarizedExperiment` object from a `tbl` or `tidybulk` tbl formatted as | | | | <...> | #' -#' +#' @import SummarizedExperiment +#' @import S4Vectors #' @importFrom utils data #' @importFrom tidyr pivot_longer #' @@ -152,20 +153,6 @@ setGeneric("as_SummarizedExperiment", function(.data, .transcript = col_names$.transcript .abundance = col_names$.abundance - # Check if package is installed, otherwise install - if (find.package("SummarizedExperiment", quiet = TRUE) |> length() |> equals(0)) { - message("Installing SummarizedExperiment") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("SummarizedExperiment", ask = FALSE) - } - if (find.package("S4Vectors", quiet = TRUE) |> length() %>% equals(0)) { - message("Installing S4Vectors") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("S4Vectors", ask = FALSE) - } - # If present get the scaled abundance .abundance_scaled = .data %>% @@ -582,7 +569,10 @@ setMethod("scale_abundance", "tidybulk", .scale_abundance) #' @importFrom magrittr "%>%" #' @importFrom stats median #' @importFrom dplyr join_by -#' +#' @importFrom limma normalizeQuantiles +#' @importFrom preprocessCore normalize.quantiles.use.target +#' @importFrom preprocessCore normalize.quantiles.determine.target +#' #' @name quantile_normalise_abundance #' #' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) @@ -592,7 +582,6 @@ setMethod("scale_abundance", "tidybulk", .scale_abundance) #' @param method A character string. Either "limma_normalize_quantiles" for limma::normalizeQuantiles or "preprocesscore_normalize_quantiles_use_target" for preprocessCore::normalize.quantiles.use.target for large-scale dataset, where limmma could not be compatible. #' @param action A character string between "add" (default) and "only". "add" joins the new information to the input tbl (default), "only" return a non-redundant tbl with the just new information. #' -#' #' @details Scales transcript abundance compensating for sequencing depth #' (e.g., with TMM algorithm, Robinson and Oshlack doi.org/10.1186/gb-2010-11-3-r25). #' Lowly transcribed transcripts/genes (defined with minimum_counts and minimum_proportion parameters) @@ -602,19 +591,13 @@ setMethod("scale_abundance", "tidybulk", .scale_abundance) #' Underlying method #' edgeR::calcNormFactors(.data, method = c("TMM","TMMwsp","RLE","upperquartile")) #' -#' -#' #' @return A tbl object with additional columns with scaled data as `_scaled` #' -#' #' @examples #' -#' #' tidybulk::se_mini |> #' quantile_normalise_abundance() #' -#' -#' #' @docType methods #' @rdname quantile_normalise_abundance-methods #' @export @@ -662,32 +645,15 @@ setGeneric("quantile_normalise_abundance", function(.data, dplyr::mutate(!!.sample := factor(!!.sample),!!.transcript := factor(!!.transcript)) |> pivot_wider(names_from = !!.sample, values_from = !!.abundance) |> as_matrix(rownames=!!.transcript) - - + if(tolower(method) == "limma_normalize_quantiles"){ - # Check if package is installed, otherwise install - if (find.package("limma", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing limma needed for analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("limma", ask = FALSE) - } - .data_norm = .data_norm |> limma::normalizeQuantiles() } else if(tolower(method) == "preprocesscore_normalize_quantiles_use_target"){ - # Check if package is installed, otherwise install - if (find.package("preprocessCore", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing preprocessCore needed for analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("preprocessCore", ask = FALSE) - } - .data_norm_quant = .data_norm |> preprocessCore::normalize.quantiles.use.target( @@ -2261,7 +2227,9 @@ setMethod("deconvolve_cellularity", #' Get ENTREZ id from gene SYMBOL -#' +#' +#' @importFrom org.Hs.eg.db org.Hs.eg.db +#' #' @param .data A tt or tbl object. #' @param .transcript A character. The name of the gene symbol column. #' @param .sample The name of the sample column @@ -2291,14 +2259,6 @@ symbol_to_entrez = function(.data, col_names = get_sample_transcript(.data, .sample, .transcript) .transcript = col_names$.transcript - # Check if package is installed, otherwise install - if (find.package("org.Hs.eg.db", quiet = TRUE) |> length() |> equals(0)) { - message("Installing org.Hs.eg.db needed for annotation") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("org.Hs.eg.db", ask = FALSE) - } - .data |> # Solve the lower case @@ -2332,6 +2292,10 @@ symbol_to_entrez = function(.data, #' @param .data A tt or tbl object. #' @param .transcript A character. The name of the gene symbol column. #' +#' @importFrom org.Hs.eg.db org.Hs.eg.db +#' @importFrom org.Mm.eg.db org.Mm.eg.db +#' @importFrom AnnotationDbi mapIds +#' #' @return A tbl #' #' @examples @@ -2359,31 +2323,6 @@ setGeneric("describe_transcript", function(.data, col_names = get_transcript(.data, .transcript) .transcript = col_names$.transcript - - # Check if package is installed, otherwise install - if (find.package("org.Hs.eg.db", quiet = TRUE) |> length() |> equals(0)) { - message("Installing org.Hs.eg.db needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("org.Hs.eg.db", ask = FALSE) - } - - # Check if package is installed, otherwise install - if (find.package("org.Mm.eg.db", quiet = TRUE) |> length() |> equals(0)) { - message("Installing org.Mm.eg.db needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("org.Mm.eg.db", ask = FALSE) - } - - # Check if package is installed, otherwise install - if (find.package("AnnotationDbi", quiet = TRUE) |> length() |> equals(0)) { - message("Installing AnnotationDbi needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("AnnotationDbi", ask = FALSE) - } - description_df = @@ -3099,6 +3038,7 @@ setMethod("keep_variable", "tidybulk", .keep_variable) #' @importFrom magrittr "%>%" #' @importFrom dplyr filter #' @importFrom tidyr drop_na +#' @importFrom edgeR filterByExpr #' #' @name identify_abundant #' @@ -3186,15 +3126,6 @@ setGeneric("identify_abundant", function(.data, if( ".abundant" %in% colnames(.data) ) return( .data |> reattach_internals(.data) ) - - # Check if package is installed, otherwise install - if (find.package("edgeR", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing edgeR needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("edgeR", ask = FALSE) - } - # If character fail if( !is.null(factor_of_interest) && @@ -3695,6 +3626,7 @@ setMethod("test_gene_enrichment", #' @importFrom rlang enquo #' @importFrom rlang quo_is_missing #' @importFrom magrittr "%>%" +#' @importFrom msigdbr msigdbr_species #' #' @name test_gene_overrepresentation #' @@ -3788,13 +3720,6 @@ setGeneric("test_gene_overrepresentation", function(.data, if (.data %>% mutate(my_do_test = !!.do_test) %>% pull(my_do_test) |> is("logical") |> not() ) stop("tidybulk says: .do_test column must be logical (i.e., TRUE or FALSE)") - # Check packages msigdbr - # Check if package is installed, otherwise install - if (find.package("msigdbr", quiet = TRUE) |> length() |> equals(0)) { - message("msigdbr not installed. Installing.") - BiocManager::install("msigdbr", ask = FALSE) - } - # Check is correct species name if(species %in% msigdbr::msigdbr_species()$species_name |> not()) stop(sprintf("tidybulk says: wrong species name. MSigDB uses the latin species names (e.g., %s)", paste(msigdbr::msigdbr_species()$species_name, collapse=", "))) @@ -3854,6 +3779,7 @@ setMethod("test_gene_overrepresentation", #' @importFrom rlang enquo #' @importFrom rlang quo_is_missing #' @importFrom magrittr "%>%" +#' @importFrom msigdbr msigdbr_species #' #' @name test_gene_rank #' @@ -3969,13 +3895,6 @@ setGeneric("test_gene_rank", function(.data, if(quo_is_missing(.entrez)) stop("tidybulk says: the .entrez parameter appears to no be set") - # Check packages msigdbr - # Check if package is installed, otherwise install - if (find.package("msigdbr", quiet = TRUE) |> length() |> equals(0)) { - message("msigdbr not installed. Installing.") - BiocManager::install("msigdbr", ask = FALSE) - } - # Check is correct species name if(species %in% msigdbr::msigdbr_species()$species_name |> not()) stop(sprintf("tidybulk says: wrong species name. MSigDB uses the latin species names (e.g., %s)", paste(msigdbr::msigdbr_species()$species_name, collapse=", "))) diff --git a/R/methods_SE.R b/R/methods_SE.R index a84e591a..f700bcab 100755 --- a/R/methods_SE.R +++ b/R/methods_SE.R @@ -1,3 +1,4 @@ +#' @importFrom SummarizedExperiment assays .tidybulk_se = function(.data, .sample, .transcript, @@ -7,14 +8,6 @@ # Fix NOTEs . = NULL - # Check if package is installed, otherwise install - if (find.package("SummarizedExperiment", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing SummarizedExperiment") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("SummarizedExperiment", ask = FALSE) - } - # Make col names .sample = enquo(.sample) .transcript = enquo(.transcript) @@ -37,9 +30,6 @@ !!as.symbol(SummarizedExperiment::assays(.data)[1] %>% names ), !!norm_col # scaled counts if any ) - - - } #' tidybulk @@ -72,15 +62,13 @@ setMethod("tidybulk", "SummarizedExperiment", .tidybulk_se) #' setMethod("tidybulk", "RangedSummarizedExperiment", .tidybulk_se) - - - #' @importFrom magrittr multiply_by #' @importFrom magrittr divide_by #' @importFrom SummarizedExperiment assays #' @importFrom SummarizedExperiment colData #' @importFrom utils tail #' @importFrom stats na.omit +#' @importFrom edgeR calcNormFactors #' .scale_abundance_se = function(.data, .sample = NULL, @@ -98,14 +86,6 @@ setMethod("tidybulk", "RangedSummarizedExperiment", .tidybulk_se) # Fix NOTEs . = NULL - # Check if package is installed, otherwise install - if (find.package("edgeR", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing edgeR needed for analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("edgeR", ask = FALSE) - } - # DEPRECATION OF reference function if (is_present(reference_selection_function) & !is.null(reference_selection_function)) { @@ -242,6 +222,9 @@ setMethod("scale_abundance", #' @importFrom SummarizedExperiment colData #' @importFrom utils tail #' @importFrom stats na.omit +#' @importFrom limma normalizeQuantiles +#' @importFrom preprocessCore normalize.quantiles.use.target +#' @importFrom preprocessCore normalize.quantiles.determine.target #' .quantile_normalise_abundance_se = function(.data, .sample = NULL, @@ -250,7 +233,6 @@ setMethod("scale_abundance", method = "limma_normalize_quantiles", action = NULL) { - # Fix NOTEs . = NULL @@ -280,14 +262,6 @@ setMethod("scale_abundance", else if(tolower(method) == "limma_normalize_quantiles"){ - # Check if package is installed, otherwise install - if (find.package("limma", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing limma needed for analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("limma", ask = FALSE) - } - .data_norm <- .data %>% assay(my_assay) |> @@ -298,14 +272,6 @@ setMethod("scale_abundance", } else if(tolower(method) == "preprocesscore_normalize_quantiles_use_target"){ - # Check if package is installed, otherwise install - if (find.package("preprocessCore", quiet = TRUE) %>% length %>% equals(0)) { - message("tidybulk says: Installing preprocessCore needed for analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("preprocessCore", ask = FALSE) - } - .data_norm = .data |> assay(my_assay) |> @@ -771,6 +737,8 @@ setMethod("remove_redundancy", #' @inheritParams remove_redundancy #' #' @importFrom rlang quo +#' @importFrom sva ComBat +#' @importFrom sva ComBat_seq #' #' @docType methods #' @rdname remove_redundancy-methods @@ -807,15 +775,6 @@ setMethod("remove_redundancy", .abundance = enquo(.abundance) - # Check if package is installed, otherwise install - if (find.package("sva", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing sva - Combat needed for adjustment for unwanted variation") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("sva", ask = FALSE) - } - - # DEPRECATION OF log_transform if ( (is_present(transform) & !is.null(transform)) | @@ -1176,7 +1135,6 @@ setMethod("aggregate_duplicates", .aggregate_duplicates_se) - #' @importFrom rlang quo_is_symbolic .deconvolve_cellularity_se = function(.data, reference = X_cibersort, @@ -1218,27 +1176,6 @@ setMethod("aggregate_duplicates", # Execute do.call because I have to deal with ... method %>% tolower %>% equals("cibersort") ~ { - # Check if package is installed, otherwise install - if (find.package("class", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing class needed for Cibersort") - install.packages("class", repos = "https://cloud.r-project.org", dependencies = c("Depends", "Imports")) - } - - # Check if package is installed, otherwise install - if (find.package("e1071", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing e1071 needed for Cibersort") - install.packages("e1071", repos = "https://cloud.r-project.org", dependencies = c("Depends", "Imports")) - } - - # Check if package is installed, otherwise install - if (find.package("preprocessCore", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing preprocessCore needed for Cibersort") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("preprocessCore", ask = FALSE) - - } - # Choose reference reference = reference %>% when(is.null(.) ~ X_cibersort, ~ .) @@ -1279,12 +1216,6 @@ setMethod("aggregate_duplicates", # Other (hidden for the moment) methods using third party wrapper https://icbi-lab.github.io/immunedeconv method %>% tolower %in% c("mcp_counter", "quantiseq", "xcell") ~ { - # Check if package is installed, otherwise install - if (find.package("immunedeconv", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing immunedeconv") - devtools::install_github("icbi-lab/immunedeconv", upgrade = FALSE) - } - if(method %in% c("mcp_counter", "quantiseq", "xcell") & !"immunedeconv" %in% (.packages())) stop("tidybulk says: for xcell, mcp_counter, or quantiseq deconvolution you should have the package immunedeconv attached. Please execute library(immunedeconv)") @@ -1582,6 +1513,7 @@ setMethod("keep_variable", #' @importFrom purrr map_chr #' @importFrom tidyr unite #' @importFrom Matrix colSums +#' @importFrom edgeR filterByExpr #' #' @docType methods #' @rdname keep_variable-methods @@ -1680,16 +1612,6 @@ setMethod("keep_variable", string_factor_of_interest = NULL } - - - # Check if package is installed, otherwise install - if (find.package("edgeR", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing edgeR needed for analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("edgeR", ask = FALSE) - } - # If no assay is specified take first my_assay = ifelse( quo_is_symbol(.abundance), @@ -2093,6 +2015,7 @@ setMethod("test_gene_enrichment", #' test_gene_enrichment #' @inheritParams test_gene_enrichment +#' @importFrom msigdbr msigdbr_species #' #' @docType methods #' @rdname test_gene_enrichment-methods @@ -2140,13 +2063,6 @@ setMethod("test_gene_enrichment", if (.data %>% rowData() %>% as_tibble(rownames = f_(.data)$name) %>% mutate(my_do_test = !!.do_test) %>% pull(my_do_test) |> is("logical") %>% not()) stop("tidybulk says: .do_test column must be logical (i.e., TRUE or FALSE)") - # Check packages msigdbr - # Check if package is installed, otherwise install - if (find.package("msigdbr", quiet = TRUE) %>% length %>% equals(0)) { - message("msigdbr not installed. Installing.") - BiocManager::install("msigdbr", ask = FALSE) - } - # Check is correct species name if(species %in% msigdbr::msigdbr_species()$species_name %>% not()) stop(sprintf("tidybulk says: wrong species name. MSigDB uses the latin species names (e.g., %s)", paste(msigdbr::msigdbr_species()$species_name, collapse=", "))) @@ -2167,7 +2083,6 @@ setMethod("test_gene_enrichment", # Add methods used memorise_methods_used(c("clusterProfiler", "msigdbr", "msigdb"), object_containing_methods = .data) - } #' test_gene_overrepresentation @@ -2183,7 +2098,8 @@ setMethod("test_gene_overrepresentation", #' test_gene_overrepresentation #' @inheritParams test_gene_overrepresentation -#' +#' @importFrom msigdbr msigdbr_species +#' #' @docType methods #' @rdname test_gene_overrepresentation-methods #' @@ -2227,13 +2143,6 @@ setMethod("test_gene_overrepresentation", if(quo_is_missing(.entrez)) stop("tidybulk says: the .entrez parameter appears to no be set") - # Check packages msigdbr - # Check if package is installed, otherwise install - if (find.package("msigdbr", quiet = TRUE) %>% length %>% equals(0)) { - message("msigdbr not installed. Installing.") - BiocManager::install("msigdbr", ask = FALSE) - } - # Check is correct species name if(species %in% msigdbr::msigdbr_species()$species_name %>% not()) stop(sprintf("tidybulk says: wrong species name. MSigDB uses the latin species names (e.g., %s)", paste(msigdbr::msigdbr_species()$species_name, collapse=", "))) @@ -2487,7 +2396,6 @@ setMethod("impute_missing_abundance", #' #' @importFrom stringr str_replace #' -#' #' @return A `SummarizedExperiment` object #' setMethod("impute_missing_abundance", @@ -2506,11 +2414,6 @@ setMethod("impute_missing_abundance", # Fix NOTEs . = NULL - if (find.package("broom", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing broom needed for analyses") - install.packages("broom", repos = "https://cloud.r-project.org") - } - deconvoluted = .data %>% @@ -2757,6 +2660,9 @@ setMethod("get_bibliography", #' #' @importFrom SummarizedExperiment rowData #' @importFrom tibble enframe +#' @importFrom AnnotationDbi mapIds +#' @importFrom org.Hs.eg.db org.Hs.eg.db +#' @importFrom org.Mm.eg.db org.Mm.eg.db #' #' @inheritParams describe_transcript #' @@ -2772,30 +2678,6 @@ setMethod("get_bibliography", # Fix NOTEs . = NULL - # Check if package is installed, otherwise install - if (find.package("org.Hs.eg.db", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing org.Hs.eg.db needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("org.Hs.eg.db", ask = FALSE) - } - - # Check if package is installed, otherwise install - if (find.package("org.Mm.eg.db", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing org.Mm.eg.db needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("org.Mm.eg.db", ask = FALSE) - } - - # Check if package is installed, otherwise install - if (find.package("AnnotationDbi", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing AnnotationDbi needed for differential transcript abundance analyses") - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("AnnotationDbi", ask = FALSE) - } - .transcript = enquo(.transcript) # Transcript rownames by default diff --git a/R/utilities.R b/R/utilities.R index 205933a7..ff82c397 100755 --- a/R/utilities.R +++ b/R/utilities.R @@ -1110,7 +1110,12 @@ do_validate = function(){ #' #' @importFrom stringr str_remove #' @importFrom stringr str_replace_all -#' +#' @importFrom betareg betareg +#' @importFrom broom tidy +#' @importFrom boot logit +#' @importFrom survival coxph +#' @importFrom survminer surv_fit +#' @importFrom survminer ggsurvplot multivariable_differential_tissue_composition = function( deconvoluted, method, @@ -1133,16 +1138,6 @@ multivariable_differential_tissue_composition = function( # Beta or Cox when( grepl("Surv", .my_formula) %>% any ~ { - # Check if package is installed, otherwise install - if (find.package("survival", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing betareg needed for analyses") - install.packages("survival", repos = "https://cloud.r-project.org") - } - - if (find.package("boot", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing boot needed for analyses") - install.packages("boot", repos = "https://cloud.r-project.org") - } (.) %>% survival::coxph(.my_formula, .) %>% @@ -1201,16 +1196,6 @@ univariable_differential_tissue_composition = function( .x %>% when( grepl("Surv", .my_formula) %>% any ~ { - # Check if package is installed, otherwise install - if (find.package("survival", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing betareg needed for analyses") - install.packages("survival", repos = "https://cloud.r-project.org") - } - - if (find.package("boot", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing boot needed for analyses") - install.packages("boot", repos = "https://cloud.r-project.org") - } (.) %>% mutate(.proportion_0_corrected = .proportion_0_corrected %>% boot::logit()) %>% @@ -1219,11 +1204,7 @@ univariable_differential_tissue_composition = function( select(-term) } , ~ { - # Check if package is installed, otherwise install - if (find.package("betareg", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing betareg needed for analyses") - install.packages("betareg", repos = "https://cloud.r-project.org") - } + (.) %>% betareg::betareg(.my_formula, .) %>% broom::tidy() %>% @@ -1245,24 +1226,6 @@ univariable_differential_tissue_stratification = function( .my_formula ){ - # Check if package is installed, otherwise install - if (find.package("survival", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing survival needed for analyses") - install.packages("survival", repos = "https://cloud.r-project.org") - } - - # Check if package is installed, otherwise install - if (find.package("survminer", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing survminer needed for analyses") - install.packages("survminer", repos = "https://cloud.r-project.org") - } - - - if (find.package("broom", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing broom needed for analyses") - install.packages("broom", repos = "https://cloud.r-project.org") - } - deconvoluted %>% # Test @@ -1317,30 +1280,17 @@ univariable_differential_tissue_stratification = function( unnest(surv_test, keep_empty = TRUE) } +#' @importFrom tidyr nest +#' @importFrom survival survdiff +#' @importFrom survminer surv_fit +#' @importFrom survminer ggsurvplot +#' @importFrom broom tidy univariable_differential_tissue_stratification_SE = function( deconvoluted, method, .my_formula ){ - # Check if package is installed, otherwise install - if (find.package("survival", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing survival needed for analyses") - install.packages("survival", repos = "https://cloud.r-project.org") - } - - # Check if package is installed, otherwise install - if (find.package("survminer", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing survminer needed for analyses") - install.packages("survminer", repos = "https://cloud.r-project.org") - } - - - if (find.package("broom", quiet = TRUE) %>% length %>% equals(0)) { - message("Installing broom needed for analyses") - install.packages("broom", repos = "https://cloud.r-project.org") - } - deconvoluted %>% pivot_sample() %>% diff --git a/man/bind_rows.Rd b/man/bind_rows.Rd index a2c3110d..0ac66681 100644 --- a/man/bind_rows.Rd +++ b/man/bind_rows.Rd @@ -5,7 +5,7 @@ \alias{bind_rows.tidybulk} \alias{bind_cols.tidybulk} \alias{bind_cols} -\title{#' Efficiently bind multiple data frames by row and column} +\title{Efficiently bind multiple data frames by row and column} \usage{ \method{bind_rows}{tidybulk}(..., .id = NULL) diff --git a/man/quantile_normalise_abundance-methods.Rd b/man/quantile_normalise_abundance-methods.Rd index fdaf6e46..1b3d202f 100644 --- a/man/quantile_normalise_abundance-methods.Rd +++ b/man/quantile_normalise_abundance-methods.Rd @@ -107,10 +107,7 @@ edgeR::calcNormFactors(.data, method = c("TMM","TMMwsp","RLE","upperquartile")) } \examples{ - tidybulk::se_mini |> quantile_normalise_abundance() - - } diff --git a/tests/testthat/test-bulk_methods.R b/tests/testthat/test-bulk_methods.R index d7c2d545..7ebfe534 100755 --- a/tests/testthat/test-bulk_methods.R +++ b/tests/testthat/test-bulk_methods.R @@ -655,12 +655,6 @@ test_that("New method choice",{ test_that("DESeq2 differential trancript abundance - no object",{ - if (find.package("DESeq2", quiet = TRUE) |> length() |> equals(0)) { - if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager", repos = "https://cloud.r-project.org") - BiocManager::install("DESeq2", ask = FALSE) - } - test_deseq2_df = DESeq2::DESeqDataSet(se_mini,design=~condition) colData(test_deseq2_df)$condition = factor(colData(test_deseq2_df)$condition) From c98891b57c57b42384589f552891e28d058b4a27 Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Fri, 5 Jan 2024 17:20:19 +1100 Subject: [PATCH 12/30] Update EPIC and EGSEA function imports --- DESCRIPTION | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 802c4bba..6b6d34ca 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -106,7 +106,6 @@ Suggests: uwot, matrixStats, igraph, - EGSEA, IRanges, here, glmmSeq, @@ -114,7 +113,10 @@ Suggests: pbmcapply, lme4, glmmTMB, - MASS + MASS, + EGSEA +Remotes: + GfellerLab/EPIC VignetteBuilder: knitr RdMacros: From 518858194f482d1de292e4c9d483d6dd0ef2c077 Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Mon, 8 Jan 2024 11:39:25 +1100 Subject: [PATCH 13/30] Fix vignette error --- vignettes/introduction.R | 84 ++++++++++++++++++++++++++++++++++++++ vignettes/introduction.Rmd | 2 +- 2 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 vignettes/introduction.R diff --git a/vignettes/introduction.R b/vignettes/introduction.R new file mode 100644 index 00000000..3e2595d6 --- /dev/null +++ b/vignettes/introduction.R @@ -0,0 +1,84 @@ +## ----echo=FALSE, out.width = "800px"------------------------------------------ +knitr::include_graphics("../man/figures/new_SE_usage-01.png") + +## ----echo=FALSE, include=FALSE------------------------------------------------ +library(knitr) +# knitr::opts_chunk$set(cache = TRUE, warning = FALSE, +# message = FALSE, cache.lazy = FALSE) + +library(dplyr) +library(tidyr) +library(tibble) +library(magrittr) +library(ggplot2) +library(ggrepel) +library(tidybulk) +library(tidySummarizedExperiment) + +my_theme = + theme_bw() + + theme( + panel.border = element_blank(), + axis.line = element_line(), + panel.grid.major = element_line(size = 0.2), + panel.grid.minor = element_line(size = 0.1), + text = element_text(size=12), + legend.position="bottom", + aspect.ratio=1, + strip.background = element_blank(), + axis.title.x = element_text(margin = margin(t = 10, r = 10, b = 10, l = 10)), + axis.title.y = element_text(margin = margin(t = 10, r = 10, b = 10, l = 10)) + ) + +data(se_mini) +tibble_counts = tidybulk::se_mini |> tidybulk() |> as_tibble() + + +## ----eval=FALSE--------------------------------------------------------------- +# BiocManager::install("tidybulk") + +## ----eval=FALSE--------------------------------------------------------------- +# devtools::install_github("stemangiola/tidybulk") + +## ----------------------------------------------------------------------------- +se_mini + +## ----------------------------------------------------------------------------- +class(se_mini) + +## ----eval=FALSE--------------------------------------------------------------- +# se_mini |> get_bibliography() + +## ----aggregate, message=FALSE, warning=FALSE, results='hide', class.source='yellow'---- +rowData(se_mini)$gene_name = rownames(se_mini) +se_mini.aggr = se_mini |> aggregate_duplicates(.transcript = gene_name) + +## ----aggregate long, eval=FALSE----------------------------------------------- +# temp = data.frame( +# symbol = dge_list$genes$symbol, +# dge_list$counts +# ) +# dge_list.nr <- by(temp, temp$symbol, +# function(df) +# if(length(df[1,1])>0) +# matrixStats:::colSums(as.matrix(df[,-1])) +# ) +# dge_list.nr <- do.call("rbind", dge_list.nr) +# colnames(dge_list.nr) <- colnames(dge_list) + +## ----normalise---------------------------------------------------------------- +se_mini.norm = se_mini.aggr |> identify_abundant(factor_of_interest = condition) |> scale_abundance() + +## ----normalise long, eval=FALSE----------------------------------------------- +# library(edgeR) +# +# dgList <- DGEList(count_m=x,group=group) +# keep <- filterByExpr(dgList) +# dgList <- dgList[keep,,keep.lib.sizes=FALSE] +# [...] +# dgList <- calcNormFactors(dgList, method="TMM") +# norm_counts.table <- cpm(dgList) + +## ----include=FALSE------------------------------------------------------------ +se_mini.norm |> select(`count`, count_scaled, .abundant, everything()) + diff --git a/vignettes/introduction.Rmd b/vignettes/introduction.Rmd index 490b7578..55d6e1fb 100755 --- a/vignettes/introduction.Rmd +++ b/vignettes/introduction.Rmd @@ -209,7 +209,7 @@ We can easily plot the scaled density to check the scaling outcome. On the x axi ```{r plot_normalise} se_mini.norm |> - ggplot(aes(count_scaled + 1, group=sample, color=`Cell.type`)) + + ggplot(aes(count_scaled + 1, group=.sample, color=`Cell.type`)) + geom_density() + scale_x_log10() + my_theme From 02dfccca8e7deafdbc29ca314ca85607dd81650b Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Mon, 8 Jan 2024 11:47:56 +1100 Subject: [PATCH 14/30] Remove unneeded files --- .coveralls.yml | 2 - .gitignore | 24 ------------ .travis.yml | 16 -------- _pkgdown.yml | 1 - codecov.yml | 12 ------ vignettes/.gitignore | 1 - vignettes/introduction.R | 84 ---------------------------------------- 7 files changed, 140 deletions(-) delete mode 100755 .coveralls.yml delete mode 100755 .gitignore delete mode 100755 .travis.yml delete mode 100644 _pkgdown.yml delete mode 100755 codecov.yml delete mode 100644 vignettes/.gitignore delete mode 100644 vignettes/introduction.R diff --git a/.coveralls.yml b/.coveralls.yml deleted file mode 100755 index a791cc00..00000000 --- a/.coveralls.yml +++ /dev/null @@ -1,2 +0,0 @@ -service_name: travis-pro -repo_token: O4NscPehU4qrWznFtQRiyJJBIOyRgPzsB diff --git a/.gitignore b/.gitignore deleted file mode 100755 index decb5cb1..00000000 --- a/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -.Rproj.user -.Rhistory -.RData -.Ruserdata -tidybulk.Rproj -README_cache/* -vignettes/introduction_cache* -tidybulk.Rproj -Meta -doc -dev/*csv -dev/*rds -dev/*rda -dev/*pdf -dev/dplyr-master/* -tidybulk.Rproj -egsea_report_* -/doc* -/Meta/ -/doc/ -_targets.R -_targets* -.DS_Store -._.DS_Store diff --git a/.travis.yml b/.travis.yml deleted file mode 100755 index 7e9e7d23..00000000 --- a/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -# Adapted from https://github.com/hadley/testthat/blob/master/.travis.yml -# R for travis: see documentation at https://docs.travis-ci.com/user/languages/r -language: r -cache: packages -r: - - bioc-release - - bioc-devel -env: -- R_QPDF=true - -r_github_packages: - - r-lib/covr - -after_success: - - tar -C .. -xf $PKG_TARBALL - - xvfb-run Rscript -e 'covr::codecov(type=c("tests", "vignettes", "examples"))' diff --git a/_pkgdown.yml b/_pkgdown.yml deleted file mode 100644 index 6ef5f5a6..00000000 --- a/_pkgdown.yml +++ /dev/null @@ -1 +0,0 @@ -destination: docs diff --git a/codecov.yml b/codecov.yml deleted file mode 100755 index 8f36b6cc..00000000 --- a/codecov.yml +++ /dev/null @@ -1,12 +0,0 @@ -comment: false - -coverage: - status: - project: - default: - target: auto - threshold: 1% - patch: - default: - target: auto - threshold: 1% diff --git a/vignettes/.gitignore b/vignettes/.gitignore deleted file mode 100644 index f1f50d0c..00000000 --- a/vignettes/.gitignore +++ /dev/null @@ -1 +0,0 @@ -manuscript_differential_transcript_abundance_cache diff --git a/vignettes/introduction.R b/vignettes/introduction.R deleted file mode 100644 index 3e2595d6..00000000 --- a/vignettes/introduction.R +++ /dev/null @@ -1,84 +0,0 @@ -## ----echo=FALSE, out.width = "800px"------------------------------------------ -knitr::include_graphics("../man/figures/new_SE_usage-01.png") - -## ----echo=FALSE, include=FALSE------------------------------------------------ -library(knitr) -# knitr::opts_chunk$set(cache = TRUE, warning = FALSE, -# message = FALSE, cache.lazy = FALSE) - -library(dplyr) -library(tidyr) -library(tibble) -library(magrittr) -library(ggplot2) -library(ggrepel) -library(tidybulk) -library(tidySummarizedExperiment) - -my_theme = - theme_bw() + - theme( - panel.border = element_blank(), - axis.line = element_line(), - panel.grid.major = element_line(size = 0.2), - panel.grid.minor = element_line(size = 0.1), - text = element_text(size=12), - legend.position="bottom", - aspect.ratio=1, - strip.background = element_blank(), - axis.title.x = element_text(margin = margin(t = 10, r = 10, b = 10, l = 10)), - axis.title.y = element_text(margin = margin(t = 10, r = 10, b = 10, l = 10)) - ) - -data(se_mini) -tibble_counts = tidybulk::se_mini |> tidybulk() |> as_tibble() - - -## ----eval=FALSE--------------------------------------------------------------- -# BiocManager::install("tidybulk") - -## ----eval=FALSE--------------------------------------------------------------- -# devtools::install_github("stemangiola/tidybulk") - -## ----------------------------------------------------------------------------- -se_mini - -## ----------------------------------------------------------------------------- -class(se_mini) - -## ----eval=FALSE--------------------------------------------------------------- -# se_mini |> get_bibliography() - -## ----aggregate, message=FALSE, warning=FALSE, results='hide', class.source='yellow'---- -rowData(se_mini)$gene_name = rownames(se_mini) -se_mini.aggr = se_mini |> aggregate_duplicates(.transcript = gene_name) - -## ----aggregate long, eval=FALSE----------------------------------------------- -# temp = data.frame( -# symbol = dge_list$genes$symbol, -# dge_list$counts -# ) -# dge_list.nr <- by(temp, temp$symbol, -# function(df) -# if(length(df[1,1])>0) -# matrixStats:::colSums(as.matrix(df[,-1])) -# ) -# dge_list.nr <- do.call("rbind", dge_list.nr) -# colnames(dge_list.nr) <- colnames(dge_list) - -## ----normalise---------------------------------------------------------------- -se_mini.norm = se_mini.aggr |> identify_abundant(factor_of_interest = condition) |> scale_abundance() - -## ----normalise long, eval=FALSE----------------------------------------------- -# library(edgeR) -# -# dgList <- DGEList(count_m=x,group=group) -# keep <- filterByExpr(dgList) -# dgList <- dgList[keep,,keep.lib.sizes=FALSE] -# [...] -# dgList <- calcNormFactors(dgList, method="TMM") -# norm_counts.table <- cpm(dgList) - -## ----include=FALSE------------------------------------------------------------ -se_mini.norm |> select(`count`, count_scaled, .abundant, everything()) - From 50a94ab981e25673e764acc578b422747ebc279f Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Mon, 8 Jan 2024 13:33:10 +1100 Subject: [PATCH 15/30] Update suggested packages --- DESCRIPTION | 34 ++++------------------------------ 1 file changed, 4 insertions(+), 30 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 6b6d34ca..51d48cba 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -67,54 +67,28 @@ Imports: uwot, widyr Suggests: + tidySummarizedExperiment, + tidyHeatmap, BiocStyle, testthat, vctrs, - AnnotationDbi, BiocManager, Rsubread, - e1071, - edgeR, - limma, - org.Hs.eg.db, - org.Mm.eg.db, - sva, GGally, knitr, qpdf, covr, - Seurat, KernSmooth, - Rtsne, ggplot2, - widyr, - clusterProfiler, - msigdbr, - DESeq2, - broom, - survival, - boot, - betareg, - tidyHeatmap, pasilla, ggrepel, - devtools, - functional, - survminer, - tidySummarizedExperiment, markdown, - uwot, - matrixStats, igraph, IRanges, here, - glmmSeq, - pbapply, - pbmcapply, - lme4, - glmmTMB, MASS, - EGSEA + EGSEA, + qpdf Remotes: GfellerLab/EPIC VignetteBuilder: From a162b8ee86684263fbed8c4d806056d81b7f6ee9 Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Mon, 8 Jan 2024 13:46:32 +1100 Subject: [PATCH 16/30] Replace README example data --- DESCRIPTION | 2 +- README.Rmd | 288 ++++----- README.md | 552 +++++++----------- ...SNN_6ec21fb35522e05c9e22c44a24c3aa69.RData | Bin 0 -> 2765 bytes .../SNN_6ec21fb35522e05c9e22c44a24c3aa69.rdb | 0 .../SNN_6ec21fb35522e05c9e22c44a24c3aa69.rdx | Bin 0 -> 125 bytes README_cache/gfm/__packages | 27 + man/figures/plot_cluster-1.png | Bin 20847 -> 9208 bytes man/figures/plot_drop-1.png | Bin 24432 -> 10322 bytes man/figures/plot_drop2-1.png | Bin 26847 -> 9544 bytes man/figures/plot_normalise-1.png | Bin 55155 -> 35060 bytes man/figures/plot_rotate_1-1.png | Bin 24844 -> 10343 bytes man/figures/plot_rotate_2-1.png | Bin 29046 -> 13304 bytes man/figures/unnamed-chunk-14-1.png | Bin 55315 -> 37877 bytes 14 files changed, 367 insertions(+), 502 deletions(-) create mode 100644 README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.RData create mode 100644 README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.rdb create mode 100644 README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.rdx create mode 100644 README_cache/gfm/__packages diff --git a/DESCRIPTION b/DESCRIPTION index 51d48cba..9b898e45 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: tidybulk Title: Brings transcriptomics to the tidyverse -Version: 1.13.1 +Version: 1.13.2 Authors@R: c(person("Stefano", "Mangiola", email = "mangiolastefano@gmail.com", role = c("aut", "cre")), person("Maria", "Doyle", email = "Maria.Doyle@petermac.org", diff --git a/README.Rmd b/README.Rmd index 24199774..91a45044 100755 --- a/README.Rmd +++ b/README.Rmd @@ -43,26 +43,25 @@ knitr::include_graphics("man/figures/new_SE_usage-01.png") ``` + ## Functions/utilities available Function | Description ------------ | ------------- +`identify_abundant` | identify the abundant genes `aggregate_duplicates` | Aggregate abundance and annotation of duplicated transcripts in a robust way -`identify_abundant` `keep_abundant` | identify or keep the abundant genes -`keep_variable` | Filter for top variable features `scale_abundance` | Scale (normalise) abundance for RNA sequencing depth -`reduce_dimensions` | Perform dimensionality reduction (PCA, MDS, tSNE, UMAP) +`reduce_dimensions` | Perform dimensionality reduction (PCA, MDS, tSNE) `cluster_elements` | Labels elements with cluster identity (kmeans, SNN) `remove_redundancy` | Filter out elements with highly correlated features `adjust_abundance` | Remove known unwanted variation (Combat) -`test_differential_abundance` | Differential transcript abundance testing (DESeq2, edgeR, voom) -`deconvolve_cellularity` | Estimated tissue composition (Cibersort, llsr, epic, xCell, mcp_counter, quantiseq +`test_differential_abundance` | Differential transcript abundance testing (DE) +`deconvolve_cellularity` | Estimated tissue composition (Cibersort or llsr) `test_differential_cellularity` | Differential cell-type abundance testing -`test_stratification_cellularity` | Estimate Kaplan-Meier survival differences +`keep_variable` | Filter for top variable features +`keep_abundant` | Filter out lowly abundant transcripts `test_gene_enrichment` | Gene enrichment analyses (EGSEA) `test_gene_overrepresentation` | Gene enrichment on list of transcript names (no rank) -`test_gene_rank` | Gene enrichment on list of transcript (GSEA) -`impute_missing_abundance` | Impute abundance for missing data points using sample groupings Utilities | Description @@ -76,14 +75,16 @@ Utilities | Description `ensembl_to_symbol` | Add gene symbol from ensembl IDs `symbol_to_entrez` | Add entrez ID from gene symbol `describe_transcript` | Add gene description from gene symbol +`impute_missing_abundance` | Impute abundance for missing data points using sample groupings +`fill_missing_abundance` | Fill abundance for missing data points using an arbitrary value All functions are directly compatibble with `SummarizedExperiment` object. ```{r, echo=FALSE, include=FALSE, } library(knitr) -knitr::opts_chunk$set(cache = TRUE, warning = FALSE, - message = FALSE, cache.lazy = FALSE) +# knitr::opts_chunk$set(cache = TRUE, warning = FALSE, +# message = FALSE, cache.lazy = FALSE) library(dplyr) library(tidyr) @@ -93,7 +94,6 @@ library(ggplot2) library(ggrepel) library(tidybulk) library(tidySummarizedExperiment) -library(here) my_theme = theme_bw() + @@ -110,9 +110,8 @@ my_theme = axis.title.y = element_text(margin = margin(t = 10, r = 10, b = 10, l = 10)) ) - -counts_SE = here("dev/counts_SE.rda") |> load() -tibble_counts = counts_SE %>% tidybulk() %>% as_tibble() +data(se_mini) +tibble_counts = tidybulk::se_mini |> tidybulk() |> as_tibble() ``` @@ -133,20 +132,20 @@ devtools::install_github("stemangiola/tidybulk") We will use a `SummarizedExperiment` object ```{r} -counts_SE +se_mini ``` Loading `tidySummarizedExperiment` will automatically abstract this object as `tibble`, so we can display it and manipulate it with tidy tools. Although it looks different, and more tools (tidyverse) are available to us, this object is in fact a `SummarizedExperiment` object. ```{r} -class(counts_SE) +class(se_mini) ``` ## Get the bibliography of your workflow First of all, you can cite all articles utilised within your workflow automatically from any tidybulk tibble ```{r eval=FALSE} -counts_SE %>% get_bibliography() +se_mini |> get_bibliography() ``` ## Aggregate duplicated `transcripts` @@ -156,8 +155,8 @@ tidybulk provide the `aggregate_duplicates` function to aggregate duplicated tra
TidyTranscriptomics ```{r aggregate, message=FALSE, warning=FALSE, results='hide', class.source='yellow'} -rowData(counts_SE)$gene_name = rownames(counts_SE) -counts_SE.aggr = counts_SE %>% aggregate_duplicates(.transcript = gene_name) +rowData(se_mini)$gene_name = rownames(se_mini) +se_mini.aggr = se_mini |> aggregate_duplicates(.transcript = gene_name) ```
@@ -184,8 +183,8 @@ We may want to compensate for sequencing depth, scaling the transcript abundance
TidyTranscriptomics -```{r normalise, cache=TRUE} -counts_SE.norm = counts_SE.aggr %>% identify_abundant(factor_of_interest = condition) %>% scale_abundance() +```{r normalise} +se_mini.norm = se_mini.aggr |> identify_abundant(factor_of_interest = condition) |> scale_abundance() ```
@@ -205,15 +204,15 @@ norm_counts.table <- cpm(dgList)
```{r, include=FALSE} -counts_SE.norm %>% select(`count`, count_scaled, .abundant, everything()) +se_mini.norm |> select(`count`, count_scaled, .abundant, everything()) ``` We can easily plot the scaled density to check the scaling outcome. On the x axis we have the log scaled counts, on the y axes we have the density, data is grouped by sample and coloured by cell type. -```{r plot_normalise, cache=TRUE} -counts_SE.norm %>% - ggplot(aes(count_scaled + 1, group=sample, color=`Cell.type`)) + +```{r plot_normalise} +se_mini.norm |> + ggplot(aes(count_scaled + 1, group=.sample, color=`Cell.type`)) + geom_density() + scale_x_log10() + my_theme @@ -225,8 +224,8 @@ We may want to identify and filter variable transcripts.
TidyTranscriptomics -```{r filter variable, cache=TRUE} -counts_SE.norm.variable = counts_SE.norm %>% keep_variable() +```{r filter variable} +se_mini.norm.variable = se_mini.norm |> keep_variable() ```
@@ -263,10 +262,10 @@ We may want to reduce the dimensions of our data, for example using PCA or MDS a
TidyTranscriptomics -```{r mds, cache=TRUE} -counts_SE.norm.MDS = - counts_SE.norm %>% - reduce_dimensions(method="MDS", .dims = 6) +```{r mds} +se_mini.norm.MDS = + se_mini.norm |> + reduce_dimensions(method="MDS", .dims = 3) ```
@@ -279,7 +278,7 @@ count_m_log = log(count_m + 1) cmds = limma::plotMDS(ndim = .dims, plot = FALSE) cmds = cmds %$% - cmdscale.out %>% + cmdscale.out |> setNames(sprintf("Dim%s", 1:6)) cmds$cell_type = tibble_counts[ @@ -292,12 +291,12 @@ cmds$cell_type = tibble_counts[ On the x and y axes axis we have the reduced dimensions 1 to 3, data is coloured by cell type. -```{r plot_mds, cache=TRUE} -counts_SE.norm.MDS %>% pivot_sample() %>% select(contains("Dim"), everything()) +```{r plot_mds, eval=FALSE} +se_mini.norm.MDS |> pivot_sample() |> select(contains("Dim"), everything()) -counts_SE.norm.MDS %>% - pivot_sample() %>% - GGally::ggpairs(columns = 6:(6+5), ggplot2::aes(colour=`Cell.type`)) +se_mini.norm.MDS |> + pivot_sample() |> + GGally::ggpairs(columns = 9:11, ggplot2::aes(colour=`Cell.type`)) ``` @@ -306,17 +305,17 @@ counts_SE.norm.MDS %>%
TidyTranscriptomics -```{r pca, cache=TRUE, message=FALSE, warning=FALSE, results='hide'} -counts_SE.norm.PCA = - counts_SE.norm %>% - reduce_dimensions(method="PCA", .dims = 6) +```{r pca, message=FALSE, warning=FALSE, results='hide'} +se_mini.norm.PCA = + se_mini.norm |> + reduce_dimensions(method="PCA", .dims = 3) ```
Standard procedure (comparative purpose) ```{r,eval=FALSE} count_m_log = log(count_m + 1) -pc = count_m_log %>% prcomp(scale = TRUE) +pc = count_m_log |> prcomp(scale = TRUE) variance = pc$sdev^2 variance = (variance / sum(variance))[1:6] pc$cell_type = counts[ @@ -329,22 +328,22 @@ pc$cell_type = counts[ On the x and y axes axis we have the reduced dimensions 1 to 3, data is coloured by cell type. -```{r plot_pca, cache=TRUE} +```{r plot_pca, eval=FALSE} -counts_SE.norm.PCA %>% pivot_sample() %>% select(contains("PC"), everything()) +se_mini.norm.PCA |> pivot_sample() |> select(contains("PC"), everything()) -counts_SE.norm.PCA %>% - pivot_sample() %>% +se_mini.norm.PCA |> + pivot_sample() |> GGally::ggpairs(columns = 11:13, ggplot2::aes(colour=`Cell.type`)) ``` **tSNE**
TidyTranscriptomics -```{r tsne, cache=TRUE, message=FALSE, warning=FALSE, results='hide'} -counts_SE.norm.tSNE = - breast_tcga_mini_SE %>% - identify_abundant() %>% +```{r tsne, message=FALSE, warning=FALSE, results='hide'} +se_mini.norm.tSNE = + breast_tcga_mini_SE |> + identify_abundant() |> reduce_dimensions( method = "tSNE", perplexity=10, @@ -375,12 +374,12 @@ tsne$cell_type = tibble_counts[ Plot ```{r} -counts_SE.norm.tSNE %>% - pivot_sample() %>% +se_mini.norm.tSNE |> + pivot_sample() |> select(contains("tSNE"), everything()) -counts_SE.norm.tSNE %>% - pivot_sample() %>% +se_mini.norm.tSNE |> + pivot_sample() |> ggplot(aes(x = `tSNE1`, y = `tSNE2`, color=Call)) + geom_point() + my_theme ``` @@ -389,9 +388,9 @@ counts_SE.norm.tSNE %>% We may want to rotate the reduced dimensions (or any two numeric columns really) of our data, of a set angle. `rotate_dimensions` takes a tibble, column names (as symbols; for `sample`, `transcript` and `count`) and an angle as arguments and returns a tibble with additional columns for the rotated dimensions. The rotated dimensions will be added to the original data set as ` rotated ` by default, or as specified in the input arguments.
TidyTranscriptomics -```{r rotate, cache=TRUE} -counts_SE.norm.MDS.rotated = - counts_SE.norm.MDS %>% +```{r rotate} +se_mini.norm.MDS.rotated = + se_mini.norm.MDS |> rotate_dimensions(`Dim1`, `Dim2`, rotation_degrees = 45, action="get") ```
@@ -403,9 +402,9 @@ rotation = function(m, d) { ((bind_rows( c(`1` = cos(r), `2` = -sin(r)), c(`1` = sin(r), `2` = cos(r)) - ) %>% as_matrix) %*% m) + ) |> as_matrix()) %*% m) } -mds_r = pca %>% rotation(rotation_degrees) +mds_r = pca |> rotation(rotation_degrees) mds_r$cell_type = counts[ match(counts$sample, rownames(mds_r)), "Cell.type" @@ -417,8 +416,8 @@ mds_r$cell_type = counts[ **Original** On the x and y axes axis we have the first two reduced dimensions, data is coloured by cell type. -```{r plot_rotate_1, cache=TRUE} -counts_SE.norm.MDS.rotated %>% +```{r plot_rotate_1} +se_mini.norm.MDS.rotated |> ggplot(aes(x=`Dim1`, y=`Dim2`, color=`Cell.type` )) + geom_point() + my_theme @@ -427,9 +426,9 @@ counts_SE.norm.MDS.rotated %>% **Rotated** On the x and y axes axis we have the first two reduced dimensions rotated of 45 degrees, data is coloured by cell type. -```{r plot_rotate_2, cache=TRUE} -counts_SE.norm.MDS.rotated %>% - pivot_sample() %>% +```{r plot_rotate_2} +se_mini.norm.MDS.rotated |> + pivot_sample() |> ggplot(aes(x=`Dim1_rotated_45`, y=`Dim2_rotated_45`, color=`Cell.type` )) + geom_point() + my_theme @@ -440,11 +439,11 @@ counts_SE.norm.MDS.rotated %>% We may want to test for differential transcription between sample-wise factors of interest (e.g., with edgeR). `test_differential_abundance` takes a tibble, column names (as symbols; for `sample`, `transcript` and `count`) and a formula representing the desired linear model as arguments and returns a tibble with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate).
TidyTranscriptomics -```{r de, cache=TRUE, message=FALSE, warning=FALSE, results='hide'} -counts_SE.de = - counts_SE %>% +```{r de, message=FALSE, warning=FALSE, results='hide'} +se_mini.de = + se_mini |> test_differential_abundance( ~ condition, action="get") -counts_SE.de +se_mini.de ```
@@ -466,10 +465,10 @@ topTags(qlf, n=Inf)
The functon `test_differential_abundance` operated with contrasts too. The constrasts hve the name of the design matrix (generally ) -```{r de contrast, cache=TRUE, message=FALSE, warning=FALSE, results='hide', eval=FALSE} -counts_SE.de = - counts_SE %>% - identify_abundant(factor_of_interest = condition) %>% +```{r de contrast, message=FALSE, warning=FALSE, results='hide', eval=FALSE} +se_mini.de = + se_mini |> + identify_abundant(factor_of_interest = condition) |> test_differential_abundance( ~ 0 + condition, .contrasts = c( "conditionTRUE - conditionFALSE"), @@ -479,13 +478,14 @@ counts_SE.de = ## Adjust `counts` -We may want to adjust `counts` for (known) unwanted variation. `adjust_abundance` takes as arguments a tibble, column names (as symbols; for `sample`, `transcript` and `count`) and a formula representing the desired linear model where the first covariate is the factor of interest and the second covariate is the unwanted variation, and returns a tibble with additional columns for the adjusted counts as `_adjusted`. At the moment just an unwanted covariated is allowed at a time. +We may want to adjust `counts` for (known) unwanted variation. `adjust_abundance` takes as arguments a tibble, column names (as symbols; for `sample`, `transcript` and `count`) and a formula representing the desired linear model where the first covariate is the factor of interest and the second covariate is the unwanted variation, and returns a tibble with additional columns for the adjusted counts as `_adjusted`. At the moment just an unwanted covariates is allowed at a time.
TidyTranscriptomics -```{r adjust, cache=TRUE, message=FALSE, warning=FALSE, results='hide'} -counts_SE.norm.adj = - counts_SE.norm %>% adjust_abundance( .factor_unwanted = batch, .factor_of_interest = factor_of_interest) +```{r adjust, message=FALSE, warning=FALSE, results='hide'} +se_mini.norm.adj = + se_mini.norm |> adjust_abundance( .factor_unwanted = time, .factor_of_interest = condition, method="combat") + ```
@@ -526,9 +526,9 @@ We may want to infer the cell type composition of our samples (with the algorith
TidyTranscriptomics -```{r cibersort, cache=TRUE} -counts_SE.cibersort = - counts_SE %>% +```{r cibersort} +se_mini.cibersort = + se_mini |> deconvolve_cellularity(action="get", cores=1, prefix = "cibersort__") ``` @@ -538,7 +538,7 @@ Standard procedure (comparative purpose) ```{r, eval=FALSE} source(‘CIBERSORT.R’) -count_m %>% write.table("mixture_file.txt") +count_m |> write.table("mixture_file.txt") results <- CIBERSORT( "sig_matrix_file.txt", "mixture_file.txt", @@ -555,15 +555,15 @@ results$cell_type = tibble_counts[ With the new annotated data frame, we can plot the distributions of cell types across samples, and compare them with the nominal cell type labels to check for the purity of isolation. On the x axis we have the cell types inferred by Cibersort, on the y axis we have the inferred proportions. The data is facetted and coloured by nominal cell types (annotation given by the researcher after FACS sorting). -```{r plot_cibersort, cache=TRUE} -counts_SE.cibersort %>% +```{r plot_cibersort, eval=FALSE} +se_mini.cibersort |> pivot_longer( names_to= "Cell_type_inferred", values_to = "proportion", names_prefix ="cibersort__", cols=contains("cibersort__") - ) %>% - ggplot(aes(x=`Cell_type_inferred`, y=proportion, fill=`Cell.type`)) + + ) |> + ggplot(aes(x=Cell_type_inferred, y=proportion, fill=`Cell.type`)) + geom_boxplot() + facet_wrap(~`Cell.type`) + my_theme + @@ -574,56 +574,22 @@ counts_SE.cibersort %>% We can also perform a statistical test on the differential cell-type abundance across conditions -```{r DC, cache=TRUE} +```{r DC, eval=FALSE} - counts_SE %>% + se_mini |> test_differential_cellularity(. ~ condition ) ``` We can also perform regression analysis with censored data (coxph). -```{r DC_censored} - # Add survival data - -counts_SE_survival = - counts_SE %>% - nest(data = -sample) %>% - mutate( - days = sample(1:1000, size = n()), - dead = sample(c(0,1), size = n(), replace = TRUE) - ) %>% - unnest(data) +```{r DC_censored, eval=FALSE} -# Test -counts_SE_survival %>% - test_differential_cellularity(survival::Surv(days, dead) ~ .) + se_mini |> + test_differential_cellularity(survival::Surv(time, dead) ~ .) ``` -We can also perform test of Kaplan-Meier curves. - -```{r DC_censored_stratification} - -counts_stratified = - counts_SE_survival %>% - - # Test - test_stratification_cellularity( - survival::Surv(days, dead) ~ ., - sample, transcript, count - ) - -counts_stratified - -``` - -Plot Kaplan-Meier curves - -```{r} -counts_stratified$plot[[1]] -``` - ## Cluster `samples` We may want to cluster our data (e.g., using k-means sample-wise). `cluster_elements` takes as arguments a tibble, column names (as symbols; for `sample`, `transcript` and `count`) and returns a tibble with additional columns for the cluster annotation. At the moment only k-means clustering is supported, the plan is to introduce more clustering methods. @@ -632,8 +598,8 @@ We may want to cluster our data (e.g., using k-means sample-wise). `cluster_elem
TidyTranscriptomics -```{r cluster, cache=TRUE} -counts_SE.norm.cluster = counts_SE.norm.MDS %>% +```{r cluster} +se_mini.norm.cluster = se_mini.norm.MDS |> cluster_elements(method="kmeans", centers = 2, action="get" ) ```
@@ -656,8 +622,8 @@ cluster$cell_type = tibble_counts[ We can add cluster annotation to the MDS dimension reduced data set and plot. -```{r plot_cluster, cache=TRUE} - counts_SE.norm.cluster %>% +```{r plot_cluster} + se_mini.norm.cluster |> ggplot(aes(x=`Dim1`, y=`Dim2`, color=`cluster_kmeans`)) + geom_point() + my_theme @@ -667,12 +633,11 @@ We can add cluster annotation to the MDS dimension reduced data set and plot. Matrix package (v1.3-3) causes an error with Seurat::FindNeighbors used in this method. We are trying to solve this issue. At the moment this option in unaviable. -
TidyTranscriptomics ```{r SNN, eval=FALSE, cache=TRUE, message=FALSE, warning=FALSE, results='hide'} -counts_SE.norm.SNN = - counts_SE.norm.tSNE %>% +se_mini.norm.SNN = + se_mini.norm.tSNE |> cluster_elements(method = "SNN") ```
@@ -702,21 +667,21 @@ snn$cell_type = tibble_counts[
-```{r SNN_plot, eval=FALSE, cache=TRUE} -counts_SE.norm.SNN %>% - pivot_sample() %>% +```{r SNN_plot, eval=FALSE} +se_mini.norm.SNN |> + pivot_sample() |> select(contains("tSNE"), everything()) -counts_SE.norm.SNN %>% - pivot_sample() %>% - gather(source, Call, c("cluster_SNN", "Call")) %>% - distinct() %>% +se_mini.norm.SNN |> + pivot_sample() |> + gather(source, Call, c("cluster_SNN", "Call")) |> + distinct() |> ggplot(aes(x = `tSNE1`, y = `tSNE2`, color=Call)) + geom_point() + facet_grid(~source) + my_theme # Do differential transcription between clusters -counts_SE.norm.SNN %>% - mutate(factor_of_interest = `cluster_SNN` == 3) %>% +se_mini.norm.SNN |> + mutate(factor_of_interest = `cluster_SNN` == 3) |> test_differential_abundance( ~ factor_of_interest, action="get" @@ -734,9 +699,9 @@ We may want to remove redundant elements from the original data set (e.g., sampl
TidyTranscriptomics -```{r drop, cache=TRUE} -counts_SE.norm.non_redundant = - counts_SE.norm.MDS %>% +```{r drop} +se_mini.norm.non_redundant = + se_mini.norm.MDS |> remove_redundancy( method = "correlation" ) ```
@@ -754,14 +719,14 @@ library(widyr) sort = TRUE, diag = FALSE, upper = FALSE - ) %>% - filter(correlation > correlation_threshold) %>% - distinct(item1) %>% + ) |> + filter(correlation > correlation_threshold) |> + distinct(item1) |> rename(!!.element := item1) # Return non redudant data frame -counts %>% anti_join(.data.correlated) %>% - spread(sample, rc, - transcript) %>% +counts |> anti_join(.data.correlated) |> + spread(sample, rc, - transcript) |> left_join(annotation) @@ -772,9 +737,9 @@ counts %>% anti_join(.data.correlated) %>% We can visualise how the reduced redundancy with the reduced dimentions look like -```{r plot_drop, cache=TRUE} -counts_SE.norm.non_redundant %>% - pivot_sample() %>% +```{r plot_drop} +se_mini.norm.non_redundant |> + pivot_sample() |> ggplot(aes(x=`Dim1`, y=`Dim2`, color=`Cell.type`)) + geom_point() + my_theme @@ -783,9 +748,9 @@ counts_SE.norm.non_redundant %>% **Approach 2** -```{r drop2, cache=TRUE} -counts_SE.norm.non_redundant = - counts_SE.norm.MDS %>% +```{r drop2} +se_mini.norm.non_redundant = + se_mini.norm.MDS |> remove_redundancy( method = "reduced_dimensions", Dim_a_column = `Dim1`, @@ -795,9 +760,9 @@ counts_SE.norm.non_redundant = We can visualise MDS reduced dimensions of the samples with the closest pair removed. -```{r plot_drop2, cache=TRUE} -counts_SE.norm.non_redundant %>% - pivot_sample() %>% +```{r plot_drop2} +se_mini.norm.non_redundant |> + pivot_sample() |> ggplot(aes(x=`Dim1`, y=`Dim2`, color=`Cell.type`)) + geom_point() + my_theme @@ -827,8 +792,8 @@ counts = tidybulk_SAM_BAM( We can add gene symbols from ensembl identifiers. This is useful since different resources use ensembl IDs while others use gene symbol IDs. This currently works for human and mouse. -```{r ensembl, cache=TRUE} -counts_ensembl %>% ensembl_to_symbol(ens) +```{r ensembl} +counts_ensembl |> ensembl_to_symbol(ens) ``` ## From gene symbol to gene description (gene name in full) @@ -836,8 +801,7 @@ counts_ensembl %>% ensembl_to_symbol(ens) We can add gene full name (and in future description) from symbol identifiers. This currently works for human and mouse. ```{r description} -counts_SE %>% - describe_transcript() %>% +se_mini |> + describe_transcript() |> select(feature, description, everything()) -``` - +``` \ No newline at end of file diff --git a/README.md b/README.md index 278fa030..8e2a3d01 100755 --- a/README.md +++ b/README.md @@ -17,62 +17,59 @@ License. website: [stemangiola.github.io/tidybulk/](http://stemangiola.github.io/tidybulk/) - +[Third party +tutorials](https://rstudio-pubs-static.s3.amazonaws.com/792462_f948e766b15d4ee5be5c860493bda0b3.html) Please have a look also to -- [tidySummarizedExperiment](https://github.com/stemangiola/tidySummarizedExperiment) - for bulk data tidy representation -- [tidySingleCellExperiment](https://github.com/stemangiola/tidySingleCellExperiment) - for single-cell data tidy representation -- [tidyseurat](https://github.com/stemangiola/tidyseurat) for - single-cell data tidy representation -- [tidyHeatmap](https://github.com/stemangiola/tidyHeatmap) for - heatmaps produced with tidy principles analysis and manipulation -- [nanny](https://github.com/stemangiola/nanny) for tidy high-level - data analysis and manipulation -- [tidygate](https://github.com/stemangiola/tidygate) for adding - custom gate information to your tibble +- [tidySummarizedExperiment](https://github.com/stemangiola/tidySummarizedExperiment) + for bulk data tidy representation +- [tidySingleCellExperiment](https://github.com/stemangiola/tidySingleCellExperiment) + for single-cell data tidy representation +- [tidyseurat](https://github.com/stemangiola/tidyseurat) for + single-cell data tidy representation +- [tidyHeatmap](https://github.com/stemangiola/tidyHeatmap) for heatmaps + produced with tidy principles analysis and manipulation +- [tidygate](https://github.com/stemangiola/tidygate) for adding custom + gate information to your tibble + [![Build Status](https://travis-ci.org/stemangiola/tidybulk.svg?branch=master)](https://travis-ci.org/stemangiola/tidybulk) [![Coverage Status](https://coveralls.io/repos/github/stemangiola/tidybulk/badge.svg?branch=master)](https://coveralls.io/github/stemangiola/tidybulk?branch=master) + --> ## Functions/utilities available -| Function | Description | -|-------------------------------------|------------------------------------------------------------------------------------| -| `aggregate_duplicates` | Aggregate abundance and annotation of duplicated transcripts in a robust way | -| `identify_abundant` `keep_abundant` | identify or keep the abundant genes | -| `keep_variable` | Filter for top variable features | -| `scale_abundance` | Scale (normalise) abundance for RNA sequencing depth | -| `reduce_dimensions` | Perform dimensionality reduction (PCA, MDS, tSNE, UMAP) | -| `cluster_elements` | Labels elements with cluster identity (kmeans, SNN) | -| `remove_redundancy` | Filter out elements with highly correlated features | -| `adjust_abundance` | Remove known unwanted variation (Combat) | -| `test_differential_abundance` | Differential transcript abundance testing (DESeq2, edgeR, voom) | -| `deconvolve_cellularity` | Estimated tissue composition (Cibersort, llsr, epic, xCell, mcp_counter, quantiseq | -| `test_differential_cellularity` | Differential cell-type abundance testing | -| `test_stratification_cellularity` | Estimate Kaplan-Meier survival differences | -| `test_gene_enrichment` | Gene enrichment analyses (EGSEA) | -| `test_gene_overrepresentation` | Gene enrichment on list of transcript names (no rank) | -| `test_gene_rank` | Gene enrichment on list of transcript (GSEA) | -| `impute_missing_abundance` | Impute abundance for missing data points using sample groupings | - -| Utilities | Description | -|-----------------------|--------------------------------------------| -| `get_bibliography` | Get the bibliography of your workflow | -| `tidybulk` | add tidybulk attributes to a tibble object | -| `tidybulk_SAM_BAM` | Convert SAM BAM files into tidybulk tibble | -| `pivot_sample` | Select sample-wise columns/information | -| `pivot_transcript` | Select transcript-wise columns/information | -| `rotate_dimensions` | Rotate two dimensions of a degree | -| `ensembl_to_symbol` | Add gene symbol from ensembl IDs | -| `symbol_to_entrez` | Add entrez ID from gene symbol | -| `describe_transcript` | Add gene description from gene symbol | +| Function | Description | +|---------------------------------|------------------------------------------------------------------------------| +| `identify_abundant` | identify the abundant genes | +| `aggregate_duplicates` | Aggregate abundance and annotation of duplicated transcripts in a robust way | +| `scale_abundance` | Scale (normalise) abundance for RNA sequencing depth | +| `reduce_dimensions` | Perform dimensionality reduction (PCA, MDS, tSNE) | +| `cluster_elements` | Labels elements with cluster identity (kmeans, SNN) | +| `remove_redundancy` | Filter out elements with highly correlated features | +| `adjust_abundance` | Remove known unwanted variation (Combat) | +| `test_differential_abundance` | Differential transcript abundance testing (DE) | +| `deconvolve_cellularity` | Estimated tissue composition (Cibersort or llsr) | +| `test_differential_cellularity` | Differential cell-type abundance testing | +| `keep_variable` | Filter for top variable features | +| `keep_abundant` | Filter out lowly abundant transcripts | +| `test_gene_enrichment` | Gene enrichment analyses (EGSEA) | +| `test_gene_overrepresentation` | Gene enrichment on list of transcript names (no rank) | + +| Utilities | Description | +|----------------------------|-----------------------------------------------------------------| +| `get_bibliography` | Get the bibliography of your workflow | +| `tidybulk` | add tidybulk attributes to a tibble object | +| `tidybulk_SAM_BAM` | Convert SAM BAM files into tidybulk tibble | +| `pivot_sample` | Select sample-wise columns/information | +| `pivot_transcript` | Select transcript-wise columns/information | +| `rotate_dimensions` | Rotate two dimensions of a degree | +| `ensembl_to_symbol` | Add gene symbol from ensembl IDs | +| `symbol_to_entrez` | Add entrez ID from gene symbol | +| `describe_transcript` | Add gene description from gene symbol | +| `impute_missing_abundance` | Impute abundance for missing data points using sample groupings | +| `fill_missing_abundance` | Fill abundance for missing data points using an arbitrary value | All functions are directly compatibble with `SummarizedExperiment` object. @@ -96,25 +93,24 @@ devtools::install_github("stemangiola/tidybulk") We will use a `SummarizedExperiment` object ``` r -counts_SE +se_mini ``` - ## # A SummarizedExperiment-tibble abstraction: 408,624 × 48 - ## # Features=8513 | Samples=48 | Assays=count - ## .feature .sample count Cell.type time condition batch factor_of_interest - ## - ## 1 A1BG SRR1740034 153 b_cell 0 d TRUE 0 TRUE - ## 2 A1BG-AS1 SRR1740034 83 b_cell 0 d TRUE 0 TRUE - ## 3 AAAS SRR1740034 868 b_cell 0 d TRUE 0 TRUE - ## 4 AACS SRR1740034 222 b_cell 0 d TRUE 0 TRUE - ## 5 AAGAB SRR1740034 590 b_cell 0 d TRUE 0 TRUE - ## 6 AAMDC SRR1740034 48 b_cell 0 d TRUE 0 TRUE - ## 7 AAMP SRR1740034 1257 b_cell 0 d TRUE 0 TRUE - ## 8 AANAT SRR1740034 284 b_cell 0 d TRUE 0 TRUE - ## 9 AAR2 SRR1740034 379 b_cell 0 d TRUE 0 TRUE - ## 10 AARS2 SRR1740034 685 b_cell 0 d TRUE 0 TRUE - ## # … with 40 more rows - ## # ℹ Use `print(n = ...)` to see more rows + ## # A SummarizedExperiment-tibble abstraction: 2,635 × 9 + ## # Features=527 | Samples=5 | Assays=count + ## .feature .sample count Cell.type time condition days dead entrez + ## + ## 1 ABCB4 SRR1740034 1035 b_cell 0 d TRUE 1 1 5244 + ## 2 ABCB9 SRR1740034 45 b_cell 0 d TRUE 1 1 23457 + ## 3 ACAP1 SRR1740034 7151 b_cell 0 d TRUE 1 1 9744 + ## 4 ACHE SRR1740034 2 b_cell 0 d TRUE 1 1 43 + ## 5 ACP5 SRR1740034 2278 b_cell 0 d TRUE 1 1 54 + ## 6 ADAM28 SRR1740034 11156 b_cell 0 d TRUE 1 1 10863 + ## 7 ADAMDEC1 SRR1740034 72 b_cell 0 d TRUE 1 1 27299 + ## 8 ADAMTS3 SRR1740034 0 b_cell 0 d TRUE 1 1 9508 + ## 9 ADRB2 SRR1740034 298 b_cell 0 d TRUE 1 1 154 + ## 10 AIF1 SRR1740034 8 b_cell 0 d TRUE 1 1 199 + ## # ℹ 40 more rows Loading `tidySummarizedExperiment` will automatically abstract this object as `tibble`, so we can display it and manipulate it with tidy @@ -122,7 +118,7 @@ tools. Although it looks different, and more tools (tidyverse) are available to us, this object is in fact a `SummarizedExperiment` object. ``` r -class(counts_SE) +class(se_mini) ``` ## [1] "SummarizedExperiment" @@ -135,7 +131,7 @@ First of all, you can cite all articles utilised within your workflow automatically from any tidybulk tibble ``` r -counts_SE %>% get_bibliography() +se_mini |> get_bibliography() ``` ## Aggregate duplicated `transcripts` @@ -154,8 +150,8 @@ factors and boolean are appended as characters. TidyTranscriptomics ``` r -rowData(counts_SE)$gene_name = rownames(counts_SE) -counts_SE.aggr = counts_SE %>% aggregate_duplicates(.transcript = gene_name) +rowData(se_mini)$gene_name = rownames(se_mini) +se_mini.aggr = se_mini |> aggregate_duplicates(.transcript = gene_name) ```
@@ -198,9 +194,11 @@ scaled data as `_scaled`. TidyTranscriptomics ``` r -counts_SE.norm = counts_SE.aggr %>% identify_abundant(factor_of_interest = condition) %>% scale_abundance() +se_mini.norm = se_mini.aggr |> identify_abundant(factor_of_interest = condition) |> scale_abundance() ``` + ## tidybulk says: the sample with largest library size SRR1740035 was chosen as reference for scaling +
@@ -229,8 +227,8 @@ the x axis we have the log scaled counts, on the y axes we have the density, data is grouped by sample and coloured by cell type. ``` r -counts_SE.norm %>% - ggplot(aes(count_scaled + 1, group=sample, color=`Cell.type`)) + +se_mini.norm |> + ggplot(aes(count_scaled + 1, group=.sample, color=`Cell.type`)) + geom_density() + scale_x_log10() + my_theme @@ -247,9 +245,11 @@ We may want to identify and filter variable transcripts. TidyTranscriptomics ``` r -counts_SE.norm.variable = counts_SE.norm %>% keep_variable() +se_mini.norm.variable = se_mini.norm |> keep_variable() ``` + ## Getting the 393 most variable genes +
@@ -297,11 +297,15 @@ the reduced dimensions. TidyTranscriptomics ``` r -counts_SE.norm.MDS = - counts_SE.norm %>% - reduce_dimensions(method="MDS", .dims = 6) +se_mini.norm.MDS = + se_mini.norm |> + reduce_dimensions(method="MDS", .dims = 3) ``` + ## Getting the 393 most variable genes + + ## tidybulk says: to access the raw results do `attr(..., "internals")$MDS` +
@@ -315,7 +319,7 @@ count_m_log = log(count_m + 1) cmds = limma::plotMDS(ndim = .dims, plot = FALSE) cmds = cmds %$% - cmdscale.out %>% + cmdscale.out |> setNames(sprintf("Dim%s", 1:6)) cmds$cell_type = tibble_counts[ @@ -334,35 +338,13 @@ On the x and y axes axis we have the reduced dimensions 1 to 3, data is coloured by cell type. ``` r -counts_SE.norm.MDS %>% pivot_sample() %>% select(contains("Dim"), everything()) -``` - - ## # A tibble: 48 × 14 - ## Dim1 Dim2 Dim3 Dim4 Dim5 Dim6 .sample Cell.…¹ time condi…² - ## - ## 1 -1.46 0.220 -1.68 0.0553 0.0658 -0.126 SRR17400… b_cell 0 d TRUE - ## 2 -1.46 0.226 -1.71 0.0300 0.0454 -0.137 SRR17400… b_cell 1 d TRUE - ## 3 -1.44 0.193 -1.60 0.0890 0.0503 -0.121 SRR17400… b_cell 3 d TRUE - ## 4 -1.44 0.198 -1.67 0.0891 0.0543 -0.110 SRR17400… b_cell 7 d TRUE - ## 5 0.243 -1.42 0.182 0.00642 -0.503 -0.131 SRR17400… dendri… 0 d FALSE - ## 6 0.191 -1.42 0.195 0.0180 -0.457 -0.130 SRR17400… dendri… 1 d FALSE - ## 7 0.257 -1.42 0.152 0.0130 -0.582 -0.0927 SRR17400… dendri… 3 d FALSE - ## 8 0.162 -1.43 0.189 0.0232 -0.452 -0.109 SRR17400… dendri… 7 d FALSE - ## 9 0.516 -1.47 0.240 -0.251 0.457 -0.119 SRR17400… monocy… 0 d FALSE - ## 10 0.514 -1.41 0.231 -0.219 0.458 -0.131 SRR17400… monocy… 1 d FALSE - ## # … with 38 more rows, 4 more variables: batch , factor_of_interest , - ## # TMM , multiplier , and abbreviated variable names ¹​Cell.type, - ## # ²​condition - ## # ℹ Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names +se_mini.norm.MDS |> pivot_sample() |> select(contains("Dim"), everything()) -``` r -counts_SE.norm.MDS %>% - pivot_sample() %>% - GGally::ggpairs(columns = 6:(6+5), ggplot2::aes(colour=`Cell.type`)) +se_mini.norm.MDS |> + pivot_sample() |> + GGally::ggpairs(columns = 9:11, ggplot2::aes(colour=`Cell.type`)) ``` -![](man/figures/plot_mds-1.png) - **PCA**
@@ -370,9 +352,9 @@ counts_SE.norm.MDS %>% TidyTranscriptomics ``` r -counts_SE.norm.PCA = - counts_SE.norm %>% - reduce_dimensions(method="PCA", .dims = 6) +se_mini.norm.PCA = + se_mini.norm |> + reduce_dimensions(method="PCA", .dims = 3) ```
@@ -383,7 +365,7 @@ Standard procedure (comparative purpose) ``` r count_m_log = log(count_m + 1) -pc = count_m_log %>% prcomp(scale = TRUE) +pc = count_m_log |> prcomp(scale = TRUE) variance = pc$sdev^2 variance = (variance / sum(variance))[1:6] pc$cell_type = counts[ @@ -402,34 +384,13 @@ On the x and y axes axis we have the reduced dimensions 1 to 3, data is coloured by cell type. ``` r -counts_SE.norm.PCA %>% pivot_sample() %>% select(contains("PC"), everything()) -``` - - ## # A tibble: 48 × 14 - ## PC1 PC2 PC3 PC4 PC5 PC6 .sample Cell.…¹ time condi…² batch - ## - ## 1 -12.6 -2.52 -14.9 -0.424 -0.592 -1.22 SRR174… b_cell 0 d TRUE 0 - ## 2 -12.6 -2.57 -15.2 -0.140 -0.388 -1.30 SRR174… b_cell 1 d TRUE 1 - ## 3 -12.6 -2.41 -14.5 -0.714 -0.344 -1.10 SRR174… b_cell 3 d TRUE 1 - ## 4 -12.5 -2.34 -14.9 -0.816 -0.427 -1.00 SRR174… b_cell 7 d TRUE 1 - ## 5 0.189 13.0 1.66 -0.0269 4.64 -1.35 SRR174… dendri… 0 d FALSE 0 - ## 6 -0.293 12.9 1.76 -0.0727 4.21 -1.28 SRR174… dendri… 1 d FALSE 0 - ## 7 0.407 13.0 1.42 -0.0529 5.37 -1.01 SRR174… dendri… 3 d FALSE 1 - ## 8 -0.620 13.0 1.73 -0.201 4.17 -1.07 SRR174… dendri… 7 d FALSE 0 - ## 9 2.56 13.5 2.32 2.03 -4.32 -1.22 SRR174… monocy… 0 d FALSE 1 - ## 10 2.65 13.1 2.21 1.80 -4.29 -1.30 SRR174… monocy… 1 d FALSE 1 - ## # … with 38 more rows, 3 more variables: factor_of_interest , TMM , - ## # multiplier , and abbreviated variable names ¹​Cell.type, ²​condition - ## # ℹ Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names +se_mini.norm.PCA |> pivot_sample() |> select(contains("PC"), everything()) -``` r -counts_SE.norm.PCA %>% - pivot_sample() %>% +se_mini.norm.PCA |> + pivot_sample() |> GGally::ggpairs(columns = 11:13, ggplot2::aes(colour=`Cell.type`)) ``` -![](man/figures/plot_pca-1.png) - **tSNE**
@@ -437,9 +398,9 @@ counts_SE.norm.PCA %>% TidyTranscriptomics ``` r -counts_SE.norm.tSNE = - breast_tcga_mini_SE %>% - identify_abundant() %>% +se_mini.norm.tSNE = + breast_tcga_mini_SE |> + identify_abundant() |> reduce_dimensions( method = "tSNE", perplexity=10, @@ -476,30 +437,29 @@ tsne$cell_type = tibble_counts[ Plot ``` r -counts_SE.norm.tSNE %>% - pivot_sample() %>% +se_mini.norm.tSNE |> + pivot_sample() |> select(contains("tSNE"), everything()) ``` ## # A tibble: 251 × 4 ## tSNE1 tSNE2 .sample Call ## - ## 1 -5.25 10.2 TCGA-A1-A0SD-01A-11R-A115-07 LumA - ## 2 6.41 2.79 TCGA-A1-A0SF-01A-11R-A144-07 LumA - ## 3 -9.28 6.63 TCGA-A1-A0SG-01A-11R-A144-07 LumA - ## 4 -1.76 4.82 TCGA-A1-A0SH-01A-11R-A084-07 LumA - ## 5 -1.41 12.2 TCGA-A1-A0SI-01A-11R-A144-07 LumB - ## 6 -1.89 -3.60 TCGA-A1-A0SJ-01A-11R-A084-07 LumA - ## 7 18.5 -13.4 TCGA-A1-A0SK-01A-12R-A084-07 Basal - ## 8 -4.03 -10.4 TCGA-A1-A0SM-01A-11R-A084-07 LumA - ## 9 -2.84 -10.8 TCGA-A1-A0SN-01A-11R-A144-07 LumB - ## 10 -19.3 5.03 TCGA-A1-A0SQ-01A-21R-A144-07 LumA - ## # … with 241 more rows - ## # ℹ Use `print(n = ...)` to see more rows + ## 1 4.09 11.4 TCGA-A1-A0SD-01A-11R-A115-07 LumA + ## 2 1.86 -7.80 TCGA-A1-A0SF-01A-11R-A144-07 LumA + ## 3 -1.95 13.6 TCGA-A1-A0SG-01A-11R-A144-07 LumA + ## 4 10.8 4.07 TCGA-A1-A0SH-01A-11R-A084-07 LumA + ## 5 13.8 2.69 TCGA-A1-A0SI-01A-11R-A144-07 LumB + ## 6 0.239 11.9 TCGA-A1-A0SJ-01A-11R-A084-07 LumA + ## 7 -2.12 -35.1 TCGA-A1-A0SK-01A-12R-A084-07 Basal + ## 8 16.7 8.65 TCGA-A1-A0SM-01A-11R-A084-07 LumA + ## 9 15.3 8.97 TCGA-A1-A0SN-01A-11R-A144-07 LumB + ## 10 -3.35 22.6 TCGA-A1-A0SQ-01A-21R-A144-07 LumA + ## # ℹ 241 more rows ``` r -counts_SE.norm.tSNE %>% - pivot_sample() %>% +se_mini.norm.tSNE |> + pivot_sample() |> ggplot(aes(x = `tSNE1`, y = `tSNE2`, color=Call)) + geom_point() + my_theme ``` @@ -520,8 +480,8 @@ specified in the input arguments. TidyTranscriptomics ``` r -counts_SE.norm.MDS.rotated = - counts_SE.norm.MDS %>% +se_mini.norm.MDS.rotated = + se_mini.norm.MDS |> rotate_dimensions(`Dim1`, `Dim2`, rotation_degrees = 45, action="get") ``` @@ -537,9 +497,9 @@ rotation = function(m, d) { ((bind_rows( c(`1` = cos(r), `2` = -sin(r)), c(`1` = sin(r), `2` = cos(r)) - ) %>% as_matrix) %*% m) + ) |> as_matrix()) %*% m) } -mds_r = pca %>% rotation(rotation_degrees) +mds_r = pca |> rotation(rotation_degrees) mds_r$cell_type = counts[ match(counts$sample, rownames(mds_r)), "Cell.type" @@ -556,7 +516,7 @@ mds_r$cell_type = counts[ dimensions, data is coloured by cell type. ``` r -counts_SE.norm.MDS.rotated %>% +se_mini.norm.MDS.rotated |> ggplot(aes(x=`Dim1`, y=`Dim2`, color=`Cell.type` )) + geom_point() + my_theme @@ -568,8 +528,8 @@ counts_SE.norm.MDS.rotated %>% dimensions rotated of 45 degrees, data is coloured by cell type. ``` r -counts_SE.norm.MDS.rotated %>% - pivot_sample() %>% +se_mini.norm.MDS.rotated |> + pivot_sample() |> ggplot(aes(x=`Dim1_rotated_45`, y=`Dim2_rotated_45`, color=`Cell.type` )) + geom_point() + my_theme @@ -592,10 +552,10 @@ false discovery rate). TidyTranscriptomics ``` r -counts_SE.de = - counts_SE %>% +se_mini.de = + se_mini |> test_differential_abundance( ~ condition, action="get") -counts_SE.de +se_mini.de ```
@@ -629,9 +589,9 @@ The constrasts hve the name of the design matrix (generally ) ``` r -counts_SE.de = - counts_SE %>% - identify_abundant(factor_of_interest = condition) %>% +se_mini.de = + se_mini |> + identify_abundant(factor_of_interest = condition) |> test_differential_abundance( ~ 0 + condition, .contrasts = c( "conditionTRUE - conditionFALSE"), @@ -647,7 +607,7 @@ symbols; for `sample`, `transcript` and `count`) and a formula representing the desired linear model where the first covariate is the factor of interest and the second covariate is the unwanted variation, and returns a tibble with additional columns for the adjusted counts as -`_adjusted`. At the moment just an unwanted covariated is +`_adjusted`. At the moment just an unwanted covariates is allowed at a time.
@@ -655,8 +615,8 @@ allowed at a time. TidyTranscriptomics ``` r -counts_SE.norm.adj = - counts_SE.norm %>% adjust_abundance( ~ factor_of_interest + batch) +se_mini.norm.adj = + se_mini.norm |> adjust_abundance( .factor_unwanted = time, .factor_of_interest = condition, method="combat") ```
@@ -709,15 +669,11 @@ with additional columns for the adjusted cell type proportions. TidyTranscriptomics ``` r -counts_SE.cibersort = - counts_SE %>% +se_mini.cibersort = + se_mini |> deconvolve_cellularity(action="get", cores=1, prefix = "cibersort__") ``` - ## - ## The downloaded binary packages are in - ## /var/folders/zn/m_qvr9zd7tq0wdtsbq255f8xypj_zg/T//RtmpIi5KN6/downloaded_packages -
@@ -726,7 +682,7 @@ Standard procedure (comparative purpose) ``` r source(‘CIBERSORT.R’) -count_m %>% write.table("mixture_file.txt") +count_m |> write.table("mixture_file.txt") results <- CIBERSORT( "sig_matrix_file.txt", "mixture_file.txt", @@ -752,130 +708,37 @@ proportions. The data is facetted and coloured by nominal cell types (annotation given by the researcher after FACS sorting). ``` r -counts_SE.cibersort %>% +se_mini.cibersort |> pivot_longer( names_to= "Cell_type_inferred", values_to = "proportion", names_prefix ="cibersort__", cols=contains("cibersort__") - ) %>% - ggplot(aes(x=`Cell_type_inferred`, y=proportion, fill=`Cell.type`)) + + ) |> + ggplot(aes(x=Cell_type_inferred, y=proportion, fill=`Cell.type`)) + geom_boxplot() + facet_wrap(~`Cell.type`) + my_theme + theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5), aspect.ratio=1/5) ``` -![](man/figures/plot_cibersort-1.png) - ## Test differential cell-type abundance We can also perform a statistical test on the differential cell-type abundance across conditions ``` r - counts_SE %>% + se_mini |> test_differential_cellularity(. ~ condition ) ``` - ## - ## The downloaded binary packages are in - ## /var/folders/zn/m_qvr9zd7tq0wdtsbq255f8xypj_zg/T//RtmpIi5KN6/downloaded_packages - - ## # A tibble: 22 × 7 - ## .cell_type cell_t…¹ estim…² estim…³ std.e…⁴ stati…⁵ p.valu…⁶ - ## - ## 1 cibersort.B.cells.naive -2.94 2.25 0.367 6.13 8.77e-10 - ## 2 cibersort.B.cells.memory -4.86 1.48 0.436 3.40 6.77e- 4 - ## 3 cibersort.Plasma.cells -5.33 -0.487 0.507 -0.960 3.37e- 1 - ## 4 cibersort.T.cells.CD8 -2.33 0.924 0.475 1.94 5.18e- 2 - ## 5 cibersort.T.cells.CD4.naive -2.83 -0.620 0.531 -1.17 2.43e- 1 - ## 6 cibersort.T.cells.CD4.memo… -2.46 0.190 0.500 0.380 7.04e- 1 - ## 7 cibersort.T.cells.CD4.memo… -3.67 2.23 0.427 5.22 1.80e- 7 - ## 8 cibersort.T.cells.follicul… -5.68 -0.217 0.507 -0.427 6.69e- 1 - ## 9 cibersort.T.cells.regulato… -5.04 1.94 0.360 5.39 6.86e- 8 - ## 10 cibersort.T.cells.gamma.de… -4.78 -0.250 0.514 -0.486 6.27e- 1 - ## # … with 12 more rows, and abbreviated variable names ¹​cell_type_proportions, - ## # ²​`estimate_(Intercept)`, ³​estimate_conditionTRUE, ⁴​std.error_conditionTRUE, - ## # ⁵​statistic_conditionTRUE, ⁶​p.value_conditionTRUE - ## # ℹ Use `print(n = ...)` to see more rows - We can also perform regression analysis with censored data (coxph). ``` r - # Add survival data - -counts_SE_survival = - counts_SE %>% - nest(data = -sample) %>% - mutate( - days = sample(1:1000, size = n()), - dead = sample(c(0,1), size = n(), replace = TRUE) - ) %>% - unnest(data) - -# Test -counts_SE_survival %>% - test_differential_cellularity(survival::Surv(days, dead) ~ .) + se_mini |> + test_differential_cellularity(survival::Surv(time, dead) ~ .) ``` - ## # A tibble: 22 × 6 - ## .cell_type cell_t…¹ estim…² std.e…³ stati…⁴ p.value - ## - ## 1 cibersort.B.cells.naive -0.224 0.415 -0.540 0.589 - ## 2 cibersort.B.cells.memory 0.510 0.346 1.48 0.140 - ## 3 cibersort.Plasma.cells 0.892 0.449 1.99 0.0467 - ## 4 cibersort.T.cells.CD8 0.531 0.639 0.831 0.406 - ## 5 cibersort.T.cells.CD4.naive 0.112 0.386 0.290 0.772 - ## 6 cibersort.T.cells.CD4.memory.resting 0.498 0.540 0.921 0.357 - ## 7 cibersort.T.cells.CD4.memory.activa… 2.37 0.939 2.52 0.0117 - ## 8 cibersort.T.cells.follicular.helper -0.544 0.421 -1.29 0.197 - ## 9 cibersort.T.cells.regulatory..Tregs. 1.59 0.656 2.42 0.0157 - ## 10 cibersort.T.cells.gamma.delta 0.510 0.688 0.741 0.459 - ## # … with 12 more rows, and abbreviated variable names ¹​cell_type_proportions, - ## # ²​estimate, ³​std.error, ⁴​statistic - ## # ℹ Use `print(n = ...)` to see more rows - -We can also perform test of Kaplan-Meier curves. - -``` r -counts_stratified = - counts_SE_survival %>% - - # Test - test_stratification_cellularity( - survival::Surv(days, dead) ~ ., - sample, transcript, count - ) - -counts_stratified -``` - - ## # A tibble: 22 × 6 - ## .cell_type cell_t…¹ .low_…² .high…³ pvalue plot - ## - ## 1 cibersort.B.cells.naive 14.4 7.56 0.506 - ## 2 cibersort.B.cells.memory 17.2 4.77 0.500 - ## 3 cibersort.Plasma.cells 13.3 8.73 0.903 - ## 4 cibersort.T.cells.CD8 13.9 8.06 0.369 - ## 5 cibersort.T.cells.CD4.naive 12.8 9.15 0.407 - ## 6 cibersort.T.cells.CD4.memory.rest… 7.65 14.4 0.105 - ## 7 cibersort.T.cells.CD4.memory.acti… 15.7 6.26 0.392 - ## 8 cibersort.T.cells.follicular.help… 17.1 4.88 0.949 - ## 9 cibersort.T.cells.regulatory..Tre… 13.7 8.35 0.771 - ## 10 cibersort.T.cells.gamma.delta 16.2 5.76 0.379 - ## # … with 12 more rows, and abbreviated variable names ¹​cell_type_proportions, - ## # ²​.low_cellularity_expected, ³​.high_cellularity_expected - ## # ℹ Use `print(n = ...)` to see more rows - -Plot Kaplan-Meier curves - -``` r -counts_stratified$plot[[1]] -``` - -![](man/figures/unnamed-chunk-19-1.png) - ## Cluster `samples` We may want to cluster our data (e.g., using k-means sample-wise). @@ -892,7 +755,7 @@ clustering methods. TidyTranscriptomics ``` r -counts_SE.norm.cluster = counts_SE.norm.MDS %>% +se_mini.norm.cluster = se_mini.norm.MDS |> cluster_elements(method="kmeans", centers = 2, action="get" ) ``` @@ -924,7 +787,7 @@ We can add cluster annotation to the MDS dimension reduced data set and plot. ``` r - counts_SE.norm.cluster %>% + se_mini.norm.cluster |> ggplot(aes(x=`Dim1`, y=`Dim2`, color=`cluster_kmeans`)) + geom_point() + my_theme @@ -943,8 +806,8 @@ option in unaviable. TidyTranscriptomics ``` r -counts_SE.norm.SNN = - counts_SE.norm.tSNE %>% +se_mini.norm.SNN = + se_mini.norm.tSNE |> cluster_elements(method = "SNN") ``` @@ -982,20 +845,20 @@ snn$cell_type = tibble_counts[
``` r -counts_SE.norm.SNN %>% - pivot_sample() %>% +se_mini.norm.SNN |> + pivot_sample() |> select(contains("tSNE"), everything()) -counts_SE.norm.SNN %>% - pivot_sample() %>% - gather(source, Call, c("cluster_SNN", "Call")) %>% - distinct() %>% +se_mini.norm.SNN |> + pivot_sample() |> + gather(source, Call, c("cluster_SNN", "Call")) |> + distinct() |> ggplot(aes(x = `tSNE1`, y = `tSNE2`, color=Call)) + geom_point() + facet_grid(~source) + my_theme # Do differential transcription between clusters -counts_SE.norm.SNN %>% - mutate(factor_of_interest = `cluster_SNN` == 3) %>% +se_mini.norm.SNN |> + mutate(factor_of_interest = `cluster_SNN` == 3) |> test_differential_abundance( ~ factor_of_interest, action="get" @@ -1012,10 +875,9 @@ symbols; for `sample`, `transcript` and `count`) and returns a tibble with redundant elements removed (e.g., samples). Two redundancy estimation approaches are supported: -- removal of highly correlated clusters of elements (keeping a - representative) with method=“correlation” -- removal of most proximal element pairs in a reduced dimensional - space. +- removal of highly correlated clusters of elements (keeping a + representative) with method=“correlation” +- removal of most proximal element pairs in a reduced dimensional space. **Approach 1** @@ -1024,14 +886,12 @@ estimation approaches are supported: TidyTranscriptomics ``` r -counts_SE.norm.non_redundant = - counts_SE.norm.MDS %>% +se_mini.norm.non_redundant = + se_mini.norm.MDS |> remove_redundancy( method = "correlation" ) ``` - ## - ## The downloaded binary packages are in - ## /var/folders/zn/m_qvr9zd7tq0wdtsbq255f8xypj_zg/T//RtmpIi5KN6/downloaded_packages + ## Getting the 393 most variable genes
@@ -1051,14 +911,14 @@ library(widyr) sort = TRUE, diag = FALSE, upper = FALSE - ) %>% - filter(correlation > correlation_threshold) %>% - distinct(item1) %>% + ) |> + filter(correlation > correlation_threshold) |> + distinct(item1) |> rename(!!.element := item1) # Return non redudant data frame -counts %>% anti_join(.data.correlated) %>% - spread(sample, rc, - transcript) %>% +counts |> anti_join(.data.correlated) |> + spread(sample, rc, - transcript) |> left_join(annotation) ``` @@ -1072,8 +932,8 @@ We can visualise how the reduced redundancy with the reduced dimentions look like ``` r -counts_SE.norm.non_redundant %>% - pivot_sample() %>% +se_mini.norm.non_redundant |> + pivot_sample() |> ggplot(aes(x=`Dim1`, y=`Dim2`, color=`Cell.type`)) + geom_point() + my_theme @@ -1084,8 +944,8 @@ counts_SE.norm.non_redundant %>% **Approach 2** ``` r -counts_SE.norm.non_redundant = - counts_SE.norm.MDS %>% +se_mini.norm.non_redundant = + se_mini.norm.MDS |> remove_redundancy( method = "reduced_dimensions", Dim_a_column = `Dim1`, @@ -1093,12 +953,20 @@ counts_SE.norm.non_redundant = ) ``` + ## Found more than one class "dist" in cache; using the first, from namespace 'BiocGenerics' + + ## Also defined by 'spam' + + ## Found more than one class "dist" in cache; using the first, from namespace 'BiocGenerics' + + ## Also defined by 'spam' + We can visualise MDS reduced dimensions of the samples with the closest pair removed. ``` r -counts_SE.norm.non_redundant %>% - pivot_sample() %>% +se_mini.norm.non_redundant |> + pivot_sample() |> ggplot(aes(x=`Dim1`, y=`Dim2`, color=`Cell.type`)) + geom_point() + my_theme @@ -1135,26 +1003,26 @@ different resources use ensembl IDs while others use gene symbol IDs. This currently works for human and mouse. ``` r -counts_ensembl %>% ensembl_to_symbol(ens) +counts_ensembl |> ensembl_to_symbol(ens) ``` ## # A tibble: 119 × 8 - ## ens iso `read count` sample cases…¹ cases…² trans…³ ref_g…⁴ - ## - ## 1 ENSG00000000003 13 144 TARGET-20… Acute … Primar… TSPAN6 hg38 - ## 2 ENSG00000000003 13 72 TARGET-20… Acute … Primar… TSPAN6 hg38 - ## 3 ENSG00000000003 13 0 TARGET-20… Acute … Primar… TSPAN6 hg38 - ## 4 ENSG00000000003 13 1099 TARGET-20… Acute … Primar… TSPAN6 hg38 - ## 5 ENSG00000000003 13 11 TARGET-20… Acute … Primar… TSPAN6 hg38 - ## 6 ENSG00000000003 13 2 TARGET-20… Acute … Primar… TSPAN6 hg38 - ## 7 ENSG00000000003 13 3 TARGET-20… Acute … Primar… TSPAN6 hg38 - ## 8 ENSG00000000003 13 2678 TARGET-20… Acute … Primar… TSPAN6 hg38 - ## 9 ENSG00000000003 13 751 TARGET-20… Acute … Primar… TSPAN6 hg38 - ## 10 ENSG00000000003 13 1 TARGET-20… Acute … Primar… TSPAN6 hg38 - ## # … with 109 more rows, and abbreviated variable names - ## # ¹​cases_0_project_disease_type, ²​cases_0_samples_0_sample_type, ³​transcript, - ## # ⁴​ref_genome - ## # ℹ Use `print(n = ...)` to see more rows + ## ens iso `read count` sample cases_0_project_dise…¹ cases_0_samples_0_sa…² + ## + ## 1 ENSG… 13 144 TARGE… Acute Myeloid Leukemia Primary Blood Derived… + ## 2 ENSG… 13 72 TARGE… Acute Myeloid Leukemia Primary Blood Derived… + ## 3 ENSG… 13 0 TARGE… Acute Myeloid Leukemia Primary Blood Derived… + ## 4 ENSG… 13 1099 TARGE… Acute Myeloid Leukemia Primary Blood Derived… + ## 5 ENSG… 13 11 TARGE… Acute Myeloid Leukemia Primary Blood Derived… + ## 6 ENSG… 13 2 TARGE… Acute Myeloid Leukemia Primary Blood Derived… + ## 7 ENSG… 13 3 TARGE… Acute Myeloid Leukemia Primary Blood Derived… + ## 8 ENSG… 13 2678 TARGE… Acute Myeloid Leukemia Primary Blood Derived… + ## 9 ENSG… 13 751 TARGE… Acute Myeloid Leukemia Primary Blood Derived… + ## 10 ENSG… 13 1 TARGE… Acute Myeloid Leukemia Primary Blood Derived… + ## # ℹ 109 more rows + ## # ℹ abbreviated names: ¹​cases_0_project_disease_type, + ## # ²​cases_0_samples_0_sample_type + ## # ℹ 2 more variables: transcript , ref_genome ## From gene symbol to gene description (gene name in full) @@ -1162,25 +1030,31 @@ We can add gene full name (and in future description) from symbol identifiers. This currently works for human and mouse. ``` r -counts_SE %>% - describe_transcript() %>% +se_mini |> + describe_transcript() |> select(feature, description, everything()) ``` - ## # A SummarizedExperiment-tibble abstraction: 408,624 × 48 - ## # Features=8513 | Samples=48 | Assays=count - ## feature sample count Cell.…¹ time condi…² batch facto…³ descr…⁴ gene_…⁵ - ## - ## 1 A1BG SRR1740034 153 b_cell 0 d TRUE 0 TRUE alpha-… A1BG - ## 2 A1BG-AS1 SRR1740034 83 b_cell 0 d TRUE 0 TRUE A1BG a… A1BG-A… - ## 3 AAAS SRR1740034 868 b_cell 0 d TRUE 0 TRUE aladin… AAAS - ## 4 AACS SRR1740034 222 b_cell 0 d TRUE 0 TRUE acetoa… AACS - ## 5 AAGAB SRR1740034 590 b_cell 0 d TRUE 0 TRUE alpha … AAGAB - ## 6 AAMDC SRR1740034 48 b_cell 0 d TRUE 0 TRUE adipog… AAMDC - ## 7 AAMP SRR1740034 1257 b_cell 0 d TRUE 0 TRUE angio … AAMP - ## 8 AANAT SRR1740034 284 b_cell 0 d TRUE 0 TRUE aralky… AANAT - ## 9 AAR2 SRR1740034 379 b_cell 0 d TRUE 0 TRUE AAR2 s… AAR2 - ## 10 AARS2 SRR1740034 685 b_cell 0 d TRUE 0 TRUE alanyl… AARS2 - ## # … with 40 more rows, and abbreviated variable names ¹​Cell.type, ²​condition, - ## # ³​factor_of_interest, ⁴​description, ⁵​gene_name - ## # ℹ Use `print(n = ...)` to see more rows + ## Warning in is_sample_feature_deprecated_used(.data, .cols): + ## tidySummarizedExperiment says: from version 1.3.1, the special columns + ## including sample/feature id (colnames(se), rownames(se)) has changed to + ## ".sample" and ".feature". This dataset is returned with the old-style + ## vocabulary (feature and sample), however we suggest to update your workflow to + ## reflect the new vocabulary (.feature, .sample) + + ## # A SummarizedExperiment-tibble abstraction: 2,635 × 11 + ## # Features=527 | Samples=5 | Assays=count + ## feature sample count Cell.type time condition days dead description entrez + ## + ## 1 ABCB4 SRR17… 1035 b_cell 0 d TRUE 1 1 ATP bindin… 5244 + ## 2 ABCB9 SRR17… 45 b_cell 0 d TRUE 1 1 ATP bindin… 23457 + ## 3 ACAP1 SRR17… 7151 b_cell 0 d TRUE 1 1 ArfGAP wit… 9744 + ## 4 ACHE SRR17… 2 b_cell 0 d TRUE 1 1 acetylchol… 43 + ## 5 ACP5 SRR17… 2278 b_cell 0 d TRUE 1 1 acid phosp… 54 + ## 6 ADAM28 SRR17… 11156 b_cell 0 d TRUE 1 1 ADAM metal… 10863 + ## 7 ADAMDE… SRR17… 72 b_cell 0 d TRUE 1 1 ADAM like … 27299 + ## 8 ADAMTS3 SRR17… 0 b_cell 0 d TRUE 1 1 ADAM metal… 9508 + ## 9 ADRB2 SRR17… 298 b_cell 0 d TRUE 1 1 adrenocept… 154 + ## 10 AIF1 SRR17… 8 b_cell 0 d TRUE 1 1 allograft … 199 + ## # ℹ 40 more rows + ## # ℹ 1 more variable: gene_name diff --git a/README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.RData b/README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.RData new file mode 100644 index 0000000000000000000000000000000000000000..1e673e03e62fc89af95cb360f67e6facbb9bb084 GIT binary patch literal 2765 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 T3SeMh0002~m5M*3wh90MI-?bT literal 0 HcmV?d00001 diff --git a/README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.rdb b/README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.rdb new file mode 100644 index 00000000..e69de29b diff --git a/README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.rdx b/README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.rdx new file mode 100644 index 0000000000000000000000000000000000000000..5940e35991a69e08dbad760e42decab26f9283b7 GIT binary patch literal 125 zcmb2|=3oE==I#ec2?+^l35jV*32CfGk`d0%cS>|6BxbZ66cUi)h?vp9qRh4e8Sk7_lb_T&M6 literal 0 HcmV?d00001 diff --git a/README_cache/gfm/__packages b/README_cache/gfm/__packages new file mode 100644 index 00000000..031a956d --- /dev/null +++ b/README_cache/gfm/__packages @@ -0,0 +1,27 @@ +base +methods +datasets +utils +grDevices +graphics +stats +knitr +dplyr +tidyr +tibble +magrittr +ggplot2 +ggrepel +ttservice +tidybulk +matrixStats +MatrixGenerics +stats4 +BiocGenerics +S4Vectors +IRanges +GenomeInfoDb +GenomicRanges +Biobase +SummarizedExperiment +tidySummarizedExperiment diff --git a/man/figures/plot_cluster-1.png b/man/figures/plot_cluster-1.png index bbaeaaed9ca9a7d0596535540451ce23b326de19..c32b3113b907afb1a5a21898bbb48b798747de06 100644 GIT binary patch literal 9208 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 literal 20847 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 I@$)zT1z9p`#{d8T diff --git a/man/figures/plot_drop-1.png b/man/figures/plot_drop-1.png index fdaaf789013179a69b69535d2440cfabcf162a3a..3842de3ac9638151a644754abd823a2f9f125583 100644 GIT binary patch literal 10322 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 literal 24432 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 diff --git a/man/figures/plot_drop2-1.png b/man/figures/plot_drop2-1.png index 12f943fcb39762b01e310e988c6e81bd97b6a46a..095755d55234a82b42a1fc022cc93217c228a1b4 100644 GIT binary patch literal 9544 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 literal 26847 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 diff --git a/man/figures/plot_normalise-1.png b/man/figures/plot_normalise-1.png index 19092d3e38b733d92047576f09424812906acb77..8c6d5d0e3212f78b5a6169c0544e62976293cb2d 100644 GIT binary patch literal 35060 zcma%iWl&tv((OQScL)TBK!D)xF2S7yhv4q60Rkbo+W^7c-QC^7;O_4JPVW7_s`u;F zn<{FGnRCwcmhN7wd+jhK1u0Y{LL?9fgeoH~t^xuj==mCpV|k#=sk*z4TWn z5D2a3-yhU~UEy~ShzuknE~4h1e!Svhpr$zwI=}kP9`}9o^i&iJn!Hi9v~fx0&bRLK ziEG1>$|9kSMR*-7QeIvoJUU)1hMSvPMheXuX|_4S5Y>0qjptXR)fUIq?}I}bZfk8Y z6IcEiq6pbt!L!aF1o9w^L$Bm@OyC0%1Z;j$1afu+!$2wEb2xIjbKq@~EC`VVxQZ}{ zxhrS&@%8C!&0{a)G-=NRywxa$Kan%Dx>|mKG26xbJ6}xc=a)RAuNpJTg<`U6_Mcze za~LO6(Lfe$`}_N|v$Lm3XVT|XMLvEymKN<((?SK@k(3Cc|M%7AYfN8*0P6&BKDq<% z<`~^DQNX{bqW`}pQUZ7V!1#aPykYBTF1*RjNdKdP0loRWFZ&1f2}7l!PdoC6T1s5IZYfIGYYxk=u?YuQn6IF75{9rv*XDTym4Q@B4;7nUj8 zyy8KYIEX1l5iH>4&dsyd)6(LFykSvf|3YHAdPEd6c|6n}ZfLw^FfFW@w4V6&wR0dZ z^yjVlloAN!pZ)cxasov1RDAAWX>n$+d9Fj1i3jd~InJHxCkWYMl=_A^+hZ|kK!b&-At1j`R9J5pQqSpm>D=8ZUFXJS zpZ<{ou&gWqk;H;~^H}kVmoQn@9>ccmufK&OFC?_U z*sc&0km0h&U!R+zy};U(UB@4^e(6i+S+p~x2#TKXf{9`e8PA?`nI~yvH!Uy;hl8pC@ zUyRA8HlYC46#m;q>ngDbl$2St(~GE}WY@t5WM`W$LpTgKZ#o&m^gaI=uIRvhs%kC5E#L~wuTSHtan5o?+0{EOm@7^+8XRPy4}`%8d_VQU!gV2bv#a+ z_IAh8?uO|rsHmxLWD2~Uur<{{!qK;pWO(m{m0_5X>{FdIT|2@+1vDa-a9_RrEm}N& z*Sb+<=%%pIAcn;w5e`f0LI?j*G!g@XBNX=Y)@hug;KlXzakua9z+SSCrI>MP@(TKEI`bXEhHV}hpI{SZKL%fYEzPojHf3lpcVC40 z>XKr_U3QvQ;>oKC+6R;#`)~IJ=snB~BdjPn2g06mvTNs3*B5x$SSP$earD#}YW*=F13{eTnZOlx!5fpY)nqBXwP%f z5ICpFTzBf}l8=JYg zxwekvu&^O1QlD7}iJP1I{{9}+*&BvUqmYgON=Zq%xw%<+o9o=(t7eCF;Q)fp zuRkSQU4uluo-4)WR*3msO1@$2=pSKOK_JIt@wv#d?;<2Tj-{3Z8r6-_wQk3zR00yQ zxtyr6$ zGc_vo+6;R_B*O7d{#I>8aIIEWS9@y3ttdrH{pGP|P)X#Q^D=lRe`vzP{aRbhPmi?UIVgNEFKY{l76p zA#hUXg&hvm5}kzzd_SAjFor}1R5Bz-MFX(J4%Uoa=)QB4CsfCn6;&!{sa3KpJTe;q zwn!$gD|gV-fqqexSs$@>b+!$xO}J$R8L*%fZ@#T+Y0&0|L>bwMzmtdquO9CpcV77r zvIDvEy&Ujcn2zs^%(Y|_gy&Ekxo(zNkYQCoc}aHdz%4MbMobwwlD~JYikoKJzjBfS zAO?U|vug-;LXMEqM+P!jfixjM^lvDpT}toY$AXeG8XA#E-EZFz? zlAIi2NJu6*j6X!DxK_x5qBQ`x@JLkRUymfZ&^|#pTLYhh8~^gs`oYjv#PgwYPf@j} zTO`|{LjRx!j3FxRWe_O!Qr48b&NEqaG{X70JF5tk8V*eSfc);!QRB1D^hi>hH0{jt4ZW{8TvwF!mfU8m4gmckN{G#R%Wv!-H!Uf!Zk?-JeQPzl2N!V<5W@26bZ1AyiOjA9D@@TSqJKLfY&+|0 z_U>Sw3PGBX?p5zPq_UoRrR{G`L1B#X!=(zNK;DFxI6`&+3N}9>l{rf?O29CIL4qG? z3UhEp*#;32V9M>YMTF!}4AB=<;2M605U7%%;=gH3h*sLuJ!t}7u_PRkBNIE9)f|Mx zq6jzi0B$`85>EhMy#70Ii$@TcJE5XtOFI=2o9%Y=(|@0Y1UyNNAwQI)-Q=DXlT zRArOd6jArzcwo^eCSoZi9o}1The{y`d<5pItA7$%{IUh^V)p)1C$o|^03xd~2iX5} zFDYPVWmDU}{L7lu^-U3G&SFW-b|t2cDQ{9z&J+OG3x$BC{1I(|5#8N#)*D5l7%J|q zOm1k~1?Dbongq%uh}pYcA1 zEqbd`8k!F_u(Rz=T;DU+ zyjpAb9?eEwDb4i>!O&CzaAryU9Oyv6QSX}}tF-{Tdxr;12#dP>K}Qy$DZr}Hzu&`;H+!sXX$U>d%H>Xvk ziTHNcGdr(cr-4;LWe1{?sm{==%Ex+yO5G`m_pw=~u(lTF^o_|)dM{vv$`6RBJd-+( zdm@2gflRwXn$geqsg}3iL60YtL6iRf=z(zfAJ(S(sO-oI)m#h^H_2;p@z=ye9v+sR zoAlQE-9&Bbv1{)T-gf&>M^}&Y-gPZ(w@@)3zA!DjL^Ic9bq`c?{VDP%+tq>5SI-8f znw%Zf|-x9|y;ER>bv}aX}petZ{X1o3X&klfa2s}3bw0}_diS6#pcZwRg z5aP7x4-2!7y#s7K-0O`MW*3#~Q6Elx89rymCqufcL1cJ?1C1S-YR_I4KBW+WRG2^| zIBGZaO%bwOv$4I)D``d2axzQ-w9ylqueON^o%qq{NnQdVmmI-6hMnFk&9dAsMmkTEG1vIOZ*0KK#>TKdwo; zR~r=`U|DIn8qsn&`Nkusni1bJzzZq;c&Fg30&L<6}6(S-}QM<70 zk{*4aqBy!c9a}_Bt|LO?1+`EC3tH!)ZG*Yc7c*fe@bq88I`=|+)`MB-BXbM*MH~8r z^o25DK;Yp&94zNm5=5T#*H2gH+W@mZ_oAEfr3+C>ktCd=$#y(_0+mRFtDjKCp^ooO zFk`Xv7z2#?kdNCYR3SNeZW_GT3mq=&ZyuL;rcWv@;e2&PhjfH-^n`H`^&6jQgAPLo znGYWh7&;Dw;77PPAtdYE$k2N5*g~|w{jc={EasdW5wgdDfJ!*oTdj|u zRL;uf6d&3`D+#i8aN70vW1+_fwU+Is9D0If-=ZKdv7(g-KMsQwY^i2y@XwK8X%m8~ ziY)J3mFVV9^Qy|Woe!H)3j~CKK)Uii^KAUy*SU9nX-02vM#x%Ot$4+{Lzz=#7|;9@ z)Lq^>GqJf0jfwdu?orTP-lPiLr!C};aMq*TFLQsbqio%0xobw_+qG}T?=!p@OQ;ije!=t;A@Cx zL3;VFw=p?-GI67eiB@mwIdTnjL-N6s-r)27h^hh*=x%)*o}{Gape=;n&A@@*Kut$t zNF%ykR-Y@sNG~D{_xpySlh4|~M5+E#Is@1yD+k97KtNX*CMwgtu2KDT7xkF#PUH8W zB>Sin=n_74K|u$;-PR`QST;}`=R%;8^aB4N0NbEf^6t8~gwtnaVP1(+l1=J%202L; zO2iFpXJIil<+0w~4D9FIeg+_Mgz$6-F7I%Jb*_V{d;R$P8t?O5Am|7*6Z;0%iCiP-Uo|{DC5Y__{;oSHbinz;!p7N@R)N?Dl6%!5JH6pY{pc4}#e1Kn zs(agoLv7@G{gmnAQaypq^dfK)L~}}h<%3e9l*lWly(g9&^z1>NAojFd;0{7%MxnyZ z(*{C&<_3cAd6yS}1;=f}&&O1pX{Z1X{@v++kQ{JDex>fUm2J>94x+i3V z`#W^Nf73W_pOma%aloJ%a!XS;P;^V+m=+L*Zoc{uz896&1yZ6bGd9v{WgSFCBW4k@ zYu6&GY2-q_MOmj!32VSXXsMEwciip-BQl}g-B4RurF=c=VXedNRd+>g?Xe!!D?}Q1 zH-r7U_OqpZE(hc+o=@LHAsxHwV3Ha*b^go_4o>e7rh6S@@d3E>E{TTKo^f-_D_Tdj~bQ-?Zf>zb=qvi&=fwjr`GBKjtl}n!w~r-OeU$4 z_oVbZH3qgmg=Z*u+h$$}nH02ssJOnWH6chsgnS0z6tcKk|?osv0muXHkxfK=KqtP98P zR$q*Y%lWI;?fWZ4UNKct>l+(i!-c$CL`}txw-<}k3wP8Tii@|%3Bl;KH~7P)tmH#X zcuHpBiZoN5y2ubLGbtQvnxMISA^fdsHYcuS>|+*3kdhq`Od;RP@|tqQpKbM^qaaoxy?;uwz++bbk50t}uw4#@XcXgid^XR^LSxQ@Z+fwnk(Rs7o6EKp*xR zf@sS+s<=GE!WXwKeAkLsZZbZ)mo-E`oki$D-nh1`VzbHdkMl+EOyOOVdYsqemE4P& zmc$Wm0Op!&f|rtdzc2lkqDhuTm9xAm^JztUHM-E%N^+Hq<7f9wMrK|}a9sK6=;}&t z6ZK24H3et!>u~m3`51dV&jj+SJXSp9WpxhuQ#w&?%~xdy{(~Dqi^?=^TpTcr4-ND2 zQNe}8qX7pTopE+kZj`npf(z-tUzLV_-7@fM%D#}6Kf!pad&Ej(vuL{qr-RZiCUsz3 zEHc2<`!x8MUtpc~nSgpmLdV)^dI696)AXbm#W&3tg)?IYr?mB(i-_m4Mcl)R$puvt zO_4=}TUAn-ExaCKBa{azDEn;GAa)oa4GFSEM1&k3l#kF;Ax;t8-2uS#W*4qLfM_2g zI+Zf6ifL#dt(Z2}FX8klOo~`Rb6;(2EH%Gi`mFX-$X+SpT388rI%@dYx<8^JG3BQ*`1DmzZ*OHu$PHEiWn&@#PK?`?BnLtWL1Loq3@%AG&>dx5?J}W=R)YD90s_dsc zzoL~?u)ttO_CCt_-Dd@KkT6D*vD|oS2C_yZvZGgkUh6L=CKI&hq4Q^^odjQ&3-T&N zp@hVxFo`#pO1||I2bRt~75@oC(kR7@<2IMv7W$I@ei}Z>KJRZ@%Y)94F8O}eg(=&k zKaL$t44~w6CJVUlo1j0AXwnswCaM|i^qVAd4 zq+~z2ltaO=t;lr8WnF4YNEC8(6ntsjf&`jLY-5xC4=`vWdh1Rwra=I|(S|)7#!E@@ z)>4}7tW@>sur>eO8h_ISDLc>#jKRmr?6`Z{)-V|xFJS{feejkd2BY3+fRL=ErKv3H z9_o8TJ#C-4?)%(|1r%ekt{-mbl!yeM7uI$TQhA&Q{JYFWzVpp^#;#n! z>`TqNyVF*);1amusF_qm!iS2#K}^s|un5eSvqE+21R@^4k@D)Nx2 z@%^y^A1bA$TxnpMfeIU4j>y!cq5wq@FAzq*jVdsB_CXxQWWFkBKXFgINe4;7Z-IB` ze3)g8P(DH_c^>RyS@WL*)bLYrTRp9FX4R;C-<91wC*wI1Qc;l{Mz@iylji~9I`?iv zrd^r+0w=IJ^ADPAT#@zIJ1zUQ#%hz}c*nv1b)icrNtiqqg?v)7dzRd2~ z2u1fHkijZB*1vg*BR~PM=j7GG%tm^qVrM(dybS;&P9@{L+b_AUR`bUGsv-x}Ab$Wl zP~)AX;#T%`xjQF(;b0W>P&K(RQ@DjskPnf1-8?!%@Zo85ht-T8_;9wkOUEwKYGp?J zeqA+31-9>FdSO{hfxntLf7j7g?xp}w0=ib9lx`k=09K$!;p6Ap62i+8rha_esG&8S zxQYQ^KF zF~B&xQq5#&G(D%WN5gt@Gu|C+t>v@>VX+_WLO(h6LRL@-&ZHOwJscU$8Qs zHL4JTFH4lX(bD&d@%cmx2Y|L&?J5>qoU-E!evPBHmTT%-L$lF{z``E=SB^a!?T8@$ zEmX7WHIj`>KT6#-K~+s53Pxqo*ac`Gse>Vq|KwCQ(BQ0|UMw5|2}cl0dAgU}o^Fs9%}O*Mi!eYO!roJn!sd(z>->NS9`HJos*a(1(11p-?agGiTxsvNr7!A z`R;$U01%1X_8dx9@NUb-A`8n~y2jOp^{YPHl741fX}S8lC^fU<~Xr?1)i`ih;6ZVstFeOkaD&&lL5+(HFCYCAX3r z1+i<-kMXi{ue)BWel-SJE?M{9XG}oS`V92!4b~YGo<~-9pJJ<#Z&2|bUlq|FsLPJm zr+Sk-XA#h!hqk#CKXzaqo>%LSanYdHmB~${npt{xFO2xN-&vV?_J0s9?s=}l=0>AZ z>55hNHsNt{@9?~M%Z!+FMPC5WTutl@KqXn$T2kS|gQluS(mxcUA8xx2j<@d$9{# zcntH^*Sjrb8H@2{a9TdtprhjR>epq+-ecTFy8Jun1QOO-npQQdUSMu0_ zvb(EsK~<#6tA7^wtj{o+dHCd_(RTqj#H>~QyMn-9w9L2fvh^B<3zA4z-8n1EIqW3< z4lM>OIg1NuRjz97*4yu|&QXrjsi6vGpz|cXo@s~QCd2(u3i;t4^!QH^Aw3Cmk@nN- zT@Qoe#I`%Z?)9|VT1Ca4%`z@Wi>~^b%S!9v710FTwt9v(^YsL%fXkFBudOU;Y`?l@ z`ZGzRFDmF@Q!+TxK!JE?WCY}oL?rRgWnRV?ig~_zH^*!MY1%46UNuf7?QQ&GRpUx` ztbjz`yGj0QiCzsz$>W_`*~+)(NcdOLeyNu7v1(Qn4`1unxC59QPiN-$SI>WgHWVtr zif{H;!I;Eu@1+SD95AAk{D4wF96C+dy_s8*F^3C)FF>8l1xffYXG0~tcPH=9dN)@x z&~{2vr(Z+$uAR2EiU#jfSf*5ZEDX7@D2WK)u3c`Dh3CwKRYf!ffGNjvd^ZOs?yMHZ zxPGP%QtEwfC+5}e%IE7R8jN~$@8_(OYoQ#NIDZo9t1WEP=AQt%7R>hWVMAhHs?#m~ zj*DlCjwHF?)~XGq@@)B)9jEB=Wqst4)U#_Q-WP@(9^zea<)4RlkAzy(ob-J8w( zvMHH;_^0M7@pUDKX%JcZG!>OEue=$Lw&KG}W50%FRx{=A-Zs9J7&scy!P^f{Smo;I zTf)^9O{yW}2XGN-7O9D5pO?SV{;I4unaG3#(`4u%21Hj@n@)hCNu+7;Zy3Au7)Z)1 zo;v=-BHu(@$^V9>BFEbghiS%VTUa6pAskBgf*8oN>ihg~PDTAQ&ehZ=GsJ$@%t@c~ zd|v85Myaz#725s)HI(NHRZl;BxHWF}tU1KalM+QKQ~iuY@C5pNQcN*YO(i4vXJUx5 zubM$ZIW_Xn0Pll4<>#M3e`VhP%Q=YoOSyiz+6!05pd2mAbb<^F+$*Onv3!3$Eq$Eq zYbgCQN4vR{%Ejp)NJ$8 zsvm@Yk19Qg>TmM*sz655O;lfjfB>oo=m^D)mj^8ix5-xGhyOe{@X=FqY^t&V7ghO_ zm2Qi8%;9e$`61S7Q)hYBhkCF2idqY6xizs_msCF{jbM))+A$!l?AdVWw^fpg3(I(0 z<4wok0|*Fk7^qj(qfKYEF@yan_0MwWFDTg0>tg4vsYjj^vxYmv2}MOk3l(l|KUE{Q zxFd7U(vntxa+82Zh98P*pWm!Y0SrIob__E!s|P7A#hq#fXlx|)SEIDl%;8ZPb6bz4 z`NMZ!OMJ-h(1+3jR0GbOKrpqnwSY{^d75;DuH%W6HlbT{6*>SzOXJ}sX>y*A*pG1Oi*Fl$ zm5g$`_dSc%k8Df$XCR40- z&$l9K6K`K!eou*bgu&C=SinrDz5LvL%i{gcbXHIKjZf-skvBnGx1LYwG@T? ztxRI<&zOWH)<{fTi>ki>xsGT2zy4Dg=)NH1#>4N7Gm^-cl7)fs!cT&_;ONjeEj4Ok z-bY1?pH6V-;6aNDxJd$%} zVF}~Q-S7?2c~ndc&_-!PtV`Qgd8*4{Y)O?5tNZ3$^xSsq`3#4dEd>iS=0+v=kEmfD z&MuvC7-=%6~Xi!iWq@NDg^a8t1JaFdya>VK0qFm~U!5IW<)GgUdU|05;^hm3w4d%#8{FO{uLdrQf4( zWT;eY{^%lOzXxWbP`h*h+Fsl((ExiCtQgum3MM8#TAXsiyF}^v@K|!k!f$4BQ5L?X zn71?WefM6ADTQr&A$N0yuVUO>lVe%6nyx*r&Vrsu)wdagP`}Zq`K|x`tB`ZEgO^YZ z0h&?2Cxz2gpY=5O=!)sPcj-YW1|dICiJJW^s>_U|qAnh=x%%CcG%Q}PHl2RZcp?KD z1O#ivw4uI%Yez|+pL=BtoXxy8jGy&Wz&kc=-<9`YyHjO}CSZYSZ`Td|Sxs-S?&)Ro z4R`5Z2}~%R=+F0W^O3DMo9EVNln2<*#LUP6kRx8F*4s#Xk1glJmM0@kSAhl)`K&xJ z_lJyeO1Pi=H*3(DWO%t%H;j{KXd1hrL0N%6V-(6qUj-&t=bxCtRqShrr`09ZmcEuD zKMrcm`o+UxAGH}n&YIe@8X1v5mNQvxgbb1(5PN-s&iKPI&@%w?CptingB=iozGPbz z6zJPm#-h9%XWf_8;?&UQN1)&Xmp>wfNZQGY;{WrKej7l~X0X-@468RsJ2ERCK-*`Q zLuUx>W*($7bc$&Kyh3L_{Q|A+iCj*is=b#4!hDuFe)}^X(E66IyDU)zdOp|3?OzdG z?bOGnYe$s?R$f+5A92L@UYyCdwg4_I5LRa^mX*wb&9|V=m8Z#>AD!Dd;JHED;72&J z?73*cH;_?WCZwV5mfcQXQ+M(@aJHNq3uF!;J{a#@GG+?2%62&v{tob82uKvQol99! zc5>;%Lk_$p8cMIda0;Yf%!Y!-25RjCbX~IIychaEB4Hapd$@bFSBo}nI1Mjkf;(_P zf5XjEjNxGwJH&af$Hex`jtIeWGBsFXXkK32UwRn|hRgXAVtxKFb49S0Ck;}C@Q&a1 zQxc=l5bl4wsjk@1-<8kX@zYS}VlFMyV%I1q{Znv6o{)?fOc7`hP@z;jt-Vyv!I@E7 zMz2A8()%Z=>~m%{^UOhi@o}+f=o8kcSeGjWNZ3U6Fp^$XU2bVJ`=@mT>B**N6f}U0 zg#mYHyV0U{CnnA)<{n&x2U`hGyl$ui+Sk!`fxtd`nGWG~?j1M%Wu5BwC`O_GWx_9~ z2fX9LXrPpqtUBmty%6n|uA7f*mHcm->SIZLdCC#;c%mDuPH__XA787>r$GZ^-^F^+ z^LD&SEPumZ!{63heI70RDUkG+CG^e@6^0iCl0Pw7s*o$Q8PX%TEC^rxeiOKW1BfF0 zJH5^kZhlvhN{?loQwejua^{DG#OSpb`*__qefCXr{ zJwwQV*=5HUlmF5%JmZ9qNr74Oq`A)BJsd*Fk}5#jrKxeP&Yv&Z^rsPV##A;()Q2;mYBZqHe*gFl^b>J`)vnvOLaM=G$k~>9uR8Vq1BGrul_dT(HH0rNz_F6RZ zR9^Tx22a0@S}l6?T)Wu8JdoaAxKDEOudu6>I(f0}NOE$q`rJHn?95t#7J=&H20FHf`B%)@d0}lLgy5j|bY>Q6 z>tmP@$=z%vUs#52;rlyMTo@6-jk}D{dA^Khg}(ZTyJtIniQvgB0G*S&>}&al3B{+w z$APk1Vvzpnn9}7;?_9g+?P5;BxppA0W3qz-`Tao>y(S{H&q|o6yV>VW1uLl>Qfy$F1KH*9Tr~KJR+;Y|VccmaOUPs!o_kRc0WP;??EAm+L|AdYKTNI@hEbSHkRDNR7AnXZ_7cR zK1|46KjxnGh?z5Yf4wejAZhq|-JnNDME+{Uj0*i!v{DS<$xj^*@wHXhrJf;nmTJBi zm^(X57cjbKxRSyT>Im*9x0_cyHYeJ{bgr5jxV7{MAg`*w8VsyhlME9JEOH_(e=2pm z-X$Z#&iqEfPbP?BoAle)adRn*A1&HCo|9Jk6hIa)`H|@!&JKS_Zwk{dpPpP>8<32& zlSPe8KqVj{{7FyMQINmXos<6dh4xqTm6Id+R?a^T*-}Qd_h7g-u;^xwCqPJ6dzQp- zs0~Pd*LNlHL5DaMb5=h^DKn%dYKa9*}X)SLnY1a_wc0`ntNC z%(v&gKv?8eKs|naeXS_?&^tXnJvXPWI)%obxS{kO8J4Eg=WD}ooL>9vdCcfgPEZ>* zhc%4X7H`d2)T$7kzALOd9)py#@4PO>?a7Kb568KB!f0ffj>P+DDh^YA0Yk!N7NT`| zZFoIM90Qb;2@ce zrBWw+dH3$!%ky(=Y%DwO2}m5N)0JY@Ow>oxtz;6YNZ@IVmg{G=>7H*xx99(Avv1~N zVYX57#gz+L1}En`9N&}-SIj%%ngkUUoxjab#hG>bIK7y@C(5|H`=m}QW=Hk0VRf(&(<0s(dOadVKZG$e|6rU%%;~Y2MPa2x{NY2 zRKA_D$*mx3=4=1K?agFZK*UsRhxi>6U*hrV8;#?J<82F5yq9aVtR}WtPjU@rYm^WH zVF|vv4AoFg?&3N8E6hJ#xne;BK?q-CQilUEC^SpSvHwHjpLM7O~jT*`^-pfYOjeccA_rSRpn_LqUR&C z6XV-}!tLf)0zO0)tiSKP4Ew%uh#Gwh8>WTOM&~(`++(kEmp=(*=vi0=XDnqkVjy6F zll$P&jiIte%57k-zcMxSr8Kdru(dl^`V1fM>cBP8NS9;u)%7fE67`Iid0XRXtHO@F zK{*eg_!%X>-DW6byGf1dVY_}+G`bpODx-NkLp@VPe{{bCQZQ;aFv^c{Ly)BETi)R0A_j%eGNlIeW<@J5O*B(e>(r@>EaJ=`zYm=rrG%bMeg@X-~6_`}N!{>`A zIfQYd=Sp0j*5MM2;^0>oL?Nf^81(A^<>SCws%fFZ0`i0mC{QJ_7@|13_i6@NsBiM@ z*up{)r{Bba`a2n<#8Qej@0PDqa#XwRYl+u>bD9as%dFc zL`TV_9UGTdgPEKNdhWzQ6d;TM^MlGBfFM0=^)CYy7`X_F{iVfk^<3~SD~fAc&mH}> z%GAPQ@dB0)bk47@qhoDo=wJo~-g~>sd;?CbSuZzUj2}my8nThll5dlqh~Roc7^Wd1 zi#Kc=>*CE`EK+E~+7qtfnzJH(F3hC93)>zMK!IG1sAKcUDj*A{1bpi2dPepi9t|W? zYd{s3o~%-)0_9&WP;fSkF9~9r$8LS(G(786kEic=K#Bhq`3=BB0L!vWWxE?F-)*U3 z0f|NdI`1eBO-)VU^h1tR)Fr>)^Swin+Tp58aqr!DJjo|w(Ih9f1Mw(lH;1g3Wt*S~pM|77quG)iUQWx#!V?i{*$38^So zd8rMsvw;f4DD_NrcJOo07;iN-_Lv>Gl2nydvKDn#Wdr?{TUV1;@MS4DB1uk$Xm1>hj^Q68qy1q1+P)!*1Lv=TN1DU5FlU^9*u~&E_`^%_NtP z3YC4XFBSbhniec2qY`AZ4Mrwe+>VQT?Zq}=1jA~kZo4!5I-UDX_;2V0$v-AQY$Z`sve7tyWn|GJ+0 zkc9qB@Nq^ixsZ=2CT$PdHPtJ^VE88T2zx72bMoQN(seZ|ZwDLox&hLZ_(nGC2A%Xk zta}L@4Ro;hl$(*Wz6dmaK>j=N00-o%PZAX3)T3iRj3e-Tr&%rb4ki*HmTX31mG6O8 z@?`YPk8juaL%Ag_hZAeS@wA6xq}%5nxA2ND{<{>FX^-c}uLyN@MfKJ}fE7~;ihk7< zfOIER<`Q1BKxjFAGgaFsb_?kT5umbQK?i{lL@PHxO|Qn#530Z1I!So|Kok8zcZi*| zu`0j9NZ1^s6DCSYpA{WemuPTh?FZ8#(ELHx#K8K5?T}7L*q<)Yr|D9s%|8PdOw-l* zZhO2fN>lgumz$%H?fI#ibb#(0IOpKA+JhqY;~tb57INvK<{0Ly{b(3@=H3`f1_RKx zI^c}pf1I59`&{QdYK&f3UZ%8>L3_O*UQfvQb!DfT6FQ$)JuUmYVV47JOb zPK`#`MHJlzG1`vg(3*wm|i%=cxu9?DJk zMbI-+nL}MIwCT_8kwU2>1M49w_U6zu%D%gWAOZ?2`4jDYiq zzdQ$5kp;9&BdB1*HL;pmvuJ@+x)IIZM{?@?YJERm)S?TU=;iG$c1()bd_QhGwr49; z8oW2OSebw#cnVm4|0@cUe%sVRkgc7=C%Coc+{YanQQB=Qs{=$;X*;2apbchh?tgMP5W;+djk60K5uW4V zl0aeI1ySH_Smae$lG>CYUIEE9llzxhmnq8i0Z#87V_Qt^2G-GNCxJ`x#q)Jk#>gs9yV|1EH;2=MvoFJtIwvoqAWuZ>R!++5TFc6NDr`PkSP zJlcn3UYFvCh_Q-}*W!aoB{PJ|Or&|^tZnG;FH&=jmqoAXoNKUE41L2v49X1B!v55*CGPynHLmoE|t=6bjQihC}K2;~1! zLe;yyxVYnz>E%8gN|0gVXCHN2N?gUZJ#7>TGT>cd5fSqC_UDnrd><9k3Esc|s-kk) zgD&)&R0y1J;pO$j)bSj<)p&jFEdMi%WbiM#HyA1aW!g93T0fhd=)UC)%?V|eN@P=V zPzYLbb^V1sRGtl`vQ8IWejm zx|$H`aNHSQUti}#uVz@9p8iu%Fi>sn>)W1@p(}LO`)jH1mH>SYQOO$$QWB6DIEobX z2;!$b1VnUN)ccUYG51NQ#vDo6noGa8;CcMJsA;^n(>wQp&A# z&K41&nl>l&`Q%?|*x<>y0-@K?aTOwxbwAZbjdXjE2t=<_M8KWWV|k2_yIR_Ih7WNfE#4H96*KF|=P<1GR{l zn3#{7qHSXS<;43CmzKtMo%3$1Vmm=in+swkGdcgKxVH|rSAxm6GKZ_TTXnr(3{4>CsFc^P3}W_oU;%6B#C(+3(zJxg%wvZQlBl>uI2X z=htX9`|K7}@UOb9C)+C1)=2d#G(4NjCHw*wQs&~64g4l=a@#P3S3-Z|R^unW(Sq8> zm<_47uP=0x@yQco=mCxXf_sSCKcTd9fN}FTf;zuwEKn_i1C8vNa?>KplzA_|T9E>D z`+;PojzSW-yc6ZcqlL-+!HJ2c$3q6p@r&zg4o&z5OnLe}=LNZ(dGp!+Pu{td=N7ZL zJ!Lnuf7mVa!u$S|_sG)*Uo1Y?gLLpJsVEf~Q{LNVZ^fVO?}s2g)+qdVfad)A)N1M; z^bx9P*ZQT3>t#Hithptl_CefBe6j-7OQy-Ol@GJq{`bijDu;?{5-`X+_wUbM=P0wt z>BrgGam8_Pzi!#Q!JpmLd6kkq$E{H2lj>30C^Y3Qfzl{^y-zZ^x;B)B!dUg|N}{3y zLoN3f(olB-AcyA*W4yIVI)@D-+$~$RA3mmJamGx#wKLodswRhgWYShW&cOx>vXe~d zqkb3M9KQa;xW+kMykMy^jJx@5LvOwW>;@im+8<&O`4j(?K$FF*|4c?pP;SGTIr%NfsyfadF-kgf1%@@m0~O!r6FN~&#Uh1 zRfWot;0pE%oW$&^ANNlUpOksro!>|b{H)s4Qu;2z&}7SHb~Ylf^L5AaBa2BkDY}?5 z8u^%8C>(S*tC8IBVRNm6g65T$;vvb5ZUN;>>>VyB1+a}Humiz+v$}+=6UGB#gIB$k|Zf z^@s2CNhhDqQ=D(H6Qaa=b3dUJ4=VRKKMH5m_QfI|&ei1$5G!0-S{2<)Qv&P)~;Kfje?wJlFpy4S$6w3HpiOL@0Lp=ZY+( zq+RbJpmZ^M`c0Z@yo$ZvGAS&7?1dcP?vl=ym-bonk8qE$uh}(r$V7g#n=d#`=)&6n z{Q2nL9WP*EZvGeYJc@gtn|d5~Q*C;cb(mV}u;5?ZP^Gr;AFU~iH|Xi_MXpq`<=EXx zO1de1hdLAk?NNX~&sEMt^>;^O%1_A){I;nLLW|hYe?19D&g&diWYF5!+Ot$zqj4J- zE|5e`LE*T&@tgRYeB3j{!~kfex<2jkIy>IBHaCxsi>oo|2*+pCTB+pdmC<1`dLyMa zEXO!G#P9blfJz|4flZHP7sc0L;rzJxIFfC3GztFq}o$uZGQRjn)y&v&@&;6wC@@RZGN1IwMI(c0L2{ULk zPRCWb{YBv(IR^8bvy1%%zls!^u59y^ie=@cg9US4PiA+M!RwkbvxHVuArs@;?S=Hq zLgY0RaHhUGOw4q2=2O)bxfsYSl1w#{8{)QgU*~vnakt}W#e#NLtSxn^CxWIEUxr)6 zW|f64vhc;2ph=lXhpBbkO6R^={d;ErRMZ!9tk$FI-y<;ns;8f({D}9##bq7liXFBb zyQqGpIj!_Y&3JEW&Gh1LmS(E#l?RHQ(1i|`(InYsQ-RBU#UgxS0ayKA@bw1-kcMAzWPZjVZ=q~-EA zVc9_CmaqusC&vzdDbF|Jn5eaQu!eYKGF6tKWkW|j&AK}Ja()l1xB<&y-I)*caOKAO`Tw6LDob-|DTzk@` z(1hG8ddC^1$fN@wrk=60v%`cM3Uo9yL^hoJ`34J1X--=z9#uTK3#)C_F@?S2XQ2xG zR3^@i#_`=#d)+us$qw1?hSa2(C^x3QZu~7-hw6lch#eGUVI&yT%E=Fz#vwVHIuktOG=Y={ zCTm=QtFgDYA2Nb*HF|n_wYKxks{?84`7GfkDJ7oNs2zoLVbU2YT;@{2&ofkpJvk5k zM1Ha~TD-wS_fg7t+qn5jBG;n=joSI)@xt&GW82@{mU&d-7c6u4u;ci4&tg-;(Z`fvB+Jxm#P+)Z5Fj z_gSZ|dp=zgTxQ0Wot>Hk)tZiUlkJq|5#i%+En!*)zYr37B*w zrKB`#Tpbt9hHunc81O9c{)jhIKEs*|iSNyB9eTcILwR*hWU9Hcq?Gt_OSWfFD-_A` z6{y9BiVBxB2ttl)2(J|MsWpt`2JIomSc&7p$%&)1<$bF?ZSh(CdmW`j<8CogUkb}E z6{P=?5Ks$V)!g>*5pYI%rH=s#U44GVF{Q6WfSEtHxqFt55WCOL@IV)5vHr@^Hx(v< zA7Q^r(2?~Bj%Kjx1M%nwQ5F{$Wg?hLii=4ET#Ku!++buf!((>q-wU9&5jG5g%rm)R>$aXR8HiX`7_K}7ua-21l2 zZWF=m>@1!UY|-KAasmzs&r3g5WWxJpo{e<0i{Y)4$BYs8T8NLYbVcU_?xAW6Uh{1< zdg~#6{cwGx%zFANr);XQq{MO{H5jUKCBRYC%nQTMVe7{ zvXoj72_TTWp_`UTcyyFP#mN!BKKFwmjI^U|NXrGO?;eipEo2;|#Hc8g zv9h#c;)}<9d{Rk+3)7h%mqG6vWbN%H5~7077lpkZ&mbdZE}q@acwkI@QdTi>q1GHv z+`&d~_0 z5W?CM)d-m?j>ubDid0CJ6sqceq-E8_BGxXhX#0dz4(Hjw2QgM56&8OhZ)=_korsvM zYQiUY^OmcW}QjjAsrBiq`GTJ#XSX>u;$VHNZI{6$nv6^(8YoX0!Tz1j5vLR10i-j;s)|O(xYzPZ84rE z8p)qL87|bGzC~h9h1XrJ!*(u6pAd2IO!_tY@gmbQ_U1?OQm*j< zc8$#uR5?>3rK0!=`c8Q!2F+CZ3(dL_|zsxw%JP7eWV%1seHOQ|RT=rFXR*=kNt0799 zlp&AZVsFQ8%(kh1NA4lwOSed#*+dg`1uI{KT4$*Uc(yK?m&aRWey8*^@RV&)-W1M4 zh|IBNR&jawyNmR04%dsu!oXjsS)~Q@`x1Z05YEWhw&2lgoExO(Df#&<-0BUdFOY0D zX^v>l9%o*NRRq7pBaqP~k}vCV2!9eL)3Y?I#MeuD(_J|tEDYg*Lx{Pz^smp<#l=fP zCeX34YCJD1xiC;z9*_t+9!BRGcWgU8p)gb+$@rU^7Uok|VZ#@1j;i(Pz4cn{)tQBt z*L579`^l~P_UYzI^JpX zEw;NufiA+lj{kM^-5ohC9UUEU@n$#;5u@k>bYXvQk5s_*K$_Uzet%}>6%GzgoXVY7 zcgvp+_N`t^k2d-Vy!EGQVm{9-bx|<1{$t>jJnzZddoMm014&m}LE(63XU48VtdS)M zg0PmB)@OW1x-v9$bc&?(^mO&58u!ye*W|N$LGAS{ztOs(I?qk^#zL&(GAt`Tw3Xr0 z_T60dLXpc&zszsnRRekmk4?jfHS8*kHaDG8%{;ee+sz0cg=v0oUa=Hs9w`nGuIGN^ z;9t4GQ z4L{2$xE);V5)&OwG4FT_c{({jEUCS&AJ_?o1?A!U-7(zOQ`IhF94>ncfP%DN(+tX{ zC}pV7k@oDA3WQ0ko(~O@u|>%~zPnNxIPx@1x<3MtlDF}csaPUp)2m0vR2?@ zs(|@<^@`{3*oz()yjGW=;$!Nrq$_-OyV6Az3(yfMdnYG(d3iOm2qR4{DypWoHmQ*p z$b@wFS<8Y~CC~!zzd&)l8#)*1>o#Y`E5o!zAV}wyd$^X^_8g>DTU!hBFd;)T)I5Up zL*!@g^mKwh)ZYCA1CF|n-p{U%ZFIaj9zfO);~%TxBmu^84Vrb7z8$-Vi;F0aF++UfMk56MX(y?Ox%>&mZ8unI+!v$2 zc0@g~9sM4vn#xg)L0O;Aa@!%4ZiV`g_hh`xdZe&sHr|_=k&%;|d&Chh4{Ld*gn^OV z;5?x=E+_n0u2@YVa496Nb+xy^&b!5=M|+>ixPA8z=C? zXnWBr`6p$7!Gb}{%3>Aa#V1p1Ep5vNMc3EH2zPpWxM=gEo!;Lri8LPM&5Ud@+s$@* zEK^>YE&PZHI=W#gmtHZ1e4b{3Vm@0WGP7^_$N(2W9AdQmNLOsc!&wAC)168O1JExz3-@?rNkQB7W6yNX=8o4*jz|Ftvn=D8;A zU%k)z4a6Klv-@EYOkX!rMmiz3tKe4M4@vbC_x|@eOx8GEeA8WK!GNlsRXh>&3W^Jj z#oPBjyh@JSEG@>QvNHMDj7U#jKlmNjf`(`1C6>2X(-$J!^#hlCtiQhdU?8)VcES z1J~&NGmKc)rnqcrpUa5)zaPV`8FM7nmtUK!B07t%F7R^XqsH0eu)F3qRqOFafoFRdJBhhv|>~T~=W~OHImv+6vh<(!PZ`dB-ABYL%X2uO^ z0ew=DZekWvmyO%pNT&Gf8__6=^6!yS=i!tLWB4QA)r#omoVLXA)iPIJbFF&?Y|+dp z*yN9YizZjiaL}eEM1}WyAI^fA7Bi9-Wx7l%K0)O>8xk+v*nV8&yw!DGQDNL}d|qUS zkQNr=vqui*e7|)TZF#Nm3L1AUf0vgRtkPz-u&!lTcKVPHtF3=m-t8n#7y9>E8{Ugo z$1mQbwis>;Jf^t%Bn4Yroi|s(O;*J_&CJLbp`O@5_nQV`c*U6(e#deeE%YIERN;ht zsPf}SDmuyK?#~5E>Vh3D>}R7F9!%n+i6em~B&xdSYEq|#+?P9|78jzTxN0rHj7YoK z-FuqSS;5jVE}u~x8zzA`Od{|+t3Z^p3ZNxZ6z-yz+WLv-a)&HG$<$7%2oAR zsAG>J6!%;)Q_Apv9sijf*HW@co_`P*@%7xFo;o297tJ}3v&|O;_}hN9`CFRy&9KSG zUTop8ZCsNNz<*GU5e;gzfCnvqK5J5boA?twWw@IqAnq3X{6_i-BbQyV#n}mWY?rExh}z zq#*h#vW}Ks(9hrB;AEZ}m-XYHoF=6I-Vv~u@a}%c8Cn+yWL# zLk(YYwH@ay&(8cMgiQNuUb$VUf4FP8iKGeN0K20WB_Sz7-d_T`VsE@P<;Q>9?z~sW z{d>Pz{t1)%p#_h&+TV5^p8lz$nB)hvPII%42=#NwvtCy4SJW-95x)$@4XCijeuanL zH2ad`Y@&ftmF^suZ+GVzLV%UjY~PEEVh$UP?ae!{m10NIm^C#r4U<&Sdj1A>N{o%? z%1i%_a!waOtU+&O{Pg}D3&GVzv<3ymoXyF$EICC}PnA^4SyGf+w91hvlyE;w5zlq~ zJ<%vA$;K>S&d9pw#T>ZEu|IcGX8IZZL0y8SB@@Z~tFmXbw~iY{84+?gXd-@&QEu#d zb%lPkoi?y1QP;6^+K#adnKpAwg;~d9jMDBazH~gqB5GOgk2=_Df2BEN-5MUa4!(!Z zYaRSpE#+jJN$BU;lYj>9Hd-I&X99ya6h>~nXMLrqMi(|*TOggHM2EG_{6i@t`_g<3 z$4BIMVRmkovn9HZNQMg0oRd-yHqKFkBeh9`54C=I@mL$)U0lVgFAkf9bX1D2=gr^n zbG*7c_2RysgvH2+;$;sb0K5PxZ|3{vXvjEN?+qgVUK3@h08-dA|8S}llC=MTb~io< zkEjmbis;~M+)R#tWMydB->_aZoxtR5XRjzcUAh*!k^BbE+Ex~rr!2?2?84tl_gu72 z4rM&|%KlHfd|9sli>da*>W7%Qw zx2BXRuY~Spo15QLaYHYb69k=#-#yrg;FlXT2}nHtx2Jv$HmEl}m4v&A~QNqEF z)pG7ZwXDs?%%15M6ei4g57zP}d+iZc;W7BfBtJ`YTe91X7iSTV(nWOoX{g3S$9INr z4Bof8KX?DwzO(fei4o!8S2D=shJQp0p3eW}3Y*(j5W~T*e}n!w=6qSG17SOMl6v(8y??h)4m1y)@ATD!KG`I-LeC*%kDH7VU0r z_dM~Pz~0hbS;!}+VoWWTeaHDR9ubFEO7yN0B6l}(BfNC(o*O=yU-;wki;Vs|6F=FO zA;rl~o3hSZ)I4FtCpnQ7I3CZeGj#04EcayU>AX~^uJtAi_`F(l0yy30TRuOdG%K@k z5B|Bm>08d#>lD~u3a@BZKW;Q>_|C%Us2ykTZjwh&x%3GWzEZ2J)M381LkQsP3%Tj* z-e$J%Clu_hmm6wyRCSmI*OFM+FPF`=qFYYJ+DK!3{25!E_%6>q&r0}8D7;K@j~YOMixT* zM~m{9av{OYs&l2zj}bB;L}#x(OmtdjW0V&cdz9s#7|%m;l^w$4zE#>`rreQ|Fh|89 zEQZhklzTHrxe*?cLE{q=ErBXwx#>oY_!m+G+TjnFK7XEyjsAjiD2(`E16%eb*Dayz z_?dxZd*B4dRM;;k_zaRjP zyt_M{*3|7!f2${2PjC3|Gc zLT~o&HmS!z^1r8I`ptg1Gojn9@VQj~VBu~-X8QooM;8q0CF3ADndoz#ErT)pI90St zUr;L+er&_*ui^CfvP%UR`M)2GcMNoX0@f+FVCAxk692P3!L4YE!hZ|MfCX?CtvgPi zUp8uwRUGR_H;#^t%SRP3ubmAnFAi+CtfUL~vLbBuxglY9dSXpunBZGZsx2Pv=&OE} zFJ}AL*1@9(j}7&o_eGELJQ})FiGU+mRKiWI8lG)P&c;eRX2?8d?)(xkab7%HffscUDW~61KhrN)7Y(-+Ue+ubp`)|KlRQ3J{JbVxdGw5?z|rN(y|?DPO|#rK7Y$*w zgj}R8#yZQCbmF9w1`b#3niq-`M=7^UC*AzU1H&+}%I&%Ncr_(VK9>Fya(qhEc)7eE zTe~%tLrj!?LVUb4=X}k_s)UlV_PdeTXY7TKpK8IU)exT!dd^;@Cwhac>A`mQ`laJ= z!U4m^P>}UFIZfx#Zb3y;{b>2e4gv?2rwG^rsb2CXXUx>3*=*OJ9%JiIrs6Lzb|c8_ zBnC@TykOdGacicRp49M_Kx5$$16mNm>g$~kEDq&}M{EhuryvCu`^L*@~ z&KL7J&bzSdg@D%0squXIhlgoj0)3hhc?S!f&X-s2%lZ?RmA)p}?8Lin|Cj+iMf&Cg z^2VMu7Sul_2h)@jcBVbUwx`7HD!#1wG$Z^M3zvKDSk-TXty0|(LE=AN=RCLqCm;66 zY6hDJ1`ot-(z;8zC{f%P)NOdy)o8aR)>3s|lOU{#vT+%GdeyFf{O5F^pS29CB|%l+ zyvGmcqm-5zja}!o@e<9A+0y>Bp~R!#QW8fU+_^>=7!K;3|B8b5wsZDf&F^^sPI=fl zA9Q}g#?YNoF`Y<673$rW4k?;v>ojK$QMSA^B8k1>hJD7|(OP>YV!LAYts_&Ph43~) zm;2^es%IZL9a)x~xlVX>@89N%`H{nrcCJl(7!u*Mi27G!+I+Gwq|w%VyxW_vW_QIP zXydcOgV`3z5BK+PBTA!J3$ACLXI2sU#TWiH1)ELtOguLg_gpIL!UE%KUK{l+U-oA< zg{m=<%EY3$;b;vec?{=R6q+Q^d?8I-?#a^UT46>kWOqLdGy1YwfZm`;pzKV%s%!r| z@yD!ECsW|0LXW*32eFCudAhP+)0P#VfQMEs?}f}Xm*z1=vc3o1bU~C{1BMwEX2YD6 z_)DSh)Cyk$0xCStofyae8{>D0N-~>YYH68US>>+N>BY!Cy?^IsW$s*wREiQ)goXcj zfZ)6GKvg}D!lk)id7W}3w@a=&aaiUlz2V)1EU6>BXs%7+GwM^x2EEuYQ_y z`{H9OhNjY3+|;5RjVl zb>M!&BQ`zgad|ibG+@4WTbOt5Xu$E`BO>swM*h1_8$yMXA6}q*LoL?KdKrFA#J62n z5ntzWnv5NNcF{#9!;sW()oSE45QoRCYlq{C?e>2K7U84|fJHdz0$_0vSWJI`=KG7B zE$k-uHBI@cgh^p+dG>U?iN0)W1&L2LZ*8_FDu8mLCJU%x&SFF%Lq{QlpOJH#--4aXrn<5h4WM<% zwP-3CDr}fWpr0R{oDXBlgbhg_S2_%Fnl5soD*hxjKz(gTSM3F#nk_R-bH+Y9UK7H{6TtPRqJoAku;Qa(Vx zyu1vc0X$DYpvLz$5>nzaV7!z4DKdHbb%M5YjnIzBpj|5KQTi6H9>K-M<>Y|-*#!Kk z$DVu4N;v^JLIG`_q&ocJ$`Tf5Jt;pD(tBJ)-hxC(4o=~J{Rg({G_en)?QLzRvwmde zW1}|ufO$yE$;vwDHd!dsJn%i?=Yc9>)&|p-kF^)uI=RbjZ=uciL`P`;y~L1+#|sIG z6w4JG;dZQEq>r zBhu4n`RYC${5E?TgLamxnx*FA;!>HL)ECF^f}n;0RJ#_jAYue9vd7RJTzj!6qf5~L z1lYUP$5U=_ylDmJnzN@$bsIZXBYT{&}?K@nG)Dy?2P7ylj6(yc$;C2oOD==r_su?CGCgn8wCPqC~ z&bNME`(4~{=S|k@qIcVR6Z5$}fP2b~ka=AcIIQ;DFLw`F9sygZqerqe&O4Bhaad@U?@~5bug3zT3Q-qN7&a3HK4^L0em7{i|>W2OO{S>8D zU@L+R?t@n9)p_c6SlrCRK*re-5fl4VRAgW0c?m{V1(F0lNn|8pFe7MQS7#@kAiB?= zKYv6l!`?h0N-o1dheCUrjFfZ=Xnp)czf2D|c9N1PgoNsFDaAJ?tKR+jgtk7C=XG|F zQEKj2S^vTbi5VIJn_61Dc7CJc89_IoBk(?8(?b2xF)*OVw0(XTj$x+U_q*Ej7HR0| z?|*K3mOlEGQ_^~Td^``D3$wE~fVcxh#zsdc&U7jb%KB!7c;XpyoT752k3FJu}aFyxI2jNZE0$PO}csOR)*QKU4`$- z(ZbVPek;g&chJ${@TbmURS6opH^<9>L876hm06IImzS54vY4TqrV%b+zZCS6=HU2v z#ID3QH@;?bb=3t<@4>87lw6LtCgFdQ-MZGsW=XKk4%dc2#n_^t)q{eLE)%F7T6(vf z8ArWQoqzxNGY3r!)6o46HuH#t1fNM~Wn)7}cRocX!fG^sw*CW(m6a8^w+6hXye#;h z<>h10RO``va!SgEu`!pvq!(aQf3v4&28$YMs;l7vC)3wg+yVlVU0s_+J%SCY!LHcM zF~~?rEFwH&|F!3THvT`2`~UC{!eS2|K70u0CtcRXWo6UQ3%}l70tpjzkeqp)|JQ2I zm{EnT!5zJa*&UUR;K&CZ@w8x`n9%t~5&X1LdH20IlsK;g;Ycf2rZ@PY&?-;4t}`Cy$Ha_-ad9}TycA5ZHZkEe?ToCh=BGf%#>U3N67am>X<&h9 z$~m|Xgc&Rnp5Er>=I(B*h1Srvwl>ZYO&uM6uPb*lGBS8F>|LHlK~g2vHZbyOXe6K9 zD|s_u3Tl8iFC!xZA#xRb=h70F+tCIPFh|zv)hFt_yuhG=SUWgaEZBj}g2aHdQUIz2 ze!*(0`gAZu8Ra(S-2gEuDJh1I?kM(_!9fR5B;dO!r^=Ei!Fg4>87n6z78X{H#vgFG ze!wp!b#inpDJ%0@j(f+XUt4W4!lbM`z-zyh&kz$6!)HF2j*N2K*w{E-C37v1mY&|; z!NDD_;{x-qgYAJZ4US@1XSp?$lImXD-x3Rjc>W6KT|;cYBCl)DLk4IGh~ctS!U5g; z(6h{}UAl3wI#0yZ`_%vTD)iI^E1Ul_Hx zy16myl<$zmAQLj(K(8F+Bkt z`}#7Akz9&Dzz-b+%Rk(y+OFkuKiP?1SJd|b+8O6z3v?^M?IV@XG{YZpnyb7>Dq5dL7b2;WKy7vPL{n4B())Lgjx{d( zrd{-ZC}w`5K`x7Q>A1fnhwaC1*m&nq;^)iA@Nh18O}FDM+6RGPvued8?5487T$g=% z-U8Rq@q9HPJj}1DsR3-!L!c{~6MP?Z#$BwYCBTuS9~N<`X;(DS+LI(oi7!FK-0~SJ z;t~>Y%*y-psd$P~P2nhv^n=B5PrI`pTSM3Z;##P53do?epdf>%>6M`&o9n^KUjoeD zA7DEN>PkxA;^H2Kv}6%d;(vyGYM{TLheUp{swp-uPL)m-j>3hQ2AZ2wyAR>@^(q}Q z;8wyS(=IzFCj>VYUcfy4yML~3)o_XoL4gMU+tGZ;z`aNZ@4z0oGi27lx z;*8kHk-hH&;C>}9G4XMftkc=So5L1Z)Yq?HcXoE(zegesc?YvB0>eS^%ppT^O^a%n zP0tIaPAV)cgiyz=BH)KZc64~y)!og-&b~fgwhh$eFzH2DR#p}}1%(Jxgcl4h5fl_$ z+YJZ^P$d|zbhNmC|9gIZejqED0tOlyc@l8aAYlgXptOKqhRPL$D%A+Mv{7T%`uU>$ z&Kmn2B)R+B2{8cY-@JJ<2#N_vWgs0mf*UM>4SP0N_4#uL*cSn#77%TxLf$0TDHdQ)>f_Mcqwd&>oL9XKw?S9DN-VKveN1w z9}J)oFyVg&ci?z_WO?Z9BT@k5IOwzp6ib4g_w(^l?F9DyK#`dO@PQFzV9oqj&lj^+ zAl_^D+0Fj((XDh)#L=&I?i(0TX22)F#~*&FprN7h>Q!PzMMYfPWa4vg3Q9_g++i}LDzJ9T$;y(KG%(y?vD9*$uC@S#0zn%BEKm?& zcYz<$qI!T-@;jd)YyFxPDRH)dAto*^XE&Q4iQ^UmQ9+_aB*;5|fE9dwnCGR+?FgCa zhYuhAW}_mlVg5I1E^C8e`@dOZ{C}xS{{Q?P1VyGdh>>3P#ieGCk4^MB8}=70B?VF1 zFjFB(0hJyfj(2wo?w@i>3cS?xl|7PivJxQZpKks;-dX&7t&gnGu>Et!wn(-|TVo}8 z=7+z}>%D8~7+#VH>GYWFOp*2s6}@Msk--c(%a6x+h*yq^JWUuc7~y%c@J4{3aC*Au z@nP=mhCDjOCJoMH6TUfgC-ceKQzFBh1&pK(8ALQLB zdb{JASXlJ|d9x|$S!X1D#JGOd)Nt!RHg8x75CPzC9fLN0d1_!a0rShF#K zo=M33ur!%qHX!!RYDLX*o7sGW2Dqv?nyo0%pV`d|SOvuU3&NU^fIaKSVJq#LA6*#|n5aoGA zw1$3T%2@}%4tNw$QLYyw^p}7cW53i1ctEapnH97#9&b;N*s(Hn4DYof6XJt=hOtr^ zer^XVp|P|)@TQucWT=>%n3O=|J2`RoHGn3f@oY_Y!G!JY?d#1l z=1CIeWouNA#FsQ67Kvb@l&cdcmZN0F#o!uLJjz2qPqh>rI!_zd7eZNVukSch{#2pc zo~q%4bWOeavse=JL_vqL-X#=s!LT@De&-#?KSV`DQsv`-0Y0qd*#v2ocrX#?tNQm) z+0iPeKB1;oj|~xWJ9?|A*jH{lKS(C=g=DPG>)NR03l{&x_rb zqoX5m_ng;dwpSOYPMd$Bt~^>Ffo#uA44POj^=e!p4*Goh6f5YVrA;-`{s9G5tN68n znHe{ve1Ub5su=Qea&QUj#c|#B=E@2bF(pucu9+&x${y_QqG4ej7=KOd& zAtGV~VgYQIsvx0WNnWP3oSdV*J!D_eDJd!Nm+(Tct@AT8y^vi)$iCYLJ(~E;df8U) z>%)w0Zf-sziuMWml@7ElEH4@G->nTIxx$Ve%m=QPtU8g1W#!(*!MmS8)<2DzXpVQL%j!e7oo4q$}u7m^tAjCH7ne;-VM84^WIl;R_nI zw6LI}l46^}f$x-)=+C5AqphM-mLOj$D^8HN)zg`q`&%ftycw_W~IoX}(ELOa> za0gR~t=pWeiZF=W+p{}5MDYZ*2C$T&1Nd~&F)@H~#9i{u&|e>_BwW=wuB&xT>xJRp z(4zI#YrA`CS@Il#(Yje$>@t5=h0d-UnkO$xx*4CqaGvuJ0sj>4AYC8cKV zDxm&i=zu2lroVro_q%|h%Io?HaEc-Z`tNP9*Ga#AX@(!}?3BYWt1gdPFm@;b)nzxQ zYR;i0h%U3gT!{!{K%{=88Wdh^UP0QZBlA+fgnCT+KXS8+Lv?SsBI3ez{uURyb997% z=jQJ2t}3-9R5&g3UGW0imuAq4auRkMO1`P7sl4;xU*f@MkN_DP8BtPF!lXA4fG(>P zMW_m9Rb^#norp)5uBeBb_v_*8hkpBYMJkYyK-x7h%D~Gz*0Jst(ovG1AIb5izYHe) zEhl)ny1J?ruYwyfQrCtdd~cu~Rtaa{nIFnZ3Ta8nUX6T6Fag?lF~4R?O#vB_w)VK! z#Zjh*s;&%Ftw0hb%`Yig+&^8L4a@+a45+9W+$gP-u>mpwV=-T`KYYFs7}6EPtso_} zI#FSd<&i|snFne_E+<4A%m`O=XC7VC3usnEu5n=s7;Dt|B6_2rIP>d4l8Hmgf6^{z z3(Yjp;tjK7L;jrUAGn#zVsuU8v+2G9gdE>!Gq#xi}IXO1c}Th; z)`*IV0$RP_&9|)*4@2@kkNouY^#w8s@R@xtk8X#?$JYY06p~};3%$D7?}5^NaP%#t z^9BY6kTQU`JAps#Ne~i(-=F;|MT*e*VjjCUrCD)ILAj3o~CylW@ zbAGsfd^B#Yt*Lo>diqGvy&RRb5gn9PO3e4uF(Cv zh@r}QS`cQbSy-&Ufm9%p<+(>~h52tP3n=N!ZwgN6St7?i;j&4;ccrcNl`Ji85ds&exy7dT*RZK-m=}+NC z(`Nz!0f8pNf-^eu3LS_YaACbh!Cl9CGCrrbu;prMYT#@DJIkg?^tH~*EI`pyFTT4Y zZUluT1l55hZZ4<#b?HktB|y%wu$O0oyAXG$e|e-msp4yZ&!Cb2>Vq#qikX?21>*mdwSy!yAZe3S6 z&48SdS+lUQrzh`smbnsUF7>X(==-}nFA2bYVM72%g_6**HV{4W88iuYbaf3m;x!`) zjQyBZU>^kSXo1LmadAO6y_ZXx@bzo&duDtitJF1kyD+v=0aOVgpWYj#2*vYNv) zP4)Cvco7S94;&*4B!7-*>t2RE`CgsO#7>t#wszwN>DtGZc>vpF=AChHLT+DByf`Vi ztrLC4b2!4U8-X+w{U~epgQBpQg2GDW4d+Lg9fg&-$inx1K6dqFEwd38M9Ov%CCB?4P2vB<50^rlOv3VVBA?NrkVTSuAupCI^6KON09HMsfB*mh literal 55155 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 literal 24844 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 F{{n|mRGk0- diff --git a/man/figures/plot_rotate_2-1.png b/man/figures/plot_rotate_2-1.png index a9aba09d52bb2693cd2f7a5323e3962872976a3f..2600394971fbe6f80b3208e4683d5ecb6f3774ab 100644 GIT binary patch literal 13304 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 literal 29046 zcmeFZbx@V<+cvuBP)a}^P^3Xx329g;NJ&el0@4j4-HIRxi;_la(cO(jcQ;CRckOEl zJim9(-ZOiDv%fv_eKYSLFtAwbzOVbb&N$BFJWf6;$VuQ}lVL+35F9B$ zn!!W|uef}g=7K;_aZR5+Q!sxf@yy!7+D_T#m4T6jk(H61sezKjQwW4NI9Nr;kPYeUtLn)bK&Y;id6v zzJdf&z@-03E^iz4A0x;G@y}u%FI3Uf7OdgdM_4}uEaEBu-1%MxQTrzmZ>zXFCX6FM zPn_jp_NR*<;{h0pGzXff81`G^A%fhQd5qNU;;m0|V&!Q1>wHf=%f%<+oh)zwdza93r@DBqO*V_9_4q4ee zy^YN9ff!@_Y2SB_O@eK|HpI@#9_z(pJ9;R^-(J9b0Gav2#9HWbNb{gj)|4rrJy^}; zN%Ky?QRTwjH^}ZAtj4DN!##ZIZvsVGHiBk%2vp(1Kh&}kqo1DZu~rcMq7!fXlgc!^}Fg}u7WS{8RRm--Yws@+QF{I(^l{#{ikD^= zEvrktkDg{+(roo)f7>)sp{c#?;cSxQ*n{=PhGyWg6uT76_vk)#_}n8>s#HoCL#wjk zC&ONTXB%Yw!pd}~KUl+!PUuH_Xe@Z9u;E!~Vbep$D4qNH+ zyIZLR)jU^Csu{9hcAzyTGh=mV85>Bj>%RP^w>Vs=x5%S;`vSuQ#dCFBwSs$|lGGFpZq*ZHigt*5)w>!@V|1;vxx-cwn0f0VjDp^Cc4|)e zcb9#VU6SpzSBuUJo1LDWo-Kual7!iS^Cp-1MnP&3_JV1&;zZI@%@J0?hlc(_-@bn{ zl#yQ|e(#6%irwWcPYz))iB1iAbD_0ij(e^bNtXSZRc^`9Z;_YJqtF@LGG;e9QRJ*< z{b-~_NU8lTYh3)+_cPvl$Ow%Uc>l8Bwh%;n?WX6(B}^pp&Bm8>I;dW8ZF|6Oxwswo z&nMG_(z4if)Sa+&SII zJ_()oj6vW~vz!laCKsjW)TI51m+@@fCL~ulGP^|82 zy|bd5f{eJ;>0X|mySVS73`|2RlP^&&>E7M?X)x3d0tBy-y3`w4SqKyO854r^!4!fD zenJ9YWZ(-COOS6~K~7Fax%nAs2Jy!`dgBui2oxeECi?On(%K}3{!8(T#%(@`>52UqDTNIA3RH8J^TOl&6&n zlREFQeGMUt{Pw~24o)s6v>l_rvCUNPLHs}JM#jd`pGoIgZ2~!X;Xxn41zwEsG5)&^ z4alg;+ggVa_ixr6@W0espms01+N21s&V+ISSzMf&;sxRHtFMyJV_ORAse@O42x=Kp z;-Z=$1^Y^81YDgiDq*ETZc8PF*pLPBv3){I&tvLasu<%iBg~iiU<2k|?6|JZOq*(} zSu^bCsyKF@s)E4sYOmhd=20+o4p;(>aeLU+eQk0Z6IsH{mg!0=%=KE0SVWVH(J-OR zS`o8X_B4a+tr{$bjg7(?YbcH;yNb>>OO70dPYDV3V`>)rYfX*6ksWh_Ci<*B>HC!r z@SbL?J)85Exu0lTyoiPLyva3%j1l$fNPgdP;2T)kb&hP=WESsJ77wwefyEPD*p8rh z+km@%CpK`sTDl-@azESSeb@)40XlIih@+HvnC#VGn3VOqu)`wb#LQF(mz@ob9>f?> zDb$1KK7MZD4ME(-3y%6+9{<>*>4NbKcAmGSwJd@2wk83&pV(7MGGuMDUWJAGS3Aio zra#0HCe;u$w-7W(vWEB6NmH5Kop+Lol=hx274Q#|!536l+cd&nXy_~X^l9>Y^pssS zw7;7`1U4a!t@-)YCcHxC<`h#340ez&MOI3P`sfEOMO{K6V>RuX)%2d2&~EMO3VC<2 zyR(y)oD9V-dlvN!mH_wr(@FQZBWXcO*`wa^vWKd*EBslpLGf2%mq~hhet1IDN4XOo zlHi6-oBUu&f%yeGjf&~@&z_dpti=zSV<@BdJIYyn7E4*+X=$`lQbqK4=&11Dd%2^% zFS->+jjxBCm6Zicd@$$i7}=rl@+IvFUR7c@qm(bnxxTFuB%8v|)YKFfzn1G+pJE&A zXRl*|pXzJ}{&4IRt1KrMGP^@01?Sch*F7yiij1I4z$3`gsN3^gj9+JoVqOF(d6wwe4?gPp;1&`(=TW9R%k72`)l1 zS~Tp@Y>i6I3^rOrFC^sZ@C;C^AJE$=oX?E*dQ0Bp@GUT4M2=*ILNrHH?&Dp#F~%*y zGpDdmr7+To1S28hEVI^m7E#JOz}LeR=D*w=EfnKH@R9ml(>8Vg-SzGPA(DuW3BG3a zZodK@J3blw06(vi_hHXd{O%L}y{b1av3i~O+=7}o_61MP_zUyGUjODGZHI3c64v#v zf&;p{h?fUN=Z>D(28tCKP=hrSzLg97yJqMdnia*V+Lme3dcU5SoCQN)T1ZQtXG!$V zJ?|xKn_I%wQ}H-gH_60W;@bVGT)a<|)*X|)M@|O(R`z| zLJfFfon}eIEyT?z^HJ|=bvx^ojaJv`>ZG+(*{V2TuRaBNfJBu{AS8|o9|Z}y=bvPI>FW?6ll=U>q?z;K*T zl=6Q6V8UEtjRy2?}Dz(IS$of=UAg1grOmZlPn31ZuiCTN!dY? z3g>x_;PGtu%-_wiA~|~XwS_QgjlwI9W?C!CbXk1kCx zQts-xm6hW-)je@`PBX(zNk=u~0FDGcjDP&>?}1VVG_J5x5B8y`5oz?ZvrghyesaR( zRrG=kd@OsKc!dBSN|7wKW$tFz9Uyawe#W1p7Fh-a6oJ(tb7VLaIw*! z;h3VD5ko?!;ww^ZQ5HihE-p6QoT^hQNaQx)L>!t;QDd2LV5u1`hoiS7@v5n0^Z^lH zrgzXSv7y=Lz}Bp?V|}t4Q$GtcHC&wJ(9+XOpP%f{|NcM`rCDa??F(*NsS2g|nZ^3m zUNyjCf~v3M#42H@q1mpwT)}W+7i__y8?iD}Yvy#bAsX%0-Ihw*S;MoVZThYI0&jEc zVyD3-dNHF7SrS&AX@rr`2MV56wV+)Rj8=6=ic|I5(n4>6>g{bUNtsc5l-*|Cp|rGg z;MX3lt(ce?Bo+WhIGi@LODv9e=3((2Nsv18(g+l*N=r< z4_dks1kQPaT2{}_+@uQM7tqu3Elz2?di8ZVA3qG4Vn!4s1+j*QCOp{iG#?-2*49>A z>9;S02c&k>ha;3>gb90^fxo7mcpdRW`eQ9W!ooCF4(8D>gjlB4X~)YqVROkmhyx$S_M0Miad-4Tp-JcM@M0ax)x7= z{WJV~W3ndQY%n_ndmv#ct;v|{qW*i;{cpByWw_eqYT$4otdl zrfOt>_37-3TQQ3!s}<;`h$zG5xLK2%$(`cazx3+oIIa#Yu#8b>u@cY%J8#TF-p||o z<<1}Q;>7(jJd`VmA7a{)B}h1x<@mh*;1<4@9o>)MMyF|aV@-a3r}FooG_x$n%ir*4 z1mEM4E_u`W=a;t+wU<`~YJRCtXEnDNy_Tp+_I{Sfg)OyEU?<*6-W_E!c1(OPm#=pj zpGhK*#U9Uv%eMuw*PB?`ubLdu%f^053dL=FjxeidXct2|VxE$imEzzTSh>Z8nOSUh zS{d5Uj(3f=W}4nK2H-w&S^E0n{-8wuH~%@vUx&u5go1aYMT*^JmVipgPQRNC=5Sb2 z7%el89>`LL+u?R7UO6I^lEu5x`QEp&$Y25+xL4P@)YfuWHO=tft4slywf|g53H!?V z!On04N6pV-;?3RaDkr0z|1_y)(>j9edf3d$d z4HU8xn@yd1wN~(yJOC5cDSnPXzKLTt!4RZO^X$M+SGgS|`2Swa)fWH1+nLtcG}s*%m$i&nx1H%7Cfm;>K(s$ge=!egE_4um8M4OiT&M%cMM| z`L~qxqXS^+F3G+Byz=s;7o;@BXYKRfbc6VY9|b`&QP;Nk^zSPQib%*kf!M_&|GEAD z$buqS3$3SxWBBYdSTu^o_DH7@fd!Esw?M6sdAK@4KzEY(lL5( zV^WK)YVHogy=zZ5YWf;HJ!76&#@=@vP^`CfzA8(A2i*bgtmG0RnYG`P{qN9y>MnOHUQDLR?QE=5O&1HWjQoRfLW(PvR4mhp! z_0ma6N`^8jXGntjeg2C<$YYx6Bh z0s0d}3+9F9DJtwwq@2G{CmJkYuzOGgHgL74Pz+~#obol{kwBS z$!G&{`zx_Zrp!xIb*`PXd#FkISx>IxAk-hRpdZa$kyKl~5)@K!xdf(Jh5IPiN2g8M z$oh`tC5)t)_w^4B7qH=X3|V|HfHUQ?t=!>OUt1BB)AI2y5rKbptCozeDH; z3J-O395UL93A-R#`i)Jb6lL~FhkjWO>nXwJg``h6yE%{5gHgJ}!ly)vOlC3VyqNHY ztw&AQSsa`iU5;uVlL4OU&E8$Zb6i%nXf_?gpw&)>XTphti^=j{QLa?d8Byg z$^~4z(J5LbT6ZMAqxYvzw@HOuN@EU{G482kDbX=GKV)KpU7jt9a2Wi$4FU+yxne=x zfhOT?2|AQ`)a#A=1fZ-o=3~O1kBeo~aA8s@hD`QEY;0^XjE5?!vB1Dtv?~>+Tvl1Z zqMhda2<7nIpAuf7cqG&mL|vz2-KF{>S=1MOXQO7bZLT#uD33s+)FccTf8CEA6deV1 z^@nPD?qw#oax<(Zt7A4GC+Z4!u3cVC-b-t%w`AeP6Oc$)@N!`TZx2@(tLRj6r_B zQNBwz)AlM{3wx!pI@gMqd76WY-qnN&Tt}Y}NN^Zk?zc%%o)%jCE_)@2+7&sd4tsUN zwx$D_iha2nC3l>MhlJOovrTswI#XyCrLOH-p$dfb$ko=~`z*=s!VM=Y%+4!W@E185 zLf>?)O9a-Rl=zail3ndS@m&zdA5mf01bI!lOxL^DI1^=hCW@SGJ=4p9U)t$jM{}ql zf=!xjQzU<@6jec_JWJ5gnyE*^9@pN%<2;%{LD@h(O)L1G>MP!>tM zHRFqS60&zNZr%RlBcah~u@O>gx1*m62pxuieEhFbn-JX1)p6zMjwvL&Vs0I4dj0lr zma>FZ)cPdA@Ia-p!wZi82x8&n^VfSh-vw??8{CBT$)D6ySEE2_#`0gp-IT@Utor~YDYaVxdUeHju?}cgGG@<1);l+qwFMbO_Cnb_- zsrfXDljs2CZy6qERV`&zHGg-SKv_v?EtVB?II3)!fVX@OKSa ztFwvnG|OO@7l#d^yMk5|ynIW^zCQT|RM+MQFtp; zIdX$BK=|_9pF|fk796q%ufA1J^1UMb>(kR_h2F}{$>|n~Ndkr`xYdY4|J{DEE0UD+ zO-lr$GBS23;O?s@(MYuM3*)b88_F40MENiXH<0Pi)8a85%8jY2OZ@WXAqbfZPij5i zJL30&0B?A-_4^{oIr!Q|9}ogSqVCUM#!Kc90x*K1^;}C>UyAsxU9L3!wCfwUto{<Hmgg;yFDYbK zA`BN9si>M5H8}F-VoBGFe@CRr$;qsw4(A;-yp^^~3BTwRpWPIQ=eLOq$7Pb0lEQ)q zSOh@`d+l+=^pXK@QEWFaZT|-Zia3uXKs#`B`wvq(0Lr4b`z5I{;0pTt``brS>{Lzl zM)XTiUUv23tvw{GUBUSW=${bGVC)mzo+RB8dRx!YS(h`GL?kVS0fZ zbhi(a9JB#-?6sNhj33_$HbW6Y1kCp&^Z)H=+t(92xK(&G@G4)V#F=WQ5G@ui$j4 zaC#2gKR-|eC|z&xqB%Gk9c7iN)}@XZ&dznGgtyB8mplpYmPgqB-ZIVk>0z{Ke}*%> zFyaRENn_gFsz=4TMa{Yes-sp!u9$Y)m2Kqw#SJ+JQEe{4X)0_sM1ZYtbmr*#N%3ir zG@%Bl6y0#0+IK~_9|-bN9+e91Jx<^k{}&I|0z9|^^0P&2X~Cj#lKWjQ&+1xmZ_(j@ z<5Ml@xvT`cIH)j|M(#FKct!xePY;nAK|gVUApWz^!56pvK{XDW8K_$1hmPx%3VnyX zhlJA|l*cSOlUvdSBcOTSa(O;|*;;ovWp4G8gqS#H@%t+6UI(5gR?GeC)QAD{9e<@= zZERVR=Y@vL-V#-N6e}S)K?B0e#_P<7^WXTm6hy_@U2kP0q9n-o%e*CcvXr_I7SBI< z=UgbYs~hW@ZLdO*@49H)(cS>Iw6n1AK;(Vc5s_^z>l;-oBgd)9ZL10BST7hj_lAq{f_rdM2i-|H2 z&HMg`S3Cbs5?Ic&$mOUMV7brt;I(P}oFK<)0q0Sf%E-OOJxC;=#265dB(~PjxdPup zQ-QMAje@OOkf|4Qz99e0^mKtb)ltYb*b_f-{MJ~^j z^Q#ufcF&Fj5(9j15J47rM|xl3w;<%hNvEW})#1;}3AO4~5r2ydz=FLH+eGkJpx!%K zEs)XFj6DNzUlgwb)cnV5CEXp>fKilkadGKc{}&8kut6a%GjG?Ny+EH;9I4ymP~_7= z_rS|^X=2mS;`G}6A+3uX<}*#-?qV3O9GS3NrFA&iM#Nc)MN9C{FD~ATPD@LZOk$dw zCAoW7`gKZ)Rm2=1b*`!e`E|gjV2yH<-OCPNV5Xv?B7@&rzAxv{XU<6GIZcIhZcX#I zV32(N{5h|E)?#wCgZVU0r`msu2HD(?XWT+#f6!tQSv5Do|Vkad@Ck4mTcSJ-v#;HX6VF5 z3BSZ?Q@1}bA$~31v%a{bgnU>t|8o(*LfNUvjtu;!Tcn_~sBpR9AQ1np_cek9$}#<( z7dTg=?G1uSD*!?B$-cNSE$ccJKzL9Cpqe6hIAK4(ac>=mYo?Ea0gbo!$&A~TDT*mI z^2uU`vCuV#R5c=C8$97{?2CBb-nn^ij0cbMz7Feo*1asyokWE{?xrQZCL_Hw0bTjr zKPEg^vy6$dWk9R?aN4tBIrWKQ3%==CY1ZCyKgPowr$DrUcry(dh>F1ScGfGV+j_n} zLn+?vd4|^-%WXafvTrnCSJ88W=HetCIMc#DERNj7;`hKo+Z$i0%wsLhP$x`DY6*b) zg4|{XBzzT@gEdBm1P54091pubIUxW4g5n!IFA=r$?G`&%|Ghep%u+-yq%clv52sua zB#%b9Ma(7BO)cbw0m|*oCTT~ru#Kw42b{!2TP&TEc{sD1Sy?G(*UqWII^&d0}KCKY#KrcC7kyqdRl!l7`xrUInYyd(I zn~!+U_Zv5@t{;NdMmyhPJk3uGa!}Vw%LyMFVl2e7Tt`i)5jb7d_tedpGWsCh?11zk z{pQV^k5bF~P=3sh5H1#_C)a&M6|kuMY&L7d1HjCXxN|K6b3xE343jY=2C*#V4$_c?_>PC=lZZ`ULwWD#%ppu=o*eOPGk&ckdLaZ z6~v2%rQEE`6uHzZivIgf0M>oav+b0M-!*U7nGp6}MZW1dUI(Jb8ylq`9F5-BwH;*! zSl;9L&)wk-Akq}u&OTQ@B4$>NfG$lph#;9@fol0L7dJx=4r+5C-CTMH*i67h=ndKt zMgzrL(!N~Q^#vi`U$AwZup*NmViezNGr-yC)d1Nel{ zYNbg3pPxZSJ;|bf$s$0N0NC6Pnn0bO{~%b*DbGuHP#0)SXdzt@l3vkh|DbKok2xxg zzTKEGMec}XR%-((pB}K2#a5I22%gkps#fE9Fd3ap6iZmRyl@NyEnntT%QZ^B(U-7L zJ#yJIY3=Ofu9yZHk{Q$-^_Hb{dw_Y3WN$cAiel4YLX^tZ9JNcLAD|B2{HSJ9iuX47Ws;$b^Yp9=CAGt1#Q6~_{ zWvbd_`2{{28eie$d8VRkSKhd*PgGm8`guY^6ndKf#@JZm>; z^32SZ+g*LTd~~K;DHJRSqF-N9MuyYAh5x72E?V?1+$ z6U_OpQz-?vm1V36UY=?Dy+y=iXR*N;$;#syy3-PGt9(y zi579rbX;#LFabq`GKTsI{N}@``1qh*0d8>}MDPQ$!4ti#;v>Bdgur=_9u8mEj^H}b zmjLdkwsp2%pDOquP_Lo?=ePf9>b2{D0B#McZJg_p2K*+b0{Yh36Y;limJIcRM412k z08q+o;F5~-3x@xBYSd(Hl>hvu2>KwwOgs!%^$X&Il#qF{|KGO&-wDxiDh9Z^l9>nX zI<_(*x5~9*9z%ir36Q+8Zb!dAz~bXsK$MFFC|i4FAd4_q*&g>g%^oEoXkTnwnn$23 zehhLd0Ij-VAmhn{ZarPM$fesvL=xz)B93c@2*f-10P1l-Wg}>8ri12gU*W4~QZh2( z00OAjpC4#3GBE`nRq@^AyfZpbM>nv%o454_t!YWXx4ETTfb!YIvj@N*X#h?-b`U*t z06L6x%|&{dRI(*OtNeI-{hzNSWSA1G+F$QB{ik;(Aa6DgO6yj}<6gH=c#jzhJWyb{ z0S~CAs7vn@spJAXGSESZ7coN~udt5JR>?W(f;XjSOx8G^A|pa++n2`%9dkN&S}cJx`{xd5P0!cn(5)gN6vPAAA&qg3wP&<;GlosOTj=_7jm#ZzL?qA_)#tv zZgS@S!QQg6Q|feJ{4(+Vf8~Oi+(8q(1EW~S1i&$Xe1u%Xs)R($hgfz!K;-SKcXuW9 zQw4yiLN-m;(8x$iNePygk@0+m=oN*UZ(T$Lkp$XfG8PjO?DHOb={|PG<>h6$){xc@ z9z}iZ+9&D17+ZllOq>(I%ijY?{~?6K5rnWgYUw6?>U~9c{gBqCn|+1&(G@iVbpW1} zI@_UfpVDT`6y6Fbc_Tm~WYE1lbvf9W97p1#xpig4Kcc;%>dzt5GATLp>A@zPzn@HUWWkxlPYIHgl?7zW%X<7)Zj;iTD6P?>WZ`)^YZ zzXCXnt=9gwmJNAhipULP9}tWvoMyW;{>_V(2*>$X8G{H07GTN${g(e(`yv@K4pX*4 zea)f}q4Mz9zF6#z7)(IzqpcOM(A81)5`qIr`fl-iz9B?JWjjqHL5Swc*98l@cm!wDVA z8jJ$mmbMM^Vd?$Hopgt%LaJL;&uA-_3idTT>$>VJb7<@OjtU$VT~rLw0`ltP!FPJy zC&oh7C+s^`6{+c3!7J$tuO+M!wNF-G#5CAP8rcAhx6bNuFw{+5OX z=jcmHe`fn2_TZz_k8w|Ast0{cxra`a>WL$8^|n52x^I)94V?_>dD3ulI(=zW8g3|g zlP6f?P-WdObbQ>mKfYa#=KVp~m92s*R+fT!sBw z8;q)i27FmIA05Yq+f1!Jywfz1Otwpz*&B|ir%y)(-b(Jz8Eyw@&^4Q(x!WE~Pd`br z9(kw|G-=meR!&;BRzNve@%RcP{gF<7rzNXRocN6zKM)G4S3_gt55-wTFoK&1U zf2{gQL(sA;S9N2AF}Savwz*oIf@NN_`PLxk$VJ@YMkGbvOu3b2b-Z?iRiSK3Jxlir z#%gJVbs03r{&grjNl{x4&^evtx9tCeB~!sir=iECtd#3{Dv9Zb5aI%o_ZJ*$W|o}> zhksB#!d-?rNcb2ERcqWaqn8dFoaS`5A(z@zlqpsvl9tmz${fUunM$o*I!=kfEp9u| zJF&GsYVI(Jn%S!aNbo53AS9?>mB#a zIJ&W)oGWX-hAqoyx39p{Tb&pVLUolrVX;H&Cle`8t1d!S?Vi(^mtG>J?Q3Xo=>M`t za@{De#yhhdyM0_Lap*N)E7~Z9Y<`dzT`!`$(hi)RWqI3D?>N0%jlOZf+pC-1RcA`; zylBwarD`9Id8>VLI4+~*yTlY-bVc)WJcW5CmobiG z@QrEN$grU3HcpvnsqRhB;^))W2i)lqp34bc-h7C$oP-@kW9VMImCa*?v+w^L{MT8`sNUF5OpHeiT)!}eQr_T*Q&D(HY5Zh^wZy4|$6aW@+)aa#(;Ci|wKF{FUtDfPj%z8-L`;XCcVWq~UqZ_V>O(r8grSbOTDfyc>y!LB>W{Tc%YIMr9J3LTtHw`1`ug}zA(pU=ozL%>GPp(-eWORL4%BC^RXIH zA?KNvMh5m#GRHjCu0IuP6q~6NEnjrT)GMz*Qdw4qPHTp|QlnLC zS*;&%O203yewnDTQ%tLQDI+gkl5txu>>h57(%Z$&uupThm&cEYa_+T@)*EagBi*P4 zQIKt^Z4{orce8x~G%CoghUSLurlv39xP8;Hs%;{Z&Ocraouw7UnKp{B*M?Ad8%Nhu zw_-^Rl^S{b;vEvLabrI7sL}9PIj@RW*i?@xa?cnPPb-g~E-V;m(eKed)27?j=Y^fCPHGRjeZ3H#Uy7cU3BL2pL}l2%ZDtx+S zG~@3fI*dPjLEG}r*C<9B1oVKuK)XYDXTEbIRg58-qR6B)cdSB{e~@1(--P>7#_^vy z%pcOADpTEwzgoZsDlC^V#>(2>eIharnMOeysLCoaH~%8ZKbrbZ3wL7p=AXBYR!EUi zxK%qWZR=~hD!fCbMkEw0m5`5r3m9qd_*_el-<=24;wR8y>d`ubj~3eJ!SOEJdw1qF z_?+CS}v2Z_zr|rn1D#y3z4-Xzbf17G2AVNOP-3G%L)ETkG7Kv;pYFS&*JLMW=t~ zM^s%$dxtT`XQ4aCk{{GO}F;D3)tY<4dm1t|&oeStyd z>FexGcV2cbC>@m-)C4rj@H#){frZ>b!>+Ih`=-K7`_%%~! zCezGDRT?F@Qb*U=Cc0%*%%C9 zIw;_{b3o~v!W1g7&d}<b+L8|0e68V@Y4D=(e{sv81$g|wslHaKrlrqlQDhLL|4`bXL=pyWdm9P4 z=TYGZ5fUmBy@KKXqF_&i!=wK3`g4S-H)H%YwJ|C;@r>NA7p^AA~hU*$yYeeEob$3%IgT8Lv^)3W;@ppOy40g=5 zQuHz+O_Wz=!wbF6z4_f~?{U&s+6!cUuM8@E31>Z?cBg^GF}DiIg+>@u9~Xx^EWN59 zu7y(GMV^#%m8Gxk9pW!5A0v@|`V__`;^sAA>EOUp{GE?rD*_Oa@a*t!e$=6nk#yhR zr)-cXIme zbx{SG6}n6y-BEEqKeHO$4<{MGxIsAJE1R<*Kd&ee$^&2rzv^*YM2XN4l1r%)^wPgA zr0#0-VK!$#-*;5!X;nyrHd-FWHj%o)s~uk}y_j43g0U&K`3k#v&eDa?(^o$$!wx1L zVPVx`t7KSkTnqS*oj2r|i^;?jLm%bDhX^Yw6Wa>ZPhGIf(=Sd#UwShR`H+VjO#$u5 zz6ZJTQxPN_;dW`DtVi@RVrA{}ydQ&st)ZhY+O4f0&uEuUs4^*fPVnlKVF?TjXvwh* zIAjBDjEwB;-HaOB^UvJ(#vGL<`34aUrusmv-~QwAK!J$`eU_>A1PjCkoV}R@3Dkwo zI0l!RNx9D=7nP-EgKZvKE1N);*a9m5&XeQaMHxV>rb|aMWzdxlBruu!@{?{dwqQU?s-eZu&``ZUpC1m71hD;9@YJ%6(zjNr zGErS>x|w*-CK{EeA@`z@F(}*$C%^&J7xS16v>e7>l{g?)X#qzXIk7*$!~(pC4!`3H z(brUa^=kquGXO9ToiEdf)~<$V{>EuC&_V^RY{OCxGzYeSC4xVmd)@6BskB$U{wS2v z3P`;E(g$C$bG0huK!@P&$^u4hLWtWSLHj2k_Bb0LX8YA5l{(`{mb8;`#8mS#vf*ua zqEN^^v`sNMAcletNS&1I;=*-LK@-OQ4wbX5H`IqaNjL1)j?`U(fa=EgIQRaxngGcr zK0g6Wgwx*3%uAd}2kMKKz%K#MqmE=#NPUjOiI?e7LTU&PQOiBe&aD6rW&`E+!7Vn=yBymmLCqxWN%gCVN@`04=Tk?m#V25DgkaCan zlW)q6ZEs_NMuZfas+u-~JhrG=z;IrX1vFhvJg*s%Ujg>{J=U*C=?uukT-`c; zKh{~-aG>eMDtYqjkXvCi-I&PDD9BC_6<0wY9O=#vLiv_o!S`fmdVsQ|3N(iiK7#R1 z%zCq2zX`eO;$+nbsF4sdIct(9pZd-(PB(WzA2LR0uf3z;^4xkE$dvz)2q=(k{zOWH z5Lp3{TC-ZyGnRFP-f(TCCr%K7OEgMMo{3?0ks1&LJ%1s|HLaz1u3x@Jn=8IUI`!15mv32kNe04uD|CHWBPo8ngBYUV)@l8OoU&i zZJWt=8d2~9*ci~Tmk2`#q%Wr=o6z>;I!d~QnZJL);}OmD5FPSz2O7dACw;KLfc<{& z{WAkoOd9H&4I)N6&>1kF3=p{AHwFyt++vbv$N-~`tG4@}Hh7W;6GDk$-j1L3iCw39 z0CgVls88TagE`TpWoJPBEWQ$vFO-k2bmHXn9fzl~{B~H^5m0d$Aw*M6crN*1zD5${ z1OHXVzMXAbH>;**2_a?a54TKumM>9h-6tl~q{7qm8a!~jo%c$H0Zr-*80e+xfBbZ7 ztWCUTlJ?HQ3eQQl$L{>Y?~u8~*#V}?%mt+hda}9@D*Wj&|63$&KmjnC(b2^;%bi%0$QStX{Zu~w&T9Svmt3rXlswJx zVAMEH^#F{f0r|CM<%idD zU~RlY{(<{mua~R?WEhAU|0(>$gXzcISTb`xAr26h34&cgz5&5NK@`UBxNngB0oE`nM9-|;PtgvdY>1&fPY{aCDkiKxaj zLH6i{EeL|-O5jZ>$18g0&K)-qFy9UI;GBp_KLor%T8sy(-BByR_#?IB?a6{z7!M{c zc7Wt~7m8;KJv|5Q9z>V^eHqZkY0d8s>*1Lv>EH7NgE7Bs5Ya+4y2b)%)a}5)+h6fT z`QW_eSZNq|Gsf9%QVv>u0Wc8(M9#1}#oLH}{WeRoce~KxgaIa3s79GtB%OnT zcX2fPY*H2x=UUs^VC`%*EOYMEMZd|NCJ+iPX4@s_-G$Z^@u0aVEvqolt34hvFO&w2 z$W0)pbt#ZzBtW)h=m9ONs-r(aC~bL7zkwjm3Rw=vifhRN3>RQcAU_fG;^8#ziU5|l zS&VS1p5!K^`@b8VKqu?YITnwpd0shDGY5b*PKc=n>2P{kX+wjJi7NUnHy~X%NbJ57 zV*uJ+FRMYd!kiF+0!9%DQMn$ufxIefz68R*Y}A{MFH{l~?xg^tbk%wS_2C@2Qq-`n zt1Q36l0GsGjy8AWJ#MpzDq=T)blX6KoKzt#TF*nHl-m(8_5m7MUXEYut2XOT5z1RT zg!YwE)e~%{X*gEw{?Y#Ga5TuPA196U0o=(@QL8vTY`9!EcODeZL|_KSXCTMTZ+*v$ zzGq#l=-?{LGhyTVB8KDVMEUTJ`An`UXi(XK*#PMTe#g1O@3`SL8`Uy9J3Afxry_c8 z+x}Q{K$UF1lX5H&T58<=pb8k55zsa+xc&5fg#!gWWD}om6s$r#TKP3F-dhAD^jvQb z;z^NEsacXMG7*D6c{)Oa`8qXXTI~A=RrGZ#1xTuhZrQqnC8Ill-*W)2hJx(fHmIh@ zdW(cDBF?&gbmEuDN@i+@2brK*j=6YWTO_m5&Ri?~4F7zDvKWdW&IQnz80=&<6`_ZZ zQIDj{kc8vmNFv5ss(>Ih-Dz_wBPnO$70@wc-S<=O7M&n>n`tj&nQ zUm(L@_6l@g&8ui5khuTK=Z%owb{dii7&69EDoZj2Fj6*QiS_tTli9YrGZ=bfBPy&n z{VT^A##R@7qX^KaOlQL&Oxiv!ZeB% zT^aJCwX^y3AayU&(~Me@L3VSHyCR z%T=+_n%RWVvTD%Ko#kVBZdVMaL}@o1w}punF@a-AH35L>k*0zX}f8`Te~8Z-AqBajm=|59@DxLNy}vb>N{oBLW(bF8Jq8}D#AeyIm8 zOH`bX7=?s{mg*5gD<{N1wJ4ct;RX*u85$GA2xf^`xVL(rnb<5Raj6RdVeUCeBxxhM z#Xk%8a*Vk3@zz(flqHGfVLtTG>fck zqesL}Uz<&p;+buqMGR(Z{(%npOnaQls^+S{$_UxfD`+|Zb)UYbMVWO@`J>ec85cPL z)71ic%Sb>tfr-YWoC8&NB{Ed}qa^6tx8@txBfh}Dfhwm6%;cc zVVnt1Fl=>-zfdt5NLmPh!))_s9_QY(5fL&IUAtDgg*v%b!~F{4y7>Z>#&f;ghx{5^$Nmi%@=@ zFuBOINsPU_<>k05s3)rsa(uI7xM;-&{G6f8zc=x{)M5YlHh;Aq zigZG#E?m1Ws&zHLrt8J+g491{1sQU83MzhbFJtZjZE(*gui<2Mct&4+>~C6gh3FVh z6<_mH2`xRx6$bZ$ygV{(^XXyZMCa%AV1BD#2&(mFzbs@8ere46$0Eo}03e!4Mftfq zfEvW_X*5G%ZV5OeVhZ9#P%OGBKU$a;?4V+RPo^wgK?|K*vOnu{DV+kw?NKS~gjK%{ ze)n+Pwce~KuC1Z0pwi21bPN9J4D^`;R)>UaDZN!&hr;lKf`J+B&#A1iF$raB&(C1y z1=Zgr9}LnC- zAUQdFN~uP4nxiq7SgkCZn3+u}RLIw64~XQA99?z7JW=E6fx5BZ%L|NbYC>j|h} z!D~%32>XZuAlvyc#~ZSuF&LPfRWA3=zhlpp>cC-tMoJ9b$RUt;5W%KssD<<9L1tcq z1{#Ul1C1MTH)u?OzWFarn(mwO*eeJu@4pv=^xr#kZ4v)NHsdXcJ-4vX1~4?WbD)=j z^=Ps96N?f3sN)9QkpLc0UkoF+N3%x*krpcVNVQ`QP)knbg5(tgNG+bFw=53t0rShb z;;l`oK;`|7JO(D>nMjnYq4Rb2XfyZH%V}d`)KgJRPXrA4*mVmXez8Al2w9Sv-I{5z zOrlY)co9A6+$8d2)_)F+AN?QYo%L7K|KG-?L`6yzECfjb0cjnnpmcW*B?rP(I>rc5 z1QqEVAkr-O>(p97yL!ykr=Z!WpoJ1$zOYpH!;_iLPg zZIjvkc+AqTy3K)YHH=Z=1F#yB&@o}-BG_Bo8_&5wMO#4SLk1U4@!uR=>I`m=BEvVl zCalTuCPR@_r9on_vgk}@WiMFgRM4CoFN;af&t&StIECt3XDA|4=XDOpXLG)_kU83W zf8I*igJJaXOe_)zV--uGGBB!=djmu{j*enAMPk4xVhnV!zQUbA@feWmDE~g6@7B^? zc09v(Fj|EtZW&C*G**4%KLPb6^T48u1J7MO9a)@YJvf4Sfs}g1$RXl{@=BBg^Qy@& z`-eIv!>8te2P84^6{M_1$syv6V{(ImR;GgW2_R2XSM9*GYhY$(wjR{b3Z{`;fJDzt z4_L3?2ASIwVg_Q*JWiBAok}ae2NHU`SR@I343q`FCUgZiMb;Aj`|HA{)?Nt!Zfu_w zUTpEPK+e`R@m2P?P|Uc|WD3^%M|D~n3T8;*_Fj+&W{|&kSR37#f|HK+mHQq=-w?)R z7vOV+)4Yer+rgka2`8&inOPQoo%5U4b?&I?AOcR@vG?-wM0qBtVyK&5wH?k;e?gv{ zJyu%opTNNLCa(;Dq@HBBIj}enlmYyx!Q8#sdw z?QgH}CF90R)20J=`osa8ens3~t-ix9ERs$OD{c6K&Vz~}-WE-8Agl#D&~87XI!AvZ z2@@Ix89FXdSCc@7#(;k{4SHAd7$R zcLaA1KqrTbO+|-J`a#;W33#I;)B_+(m_6|q2(UG4yQ6>;!I&agi21GR?7>1h$|Uwq zS>Zq6f$l_EPfn%3hpgP%*-uSLfid`i%AQV5Q8W+ux7D2O_eujT58p~gL~nSvxLIc* zu~kk3i45!z>H`2_eot2pQzpvf*r5IMGIp_VD$A&dvHqBImbueIJn3c}()wN?Z%->g^WoMfNmNdm`>5$D*Ek%mTPs{9U>34f01Szl<342Hvy z5bDx14n#B$c~Uzo*bT|6m4gYz*9N;30m9|*&ID^|2o-HA<3;OP;H1LFiW2_5FtDd_ z;W3Rvjl21f;*CFW8^;PRS->XBP~2iLRXPIgoj)CrErl*tw zCWrdTP9~`n*ip{2P>(*TW>H>@K~ZbzX>|wOKCmk^0aF`DB(=Y17s6&1UoawB|3h}K}^02ElRk>OI?nNQmBe#!c!!|Mr zF#y-;!xpDHN7bCjiXqzM@qDI02W}OPX;R~ z%!xUdEvyGNRtq;qd^l~cSA3OsgC~xvtXdpGHDY6R(z`1jQ{!oYX(7>C@~)y zEk$PmBR%_m|8TCRHX`#`sMpMiDD2q^Qk&g#@cy3Q(4W7h$J=`&wi6`(5!SnChZ5n6 ztI2>e+0iOSA8A5-bj z->$wit@Gx7D!zM4mx_qb)K03%LAJlz*emQt+s&2_YS0xarJckE0~-Ly~Pr z6<&)}5$?I{UvQ%t6X8qU)g1cx`i3B&5UbFBy-0q390y)u9m-X1CHms&YNwMr0pSY$ z369O_YED4SBrBwl_K_qfoigEefD@B6-v$*9hFE)V@7E+vw)7P1&gisA{zYA+55!|R zaaWbLL9J0i-Addrr(Pi?22)rkjQ?&XOI-cR#cpL_GklVHwZa7{%08M!_0H4w4Fl6q z2n`04(=qyI*_IjoP;`!I5oYE{zb|F;)xFz&zpoI({Mu@wRQRZ#(4z?au&J6%ZcoRQPTmpF#NT&EpR^iZJ}*Tyy0C8LIIi~9%81sk$#nq* znqAD`_zN8JvW}puB2FZGL~e3MY34@0J zLI~k|g=1d_6$>*@EZIw3b)G{>#I=dm6+^sVWJ5j)i2 z8_slZh?mva^$T~XR(3_^cu>kZa6ITl#4+Y^S9*1S7*?>_^|ox5N=-M3j_rmVeAU6s zK~>KrC3?0s&G_^p6-hWe74~FsAKJfqz+t4%+KkHo z4K1j4D62+tL~dMzZ{S*%e=m%mB)5j@&Xj$DZz1pqb9^C%XjdcISSYoeNYGmPHPUQ$ zWSOrqr2eW#>H&dr*(%iE^|k>qSaNf;`H8>mn^V=e=%dqWB``87Oe#A7{AKW`Ul>dlMUqJTZ!zw3L69*ht90>gdGxO{0ego-Xmf z>m~$0eeh3HMXD{(IY(79XmFCdB5{mGps8h=H;b{5(+?VaUv0MB&NN<6Rb%xJc9%Km z1RR)txW?SNIWMCcRJC0bgY(e1G_Is9lJ2P9ECh#v*DOZ$ne;@Xbw@?Yh4W`XOW5dh)tGK8?%&|<721(I3P5UgPO$; zJ%bz`X}Dfk1hbROuV;`3OG{g+1Dq)>QT2Xy2F}RD4}AFFu^mueDG> zuvYGAa{mMTFqMPcQ}jftk6AsEfRl;irXPKv4k5l~kRGf*S<_E}IH68QLx$>gh%7F{ zXJcvUui9rgloA#3i7kAH(_4T`hu>f+*r>@h;t(r{PN|ODGaZxrX~+V5<_|XU$qL07 z!J^U}$YqVC=21^zXQzhfK_0$UV2}6*##53z2jIWxn)R>ZQ=izQu+1XE#gMtr3akc% zmoBS?Cx1P)AzU87%+JNKj=w-S*4KuD6SCY<5$#pRBIe2jdrwkQDE&9K%@WV3@8%4);MAFTFcX zgr;@8>R&pl9Q-vaW2s)|^`5^UYkRxeZLJ|eqn2Y?Jy=;xR^M51+XohT*ZG4X6GKua z`9L~Yr#(I)OB}M{bsf5swLy$y$Pmo%{N{*?RO7du$l3XDv@{S@N)@N}kA`jg1eTX_ z;|)|jB?$hSfn0|9p&{Ilk1w9tdF{AaS7#t1$$rFc!oJs!Bc1#O-9-yP@n zY@!R*Ggsy^t4WKImxSiQYFk1$^~cgpz#EmpVrupeiTl{Ts)3q^rW_Il%U}h7U(nwv z5-x(|j)uJbSvT+<{*PfZeH-{Ji4c{}xTP6@$RcK36pI%>>5Bw|=4= z3J+}rk|`~MF%YIo%j9z;wM9+&&5dk%gI`e+TK zzdS0MeDB`9=84vU-eFrx|D+=F-XW^q?aEWx#2-mtp_zGG#_k%cloa%kZo=lctqxUo z_Zfu*m1sNK%z(W$vASKaY(I3(I!7Su(#X(SE=^`bsg8F!_X_u=z(sqv1mV^Et_=2` zNT*T*EQinZ^KCFv7_Ermmkr4(ZP0E-g;Y1=oo1d7Ra>Jy{r7dUyvKtOr@-#h* z24aty+?2!QMXdDbK5`8s+~PhEj~I`C@>%D^%Ob_E@I2v!NJz`CTDHD`_#4hgnn*~& z>O~uq`JSDs9NULF1&uGOQ77*XvGnI)`FEtr{VIKdU7z>pxO<*nrJ=}s97!pj59&u5 z?xsS#it5oD^G+;qD|z!g?aR(Ib#G$R(Ao^RXYV|h@zt_JQ41D?158+r=hviuQjvPt zp<0kFYtJJU>`{_fEdOvLjcI>6w_&Ntg34;tRDV<8Vg1CL7thAts%6yn+7TvTDc9O< z7XW_TtHlbG>ATiR&5TN0JsFUfG3myqjngC&h1&0`le;>{EXk4%BcT3+VXTW-7Vhh%Hxf8z8D3( zqM*M8z+(NKwgTCWCPN^`a5GwpShCucd#6G8yTWz~by}15nLJoW=Uoe9kRDO3a9Pbl zk&Bs5=Plnp3o&y85tqFp1ElK>FQ!!Q+`ELeDs7S-+PHwD?TCpoAUIXwP-7{$ChqhL z3|E=8pyYBGV>PlO(XhvXws&vu$TDd;?7U|q*ydp6^m}aJNkg+`lGg$VR7AwgTD`d6 z4(lWeY8$F6-@mM=lQd((X)&}5%!|w1s2>m5cl`&~sl11ShS+R;KVHeoN0in~X>CEq z+-i8;XPf-?+#Q*+-O3SPiRJV&w|+iH$i6;&K=5;&1#`G-RsNpXMC&_;+~F0Qa(VzWrqmnoD^P@;{I<3vZ4#DIk;mLA%dFSK4=6z7waCmLB zaW~}pk@FM6Mnegbv0IjJ^$%D?Nh++O3|?~%f2=EJ_Q=r!)XbV{ zSi}DDk8d&>x9NOB6n>~vL9`(e8t_Z21xRfSts#eH(bP03%E;4ou5+L1y=c^6!(mSD zZA?3RTobp##dG7O|FYPxn{CRBtx6&S^zwNVtW)zw&K_@QJy>9x0vBn*&X|18C0t2gvaf7} z&jy&M%_ESKed|+`DKi64X9>;N;~^ zsOw{QW9nNwl0seSCa;(o*jtoCL*Umz?RObg+;qzLZZenN7_ zucVwsN>{Gbgcl!2Kf9K3^V?Ia3tR&oz*m)U?Or9|@m{iC*Pt0X8FJ?Pp)921&3rNT z)()>&^w$19(%uHTMnNt9yi6|brNqKycXuR;{v~gmU!JJd7h4gVCbKOfXSoi$s}*J6 zyMWaO59XhT)TyZ$twMoAiJ(d`z7jt;@q3Y0(?HH)+sI?B7_Z}l=Z$^WOCpry(Pns@i`uZ~s@uV~RMA~|P zPXK*cA`T`bTr9Rc{S>d?>!k&d?C=(_TqHPHR8{EOVRkaDsG;oh8A9p4RN=i_P!m`Y{$WGla@GtBolN2ExqeDv)?wI zcUyJkt<+lAxpt=D^I>s3k0@CcU0q$rcNV($@%Vb}@7uX&ZYSR2Wu}Y%DA9y!rayoF zpz%`O7Uyq=2ZOc|Ix5e2x6~(3PJ)6aU7v_i*Fi2#bh=o+q~-Ky&ZVQH^BxKjGA)Zo ze|q)>G>50O{`!@LW)R;+F}HuM0U42QwEcJ1WAW<|j}6PRUcD=a`b}2*KZ%nesYYie z*EQ@sRDEjr82N{{gK7SJf`p97r_(Pb<;uh;x{=bgMK*0LT-}UUBI=jG<=IK9HG*r+ zJWg4Z*-IJr&~E1;b=S(MgMy#K?RC=URxD<4P_JIVq(Zr=qlqJ4clgzrV@)MWqv+5x zYqpfarKrWVe8tr9z4f-JAxDfXL)zR>u_Mxn_>m&e_vnp6Tc=ocgxKxAJJ+8>*Ox#> zbG&NdSzh1OuMa5CHxhnF?F2@pbc~5cf1zi2xY^d=itl+f6=dlvU*#xZTaa5%n%yC@X5r}`Rt2ixS|yP1bgJTo+c zmS4=5*s!1VsKMvsWxRelv=iR3UH+)LCRs9aUiUiGC|wK{3lBmX8~rE`_LoK?5WJ#C|5q?Hdaza5}Fi%P2!x96}| zKbO7KZfoKg9nR>VoT27X^6??9tX~aQnrc>F3>)A`W^6f_X(CMytxGH%a)IN!tOwo8BWYTH5&k!R|xUqN>D)6k`(e0yHQI?lqM~{N^3gy|c|9gE@vK%ST zXk0jNR{!RsVXXM{hiutL=^WpGp6_91dt~LrYj>A5CghIt%W&mQ^CcGOo1}LiwPPQp z4=IRcTJcZuaNT@XH%#@=@{Dd%P1_p?H*;7Cys7ohW5~7S!=2&Z#y_|e7N*v zD4H_c0xm3Fx!SRL`E$2=%_EdAvGSFB)rxXpo}bKCr(S-PVIQPrd_w&yS6JHQsRwpH zlUKjRB{~J#vbe7NHm>R(@8&CR#%)3dKsT`N%7+$g{x0|L>bg3amCBu!cSTwK4?ZKH zP7>jnI^wKb{pOEvozVQ6bD|D&nymAmWjyw;p1BNezH6T{y^^>FpHW}Fy8HSY;*{^t z&E_AMw{m%IeCAmNOO_r9injD(@qxrs2p@iPDWSdyemoG|-I5sB-($}5Cr>x(4o+n` z1t49lsa3M>pS^>;b)!R)+f~6N_%|~bA?fEs8G2(2l)oE++14>6H#c{b?)wx!MFaCY zU$^;>=qG18sVr_o$3!T(IRE=%V$!={a7v}||GvUW`QyTeQ^JYmE^HLcO#gkIIinVQ zTB%y-zdr}wK<_ri*}*4=Mc)7ST}&at!PL(Gzu(UHoYI3|8H?|Qzmh-lO#PvbO4$S3 G(EkC!CzZnh diff --git a/man/figures/unnamed-chunk-14-1.png b/man/figures/unnamed-chunk-14-1.png index bfa30c1813b3f4914a52c1332dcc40b8301c0af6..b99e9aeb2598120cefd2d379a1093473313339e6 100644 GIT binary patch literal 37877 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 Hu2TL3X3^TZ literal 55315 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

-^TS#& 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 F{{TO&z!v}j From d8862e28e820ee475726a5f1bf56a240d9aa59b5 Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Mon, 8 Jan 2024 14:15:02 +1100 Subject: [PATCH 17/30] Update README tidyomics ecosystem links --- README.Rmd | 46 +++++++++------ README.md | 87 ++++++++++++++++++----------- man/figures/unnamed-chunk-14-1.png | Bin 37877 -> 38771 bytes 3 files changed, 85 insertions(+), 48 deletions(-) diff --git a/README.Rmd b/README.Rmd index 91a45044..487bf6fb 100755 --- a/README.Rmd +++ b/README.Rmd @@ -1,10 +1,11 @@ --- -title: "tidybulk - part of tidyTranscriptomics" +title: "tidybulk - part of _tidyomics_" output: github_document --- -[![Lifecycle:maturing](https://img.shields.io/badge/lifecycle-maturing-blue.svg)](https://www.tidyverse.org/lifecycle/#maturing) [![R build status](https://github.com/stemangiola/tidybulk/workflows/R-CMD-check-bioc/badge.svg)](https://github.com/stemangiola/tidybulk/actions) +[![Lifecycle:maturing](https://img.shields.io/badge/lifecycle-maturing-blue.svg)](https://www.tidyverse.org/lifecycle/#maturing) [![R build status](https://github.com/stemangiola/tidybulk/workflows/rworkflows/badge.svg)](https://github.com/stemangiola/tidybulk/actions) + ```{r echo=FALSE} @@ -19,24 +20,37 @@ The code is released under the version 3 of the GNU General Public License. knitr::include_graphics("man/figures/logo.png") ``` -website: [stemangiola.github.io/tidybulk/](http://stemangiola.github.io/tidybulk/) -[Third party tutorials](https://rstudio-pubs-static.s3.amazonaws.com/792462_f948e766b15d4ee5be5c860493bda0b3.html) -Please have a look also to - -- [tidySummarizedExperiment](https://github.com/stemangiola/tidySummarizedExperiment) for bulk data tidy representation -- [tidySingleCellExperiment](https://github.com/stemangiola/tidySingleCellExperiment) for single-cell data tidy representation -- [tidyseurat](https://github.com/stemangiola/tidyseurat) for single-cell data tidy representation -- [tidyHeatmap](https://github.com/stemangiola/tidyHeatmap) for heatmaps produced with tidy principles -analysis and manipulation -- [tidygate](https://github.com/stemangiola/tidygate) for adding custom -gate information to your tibble +Resources to help you get started with _tidyomics_ and tidybulk: + +* [The tidyomics blog](https://tidyomics.github.io/tidyomicsBlog/) +* [The tidybulk website](http://stemangiola.github.io/tidybulk/) +* [Third party tutorials](https://rstudio-pubs-static.s3.amazonaws.com/792462_f948e766b15d4ee5be5c860493bda0b3.html) + +The _tidyomics_ ecosystem includes packages for: +* Working with genomic features: - +* Working with cytometry features: + + * [tidytof](https://github.com/keyes-timothy/tidytof), for tidy manipulation of high-dimensional cytometry data. + +A few more tidy tools for data manipulation and plotting: + +* [tidyHeatmap](https://github.com/stemangiola/tidyHeatmap), for producing heatmaps with tidy principles. +analysis and manipulation +* [tidygate](https://github.com/stemangiola/tidygate), for interactive plotting and gating. ```{r, echo=FALSE, out.width = "800px"} knitr::include_graphics("man/figures/new_SE_usage-01.png") diff --git a/README.md b/README.md index 8e2a3d01..08d29981 100755 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ -tidybulk - part of tidyTranscriptomics +tidybulk - part of *tidyomics* ================ [![Lifecycle:maturing](https://img.shields.io/badge/lifecycle-maturing-blue.svg)](https://www.tidyverse.org/lifecycle/#maturing) [![R build -status](https://github.com/stemangiola/tidybulk/workflows/R-CMD-check-bioc/badge.svg)](https://github.com/stemangiola/tidybulk/actions) +status](https://github.com/stemangiola/tidybulk/workflows/rworkflows/badge.svg)](https://github.com/stemangiola/tidybulk/actions) + **Brings transcriptomics to the tidyverse!** @@ -15,26 +16,48 @@ License. -website: -[stemangiola.github.io/tidybulk/](http://stemangiola.github.io/tidybulk/) -[Third party -tutorials](https://rstudio-pubs-static.s3.amazonaws.com/792462_f948e766b15d4ee5be5c860493bda0b3.html) -Please have a look also to - -- [tidySummarizedExperiment](https://github.com/stemangiola/tidySummarizedExperiment) - for bulk data tidy representation -- [tidySingleCellExperiment](https://github.com/stemangiola/tidySingleCellExperiment) - for single-cell data tidy representation -- [tidyseurat](https://github.com/stemangiola/tidyseurat) for - single-cell data tidy representation -- [tidyHeatmap](https://github.com/stemangiola/tidyHeatmap) for heatmaps - produced with tidy principles analysis and manipulation -- [tidygate](https://github.com/stemangiola/tidygate) for adding custom - gate information to your tibble - - +Resources to help you get started with *tidyomics* and tidybulk: + +- [The tidyomics blog](https://tidyomics.github.io/tidyomicsBlog/) +- [The tidybulk website](http://stemangiola.github.io/tidybulk/) +- [Third party + tutorials](https://rstudio-pubs-static.s3.amazonaws.com/792462_f948e766b15d4ee5be5c860493bda0b3.html) + +The *tidyomics* ecosystem includes packages for: + +- Working with genomic features: + + - [plyranges](https://github.com/sa-lee/plyranges), for tidy + manipulation of genomic range data. + - [nullranges](https://github.com/nullranges/nullranges), for tidy + generation of genomic ranges representing the null hypothesis. + - [plyinteractions](https://github.com/tidyomics/plyinteractions), for + tidy manipulation of genomic interaction data. + +- Working with transcriptomic features: + + - [tidySummarizedExperiment](https://github.com/stemangiola/tidySummarizedExperiment), + for tidy manipulation of SummarizedExperiment objects. + - [tidySingleCellExperiment](https://github.com/stemangiola/tidySingleCellExperiment), + for tidy manipulation of SingleCellExperiment objects. + - [tidySpatialExperiment](https://github.com/william-hutchison/tidySpatialExperiment), + for tidy manipulation of SpatialExperiment objects. + - [tidyseurat](https://github.com/stemangiola/tidyseurat), for tidy + manipulation of Seurat objects. + - [tidybulk](https://github.com/stemangiola/tidybulk), for tidy bulk + RNA-seq data analysis. + +- Working with cytometry features: + + - [tidytof](https://github.com/keyes-timothy/tidytof), for tidy + manipulation of high-dimensional cytometry data. + +A few more tidy tools for data manipulation and plotting: + +- [tidyHeatmap](https://github.com/stemangiola/tidyHeatmap), for + producing heatmaps with tidy principles. analysis and manipulation +- [tidygate](https://github.com/stemangiola/tidygate), for interactive + plotting and gating. @@ -445,16 +468,16 @@ se_mini.norm.tSNE |> ## # A tibble: 251 × 4 ## tSNE1 tSNE2 .sample Call ## - ## 1 4.09 11.4 TCGA-A1-A0SD-01A-11R-A115-07 LumA - ## 2 1.86 -7.80 TCGA-A1-A0SF-01A-11R-A144-07 LumA - ## 3 -1.95 13.6 TCGA-A1-A0SG-01A-11R-A144-07 LumA - ## 4 10.8 4.07 TCGA-A1-A0SH-01A-11R-A084-07 LumA - ## 5 13.8 2.69 TCGA-A1-A0SI-01A-11R-A144-07 LumB - ## 6 0.239 11.9 TCGA-A1-A0SJ-01A-11R-A084-07 LumA - ## 7 -2.12 -35.1 TCGA-A1-A0SK-01A-12R-A084-07 Basal - ## 8 16.7 8.65 TCGA-A1-A0SM-01A-11R-A084-07 LumA - ## 9 15.3 8.97 TCGA-A1-A0SN-01A-11R-A144-07 LumB - ## 10 -3.35 22.6 TCGA-A1-A0SQ-01A-21R-A144-07 LumA + ## 1 -13.4 7.56 TCGA-A1-A0SD-01A-11R-A115-07 LumA + ## 2 5.25 5.35 TCGA-A1-A0SF-01A-11R-A144-07 LumA + ## 3 -18.4 -5.26 TCGA-A1-A0SG-01A-11R-A144-07 LumA + ## 4 -10.4 6.87 TCGA-A1-A0SH-01A-11R-A084-07 LumA + ## 5 -8.31 2.81 TCGA-A1-A0SI-01A-11R-A144-07 LumB + ## 6 2.22 -3.15 TCGA-A1-A0SJ-01A-11R-A084-07 LumA + ## 7 33.3 6.52 TCGA-A1-A0SK-01A-12R-A084-07 Basal + ## 8 5.38 -13.9 TCGA-A1-A0SM-01A-11R-A084-07 LumA + ## 9 4.11 -12.7 TCGA-A1-A0SN-01A-11R-A144-07 LumB + ## 10 -23.9 -2.77 TCGA-A1-A0SQ-01A-21R-A144-07 LumA ## # ℹ 241 more rows ``` r diff --git a/man/figures/unnamed-chunk-14-1.png b/man/figures/unnamed-chunk-14-1.png index b99e9aeb2598120cefd2d379a1093473313339e6..b2be5d391427285d4521882f7016c28f250c7347 100644 GIT binary patch literal 38771 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 Q?qY||?*@n>&4@x01;PHih7$;c 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 Hu2TL3X3^TZ From 225c0056b6c783d44e400def544cda292578ab05 Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Mon, 8 Jan 2024 14:15:41 +1100 Subject: [PATCH 18/30] Version up --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 9b898e45..0ff37ef5 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: tidybulk Title: Brings transcriptomics to the tidyverse -Version: 1.13.2 +Version: 1.13.3 Authors@R: c(person("Stefano", "Mangiola", email = "mangiolastefano@gmail.com", role = c("aut", "cre")), person("Maria", "Doyle", email = "Maria.Doyle@petermac.org", From eea34de0f7a8408c42bb1d5f6238b6042a324498 Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Mon, 8 Jan 2024 16:14:37 +1100 Subject: [PATCH 19/30] Remove EGSEA import --- DESCRIPTION | 4 +--- R/functions.R | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 0ff37ef5..d23ff873 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -86,9 +86,7 @@ Suggests: igraph, IRanges, here, - MASS, - EGSEA, - qpdf + MASS Remotes: GfellerLab/EPIC VignetteBuilder: diff --git a/R/functions.R b/R/functions.R index d31ee4f1..828e299f 100755 --- a/R/functions.R +++ b/R/functions.R @@ -1557,7 +1557,7 @@ test_gene_enrichment_bulk_EGSEA <- function(.data, limma::voom(design, plot = FALSE) %>% # Execute EGSEA - EGSEA::egsea( + egsea( contrasts = my_contrasts, gs.annots = nonkegg_genesets, baseGSEAs = methods, From d59b0a4b1f4cc4569e930f5294c2dffc9ffc9574 Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Mon, 8 Jan 2024 16:15:01 +1100 Subject: [PATCH 20/30] Version up --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index d23ff873..62a75efb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: tidybulk Title: Brings transcriptomics to the tidyverse -Version: 1.13.3 +Version: 1.13.4 Authors@R: c(person("Stefano", "Mangiola", email = "mangiolastefano@gmail.com", role = c("aut", "cre")), person("Maria", "Doyle", email = "Maria.Doyle@petermac.org", From 0f60dddfe27249084203d6f760537c11a58864d4 Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Tue, 9 Jan 2024 15:46:53 +1100 Subject: [PATCH 21/30] Remove unneeded whole package imports --- NAMESPACE | 14 +++++++++++--- R/functions.R | 13 ++++++++++--- R/functions_SE.R | 12 ++++++++++-- R/methods.R | 2 +- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 25148a3d..51060723 100755 --- a/NAMESPACE +++ b/NAMESPACE @@ -61,9 +61,6 @@ exportMethods(quantile_normalise_abundance) exportMethods(scale_abundance) exportMethods(tidybulk) exportMethods(tidybulk_SAM_BAM) -import(DESeq2) -import(S4Vectors) -import(Seurat) import(SummarizedExperiment) import(broom) import(class) @@ -80,11 +77,22 @@ import(readr) import(sva) import(tibble) importFrom(AnnotationDbi,mapIds) +importFrom(DESeq2,DESeq) +importFrom(DESeq2,DESeqDataSet) +importFrom(DESeq2,DESeqDataSetFromMatrix) +importFrom(DESeq2,results) importFrom(EPIC,EPIC) importFrom(GenomicRanges,makeGRangesListFromDataFrame) importFrom(Matrix,colSums) importFrom(Rtsne,Rtsne) +importFrom(S4Vectors,DataFrame) importFrom(S4Vectors,metadata) +importFrom(Seurat,CreateSeuratObject) +importFrom(Seurat,FindClusters) +importFrom(Seurat,FindNeighbors) +importFrom(Seurat,FindVariableFeatures) +importFrom(Seurat,RunPCA) +importFrom(Seurat,ScaleData) importFrom(SummarizedExperiment,SummarizedExperiment) importFrom(SummarizedExperiment,assays) importFrom(SummarizedExperiment,colData) diff --git a/R/functions.R b/R/functions.R index 828e299f..989aa1b5 100755 --- a/R/functions.R +++ b/R/functions.R @@ -980,7 +980,9 @@ get_differential_transcript_abundance_bulk_voom <- function(.data, #' @noRd #' #' @import tibble -#' @import DESeq2 +#' @importFrom DESeq2 DESeqDataSet +#' @importFrom DESeq2 DESeq +#' @importFrom DESeq2 results #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix #' @importFrom purrr when @@ -1706,8 +1708,13 @@ get_clusters_kmeans_bulk <- #' #' #' @import tibble -#' @import Seurat #' @importFrom rlang := +#' @importFrom Seurat CreateSeuratObject +#' @importFrom Seurat ScaleData +#' @importFrom Seurat FindVariableFeatures +#' @importFrom Seurat RunPCA +#' @importFrom Seurat FindNeighbors +#' @importFrom Seurat FindClusters #' #' @param .data A tibble #' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) @@ -3389,7 +3396,7 @@ keep_variable_transcripts = function(.data, #' @noRd #' #' @import SummarizedExperiment -#' @import S4Vectors +#' @importFrom S4Vectors DataFrame #' @importFrom utils data #' @importFrom tidyr pivot_longer #' diff --git a/R/functions_SE.R b/R/functions_SE.R index 8425b3d8..92525461 100755 --- a/R/functions_SE.R +++ b/R/functions_SE.R @@ -54,8 +54,13 @@ get_clusters_kmeans_bulk_SE <- #' @noRd #' #' @import tibble -#' @import Seurat #' @importFrom rlang := +#' @importFrom Seurat CreateSeuratObject +#' @importFrom Seurat ScaleData +#' @importFrom Seurat FindVariableFeatures +#' @importFrom Seurat RunPCA +#' @importFrom Seurat FindNeighbors +#' @importFrom Seurat FindClusters #' #' @param .data A tibble #' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) @@ -1123,7 +1128,10 @@ get_differential_transcript_abundance_glmmSeq_SE <- function(.data, #' #' #' @import tibble -#' @import DESeq2 +#' @importFrom DESeq2 DESeqDataSet +#' @importFrom DESeq2 DESeq +#' @importFrom DESeq2 results +#' @importFrom DESeq2 DESeqDataSetFromMatrix #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix #' @importFrom purrr when diff --git a/R/methods.R b/R/methods.R index 6d167cd7..f2036e29 100755 --- a/R/methods.R +++ b/R/methods.R @@ -114,7 +114,7 @@ setMethod("tidybulk", "tbl_df", .tidybulk) #' @description as_SummarizedExperiment() creates a `SummarizedExperiment` object from a `tbl` or `tidybulk` tbl formatted as | | | | <...> | #' #' @import SummarizedExperiment -#' @import S4Vectors +#' @importFrom S4Vectors DataFrame #' @importFrom utils data #' @importFrom tidyr pivot_longer #' From fd170a8059408e3041f349efffbbb827293c2c65 Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Tue, 9 Jan 2024 15:55:36 +1100 Subject: [PATCH 22/30] Remove unneeded whole dplyr import --- NAMESPACE | 1 - R/functions.R | 29 ++++++++++++++++++++--------- R/functions_SE.R | 1 + R/glmmSeq.R | 14 ++++++++------ 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 51060723..715c284a 100755 --- a/NAMESPACE +++ b/NAMESPACE @@ -64,7 +64,6 @@ exportMethods(tidybulk_SAM_BAM) import(SummarizedExperiment) import(broom) import(class) -import(dplyr) import(e1071) import(edgeR) import(lifecycle) diff --git a/R/functions.R b/R/functions.R index 989aa1b5..0e922123 100755 --- a/R/functions.R +++ b/R/functions.R @@ -154,7 +154,11 @@ create_tt_from_bam_sam_bulk <- #' #' #' @import tibble -#' @import dplyr +#' @importFrom dplyr select +#' @importFrom dplyr left_join +#' @importFrom dplyr group_by +#' @importFrom dplyr summarise +#' @importFrom dplyr mutate #' @importFrom rlang := #' @importFrom stats setNames #' @importFrom edgeR calcNormFactors @@ -241,7 +245,12 @@ add_scaled_counts_bulk.calcNormFactor <- function(.data, #' #' #' @import tibble -#' @import dplyr +#' @importFrom dplyr select +#' @importFrom dplyr left_join +#' @importFrom dplyr group_by +#' @importFrom dplyr summarise +#' @importFrom dplyr mutate +#' @importFrom dplyr rename #' @importFrom magrittr equals #' @importFrom rlang := #' @importFrom stats median @@ -287,8 +296,8 @@ get_scaled_counts_bulk <- function(.data, # If not specified take most abundance sample df %>% - group_by(!!.sample) %>% - summarise(sum = median(!!.abundance)) %>% + dplyr::group_by(!!.sample) %>% + dplyr::summarise(sum = median(!!.abundance)) %>% mutate(med = max(sum)) %>% mutate(diff = abs(sum - med)) %>% arrange(diff) %>% @@ -2629,12 +2638,14 @@ aggregate_duplicated_transcripts_DT = #' @keywords internal #' @noRd #' -#' -#' #' @import tibble -#' @import dplyr #' @importFrom rlang := #' @importFrom dplyr anti_join +#' @importFrom dplyr mutate +#' @importFrom dplyr rename +#' @importFrom dplyr left_join +#' @importFrom dplyr select +#' @importFrom dplyr distinct #' @importFrom widyr pairwise_cor #' #' @param .data A tibble @@ -2678,7 +2689,7 @@ remove_redundancy_elements_through_correlation <- function(.data, .data %>% # Prepare the data frame - select(!!.feature,!!.element,!!.abundance) %>% + dplyr::select(!!.feature,!!.element,!!.abundance) %>% # Filter variable genes keep_variable_transcripts(!!.element,!!.feature,!!.abundance, top = top) %>% @@ -2686,7 +2697,7 @@ remove_redundancy_elements_through_correlation <- function(.data, # Apply (log by default) transformation dplyr::mutate(!!.abundance := transform(!!.abundance)) %>% - distinct() %>% + distinct::distinct() %>% # NO NEED OF RECTANGULAR # spread(!!.element,!!.abundance) %>% diff --git a/R/functions_SE.R b/R/functions_SE.R index 92525461..77278bbd 100755 --- a/R/functions_SE.R +++ b/R/functions_SE.R @@ -373,6 +373,7 @@ get_reduced_dimensions_TSNE_bulk_SE <- #' #' #' @import tibble +#' @importFrom dplyr mutate #' @importFrom rlang := #' @importFrom stats setNames #' @importFrom uwot tumap diff --git a/R/glmmSeq.R b/R/glmmSeq.R index 44924740..1c59ed6b 100644 --- a/R/glmmSeq.R +++ b/R/glmmSeq.R @@ -164,7 +164,9 @@ glmmTMB_standard_error = function (model){ #' @importFrom purrr map2_dfc #' @importFrom tidyr pivot_longer #' @importFrom tidyr pivot_wider +#' @importFrom dplyr left_join #' @importFrom dplyr join_by +#' @importFrom dplyr select #' #' @keywords internal #' @noRd @@ -181,7 +183,7 @@ glmmTMB_to_confidence_intervals_random_effects = function(fit){ "group_id" |> c(sprintf("%s__%s", .y, colnames(.x))) ) |> - pivot_longer(-group_id, names_to = "parameter", values_to = "CI") + tidyr::pivot_longer(-group_id, names_to = "parameter", values_to = "CI") ) mod = glmmTMB::ranef(fit, condVar=T)$cond @@ -193,15 +195,15 @@ glmmTMB_to_confidence_intervals_random_effects = function(fit){ "group_id" |> c(sprintf("%s__%s", .y, colnames(.x))) ) |> - pivot_longer(-group_id, names_to = "parameter", values_to = "mode") + tidyr::pivot_longer(-group_id, names_to = "parameter", values_to = "mode") ) mod |> - left_join(ster, join_by(group_id, parameter)) |> - mutate(lower = mode - CI, upper = mode + CI) |> - select(-CI) |> + dplyr::left_join(ster, dplyr::join_by(group_id, parameter)) |> + dplyr::mutate(lower = mode - CI, upper = mode + CI) |> + dplyr::select(-CI) |> tidyr::unite("parameter", c(group_id, parameter), sep="_") |> - pivot_wider(names_from = parameter, values_from = c(lower, mode, upper), names_glue = "{parameter}__{.value}") + tidyr::pivot_wider(names_from = parameter, values_from = c(lower, mode, upper), names_glue = "{parameter}__{.value}") } From 9a9542eae6d80cb0ec47f3e40d727243fb32298c Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Tue, 9 Jan 2024 16:04:19 +1100 Subject: [PATCH 23/30] Replace EPIC import with message --- DESCRIPTION | 3 --- NAMESPACE | 1 - R/functions.R | 18 ++++++++++++++---- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 62a75efb..4cd944c9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -40,7 +40,6 @@ Imports: pkgconfig, AnnotationDbi, DESeq2, - EPIC, Rtsne, Seurat, betareg, @@ -87,8 +86,6 @@ Suggests: IRanges, here, MASS -Remotes: - GfellerLab/EPIC VignetteBuilder: knitr RdMacros: diff --git a/NAMESPACE b/NAMESPACE index 715c284a..13c99390 100755 --- a/NAMESPACE +++ b/NAMESPACE @@ -80,7 +80,6 @@ importFrom(DESeq2,DESeq) importFrom(DESeq2,DESeqDataSet) importFrom(DESeq2,DESeqDataSetFromMatrix) importFrom(DESeq2,results) -importFrom(EPIC,EPIC) importFrom(GenomicRanges,makeGRangesListFromDataFrame) importFrom(Matrix,colSums) importFrom(Rtsne,Rtsne) diff --git a/R/functions.R b/R/functions.R index 0e922123..b8ddd1b0 100755 --- a/R/functions.R +++ b/R/functions.R @@ -2697,7 +2697,7 @@ remove_redundancy_elements_through_correlation <- function(.data, # Apply (log by default) transformation dplyr::mutate(!!.abundance := transform(!!.abundance)) %>% - distinct::distinct() %>% + dplyr::distinct() %>% # NO NEED OF RECTANGULAR # spread(!!.element,!!.abundance) %>% @@ -2742,7 +2742,7 @@ remove_redundancy_elements_through_correlation <- function(.data, upper = FALSE ) %>% filter(correlation > correlation_threshold) %>% - distinct(item1) %>% + dplyr::distinct(item1) %>% dplyr::rename(!!.element := item1) # Return non redundant data frame @@ -2995,7 +2995,6 @@ run_llsr = function(mix, reference = X_cibersort, intercept= TRUE) { #' @noRd #' #' @importFrom stats lsfit -#' @importFrom EPIC EPIC #' #' @param mix A data frame #' @param reference A data frame @@ -3022,8 +3021,19 @@ run_epic = function(mix, reference = NULL) { # Check if it is not matrix or data.frame, for example DelayedMatrix if(!is(Y, "matrix") & !is(Y, "data.frame")) Y = as.matrix(Y) + + # Check if package is installed, otherwise install + if (find.package("EPIC", quiet = TRUE) %>% length %>% equals(0)) { + stop(" + EPIC not installed. Please install it. EPIC requires manual installation as it is not on Bioconductor or CRAN. + BiocManager::install(\"EPIC\", ask = FALSE) + ") + } + if (!"EPIC" %in% (.packages())) { + stop("EPIC package not loaded. Please run library(\"EPIC\"). With this setup, EPIC requires manual loading.") + } - results <- EPIC::EPIC(Y, reference = reference)$cellFractions %>% data.frame() + results <- EPIC(Y, reference = reference)$cellFractions %>% data.frame() #results[results < 0] <- 0 #results <- results / apply(results, 1, sum) rownames(results) = colnames(Y) From 9baac9cdc05f2c147b592d11b6aec91a1d9ffd1f Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Tue, 9 Jan 2024 16:05:31 +1100 Subject: [PATCH 24/30] Version up --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 4cd944c9..2636f2d8 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: tidybulk Title: Brings transcriptomics to the tidyverse -Version: 1.13.4 +Version: 1.13.5 Authors@R: c(person("Stefano", "Mangiola", email = "mangiolastefano@gmail.com", role = c("aut", "cre")), person("Maria", "Doyle", email = "Maria.Doyle@petermac.org", From 7af3822bc3b32dd5d0e9711d6b30ba9181722130 Mon Sep 17 00:00:00 2001 From: william-hutchison Date: Tue, 9 Jan 2024 16:47:44 +1100 Subject: [PATCH 25/30] Update README --- README.Rmd | 3 +- README.md | 30 ++++++------------ ...SNN_6ec21fb35522e05c9e22c44a24c3aa69.RData | Bin 2765 -> 0 bytes .../SNN_6ec21fb35522e05c9e22c44a24c3aa69.rdb | 0 .../SNN_6ec21fb35522e05c9e22c44a24c3aa69.rdx | Bin 125 -> 0 bytes README_cache/gfm/__packages | 27 ---------------- man/figures/plot_cluster-1.png | Bin 9208 -> 9188 bytes man/figures/unnamed-chunk-14-1.png | Bin 38771 -> 37014 bytes 8 files changed, 11 insertions(+), 49 deletions(-) delete mode 100644 README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.RData delete mode 100644 README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.rdb delete mode 100644 README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.rdx delete mode 100644 README_cache/gfm/__packages diff --git a/README.Rmd b/README.Rmd index 487bf6fb..8bf08037 100755 --- a/README.Rmd +++ b/README.Rmd @@ -40,8 +40,7 @@ The _tidyomics_ ecosystem includes packages for: * [tidySingleCellExperiment](https://github.com/stemangiola/tidySingleCellExperiment), for tidy manipulation of SingleCellExperiment objects. * [tidySpatialExperiment](https://github.com/william-hutchison/tidySpatialExperiment), for tidy manipulation of SpatialExperiment objects. * [tidyseurat](https://github.com/stemangiola/tidyseurat), for tidy manipulation of Seurat objects. - * [tidybulk](https://github.com/stemangiola/tidybulk), for tidy bulk RNA-seq data analysis. - + * Working with cytometry features: * [tidytof](https://github.com/keyes-timothy/tidytof), for tidy manipulation of high-dimensional cytometry data. diff --git a/README.md b/README.md index 08d29981..af1a9a8f 100755 --- a/README.md +++ b/README.md @@ -44,8 +44,6 @@ The *tidyomics* ecosystem includes packages for: for tidy manipulation of SpatialExperiment objects. - [tidyseurat](https://github.com/stemangiola/tidyseurat), for tidy manipulation of Seurat objects. - - [tidybulk](https://github.com/stemangiola/tidybulk), for tidy bulk - RNA-seq data analysis. - Working with cytometry features: @@ -468,16 +466,16 @@ se_mini.norm.tSNE |> ## # A tibble: 251 × 4 ## tSNE1 tSNE2 .sample Call ## - ## 1 -13.4 7.56 TCGA-A1-A0SD-01A-11R-A115-07 LumA - ## 2 5.25 5.35 TCGA-A1-A0SF-01A-11R-A144-07 LumA - ## 3 -18.4 -5.26 TCGA-A1-A0SG-01A-11R-A144-07 LumA - ## 4 -10.4 6.87 TCGA-A1-A0SH-01A-11R-A084-07 LumA - ## 5 -8.31 2.81 TCGA-A1-A0SI-01A-11R-A144-07 LumB - ## 6 2.22 -3.15 TCGA-A1-A0SJ-01A-11R-A084-07 LumA - ## 7 33.3 6.52 TCGA-A1-A0SK-01A-12R-A084-07 Basal - ## 8 5.38 -13.9 TCGA-A1-A0SM-01A-11R-A084-07 LumA - ## 9 4.11 -12.7 TCGA-A1-A0SN-01A-11R-A144-07 LumB - ## 10 -23.9 -2.77 TCGA-A1-A0SQ-01A-21R-A144-07 LumA + ## 1 -2.14 11.2 TCGA-A1-A0SD-01A-11R-A115-07 LumA + ## 2 -5.49 -3.46 TCGA-A1-A0SF-01A-11R-A144-07 LumA + ## 3 14.0 4.69 TCGA-A1-A0SG-01A-11R-A144-07 LumA + ## 4 -10.5 7.69 TCGA-A1-A0SH-01A-11R-A084-07 LumA + ## 5 -6.06 9.23 TCGA-A1-A0SI-01A-11R-A144-07 LumB + ## 6 -3.57 13.0 TCGA-A1-A0SJ-01A-11R-A084-07 LumA + ## 7 -5.93 -31.0 TCGA-A1-A0SK-01A-12R-A084-07 Basal + ## 8 17.8 1.86 TCGA-A1-A0SM-01A-11R-A084-07 LumA + ## 9 -11.6 13.4 TCGA-A1-A0SN-01A-11R-A144-07 LumB + ## 10 11.7 23.1 TCGA-A1-A0SQ-01A-21R-A144-07 LumA ## # ℹ 241 more rows ``` r @@ -976,14 +974,6 @@ se_mini.norm.non_redundant = ) ``` - ## Found more than one class "dist" in cache; using the first, from namespace 'BiocGenerics' - - ## Also defined by 'spam' - - ## Found more than one class "dist" in cache; using the first, from namespace 'BiocGenerics' - - ## Also defined by 'spam' - We can visualise MDS reduced dimensions of the samples with the closest pair removed. diff --git a/README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.RData b/README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.RData deleted file mode 100644 index 1e673e03e62fc89af95cb360f67e6facbb9bb084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2765 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 T3SeMh0002~m5M*3wh90MI-?bT diff --git a/README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.rdb b/README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.rdb deleted file mode 100644 index e69de29b..00000000 diff --git a/README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.rdx b/README_cache/gfm/SNN_6ec21fb35522e05c9e22c44a24c3aa69.rdx deleted file mode 100644 index 5940e35991a69e08dbad760e42decab26f9283b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 zcmb2|=3oE==I#ec2?+^l35jV*32CfGk`d0%cS>|6BxbZ66cUi)h?vp9qRh4e8Sk7_lb_T&M6 diff --git a/README_cache/gfm/__packages b/README_cache/gfm/__packages deleted file mode 100644 index 031a956d..00000000 --- a/README_cache/gfm/__packages +++ /dev/null @@ -1,27 +0,0 @@ -base -methods -datasets -utils -grDevices -graphics -stats -knitr -dplyr -tidyr -tibble -magrittr -ggplot2 -ggrepel -ttservice -tidybulk -matrixStats -MatrixGenerics -stats4 -BiocGenerics -S4Vectors -IRanges -GenomeInfoDb -GenomicRanges -Biobase -SummarizedExperiment -tidySummarizedExperiment diff --git a/man/figures/plot_cluster-1.png b/man/figures/plot_cluster-1.png index c32b3113b907afb1a5a21898bbb48b798747de06..22eb553ce952fef0fd2766407b39a7065de873cd 100644 GIT binary patch literal 9188 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 Ms+uY!rJE1`2mfJN0{{R3 literal 9208 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 diff --git a/man/figures/unnamed-chunk-14-1.png b/man/figures/unnamed-chunk-14-1.png index b2be5d391427285d4521882f7016c28f250c7347..9ac5de4acffdbf20f9a6791893e4c37f005f428d 100644 GIT binary patch literal 37014 zcma%ib8sJDxc4_`(Ac(Z+jf&QZW`NW8#T6VCynjKw$a!&@Ah}+{`t3kDqcpSyEuBj5sSFRkSS0wMPO`v*2? zS7HnT5rbsJMZUOaoUXflQ!`lvT{_j7%@!y;=sT?~WKuMrOqCn@7+WM?NKhr+9 zXd&V^e^L>Sp^$5|rgpv%n2BW{CwzDzvq@WXF0e^MoVci7qvGOHvRlpIKjDXziStJm zg~|O9w6KaH3_}tab7JT(1ze$s;V*&96etjkkR%Wp*PpqYED%`~0vXC3xR`@_LD8*N zvqcI_9k+2Wn~Ub`tse>m77Z&KRp6iv1TS|k>$}*tA8XOmz-`|)g5a=bW@pzwI!)`A z-|UWuj9KqoF+i8LOMPvI<_23Nx5K>~RmiO^|NY70S4Wku;#!M<)DHC`gJ5L2#||AbXSF^? z&p>3yAKwuyBF`}m&>uAPkiok_(a55VDwSk36s!W%bQ~f>;Qt=pBHSMH?7*wBMu#C% z0{d@n9Ki?)-tqfCZ*w-RsPS9aiKlrr$sSUM#GfLImh_{fKF!06Wu--6p~MCsnIBpXQ`){1cj`H&-Oumh<289YRb-41k=QI5Ut_m@LE@X&?vj6AV96 z$MP&DyXNPbsOslIGlbbal<^~6*#-+X^xzNVcX0liUI=T8oUS8liR-eg<7OXl+{}G= zMzARVj!KpGveRL{)4}@;J3S8eZ*jWh2rFzj$=C_Jl23Af5%(fXqM7Yml#m2rljYjr zm^K}^D=INIi=vk(fMTlH&&pW~75@H#JL?4da+s)ea4w{qJz31A`HbYpvx|v4y;1U{ zx>@jn@n$3tu@!dUj^H?q^b3mov`+*kmlH=iek_MqU2a^)tz_j-QIDorYHN#bzx8=4 zthH>upFv`au+2kUwrmO8^@aRuW974CrHEdIdb@`GZeQH&nWic7B`W%&T6KsX)Z8?0`F@+db(9{r7gwbhMp#$j(wS4b8(uZ`{#WiVmvK_{=?^@YGQpG|fLac(K=H<60Y>ULH&)O9*_ z(KqzQEfur|?YHYurf6Ia%h4nTB%#+!vuvNF%uEE(MaP4_xA*I!fuDf!P>kEAPg7HQ zsPc*akdQeZI>R&p=ySt$NbS3`lZiC3oC^YOUG9z=!7rS(4w+F&4@i{}yok37I`BJQ z_{$O*ZEf7}e(m4iz@i7`6cq_sjfd_|7M+}&=;-J!T2B~%2>&*p&TDOL9UB|lsG6tVhE53G6@OE-rio4 zQ*CW6B9Wl?=AS8u`0<%PN`b+f6p?1tHu8F)AM*~H8!9@@zD1WY84mR6)2EZgY9&QQMQQ1!CcEsysh@*8T76IF>upUotEN6> zH8s=Y7@X>CH zwJYx+8?+hFKQlxxR%q2(&eMXvc6hpIXe0>}+dJ9Zc?yKjvt`R<=Bk!Hdi&Zff?q(< zBf|?)q5J7M$XLuM-M|#j9<3U4jR`ZxQSxskuf20tFz#BQtI7t_+a`bTL4s6~9Fpmr zc)KE0<4miv$u5_5Ea;~j$B?KOy1_n~xo`&u{DAVyFM*Ybv+KA^Ql@@At($ajFFH*D z0|TR=pdgn)g%pW1wy-Ge>gw8~K@92pYY*z4`4O#Ljdz5?K0^kR)^%QSNwfgxf(#|; z)Zxh9unJ1T2?CI?dxd&wt-= zv_acOUOqyae5K8eNha>);o{)R{pu>k1|pa9>ZoEpAbBE2JRE0Dy3ze6=gI9>|7RM8 zud9JW9Aqb1;E$;lMYksRoyA+QU&MSueP{^MLLaYnXDPg(HDIs7VKG)zROoj3`Zzc^ z*xO&CDe)WH^ypN6tsxZbf){YJKf20WP*Z zJRynk!KUX;pJux0H+A#jm+C`kuit9?>+BhtRTMX0jLEZMwr;0OZbIna+D7Pb>kJz; z$98_?m$Z#=lKt>**fV058-hX)Qv?#S)9t3E6=DUj%rLW;fk2LpY^_&_)@ zR9n@?RmtCvqwiADRjuoajwPaL=UKPwstF^RXl%vA!@EFGNQ`2Y-`uy{%vara7>P zKKrYQk-RbzE47YS9a2%$>Y+c<4RkgE;&c)mS`AA6yR&mPSGo_P5%UF#5SU3ZO~Hf)vi-wpoS@ zrF>J<5)-XsToBB6FK;$;FtAELIIS&$CKBs`*0LJ_Ya&MGa&ScoiaS!cN$<4YkZ~h^ zE*V=NSFPaco11M7zb;~l6{1rZ9IWf}@HvOWJVplqajsxbwAeyTC-e;@vlmz;CO4H3 z{mx{f;8t%_$!z?N(h+Nd!uaf9FHU+KFIO~E!cHo$_uWzO_snJP5i;qqtwyKow;7V? zkjPK|K(l+HD6XC32zcuJfW_H-FXweGC%=xLVQZvN6KHFm&X}LZjpt~E5DpD~&6|4k zYv%6E?gL25FuCqih$OIn7ss$2~_2hY<|a;-B%PffXhI7_+=ye%uFhP*GnF3!#90rOjpj^9~T z_W9tK0bJ&--xbLNeMekp8Dxv+YUCw%1*G|X? ziAb+;NPqHUJju3-*ai-7)C21k`{;$~-vp=sVoG=SiCI4&gxytZd09;6EGz-G{JZQ& z!aWnIscLbL9KP&xGlWY^(xL60(|m&)S&@NCO8m#PmaHI?zf>Piwu@sf*fHO~y5+3) z(s0}gtdQ!-Rkb11nmv4!ZEF?T{50{nJACB&hH_1+t7kD{IucwdNGc+*dM0fp`NXsKt^bm3!5ZQBBuspMUp6$Lf}Jhz>&TyIB!(_kh$qt@Y#{lupA5g!47@tUD5V^85JW zQaO;L50p0+PgmmA{CPGB`RyKMH#?3%PtnbHDJdA2)$|(I&7IA#vy<{HSIs3Gi0o=o zrsdOs8K0=sT{D?H0wtiGFfmNVmhVMSdsn1!lWnhG zc$AN}XX8K)l)oMaj$84^ex7AsCmg_|5$x&2a9F%oh%hL@x2lAnn;G|Pov3;Z$C~Er zEiL2!&i^Fivz!6@1`w3OkIRE=#0*t*C-VqspO81M@3iArq973RaH6$R^GoU4+kfna z&-=K2!Er9(822-Sz|;5yM}q6#!4WFz5TEUZ}F`o6=z z_>1mkbK}OgqDAl7hJy)jA(32nUW0FWM=HN;C{y@mDNzC6XLd(9=cW~v_>D}^#S+*z zQir!y(Bfj(D4BD7%+b)UUww2T?#2Y?1Yfa%uh!-&hozp%)jgY8^5VRn7tXKQf zNBp|J7+0=Jc%xUQsH0Iz(6@Fhn?Y&JMH0w#8AnZpA{&`VeFRRhlcr<5vo5&IoFIE~ z8woei)=WzDr>J@c4_fmIH6eexddz6PMF~G`l~?_%;c8k&nh0%B$_dBN{W7|turi*} zrFnNZCcmgp@1Td|>e0DSQp$pOiqvff&)Cz`<|^UByk63%8butUW1H(|uuDt$oq6ow z9{4d%TmM-0QTQ?q{pB&?w312JjbarxBaaO)%i3n=eL%f{E4*6oDvHl*juY>UK11z% z+HjcYdX4POx5Ich@_0qmasIv}b`hvl&SvRb(*7CLb85-}i&XLDWe! zqaH@ds?1tVhaZ4i6+``|Q{$c3d}nygII28ac2@@687p!{$+jnN+AdN2O)uGs;qR;# zt(siZApQ%K)gm+Ob6WSb6}Xh!hiaw-cuns~mC~JG60R)hn|k-JMKLO#rxjMcfPdXK zR`F^x&u9}~`_ku>z@UF@F)eb!x&(kU|BZzO+%gbl#sepz`8@ z;Mwv}JbA8IGetVZLBs7UCFEDAK;PdnPlk|_PyLZcmX?e@R!X37NjtMI;0Vlss&tH& z75e>E-;i~!(?Aqc=h9F=eI#6FOKJ7{T$*Bv7# zj3(ZoemofNrHjT$0p4suV*J_!c1;V~4AKFX$WU0rX!N*wxJoDBVDC4#!tp@Ag}}kj zTI;`&l}YtHBG%DF+nBujt2K`J)uCs*?&DZ2PQ~G5(W7u3DeZe30c4LGdL?Yf7l1A^ zCt5^CmAz0*lkO?ih2QJVJy!Wac7dMh-t-u_chz`|r|vmlll#zC2d?ez?0W_^l*6$sg|p0{vVf z%$6KK4sEbEjcd=LuVWaVo}-P>R=Me{*RFH$Ja#LMR8Q(7sJ(R>jy9(8uI5O|fBbX( zEm%(VO7mnWqzd=`OB!ek(eHUbSDuOM-G=M|_^Qg`;dgVoq@@VE=yqH_F#G0~dy))= z$`@gGYm_su()U?_*7~3R12E6o{@C?)%6KR-z1HFM`7aKCzBq_0=`K(AwCc(Mi(6H% zFVjM&PD%i0{Lb;LZ3>1oV#gx=aUq%Fw_drctco!p^6Stt`4F-_=-cllrzegB6Xp6P z1)F_|Gh?s!B)=1?%>vmHWvFoA`ddg`Rt_89!R8~y{#xtjj+sX9U)@Y849D+xi;3?q zE>0SYqLr^bV|sUz3J*+tpwsfvq6GY^$&*m7XQd&?)xP4N151d|UrtJ8yvhh>ADyE& z;M?fVI_U|^S<;!c&isP`B~6A$Z3E^sG>t>?kT5Cf*j+9!IxvaO-5c{87;yg%uZx}-vTLQ5HqYLTB^kDQ1Lby z7}?L|yvq4Sg#wRU_8+Xs-%2AYukw%=HFD;=j81cimi{g0@9kJ;z2f&p;6|B*lpeE$ zaBj0gL$DzYhC+ku9?^DjFeAOFhGwJyuiE9S%NRwsO4JMm+Es6eQ#xX}Fju z=*a^;-(M$5zQPlwS=}JzbwU9k&o$UCxtz(`|t@#1U5j9CUh%I&;6}XP=?Ri z6)y5XE(8t&_+3eEQZTcP2=tor(~Y!9U@QByH(bZK#H1PvUqMq-%8}eISV0E!8BeC} z2fKrXqK_I6BUAnO2_k6oi|z`tfLDanr5&tWmxevLoF3Z@+2PI*&X11zPon^l$CTZv z=G1_y5rDe!@!DqS#2+!9-a1f?50n_YE3Cvj-DdJAsqO(5?8$p2mr#~vGdUNuLuhh7 zPV~L8)w{^YE->YlAvC@I=!X7q)qWxDzH+B$M2Q(mICDGVBt()M0}gt5O#sAB0+@PY z@Bnn3D=>XjaC$8v)`gu8rpM6|+B~3wa$_&cy7M^7cgi*}P&|KM7fyXn--Xy2ydzT_ zC4C%a^Y2Ez{YlhkIc-k!#neda(>=ipgphH>q4{JNcuGj`&MLDWXesTw;>|wB#M}n;gPSnJ&ISh5BAFpKI z_!ZXVeJzLiTi>+y4R8i#OH!3M9@y8;2_DS5hg>HvB(#pxS{D5p`5EU%E@Up%BvRr_;U))ocbzL+C7=WJt$-i+zGHL&M`~3LiT5Bteq^XPA@W>Q{|O|9!0`JhJoBJx%yDK`-D z56>F{Ib=sDz=+6WO)>Opp$U|thA-%aQRTd{Cf}Lx7sT3g$+0~3hh1;#0xaiGQxTw^@7nIiheHy)ni#EQf;TNQ2 z8d{k1#bKLN=QtH4gS{|y|7k&Dj|iavR=^x2kUC@ZBPJfGM8?J9Vw@6g=CZeUDp?L? z^>&4)w#>L^Z={LW)G6s@lY+>k|O+_F>HFhn!>qrxGC1lkxwB*p!&5QsVQUcrT zm-)fnPlV3*;1}GhfycTb9D3fKlN(Kp?44Xm%Wo0sqfEZ2JhOXs;BEAp5=j;^{@Bca zK)KLy>cc%+7bW5U4dRO!!3Dho^^pr!qDg{@(M3X*B{i?L$E($A9%FsF+XyQ@+FUw5 z)J_+5*QL1=9CyNwhxg zY*@h`Be&MUeuURwKZGd(YE%vXQ8)=&FMj8nbG*>%zP~Y;aEy+tm@ot?l=~Rmea8P~ z0Rm6|z?Ehf_X)hLQB@ed$3v-&ayrY+G)=~cdvV%H92fZE$4P!%Pvc8$11D45vh7pnyRcOz2qJr+y8 zvo%N+dkoWu@6h$Ys#edn4|Sa(to|CPw%PEwJGI*2pzZ;3(>Q2{-z#HLOpwBCU zZps&uBZko`DJxT$r9I;V4^9YY#*cY^4VRye2<6Tm^QL3>UOYf=*qbNZnz9^9X~Z23 zbI@Xamyk-{q+uYmsthPC{JYsRL5C;QVRTPcm#m{Z0WK|Us(!x(UDC;EgBOn+Z2gih zFJmw+FtdkL7b&lO^gp-shY#mx?2PYL!s2)2o*GyU)8(S^wL8Xjb2ZeoZ3?y0XsSuk zgzkH~(E_TFd5ATe(Msl~eu0{GDZhG^W)w1%ATD!nL+BpLG4gv)F4#$?^-ehs)aXtF z&p^J>GK%f;+WK^D#HOFkhMcL>Q@>xZ;MU6cwr#vPf%MmViTOg_eA76yrJJ6ewgoW4 z;Y4o%bCH*WitsF+6|zHnpDgHrn;gGdwwJ693{IDxNP~)y3#p9};?V9cd}i+~H)|cL1B+u+)vn+C?}fB3N;V6*1uq%H%^@-6$i`-> z8YH{s{b3ju78b>dnT|IvxRH`j`Qvsa9G)<|mW>Qrr%0O!4nDfmN6yx+UI;xWWydI` z2Fv#W)%BSDg%{R47j))p?$YYx1z7KjiTfrqYo)7d7T-$J103bHYc*MBQ+o0t(eXseZ?N9pB*phOC=JzD^S?)-y`66R;WrBkYlZ$6H&nND18(VaL&q@>YH zGJ~x$xW7$!t1#1rr~<7Ec?eXN4Lm!w!n3?hVPH@AfgGR9GEsRI!{lS%wYyq>(0IUp z^{vv8^?JohE8fo1-<|d~uCmj|CYC4yect_+O=B*0${lzaXE)9^yb(nF&p!yVG%S@> zWk<%3^+R17-NcH>h}tce)GWaLJ$!GgLs$!~PrqRQ2JDj`G&8wef@R6i2Rj6;*;KsK zl{R!@GC-!lPu&p8fA#HXld3N8{-e3gidEC>L%qxn`gU5!1sCl~ z)%{@d!#cV+V4(HvEco-Q>%8$&QedrKyLl%ZVdnz+I@mY2LW_BhC6-z{3I|cfxrcpd zvfa;M_}f?ZZOo6_@)zEjk$WCOCUtSNadaLu#-hbl_7D9<0AS*ylblRzHAMvRR%$1q_9F+WhW~$8(NQ=U0E4*FmCfe7= zl`Wztr^1#&`lT#*E1nDAg7q+5F#zqDHD#5T;LZ!kCB3QJtUry62!N3By+fK7sRz+G z$yth}Ee0*evgF-~15pM}8mfkr@=Pagq68|b?~PzFU*IvFDSudn2Dfi~d%*F|S%I9Y zW&cPki@OGdR8cCX3G%~)yW3b@nc}jL71Dybcz404)+Co3O*}f+A=YzO-r>pcqu`HG zixKx5Q~H}okux9Nk5%PbQYW({z}F{4z-|%rOxlr`9K`We8-ZJG+hjd27zyJwLkm%zgXU?|DQRFl((-?zLu*#*y|LeaXA#meC6bUd-He6fBu~7OrZgY$|FW zzPg?R!yvz$6@Wm2E=`LJ^RR5<+)jL|04*=;cC%8(U64tLXawbLFgO2~NOv6Zb9Es@ ziG-z&&*$ql&iWuOUrN zA|1R_IZOc=Q8$c?c>tU#hN0-ctD(q5;zDhtyK-<}~_XQiFei zhS1+gvDXSkW#E+;yyD`Ux3H$+-?j49F#S6c=ze~W8_FH@NFO>({LL;A2ekh@vw(2! zq=g#`2jIrH=-~>r(oR6RN`y>Bn^EogMFTp9H#BR?Ix}N$cF#E=zt=`@qq4#& z_c#10V=2E$EA!(4Oje!`&LOKrWsMyq!+83L8~n080H(3_py(!7{gvJ{^THp4$h8! z0SDec;tymQu&&=XQkx6Pg_c1Nvfa(&^T{@Hc^U7lGl#)xz?a zMww_8T4e}x%LCFIJ06Ttg~;p1$Uz|22_$#yEtL)Us|`R7QN0L1li^xD}*rF_`ATwT#(hXF}ww=~do ziWh&4Z6S-;Szh+OTRzs79ZnnwQ`GxgwB5h^MrGXlfstLG)Q-YAJiNGpA?(*<%4tF! z-Q3qT?s6jI-38gHlvcK)9XIrlX}^azx+7%8%2Y<{8`d`aOdouo4mpu0^)_>vpmd5D zFJy5d52vJbd|&$gN*Sb_=G?CxWaClPIv~w?7nO8WBA0qYz?yZB1$d#<6bTZ#=s=D@ zNqzA>rm)A?Pf`u5h*A?QuDt=6s{!8^mBT2I`BK@3 zF?+(Zn~6sPdun-P4tq|Vs`xp70+$h9UUT`3GNU`6Qdbm$5X#*dEmm5U9Mv+danDz5 z=W&Lh))`l1jY0vR^s>&!HE8qq-`;MYhUH>(34k+K>}_i3`c5%W@c#<>FB;&v*d7Y7d#ko-OT2hY2r zA7&$s*Pph(vy&VN+I~ku{p-W|JAqIC@Lb@xKxX^E-{Ys-q2Afzos)^q$JVtcWo5o7 zTa%m#OOkH?NbZfjaJt+PKA)qQZi11E$$j=e!VfSMy1Mt*(IQQp7G;o*yUnAK)ZQn@ zd{=fRVqJeZ96L#X(K?3hKvkpY%2dx4)ZxnW%7)J5{z;0N@Fg|BeV$2D*fcmbwq4i2 zk)G{bIZZM`1#EIW>3EYTjqE%QyiFS3_w-XJ5HLO76wai@t2!+os)?<+r@9>~Y}0I~ zeuip3U%fTw>IJNEjf%)|0r7B5z&jpr0b|q%k?`;2)XO-WUW_L%X)?#;lk-b`cs?%Y z2f~n}4(Ldlnr+fHu%o}p4m&#-zc4+KJMJ_8_~=}*2FrBm^1FsqF@Go*fe;w9H%0!VzgR; zxFh_)sa*gb=POIyd)u?@y3wWfrT1 zd;R(o03ZvyrwsEPpzc1fJ|YC{<##!A$eLcerO#c4j1^FsIpbGh%c>sz+N_ga$m1*m zt#YZ-H$W}|abfTJa18n_F7rv%gmU<-7O#<_OMUYz5l1vUmxXkJt_7e2Fo6ok0oL5TiU=sCfadk1LMu)aN zw-`hCzULd4w=7>BvMz-L_BVt}K$n=)l`ES;*97l{P;o`DNoP)OZqun_pW6kT>d|DKF9tM<>$c0+cT7fJcPkvU|@vzpXjgdKZ?v%Y_)Rj#` zXB{V?tAw7fkow*P7Snyu(L!M~8#kgg84mHHYSf@V+&(0oa?ZVfU=S6k(Y29kBUdrf`u@$gFndG7};I4>#1v7kK zvsd%MHdx$rETp_TUdfnJyj{X=WNN2A%0+J4)FPQaN4gFcWT*OPw$~f?GETA;oYqqv{B9ue)6GgNxQ89K38-MD!VArFi*! zD%7OTg+SP)=B#VQ>5J`w2cnKxnNH?1AW84DcFm8gSNS&29$t<^~V-zI%t1D zDOUE;e;(p+;4fuUUni0CV|B}>sGwY?!Ulm(G~)?ThZ7-x2Q?b{8cX#dTZJpK3y`LB zQm$}4>Ki2G@XeRZsIWmv{{GqO^l#Eqp(a`X z%2E*4q_n}X-20aYT0UNB3Xg*DU$9=&@af}xI<1~BO@cN^G8n7Zg7zyA1fmpCMyj_o z+Y4BqUe(jp=h|Jnd!IS-d;sR(TVJUVX^N_fN0**uUbRcGp(nF-%nv29iY_qdi49Ob zbdLPDWb~snznOgl#ZblRg<(Zpx?JBeM64ZXCP!%No_t?6O*b9Zl9@S!@Gj zkH7d0q|E>dgR?!AY|Heh zgnOzBbbBG^^|X-!*Mn!C+D!*EJ(wzv^s3E&&a54hR_S}361WsR+y@c?~e8^2m)!A#~~ z43^Nj@mEi7JG0hdHYxn?xxsA`zhg;|k5q?>Q$vkv?^aRN*Eda@q_vXFZ5)(7Cxu{5 zaAGZSh-3XWm^*qPD!X}e)zUv$T+GS9uoxF&Y)T2%^fcA}b*^y{Kz`A1O7pR;4um91 zpCTP5eF?h;n9@{md{k9-M^P(2W81FB3dGU1q+CnaXaH93oArJW;O#pNm-|+S$;%pflr{6Zb z-Fs>sudopI@Ybmq&Pmw!PeMj^D4?2@D zDvsy274OyMqWZHQ-R%dIidfFsd`6nl5QFDlPi_f(KxGtMUD7JE0?NxFg^35V&h7W1 zK*IIZqPMo#;!+*^on*W+OVFOv@~1>UyXlQY$$UqeSsL=dNVs zzjKo~7?Oruh(q}#%9^y`b&Mi>(3IHq4rjnL98J$9 z>G8_4@9vaBt(tKqyjgj<*9(5sjyIOk#```uTy&N;dpFcL0%A=woq>Ud>O;O$dZLz} z_P-QYxiQkxsr_adaF`>Z#Z*XLFFzx`C{BelNkBQ-$mdn^ugYq%J`;Bt3*Lx}>?%;P zE-Xm90EA1#y=5oB{D709!KDYi1OTW z+EF&dGBjj6em(mgqqm@|TBW9e_k~5by3y7Y0KUf!7ZoS)i&B%?XxuBG5^YT>hh;RI zURU{Bu7S4N0yN)Ksu%pctpAL^gJJT5d$cUFC&=-lZWfQW?tQh+1z`l!2B?Pc@Uc&E5obR&5t<;h*pQZm}ptWt^_}GC7Yx|^57GR7Kn#O_(nm+-!kD=C_Na1d}9X} za5y?U9y6i$be{+j>Q^Jo+Oh7O94i8C$;U_8-eLG(dVYsz_h%V=gwS`)hj;1PFL8!< zqw&0C=o%ju7=^w1;hols@Ta{c!&OH=a{wWShA7GIx>#40%S7xpjTO0EG-|pj4b!tK ztEiJGmRhOVT2*XmG>iDVeZdzDPdV?nm29&EAU1~6&K@|+e&&^W5d(;+S)+W9K+MEr z(a)FM3kfs@^WAJaPGSbqj*{sooi9+_2d%fap<|nt^)F9E;8Gy<{%m=puq|o>9i}2O z1<{7=E{Dg;e64!X#5qr{y$-;3KxX~m=U^l<6p%^2AZU+ZUHxW4ZRGH6H0FgWbj+Qk zCiircC_RKh);WxCwo&64kATT{Jy)l*a;{&`slD@;YFt^F^_{#kS}$<;YvnfEe1I6N zrmpu7@izx#qt>}|xSE)WtWzA@7Z1IhN+Hro19AnBKX%q)(IHQ{Q(BsuoKL()t4ZwF z8jTuSuZJJ4_)L^`p_5xkWOhcg*mfaG7;Md}CS1~}=P?6aQ|+}?1WxTx>y)7*vvV&s zkWBkTwFGN#wXeOiB1TYG?GVd^T@5u=J}KQ@j;C-yDoUNQ4_>C;B|9Cc*_2+A_?qZp zI2l@TDXzh=W3;vBMv*mTG(zxh@M`r5>!EnlI9c$Bdw8J?ykK33W*sPUnB~Jggn>dK zApiWkPYJW{Hq=1WRf-1wAdCh@;OEZB`weqdiYn>hU&!tfqJL(l7v|$E)?*Wop|**w zUBz=vcWk&f>dcpU5o;AUPD{1)txW5_cUra(#D|b6qR%Gvv(NeoooC)+G@v=$IlR#c zpezH?L^jxGz|hc#Pn{}#FhO-5HGZMz;K0%^YBg1EySW7GPNpz-*?GdwN@hD5RhL5e zhfUJzpf(^W*$NhU35-68SLEyscrll3a^karfx4}7(H`bab&wVzqZ+O8w`ju)t|oWS z)v$FapQ>vo!y{}>firE&iwbrV*hUgK=&P;l16m z<$&~5Y#rWZrFSd8s39h8cA=zgJ05fiL=?>epnY4ZcFBQ*GEJ3^l6KU0q{Z7iLiQ2fr^_pEWNy+v>k zw|atFb@n6$0pU7L_Q2!!jsiq8K#66Kn@&h~mM*#j0X;_kV6UfEs*Lg{?C1pOo-DTso;vKv`F}$1H`R&2=4&DgwSfE7r0UDN8v+F;+~+d zV~#UDLA1ui@GP7uK$|H&$ksrwW_oE_$jKu9>;q(yU%VQoAt66B#%jWpu>di}RutKp zkm+lst;|Tz-$!QbURV8}^pc?#7HZs!cw@S}FJJ5af(w&tZey5v!)@yQ+<4g7vZ})o`u;&1jitwGRkqHEzNpi&h0OxbF%& z)F?T%ya!3>$kfr08ykv0`gG{!r~gVN_lsZu&G6K~dlz4VBaTP5nuS>2+RusC&znXX zMUDG*Ix%trPwAATDPLX=OM5$a`i9|Yg8JyH>lLVc08H1pcwi7CES%oV>U=W}j7lVgb&+5hP=2%N6}1TfqsS@?Xlbf57`R7&USOxSdiE zQX40H1?evC0?sou64NdFU-&l%HW*!&hHZpbwBj8GBMlg$apPub_&bYub}ci9K3i>@8}qqsz=okGM+SEaN@L+dAiv}3rH4y^yBx3 zGYJdJWAR?Ld%X60xJ^xcz3GghLt#C|G}(Ktv5bvM)MI4dPhurl?eR9rO1^48YUEGC z3Tg>*(dxfuJrHMcF)BLY5rr7S2qoocTFww;CuP+Lytco#pLNOtpb%&pOhf7_eI8k2 zu(;TwJXtp#MmBN_kWuHABhFeueYOwtQ0nDod7Th|Xrcf>&eaV%6=@scLB51rf=J3Y z6BCKTJ}G|3877DDjnCPv(`?pRZl~`BUNl$wMx47A$3TvtGWp>XSfGxK(;G4a9tg&PL}9+vFl zRVs?~#BQlk)JiF(1_uHXg8#l`q6pX>0ru8(x3ieKkKg`8_y{Y=o%`EkaLIC`VP{Q^ z@Nx>(^{>6FpR9AWK^8g;dwaZlVp?rLfA{nx{R)}g%p2O#vG%1pWLR|tW-{wcu6&Nm zSIwbRb(32I-LZ*%`UwWW8cl$F_*nZY8piz1L<(*@HvV0K+S~sBvH)e{z^QBy^(@C) z`ju2IF>w~t*}8TE?N2&If|}=oJZU4=2&^F4m2uC&XBhZPa}aCnzJ!Gi+dM~7-}oMu zPb&CHr{w`t#l*zZ*fqDsC7x9OTu19i*|=+;yqywd4QqYdhd;1`p3rh* zakY?$S$yM)UI;>D9w{BFa3<4OK%wc$k$M39i9FV^V z?}^^6r?^Me40GiGo2}ooNEn$ApIs>I%t!3HIh6e&Ur!jHOys}A00xLHCU!QiSw$0$ zkK$8@UkUGY6!}P7;xPW7lCvXWBVGU?IG_3|Ujd!o%O*-gxlaM3gHv z%9W|TeY}h($Jf@@Mn*>3&RfG3iuuEYjO}MlN4k94(_=ld=Td0Jc_59&(dr%l}aKl|gj|O_!IDK!5od3-0dj7kAs?{dViC{kOHXe>Rn>gsS^oo|)F#sRj6L*<Pjw@)NecIyfb6XAP^l3>cMhI5FVtB>*Z{AJiOO-&un(A9O zz?Vy*HU!G1GG)T|8;h`7&*%K74c;n23lK8CA+ zjCdf1x*y^jx-%!6vi|avGqYW_SnWHBof61~rqBvgv9Qk~W^jaIM`$P@{QWJ4&QgM?g8&^ua*I+yD!rh^J`LFXL|eN(MeW zCq=oy=Dv|pMJ9=idribw=B^QX30-X4SpsycD_9-xhl{ge!B(e3b%<)+H$6$ozDlEh zYj8zgbxj{TR|c*k7)Ci%GaDyK*zty6 zMpiKZCTWVpB=qiKuT731)1*39eaIhlNxa)3%c#F%W5Y=Vm)zbToQ2Il}jM5|w}cOe`8wRxTS!53G%ja`8LP-1e zioL9CtS*=4ECo_s%Z^6Kg_7Ci9t%J4$C*=){)8~Mht`;2N_8G!u-F*P*0XcF{|5|D z7ah(?(PdV!pAd|z3Y4!bIM57XUh!(x<5!fJkhw_a?%=GtzP<)CKNIHx^yjp(=9_)7 z{0~zsEG(o^rbkQ7%)3b@tJ)g(|TT`8&PyEp~I zZ@HmX@=qin@6sl&=R{0wb7N;F6V|NU`QDsux8Cj*;fEUo@pqNUFgT$`KtKR!!4o-c zh=tzz`tmoL-c73LXtjDhOqFQ(`T0GYsqfshbNccKXd(lxD?qieFGw--fc+w?k^>@76j3T(0H+VDCg{>r@o{jm9W`jd=MYzK*7jw5nK{0?lhaDP8`A>+~?TyPOV+dUY-sFJQM#301iB! zAUfN$+!zC4yOq1=PztxGs3_Iflz+XwyIp&~oj?Vxe2sipI#w#<74@OQLZwj}-E)#M z+yheuy=ULWAiC#;m;g4{*vBOL8#e+1qzJ<1$y3Fw!sGKqBM-0qNC%I`>77u*D>9OW z&jBss0xVjRyyO;U)q?0#R06jEIRyQc7W!6QATV*r+!W%CVIe^!#A-+L)^NSatkkq( z?L2PMMyY?r_J&la~+0Zfy{;KYGORy-^NIi@H+1@f;tC1RW zXI@3pyJRqH!w|6T$h<4ildI?a_G1$!&uY#Hf^qbLaW^_j_=(hg=CHvQt@LdM2l}{E z5P3mWrSAa-?3h+LKw`!9MwTz?`S8!2%rtrX+xc;iy-y}e=5Jr%3(=nuRTjH@cf77f zG#R~uwP}5DGB(b=_|_eUm-n^WGMF;HpGmuEhTy`kHd0E47yD5@b}rQ-Ny1L)(t6*z z5a3%Tc2__uez;@oP>asOr3I9fD@V?BIpox)URUN53L9{zewyn^iXF9Glm-L^`0F=g zK$yWt$lUZ`$n<*g2VlN=Wl1hePRWFKG*x}=ot}!H8=kyv6sXMzuUCillf`9sT_g5= z_X1L<`7}z#d3XEe;83zU^Ro>lLhrbGC+q&y^+2k#FsOXr1RTi=)AD zF*>Bt1Ve||J=G?R)B6k)TsG&&dr@Cii7wXL>0sk>Q89muXdh`abZVx`$g`ql-YigG zyAfpH5)%9KUQ_=Qx_z3C4xW%$KGQRQgp)&LFk(Z}Qi}Lo#%oF-)Wif~_aOF>=GR~J z)V1W0{>A!Yi>QyF*(qI0OylhBFrAQ*e_i_kFLpRbWP3Z%Z0@*EFr%@-QFD5RZSn7B z`+QT~@*mj*%QH$x7O))))aeqUQFGa-+mhc+J#2^_WzHFAFxm2k@^3!HS!<}y@zE~t z*C;K!a2$P1EQNt^d>+;&;wr4Qn85N@N=j?cJ2suU3#&1+xascx?siiRFyIlh17)4) z6(QJf38=3jki7kY&==)sk+SgMoS$0^;#AjU@;xWBds*Lf_^gYz5w$Php>-P5;(9-& z7_FtOSW|4M2NkEewg7i2K)r_Rp|)~M?FGQC`6-#cxpuj!M}(xfe@)LLrNZ^9WQgxC zdlpLWD}mxzg1E%{<4Lk#!bqt38W@r>-w81&0|?dv$_xCyd}B>CUm+S-??9ScPsmpRu^V~uAd4DY1I5%>0} za`@HbZa&{WdI#mTeV9eq>V!gTk>#_r=dBXw{n!ZyK| z_{uxw-2~P8__OAy$dh)yoSTtQ~Cz6M8t=PwO3W`UU&=8ph z*aV~(Ed9Sh zK1g!I<|>n!vKhq_iz{)3g`Z_5Y&Hs8?u%Q%F;(KNjP92d(YS|5UN<%6jk3DIxvqA< zYX+(%PbB@{8g__$a3s-8{Ya-Usd45)nzY-+h#LF#c!kpC8#^Bj7wPHyy&e8ASi%{h z2+O7+*L$|d#dV%nKE3Z&8hsPlOllg!sn=k=e==lim=jnflip)XPC)bYt(XNX`>M<8JR zscC7=EBP20ta_svy;BE*;){ zZy-M@EnWSzizOwZpYw>kr#PD5DO*Otj*F_A3>7)|L=hZH^`6+at_u-KKEvm0ZQ+i5 zqSx%hZ-if53{jg#b)JOzfCRIQTvxZV9F#3zAnSa z@|B0Bx4LXrLXE?8WU>fF{gWy!)b~hulxTP0nj|xl9g%BVm8fV%qu0^7eazmkG^S^X zMKWqPU4yC<98=|fHpsbYS6{F3a_}^s_m-3G=AeK2$}7%YzUtm~D0m$RjwCa_*2}%DjW0ThRge27}3I5(&{%m7YVtD*k5Qqpeg1Zx>5x zF=6f5iv+?KExa_0jM_DpvjNBinORw&o3PaAY-3;hI=_;2b8M46HWqK_Ym}bn^3VRo z`O`vlrErc#_N8H-rrKq`j`{ad;^~_7OaHL?`*Ce_x|b5zHa$jEZaZ%pQB&Rf67P9k zk8B3{phey%cY?5njt$UvI_Z7biX$pe>Z9kr5oIDX&4q?#<< zB-q&1o{`nqDCBm`>itBVC%?$rV*VL_TM{>cm1DDHQwjDbD^+++YItV&mmZwoK)oUw zicQ4pbkIwce!r6ynUb2S;f@boEP1Kb7WrW@)T#@f6pGv(px_+AQ+u8Esb1oc)f9 z;D4eXERRu@wm)2_W|eswrijY>3blsQE7G%wcETY$zrC&E&KiLf?dvMc z7X)DaojpCtjR+%uGTL6v&NkX?9E}wR1UAo}9?(pWKicn|k0%+41(uJZ5``S&ng5E@ zY+x{^zG-p#!oGHnr=o2OV3C9rQT!h814Rp9&6kYSzE|3nEH=KsYk&cej z;7wBq?`CKH|CCqAs})K+lhV@3G`N^`{cP89EJr3Cy+7+avVTcRfp#+!yYrRhM0hXF zKTXapa>bd$A|m&4#fzqncVX}i(;GH;U2_+nYWMt-lEoI!J6~A%4@J|ZS_Fb#P3h@6 zmX?^HpJ=x~1kC(R>!p9aubmd>|S^r$xiSWd@ z9)|4dcyOuUty_1|Bm64f3+3H~`GRb6yx4X)Un>@dYr8v^v)LaXNzC6+T57#eXA92W z0yVs#{no(9?@uzRJXmOGdQf9wI?SmhH;O5a7Ap^{)Q|hD6FniXIO(?PA*JaOR52>Jt}Neqk3dYFH;;>b*|A-U|WNz@&Q9V zzG{7X*cwbmKtOo7yQ0cW<#jeTHnv`F@w`3XmCUi*_!m{ATmq`rnEGUdlJY9#)3fBn z)Mjaov0CTxVUZoQVB>B&@8A$tOqkrR)rEk3$ zOqo6VTgN5@m$(JJ1_JL$wNllz1pjFMM6NRWmtUtJPb zh-|FfQ<=tFRlns3j}Q^(`Po@?GOUt)3;ptt`0LlNn3%JXPpD>3Ny*9kM@KffxxO?XT7DGACp}ILYe-$Ml8YF48QC3Kju#&Jy zHsTq`G4tP?QXmA`y#KWhq-12RcTiqA%wW^OBzF0N4?H~TXH-IOL02z=_kcb*KIMjf z4XU++c6ksoQuFwMNg-HH%sjmz!{e&Ze2iw(VEb1|YqzY;5Aon2=*xYD$CSp{(HD>7 z9~|wyZ=K=FR4PgH+r3oIqZ2kIVSHSlGZ+`JC1qu01-`*s+up7<=!uxEGU4UnK_4B> z5(6&ie!9`?d3TxE7(P<3{pMGg^Y+&`L~B<3^=^sz`+g5cp7i2zod*TRCrg=CnE0G5HE#@j^<`QuOH;y9GMLN{03dy?$oSGrVg@0M1z ze}JhDKqc{7Y4cSoQl_A!eBQCsy>4mHPWVWOhz{4*D#3=qVnA<>Yi}x_&wyb*56zG) z9cg7uQyf);kr9zY!92_Xr-;h0gep#ID?1StaQ{sUrn9`2=}1lHN@;N#kmU0~z2bQ3 zarKty`Hz;iwzZATF!LKUTSDiX)6JC?-Cz;ByGtu~cX#_*w1!Mwf`_lCvKlek3GQ_3 zD}q%KZ{=j_*HwNibo0Pl^m)^5=t#>`s01}z0lmr?4Zr%$VI{ptWl@HZ&C6hsH{p&Z zI*5N;4It8O?AOrF(a{s&?Q@gm<;-++Mc{)RT~Cd|6&rnl4xW4+f1#F}A6yDb-j znA#KByl6&Kar_>;cQ1@6(6mZ0sZ!+4$8ODYxGw&j>bqvGy5ZYJvu^8e2rg0Gk!!l? z|41Np5JPxqcnBqAToB&5-va73$@bJ5J z+hRy?WX-J%cDfeXXYR_#8;3Qm^YBBOucLI_+G*_L3}22ayhv|zKJFZiNXquBxlL?C zgIgkBs7%4Ae+R2Yjvic6Qer&Y-TnEu?9QVj@X@oaK{m0*4EJx*tYvV?+sTXu7i_9* zhv5yQ$oA$Hv+g@Q9T&7G`t>VCx^TR!=OpylAU_NW3%g$pBnjF9=@B?o(%H$0!#UKa zu&}Z$??J49-u4?VA^vH+yM5_d@myut+?cGtg+1rUpcB$l%R8Y){CCdyt1B`h>x;9S zy~s5O|H7exp+CsFzK4cwx!Dg@PCbb=c}qWBD#aSReuuBMFE2inp@2A$y}pKSZ1l!# zS-*IT78_4>6oE8e8uyD3k7t8`t)_=QO(t9;*;&2nKGG*}={(Z9X;377#Kv9b?%n>s zi==4W9-rawJ-m_|A`{EL4<`b%m4-^z;X4#2kF#Ptog-|!oMrg};sxF!k5BTG-U~KZ zGdnH9TJhFMa}HFQ{Qmb1UoJv@ujAj+zZIB*96E9D!Y)qkn>`^QX;_;O7|I&0UFL6YX;Bc=6a5>z&$oTxeXMzoQ7!Hn5*p7r{lD_L*%i2}j|k z1$q5jjpWnC(p{{_^DgF-YR#rE>h-Zn)aVIlXjCuo-h7nIlH0lXkmfO5bmol;lkkd> zALdV}%f^mFPNibm#OV9t-V%*iyNBh5qJrt^GY<^1(%Kcn;PNZVvS#>qd7tl#Z{)O) zbCp$cb8MRIE_6h@@`C?~>X+2|CJ%J)@LDM;$lTOMPodV^y4CJ8o%gt+s8V`V!p!~7 zWNoh7DAopS1w;!Ak`7u$+WvD%#X`G?7|wdz82rf9xxe|P0R^Q)^Uk`4Mn( zcGludhv@gBu*9RD>YUa^weI4-)HUBwKeoaCfo|;Pjg7TT(o2y~nLAcr$}BC7Bj+FQ zoXpa`6z;GgiNi*eWolDfd z%)C8sb*#YpufODw)Xd$X~&Cbrdw5XRY3^C4_-a&kZe8DVe@{b-j(UDs`=!yGM9QDW<(xc({S8 zDkK(Y3#4ram}*IR#pO6%MfEOCtsPsPFnnMO2ZxuE((GI`F>%(L(vmYxDYc?_C@9w5 zZUx82y-VwpUP7z_ec;zuTpxBn@g%={ojYq5NxV)(bQd2xDVACyJ?xWqR^5m#TJbRW z^9|nl;O=!EJKhnLgO&8Y8HHHNq=_IWC)kaGpRfD+Mu7G;soeM->&_yxK#V7cdVsTE z5En|VSOW43;tVW8Dw2nl)n5}#eSPSM2j7K-(`=5yq2aDBd|Y}9o2RED!4pgEEs=6_ zW)4nHx1X*uOo%fGgxdUU6CRy;hR-PHX?g(6qdK~gerlBkE(`dtI|6V6Sc>roO}3!| zO$LVzMQlsq+RbUh1NSzfMoGq#9R|N@r&R;Y%$VR>3A&B?hCd@6Tl=`aUxCRmv!km$ zSs%*I_EOSHJ>2;4j{2KW|1Jtd3-JXpB#9!1J20^Nj{75I2N6u{qK1;v)Xk4+o5fp& z-#eqV!xoQTRXjF2d^!q>4wB@flScX3quaD`%D5d|gk4=((UerS33&xH zfRLi!!o%dCsQBPCDyt$%>a?Z?W|Zu4djoS8kM{*6tIg65Vl3+{p>--MebTo#Kfm__ zWdK=0(c^OrRDBn3*}2Y9n%C3#_hmq1Utd^EUiw}(5sZ)A${XUgi9Phmoc;anA4;2u zdxY(-1>fH!z5ATguxK7E_xk&u@~FgObaeEYxg$Hz9!vv$N;_#7vM&Vx#9ZgzD1maIOjr<{0(`5Y(e0hcRV_D<~*>oty-~SLXdm2nzb!u_XVGzpBz3TjKmI6%YOX z%l07>ga-u%RoA=*BfF4L+clhubSSDK*{X|rPsU$qR(Q}XHlMVJ`781Jf`zwGU5|g!hKg(0Y1_2>%+fs^xJc>&>jJn0$}ghb+E)0VWU^ zZ@o$6_YlqxbGf}i*3(;uGN~=8=}FT#i$}%Y@7z`?DkMq;NG}h~Jy+3UJNVu(z(b@z zwZSF?b}F=Lw48G0Knt}~=oHSWUat2ed$*uK=!vZ>VRvY+*De>On2_3bc_Es@s6PV)9bxTOe3+dCU4Get=iREE^uz?MJ z5mSr;oeNs80()(FLCrAmQP++JMmYvriK*n6x~eI%Y>z~7^C){gcH1FtmK2PZ8psIG zy%dZtk4My_l2c2$5Q0SqbpXeX%Qhii7!@o8u8rLVGQO&L-fEiy-{J=up*fC3^4Vo( ztqiqdCJbNP7$QoAgFw}u7oR41l+{e8lrhnyM4Xty%;PI6L>Cj3#|km8>??Ko{-Quq zkxWp*-5=PmVNfAjp^{3BuluHI!K?ocC5AMFRGwzXb)LYTjor=UHkT6W_?_)5v+ALARI9Pyh-$A!l(QNd*E3}rdUb41lhiiKQW+FpM z7w>^CfZlJ`0rCcfIv>XNDUN@$Wb`_HIREEq+yEl(Q|~2hj39BwtDx8J zRW|7=1B=u?)^D6gVLz(qS&Z8&ej$tsx^Vtr1nS8eh69xezfav;y<|;%QL-cVi zr&giNy90@x@oQ8^peG4Bb>?Jh8F?){2 ztNA-R;R~{m9YQWY_;L}xvZYFi7-%-aUGpI^R)mVmZY(BFI-Br3q>UVeFl_NAHR`z7 zy|~xA1&1Y_{TAP~gR84m0+U`rD1Z2X=fmCB@%$a#_i^9Wj}39i)@G~xvnMjgf+V~x zZHHBT*F74Hd`On9IT}~)7g$@19uXsxl<*4-qdUA=zCcTMB!>TC8@DNoYh~^H4No2HIbT2q;HFn# zAQ1YuApSzyUVs?=-#@HU^7=qC8q^==8Q*UrN*FDy=q&`vb?Saqf|w$J&4obr;g6hn zeW99i&mlRf^@g9Z6&l3B5!m9+US}VoRfEOx_E16*3uHv=IY2ix@I0U!WuZfS0-l@V zlPp7wVabiqKTu2EAh$ai;V}yI;6n_`L_R;Rp)iJ*K8(OjosA3)i*;HB`1u!md(8ky z3$T9?2awq_wOo_3v$IoEn}S9zzuP&pGusjW8?sbhor`tnwGv@cefNv^+Fj`->GiRK z&Yu+vOs5QttwfD7k( zKRuFoUH`66c8%0;@-Sp#if^tFzTCPSdlmX)0&}qyF`n`5FoB5--!O?_@!WCjUQf8N zy5#;mFj{{$m;Cr&zsO^H^$iSyO+gh2x+*eXz8I?2WMt@G9?TN3c9FLrhN!b zsjnw+m(f@2o(vBXe+y>rp*7^YoKxo9tA zA7@Cuq#s{SPQ7}}TWCxN>;>I!V`kj)c8|BmvNFGAsWA~r`~Lj{r`BJz`NDSm{R;+| zMKe)eQ^Ux_G)+%MPJXaZ9}@(UtCvEcoyKnK=bDD|ay_NS=?Az_V5nl5(PSu1pO#jH zM9}slW(9+`0D)kv9BraSuL$`qyu5NluIj*`viDui^@?g?{yPm`7W3D$Gc}dVd*+w> zO!8sGTiXuGWX;{=&L-rw~0_BOP_e)&|O z*k{O!ar6fee|WqO^d%}zbx2I(5|K_8E-c2V(#*_?dHlbpX^KcvMEy(WE@;6xzF;Su zqe5p9Iq-McUCRl}Qb20l8cvbrjDd=D-n>$+-rfm2wRT9M@Z{hr4Q(ROb$fm7K9|5^ z0HEhAHEhunfD%?!RcX{(r&d>2=Z^IE(@{~0VTuOmiO3BM4qlv}f6#Gf!1g}>2`&7# zS@|<&@b;$mly$Im&Rl7|)zk|=$SCK&LQp*oOPihn>&UW9Cpa0NQ%{o43gT0W2yAF= zef{k8Q~;P!4rn9O28%Ps2L=T2aB+2ZbxDKCsa^J}s;Pm_*Ot|5nEQ5)=|5zS>6^2! z1P28n?@G5GTGwo?Wya|Yxw!4;G#WxN-ttEG*W|{u2_eX)D zl~sy!RtNoF)u^7<#v)|A1CQ?`PDXiLbNLtX2J$6FlY6(yN0^IE+F0ub3^eaG@fa8x z!X7Sej3~o7%Nm{RgjCT>6wOu`^4OXd=Kwtrt@g%CDT}VUP6AOUYH1&{Rh4Kw*Aks3 zA&^wCTqEq_R1d*Az5&O}WG+>7l?O;r z%9ywZPI7`fOIY&^1dSkVGvDA)bw7xT=ABDQN@2L2yNH*`);ahJdI}ep7=3b+_#93_ zSERhBM4gZ!douRQ3TAy{fUB{l)>XKJ>SPb8s!IH=Iv!rF#MIQ-EAN~=bGa2fjYg+d zLI@8YNKZ{S5F07=&t@xDwmg=kpL6<$2W>p@6{`Fb-FIe&_!xoG8dn-M622!) zz=Od^T1zV`(A{BKpp1ifQ>)n8fk0h}q8j^HM1;Qo_ToVNY^F_jH|uQT?kYr-6VJlp z^fc-XL2tm7g*&poQmjjrkFCQPpFKzbpNE;iw~)oZkfkx>bBNc8v*h_b!q&mu@q-$f zK3SGwlw3e_oS^HMX8R)JM1l{Btm|^07%?C|1uKkhkeKMO^kSlX@cHP0giq0oSG*d< zb%Q!wbmS=*M|_u*OSBWYyl5vUdDm69&X_Mg#*b}28o`u*L$mNZm zEf0N6UTME|gq|(pYjh8Gxfj3xfJ5_O=lT8z(}Z3Pc!(9)P9ZS{xZVB9$giQ_cfX1> z$aIGqmYlhkK;9nLZeGhf;L) zDS6vyYCmN(#m1iRn%q3N|5zaG?hPhjk2^W%PyanO zms2D~@Q{XA3x@C`6wKDpTMFnc>~c-$?TCOhXql*L=gys%EaCFrpL8TSl&NUvs`wes z(P#61yaHXK9rU{2s5_KA^F^oxV~u23A$VrD6t3LJ$^=Va#6-f1<`*wJ!#FJQ)gU{h z&-ohrKdefMvXkwvp*a-A@sViIOq&lK^acj=y47;&zJ^l<*@_{XM#Yg#(BH5-P>_vk z1$^m7CeSPHt82ePif1xYQG0^q2CDcWe-1-uq%ckQFt|fCbce&YID+Up0axkoyxb#8 zZT%@|t5{s93;Vr(bp1Tn->BHikg26RJ#u~7Z3~~;6yRhr)Fl$OaGp(3pPV`!-N9tYQ! zgM}qlD{U|&&SNbuCvdfr8QB-T{@hR^#E1iK6=`SbbOS{r%x^yx|$%KLsqbIpz=e?|Bufx<3nwU<_PNKp;E9 zk%T_=G_l$8HJi5)%iuAv@clv0M?xZWoU zDlHe2#TGJzuSP!p2H3HFBq1i!+5D+6WXBTNXB8Tqby3ShrFB=4qfK++E!3j_40S(KKvIf*x6F#)O2kk5?yRC_C0| zZthZPn<}NKdM&(*NdkcCQVA?u? zWf*5FBdNqVB6a>zME`NCG5g9lQjj7$hZ)hr`ro(ielce$j;3_W*?HkTC4KH18!ogH zoMAKg3O&Nqna3*@5RwxkYbGE8dY|^vlMLM95Q7nromNTS#bF|W`lrm;{lW?g<7Ry= z{@6L%7`U=OeEG(Fd=>U1)pM%`q2q&`U7l?7h1lag-XN>@UY)~esO3k$6+=x;?)XNG zc9t_7Rxy;2S2tme@SNu`@42IXIa-PzeKuJ95KbT<|F7>Yqt-~Vr11b+f4}0>W7FgC z-KBW$@M^#to3(eEi$-N7E0HAF{r#$~Y1L73E>kEOpfHP%_4Vn?qOY*_# z@Bgz~+D;;nfpdJTxsYwYg%*|I{i%9&S>F{8ZPccbLc#dkm00Z(Zd|ND%|{QHOqa%# zlVg2LOT~Qws}Ubh+l7qZ(gB?7dz8VcO08ox5uOlcnENR>W`f;wG2r^R76jdM0R((s zSX~2hHJt+zZlgIO-PCV)$jcZ@VI7!2lVT^N?tRB>#@qMn zJXz&n!6*t86&N-7hM!y&L8jyK0-hd|DM7-8(+pf_7*QA;6?{ zKV*2n+LSL};n|_~SGVd}-dLQkXYc~xyWi`ZOYJvRbzwm#?T0PULrL{DqTA{>dgyt9(H6jo>` zzD;*s0}Druo4@d0wbPLdrvD$s_p2$Y9z}~~uORl%8FuY^Wfe|FGY6RTpd^ofEvc3{*^!}#1Dw9cf~tS?@AA|Uau+~i&$H=wF?&h;=NOeJUAGPP+L@3?&PYasDCaYq~P zkh&c>OWLf#u)~+;nm5(PgY5Kytx?ywaBvw3Vf#b>{phDk6CFzb%w6e{;%uaJ92=|< zc6Litrs!Vv{5XQQUC2QVymg+u>?|Z61SUc7KBX|ArL{$Fm}>!`m(FDW```|S)*rTK zx({yV<62ExLnQZFVe>Sa4IeY}TdRMgmf3fRapY6J3%b}hQ&ocKVuPVFQ=Q~Kw%H5o z!AxJq<1EX2owpdPIqq@cuq(1!l*-|EySVjgyZH%vse%OU_G066*x!$wkVT{y#9<#X zMU_HvB68$O(zjN4_5fyuw9T&x!u2G>TUdU_gOXsH$cq?5Bg{uvel32w#|NHF7q|Od$3PCV z@oy`UWKQL$!PmPbdqk9)(qqM-{WFG^mB68rPfIg)_zNevu2R0{foyoXwW(70;xPU~ zVbRb?R=x22Mg>=+v1WQ?)VV{Pexpi{{6F>9b9}+-5Kngrkl~`*G6u=xLWbVplHT-2 z5kDUd*&(zrcLSwjC-*_ej``8~axwUza}53cDk0ce=I3D{TJT^8T2PH6;0l66 zF*hTqmh{vu`$pr7tAB_5lkc2aB3q=B|GNAegIaRm!asOC6C6@fA=!uXRHsVUUf}!h zuWIMsR%8l$*9Ll-e7a+X5+4dsLzp>V@_ppYSZekId12K6$($HFd-RN&NGBK9zqpnm zou;<{NTbkZf0o4;5`M!PJ(P_lXxel}Vq+=(2bOIyc) zozagW`kqCoHlrQG*6tOjAy-$}D0mQo=i%~#Vis=#zs6a|dgk>*>b9|hm6cQp9UT_y zc-LN`@;*F70klCs#`m0o($U&iRY~IeN6o6?ah55LTMDbjH%!5)6y%gavB-CO$&I2? zn3JuR>oUYe-iN>NF!3hinjt<2pf{S)A0z&UY{IbRB>AK$Fc3I{Zt z=)*ZQM10}r>foVNoy%9iiOgQAPNf;JS=WYSRIP%i34RVF6@g?lAz4}^EHd4&J0-5x z#N$3YRC@!JfW+^UAF zvHI;;4C)eCN^A@-HBLPpOTZW_Wf8|Sq@Vxu^~K=WlkUK?|Qf< zINh^347;Ti*jq)lHp*6-!(bUDb8Iy_kuASCHc51~&*=STh{Gy684As?i;HBsXRzRTqpJLX%Z+&VSJ~eE;gzDo z%5#p=!afIkqN#io$PPV7G(x+cT+fF{KZyu`PWll{)X6}(pMK;JbBF>tf6l$*2P7{S`i0dCfp=Y;need6@If3npI^P3+47s|elm&MMn+KOl|@s? zQ2^sv3&Gj;aD1=f*4!O`1e)mRf|U=HfriGcGYBmwCuhq#2#<@4tFEz8r`3ySnT%AP z8WV`FW@l#|9UZr5$qx} zS7)2m-0W#(RZ>qdMv=m0`*&&SaV$q_%UV4C+u4@1yZarWc_uWzHx6*%BzwsRf%v=v z@HOsN%9z>t`Q%0{tyev^mzS4>J&BF)wO({Ega6AHOe`S#y5oROKLn!s4w%mKKmYw~ zep6FZUERz=i4P+@$(tS00YU7SA33Yd#wi5_TYF=uER=y*@dhZbvU79cUcF*atIQUQ zB;K-03tn6gEJJ#J{gT?t!}&aoI=jt2z-ROV94pY1emd?z9h~H_ukS(C zfd!wJ2g`J5Y+%4C@J-FHu2(Hq{a~I^-nQ3${ry;o z{!Wu~a}7;R3t@*W74G-P8a~c&1Ftz}Vg6V@Jw7aZUJ;>%GfcM%P*SPbU%agdnz1{4RjY-7%W#dH)CUB$U;avm@}!jwzk~d+>(l2 zjh!P&ypWEEeDI$AkGl6J9qK~ID}TCljB?z%z{1nmNf+8@IKw+RKmz;GlGaWXlG|M3zh$T1hk+5 z+s%NNx3NE-$@_BF1RjNu%W?0QCgZeanIbI?leWjTk3OL`xFZc$LPSXMcolo^PgT`? zxt^c49uQ?Zs<@^-%`ZP<6A|$n^w$|6jqq<>zh=JEm*gH8XQ)AlIFLZSH=_L#c z+*xi7BmxPiqpE5`YwHtGPu~E|Fj0{nb1vOrW40heQ4P0a;BpMUY<#WNokAHT416Y$t80DJ`)<`m@QA4>Cj zlMeu0lec0Q0#YxZtz*7n+mx&<13*@`v^>~O_ih2NOqK3o2Z+Y*mj|Qs*UL|j&cNFQ z0l5)iV0#Y*o5=@|jF=1n2Pgdm_*Im61TlXhgPxibSRlYfZuJ0Kn?tY~&6cy3K)E2u zz%ck@@THG2u=EUs_V#v0Mn;S2QmmIk8u^N}!ztWsx@|s`I;UI7Hg2x2AU<^}TD|m% zd;WfCv}8^}LBaM=YA9gbf!V;JSN$0i!)Cwr#m43+Gc!{VPUFNYu*J9 z0{MapgNob)w9mj_t1BwhT0CwFm5RQ9|BlV5c@6GNPj1vY?A|%Py!6^mb>`7FQCClj ziBag;XGw^O83)>X2dRUDgRd!EdZm}RpJ`*$c%6rWu%0=&Z#oDCy%vHT@wA+rd?Ou?%K`%r9#IUxK8 zUQy|GvDeutqEI73Plpw19rey3I~w>)Y-}tRCT6i#<7Fs-oNu<%!zcMV6qSrr6g6?W zI2;3U7rR1nzy@n(V?%8@Le za#^3vT4%7Zuz<7<836$Ve<2~Er|TZUu!W#K^T}z8UnDJA_pMj4=_QzFHn^HG0LcUb z^1whb;QPQWO0}EKJB@3kw6sPa{ZOITT~G0g?`>N}<6@~2?T*Z=8?v*(HSd%h92`_s zCKr2?U}AWHFS_s3C@M!Z9jB+|Jz{y>R>5pfX_YYUg-z8=gDe6Qu?rj$QtNr=G&+(_ zbW^<+WZ=kuH4R6S-+UylWv&$e+BM6==Z3Z7IwncuNO9S%w&6OAz?S zsksaEYW2l#B##k1047In-`H;t4W{vHlr2n6T>{xdq`+;yu_M4?fl6NOkLf7bk@UjzI%D$M8)N$rBHBM!^z3XdQar^FU$EF22#?$b8|e@ z)Z*@pjrv`PGBPqCSu0S;i;IuvtWDHg8*Wxry$&?42Q0B*40~RAjTm$c43GnY00Yvg zW|LuJQgGG?A_BrJ&_Be-PXlQ_7GhUFQ|rOX3NrxO0WJOMq=)2iu`7C_&R|n5X;UiJ z-@AV7H=D7RgoFfuI_H#RWQIXt+}zx}xxE!Q8(>30LGktV1s9SJ^IxSjHoD8oj(~)& zn!skU!4bq-u){Ob)AM=W{?S8rxs2Wuk?=gF_=OaiuHdxs&B1YF)ofZxEO5*OFYX5P*6Izu&!;4M0j@OOmU zJ~f}8p9A9r$3w(%8sKh?%LsaI#;Q=tq&1mO76t_c0aiF}1>T&)^jjpP&Pw@?!jP~q zL)_1d@jacLZ%73ASXrZkB&DQ41P8Mk0yqcHi*mBo_5Iz!Vx#lJ?L{C8QG?rsxsXsh z;5sBN46OLk(sN}us;fH{31KV3$0#Em6RmOvo z($W-}AVh$>+}XgOpbPbL3YUOH04xNVn6Iw6Q9wSepwX>#?Q=!pTzQsh*201&*g61U zE}hEbIF>E3y1J^SrsfBSd<%qE9|)*p`+y??&b{xOxu2b#nonm6e3eI`NU+{yq_vW&Dw5Wl#bA(G zI|<`Iw)dp9twgh$3JJVlYSAH3jI&cxszW(rGc$k7Q6zmdm_N03c2-ce($!dFfuYCVhkE@hZy70|CqM zFRa-W=%x^{4+tpr-r6hTc5LH@T~E!5$@~Ks;dtu$7KX58DU*Li?bl}EKsdOFLvt|C zgN6eAB;@TFn~id=lgZQCG4-Tat`b`(djG%IoeQ2^U6`5@0r-Ut>~1_R)y@Oj zU~g|Phm8|(oWjxb5DqZDu^=Ek3JQgVSrJNda(OSh_re&wEqSPyeBBA}=jvQrTlaIgk%~B_R9GY7ARGkDdiuK6&jMly2??PSAkCnH^mcaY0hQkx8P&yjRyPw_x^^Py9AcNC4WHq*h!KGl2-pb4o5Z%BGs>iINkbYg-@ zr(-kUL?5=guiM|+3Nw+)R0@9IvQ4j;avIwy%wB$%BQCP>(DH*|cUxn!-kn&p0*BPJ z+J)RWI^{AnNhKqPC}zNY1*ue2RJ6+F@g^Mz3G1W;sseTH1&_&4r~D%ph-@&#c2BVMDf?()?M2K=d1Vc-qEcyvBrMASEf8GKa$`No)$ zYj=J(((+q&hsvR-sF+RRhg(})dka1}T%SShB#rSsn;C={FDu!NmoR+K(cOlk-RXhX z0hN?csS*(SfYYG+Kc3hGdoRV*z`FK881jog94D@c_0R|$t1k0kNc72wTP}S{%8yGc zj8CITA#2W&m)dYxv=+1E0_x?dpfC@rxL1Q!5maG;PZkut0s41+m}_!dD?Px- z$f&?!0YqG)EaoZH&5Vo;HiM*~pgTq${9G?`U0sob4;|JjOsnos3VnFlt!UDiw57fE7 zi3uJk!A*b=91h2J_E_5}zo>~YFv`>+B_t$-f`88W^AbS+An1QS)yE_F`xnK>cTYWw zAumnxCdjWKaG1PRcJ5Iq;IM(%s(W0GE%01MF7%#gG02uCS9mNTXpsG1R0Utwrdc~h TuiOVMkWl6(HpbH@B`7Dd^mgFr61j6_vC#4Dk!T$z<;Qpb&16Qt&B*~sI^&9xC zfPfAp6hy5R{e9W_JT@~TltT$BX9?7RO9`r0&HiPFlh!}ggK;OpWZD#es`X6c({>WK zJ=j)jB&eZ<6;K%w5$lhbtrQ3qg4_+udmyu$8L;eV#|@W3quS}u0R zEX>U2VMN|MN@$4iKdHVi<4kHL)VUCO_IwC`{d=!AJF@<99yZ*N*B>3;O;EFR3c3S> z89@E!CyPQIkcN%)|KTOOXTX<4Or#Z7nn=EqWyGF)`~7;c!5Lu*lq)>o{l6sgCi04E zV1rmehb7_&YK|jo3kKu`Oq`@YJ$_zOBG-NZ{7zzV)Y1Po)(aXov~qJHnADe6f!qmna+} z6Ww2O=aW2IXZNczpp(9YphygeygskX2DRTj#mD;KsP1l2lmGA2@c*7sVRs&skCBts zb@j*6{OH}5bviM%lNFUbN_dFh4h)j|s!Lm+Z1(5xTqd6?YFuO$Yo_z?-Udp(VqZ4Tfc#LREiJ@|uf3`3*IP58W zXuQZy9dHPTIZnGd_m#-9Tgip6yWXjOA6;SqV&o?~P~|`Z`M7iFoJA;MDF@8!Kvf7X zOxO|+F*c4-#9tQW^-^aO2VO|*`(+#P4|^W%J@rrGDD$XkromArwE8F&80@7#H+aN6 zZq8QH{jWvq1~+s*_lB%9-7NOF-$0`#fn|^4rpkLl9UhEbs5hK~%@&98sErN2?EhEz zB!M!I4vfwDLN)z_55Z8kYoe~S>_2~O5*)SImEXlsm_ShJh#9cIA5%fbQE~Y ziDN?;s5a?Np~P9KiOv~vT*cgdXpeGZyv9GPZK1$!MPi(%cD|qq_~+3c(CWYO-^amJ z#58ee6kaC?`en6H>wdXf?Sb?{pJ{EuuU7CeXdWhuAPvLyyRyP|{13SEe(F_IyN{Za z`pv!3hRd5AZK5Re*NKec^hSb4<&`rRud)i~Ly!MUWf@&47Db^pMOx{kHI4R7%!I7p zi)>u$*gpJqL!u7w41}Y|TH&2!jvXflF?a-EI9RZb_Z8moZnC@^DKm(U#^um;L#8%G zc)h89ef6lRS7_=>^Y}$jBX=uoW&Gp8K2dM6`SSK`$k53(<+s;C1W^DBQ|Q*m-??E% zT`)0YNYY9zcW4*Oo_yx}2Kf@W(ea;^a&s&02ikx%Twu?75>ds7;0ldaZi#YUFb+t( z2^e|)xnDQvEFBRuPV%xFlN~x6Gduo)E*)479I|ZL0UFAl(ab}fXD_uMi5+J8MmjAe z(5saagA$=R_w?;K?UnH#G|wn-$V+{Xt+4rrPUHE-aVL$tym!ag4A)GYjsCNBS``f_ z)DHo06x3nZVoPiM-%%zO(rnobqnpa~mWvmKKCZWE8;l1DelLTS8m4My*|l;X6rfiB zwGSzP1Y2|$3@g0ov^R0Ow*-qBAKB3c9AW@ZayZoYD15(*3G)53sQuv>wVNE1pXeM@ zU|iMu-M<~r{)|svr!~c4Z)Lb=1qm(YsGXga9XTk3rk4;SewIR z%VVpx2JT`=$6K?r&{6v(q`!W_hNpjJJGOC(aojyK@ccIL+`Ytwka`mxD05R644tjv z5<@+euLpeX$~sNMlX~tMTLdGi0$|k$nX{Ag$)>^kZ+6eA5)AHW`kumwK(W7WvuR;N zXD!NQxPPOinfrYrN3^&Yn`sdXks*nqY=@Tceuf7%zNJGSMfa&U?%YtaQVD@V8rUDL zPq@%2e{aJoq%p+VOzPO6VK{1il7RJ+no>kvU!t5Jj57n$uLNM%&5ywxQT@cn^Myy1YqiZe{MpT) zlVS7<+WZr{3aAnTp1?Zr;M-k=w@h=Zwim%g(8~s1f1xwilss-{`TW9nSe`S|>p_n3 zsl2VhJz&rGUQK`75bZj#Sm$TYafQsV7HJY+$LNj!w|!x9a1L<%slS%P^+8Bfi15>{ zyAvu%@hV)4^5ftKm__aEO2(aJQSloP^R(@Oqg$Hwd-9*<`&Fe#APN*Rv$>Cpf(%R5 z1-K|#oj-wxov&C^eJQOX6)pXkI&I*U+cbA7Dq8$LA>(XosX2d|YxbDm{2f61@?&2vB0We1%jT$&(j3xs5V3&yo*p-PN(>fPUdX3dj{wrtGbUpByldcOG%gPp z5ETz>T5mQsHXfy+Ek|89#H;l$YMqBAhWq?CSnY0+Zs?%lv&iI)C#LSIzV0hf)VM)2 z!%kwDZ9J$_#C|Hc3eD^71&NZA%(jh-3u7;CX3wqC^K-+wD|YlF7Is#r@y*|;yr=uR zFHro@t_4^uO_r?DU$W4i+MYrpps%m;uX^JV64qOe(=40Y+8!ZOdPikuQj(LmI&Ad$ z`GFQ)vG#-$+WYODOrA4Z9H0mMN-}OiCYq*pL+UdJe4=HrU5=PG5`k`a zVVS%e%0xuNEPlhC7N>%h2q5AvH)U>zpVb!(h`GW(%*%J zVsI1W$ZoD$v&z(9Jd4}WLVRp&Y*ds{_h%Y%oKJzF!h`7NW5K`7*mM6rs=((g zdQyM$^ft&VKB{{I%GPVS&RtqQVnf_6Ue0;8vRl){wf^2>8Jj_c{1cACg;>~=2c*~P zslKYJu1-Kf@mU2QgpG(pNT{K$U4(XO=yNrlB^eC*-PoA4@ezROIR>dRleIc!3@BYQ z>ENdSl^Q~C)X+kfz>g4D;eLOjI_5TZz;<^NfIs-k%Nk>OVPY=cw z4uiq!Yn@lPkPs2+7#QHil$0Xm^KelP4_o z>tFrzR^$f!B zebBzBz0Av$6t@ce<)5BSns)C*fsVXYBsm9KJgR-K=82r@JIWhN@1>mjV-&}C@BT## zI5;>^P*8YXA8J<`b+-9D=;`an#@s^9$rBR-Pgs)l-jH(8pP=Ul@E>2N?nWkSwlnQo zBKlp}5-eI*=uN@T)4eL9=*UoqZCTsn_q8nR2pTcEC)v$mm-@m3 zYdq-YNgHJ2ZDL`{?Dp{h@k5er^QQgW66?{<%aM0_dS^mB%1O&uy}raX5`xgW*Y&&w z20sEkyn)vdudYjv~q#i0tI8i-xI>(B{H{ zWygrOD5fSeh!&Vxe|a3bpm{>$8NcrWEE z`RJo`pM`UChV-b;%El?rV#7jSsv#AVa;#7A*Jfm_I`ZU?ub=Dd-b67d|7s zNADNh+;m^e4O8k0sn4?wqSznzG26c-q^UI+D^*BMe<$m`3O}joePVt(ci6f+K*GX* z{?5JtKFx2Rv5-yo7~7g-iMCjIs^aVJaw05B0cPdD=LyD=8sE|H{L!oCRG%B-&a%B? zQY)UI|ILwd1-#_Np7!%h6q0(~sY3r^>k=sXe3i^l3j4jxP%*5Lb--Xa)>>qa^D z7H0@(_#){}AX{JO6$?JXiedAdtR7vFadIsfk&-ogZY4KHToN z`Q&h*H`UNU4ZX?H#}H^mx?NVf12CpqvGra3_P*1an%Bb1-cJN@V)|4oBy0C{dK{W$ zsBZcA&RAwl6ZI;~0V?Yr+$Y=jXJNrsC$BmTV3vWUec=hOEGdr%$1e5|iXXU+JDey3Woi4}1|Su7h|mLBQJgRM z#KD2oU!bpOF)0Hp^Zx5@4|5%j;`%qe`MgyF_Gc%j-lqR-y{c1JU)BjpKO;EjNLfr$ z+*h&Z$W6yFV5D$B>FsjUQaPXxUTf6d7pyTi6j%(6!KXS5S1oc+o;OzkpeXR=K*t<& zdmKO$zMJX)9%!xTrbD4d1E{%WR8v$J6H$e@&>GQnq9OCK9$x&sLGynPI|?~`?r6={ zh`;3afzkFM=QrMgl?|@Gc0L=cJ0$RVHhAka4PKywm8)q5rRY~tfQ}XZQ_PPMy6D}y~J#EqWMu)bl z9+fa4_RPO|lk;AMH#k%{9C^*ng=5|z+gfB=2lj;m{KqQsj)Cn$NtH`Sb5M$2J7I&+ z!n=8=FXz6hIx45g2JT<{z#bN2ySv;A-+rv3xL_ zZ7zbx*LzwJrxKsohWVTtehjK?rgnpNO0@uVCR0-%HpWd1>Y}6gh8wnR+lnn>n_{t< zsU%GSf2RN3?GtF{vrkH*SgY~Sjx{%7yiAxJ!>s4i{zuno`_iFX>3SG7Nq`8vo{kO> z)bED?(G-Cpbkqd4LmjX(_6W+r+Q+Hi8@ohQ*LhV4HOlRlXOqSpmV`XMSFlWa#uRN< zIE;Or`Dx+kuW<(uJL03dvvLvT0L9Z2YE9^hDbya#368qNcr^1BLK#))f4gv0Tv+H5moIL4A4cW)1pt~PQQT!_z~fk(@Hn-Y9A7EZKR~c9W!0!Fw!WzS_~zH% z4c4m5KPs!ni{GyYs5X`fk%47NlEW3+6DG3k6915q?~t^@ZTAT$`^sAl?yK|Jra@2r zA!Qe0pk%v*sxg0*6mK?s)%0`lD`2AGNn>Fd=g02Mdbga81w8sa*w^H_<+8%1qG8%V za8~C`WvQzzLrVVaBDPWOvHuk4`tCxe@ZD7~vfA!ZU(4G`*$cOwNS~I96Esl69YbVd zV1^ajq%A|^eJR?zEB#(GA7^C0uE_ifn{pu>t}4nMS;_FIiya|c$H_kg0Ye&A?e}pu z)`+04A>Bsr_-Vo5AhOqCoJ366VR4C;3*A5mh=VQ`*{bFk*HrweJwaOY-K8%2&a;*1 z96sMOs!To3KDB;v;dwe0^RXNwSB9w3YEY-aljZAiCYs`}?^ku%@l3zxL= zjZW`O|Jnn}!2Fsh`fK4_j^gswOsBE7Xm)dC621_b&`c%$bVO$GXeGl+&Yc&ZX4-VC z!B*nA?RqFgC|+!4eVsX}J?Z&Kw!AJP3Z|x(pUQ&Efg4+u#Mqwq^|oBsgG@vGBZcoaT9hLz=#96LT$HAoRs?pB`~2{CU?&q zGK#vH52=ugz>JH5>u$ZVU9U%3Z+$2AhNd3Iwa@MN%Ll8eZ(p%Q{j`BD9khMO_m-+n zkOZYX>+{2vMS2B+?E<(yl;Vc|=WTM>UnO`1p=#PhT`gc;9_rJGQ$W6@d2^NLx>dz@ zqFV)q(3I)PXP{g^B{rNM|7-uOC(=<|N@j1NGgQJG8a*M#eWed@WCHp#przu0H0~M3 zPDzIKjuEj9>DgDYh4`9V+539ELM;NGWp{K~+yygjS^7a>(YZ8M1GLy=_70G54ImL6 z$_b8uRk)u1gwwwRs>R&WD@zJM%CTG&ij01it zv#!_(<|YhoPkh?}cZQS{-h0mp*^~Ip31Dv*&M*PGU0Z)4O&SK<#iwwWy_5oS_Olj7 zBe7MhzyG+(g(Vp-lg!@<0F8Da(j6s)V?s*BE}irFhka-ME;WfM2?v@!-Uroof#H#p zv#7HcpV8WcR!zu0Amhl(2rd|{B#(A*mt zP;!BTa;5(Kk^VtpQ>TfaqWWuGzOnd}VZmtor_|)eHn+56~Ie69L8>UVyywt>v@dvA>CmPw@ z5Sd(uP`)lDYlbUUO~Zb&m9d!_>^8_xVkZL0$2c?TW+G1{)UX=;*~{ub8=AM4Sjdu@QHp*pT*=W`6z;(hA)mjEF)avurt*37L75 zo1A9)yBluSHboc?^xJq3&iq7trq^MCL-d19OwAP3XW@=} z_i?!>j!GSJ-FeOlPB~Ixn`g}=j#q3$n=%AKN_Tne2a5~N1PUC{jHPIbId(<4nhN4}mhW?Q&4Y2~(vO9O&lW!C>Rq+_GJjbHz0L{`-hbU#< zp?~UUIyp7+S4zSwkUX-8mLdQTGEw?$fjQ8#G>x+;6T_kujqXA_ob85Vb}ZPZ?M^%CI2>g zJ&~vyE3NID{GWhId!@5wbcvbV!8;{+^HQiM>7y)2N+Z-da4WU3i;12CJx<49j6^RC z8<080q!1_|Bsp%BBVrK%6@GCboviy|Z0r%$)Zz}96M5sL?6vB(+zVCJM%>Vj2dPd= zijmbPvnv8n5`etv>>Mh!^2aSbg-=`0)mldQv&};WMh(|i{H8do{{g2NU9NqR^3RID zwqHCC7#$Z=?JdImrX9o2K8k0?73rGmKdEZ!hl~_kK6vq};=OE1~BWX9#ZTnAu7~pMqk)9uq zuGp>psFQJmcfaWjDQ_e7@2|ij<4DyumiUtx zV&E6N0%uz!#J3DLA|j^80jh2iD`iYH#CZHscr?0zUA&nV9yYbBvp}q*>|tJNswo+{ zwjI5lZLYIr-RX9qGVxmyDfTEwujOaBb?aPB%`*3iM)4w`ZG4gucp2|NO(>-bE^yp3 z3mEoSq`>?s;#=v&tA1ElLe{VPr#s{~cIRO8uC1Zdh!RN5edvvXLs70IaJr^VA}XUe zQOgU$)?1_;ssBxdkVMdoPrErSb?FMz+Rh0pc)x45f3B-=kv;+_CEJ;T?Q%{VDt;3n zW;ECR%B$ZGpQNQVp{nk`!r89Uo~<>6$gd)%|8Ewc*lXmm&9HLczfg#aU%+FL+1YWFk9uOdl{T>Db}>6s(~9#kFgV&e!Y`r5GPwz3?R z>ivwcJ`hIB{$0fK3jyQ{>-C<-Kbs)UxWJ2v4ZW?s9Ljmo$CcHf<#>^8oQqXC9#*HK zvV9#dj3Eq_AIk>9I9#3f7temt2Jl3>E=bAZCr=~xvE#O|#+Z=qfkwpe<4ClVf6kR*3OcoE&3^75Ds;!ERn><8SW)s6j35TfHXpA8yBzI>rU>jAZiV}>u1xp$5I<~{ z70z2HJeTg{f>^IV-GY~BhM+Ea0ZyI<_2q8rDy>`>!H18wjfrqQ{9_*`p?Wzv|^r6t= z;0xCid2QPW{{51>^Ts>Jv`n*AxtP>bWn#x4~S=nw%zqh-pbITuljxirgPp zhuc?M|H8YufakG!TqXZ%@hXHhTWC;npe^IJU*2V}0+5xe>LFF7#*4YtS{?9?_j3e6 zhjs(POJ6@uh8g1bBqiYk-F;GcW7dPJvj1(3=HDlak$$U{8G$;?^<*X#jG z8@;_w649kbH@)i5^K{x{>+M?TTS zk`ij~r-3;{s_z%{1oNq>_Z%1k7|PTR-qp8d-v7yV_QG(K`%zk&Fm+vIdM94WgnX;Y zxTILUc--|Wwam?T04k5QebiE1n1H756HtB+z=zGV$yQeR-kPRrUE&9TMz&ElcTmW8 z0Gf$WRcY7nYFj`EVSpZ6yL6A6=yNZ~%R^4j$v9c>lHtq`lzO5X|vyb!1b-{IhXshp0PLss#`J8#@>{-A$v3xa{RA)nwMt-xYRU`~#90;DE(|%VrU5)JO z)c^8Ixl^@j!+$APKL)@K_?Uc1omq#jJ@=Sm43)&FF5mqF_h_7IN>6NUZB~9YFqzF$ zD@h&``AI4peUXUWphzx`>b^HlMTPP+yELXNZ`Bz{Yx#lmrcX4|V1G4; zSsi_8OpPTdxmV%}b=}$WQV2J~x<8;xtKk0u7syptXr3?cddv@cE~~!MXA1{~0E7oQ z`iD7Wwtg~eR?FXl41*Fm`Yj%!tof`0|lfGRl321IAco*b6 zJ96HJLI0D=^GWjbjQD6PeqqX4dKDM1Zf2PJ`)5M0?T^mR*yB}GQ^{0(>YIOcM~61W z2DcuanBx`A1m53Jx3na0`1*Ca!MmP-yW+lfg}q?)_d5(1nH=U_h)tSG;PRSa{z58S zr>Vw8Kee>ScIB%GZp>1awGuGDuB#YbX7axVp!s1H^y+O);+xMzf=7~Tay^$jSsA}8&`d!{xnkjfkv;>Wlb z1fA0DBK0jr=-Co8hrrD2bV1PC7L)61QKhk%7e{>h3=!M0t&*{s>GYUiK6rSUZ!t4g zCr7`#B0cporjyc3>vLv$yL__p2$UxVPQ6ir^v?nw(?Koz7P>=E(i2M5c*hw3prtwzVo`Xe z>1gHeFd?Nz6T0&#n(G-~e%RcQ3b6Gbf?EtK)B)v4i%TJMZLXbwVnN5JNM+F>Om?o| zOu=2YRnJ@MH4qW~xIE+&`{-o=6?+F|M?n?}Udn20L{uVs33L#go$H7v^iPcokDOLg zGWwkPVd=-n&>G1;3Z>|CG)>j+8e@`Lf71d<*DN&UWACXW;MgaDV&PdE6k z$xAXE$>Bim<^N(K#0eGfsOGhGHm{6J)$YSqb3uZ^6QlWaI^;d@VBK^XXj=~3+*6Tp zNI+P{zLF4HMaKGH$-L&Ifa!xcwUc$Img`0jkl6sz6qEfMzS3iNHoI)w%D1lbf7}K? z?;B)(f3Kf#=5wDUi|(5f7An6&y?4Z0kkscUteTK5knZ!CbH*2rAtfgoA&j!xfKzWVhs(M?MuNuK%o-K0j9&^%JjDVLX>zfPyRZ7Y z6AjeWzqU7f0<+6C1dy1F)Y&!NLxxnszxaqXzo>^$zNZKh?hHja++l4dy^G)U2iqZq zc6X_$hQ3{sB^Bx7lITE&WIyI``^K^7@@k>rW&X3NY1a4F zn(jNTKL3%;1Jf7)^WZdIID&Ko+ro9d^m?CSi=J+A6Y_)5c?1dbOY)&^G?3Uj%~EAZ z3DZWLJQp3ho_+*$DeAeFB3!fv@NSpT~v(Mzm_%kiM|3IS@ z9|tMO4}nVT!(LyP^G_;?u3>MJ?3-sGGza?q^vrTri9@x^2aZ0y#4XhuvF4Fb0h=KK zblK-;t1B^RAnvPm*QQ4!D(w=N9lnMT8TlpWUGdFXFhcZ(77V*$)U}^z)7>#iuHjJS}7eE zFqIB7dy9i_yq2XWAUcGhscUk#CUlwAI!uY|QZb(mUtXvF0j%=!Iq(qfxtGS2o3+1e zX!%U~%4~T%;WiIYB9Poahx!Rh77BJ=qFBeIo@~zr`Uo?^NmY!u7VXKaoVlUryhSy5 z_wHAq?1LOrZvIGi{?*;buI_Gttp4jeg^1ddc^%h&L-1NdAJ+esXG2Cb3MB8$Map2m zfjK%AJB~ackKj9m62Fx(*)E8Wf4Dv*O^$!6SZcw-d=X&eJ}9F;m{W>O;j3BPPC^Yx z)fFA<{m>HVk(P~d$jkYm`n3Ruo92c;ixyqa7mzr8Z7m4ebMZ|vdC~NE&Nw_$)?4jo zNw6ONVADGK$)DKPb-m#}t&sbqiSk8uV6UNp#G9PcnfFP$dt^xSxvzSGdT)6oGF%zg zZcZwKL;;hOUCTAtXrBB@G*L_}$c@EFE=YRmyVb9>*F5J`4he6=V@tl&A2>1pAYFGE zC%aCVop^9j^mBV8xw{O3zh>&`OuV7 zz|5WIdgtQhAwh`Kq%6s)x1eThvJv} zA_mZas2&ldl!bCwlx2~E;R$~_*#oJmFVF=m$V!rHjsInOogpe@NU}-r>OELNoegW} zXr`57gW^$k{|WFh@$`I-&nO*?Zd+B08v+&i|B~qz*_jAHu#gka9+@YmdLC40SNWF6 zlJ6P5)uv!-6Qm}V`Mj_lC1zTSKFD3Hkm{L0p}~y{B!IgDs?Yr;aBVRQeFM)W6oU@! z**!))&BV^4Sl(BFbM{IQnjOHr8;o= z#|O)23J?l@Q#*n11K>6K2>SIp^&z^_+IN^i$0%Lyw&g;Ic>PG1d@ukn855+QQtwsWP{3k6OgRCr zVn1)~J_&KVg7ZTO*=Y!2>HDKtQRV7@8XD&Fk@M_*_^~9^#%@CPW;CHXCc~9M=ynf{ zv!tb_3y9VaHwnhUgp-&x96Q+qbjLcMLbLAy76({D8+x0D46HU5yloN9mPw-f& zy6Ee})Mynn#R!-x^v*2pj}bMM;vuH^lYrkDF;6qq^GD-|qMG0_OxktFQ+6YE_6AUh zFYub4c%3Hzrf0iIiG%7OBd~&@Uc8uK>RnPYtN|FVQ(vRFudCesO&i7nltLV$!4*SO zj)!LnxXb=`Ku>YAcp;;6oy8cREo^$=uyLvTM|i823B|t;QEJ%}++s|%gsgq$w7SC4 z2tRgJV#@AQHXe1Jh88d=pEy{=;J+R#>rA>jitg^JvH3V{%ea3X&FC-BM6=2wP{Obk zQ&HKk>#7m7F@tx>k-9%fOG`7yht8I(7Fk=D@=6F^{-<@6ZL@l4Jy15wT(fWh#3k+( z^b^Vir^A3mKntuybjIxTT6-_Gg>CQJOyrYGifi}v5kI6Exx(@)-r#2H1C{}2Yow5@ zHh8JAL$J+Pn9_459nT#Pk5!vm3l1(M8}(w<7*@HAgp-@R?R#LIHO+7{<@h)zuOF5W zm_EG>xzy#&G3(T7L2G|I+V6mtqj&g3TpaVGU2ppSSncjmZP`Oyt)f#*bWScN<%4$P zHAh$TEFcvP9}e*HTZwu?+1LXjG0R)NKHT-|scW|CY!83xPM@E^t>5Xt8yH=yOhs@% zX}vMq6T+yR;eE60cCf!M^781Udo#qm5TTmw`k{4GN^rJ^U9{r;$=_b| zqwA_{vmcWGy`OU@c~s<>43Q1L(W8SRgC;CLtY|8}`lNSw68zl$OV?}Psjcc7x2=fmK-3}BDITkG5eRWFQGTfYGL27tHf52`YZWa7 zi56;WX?_29y4${LDY!dO0@qc&22@EGFLd$?ypw8FCs7m&FKLT@S5o^ zj!m}J=Uh=%ybVL;_09L-Cp~w4sW@*rzG@%*oJM-}_ub7uIM+ou3P*p zt1N@2h-r5Kw9w0O{hdsDSvT}%8!=&5SBh$>A|BN&riq5jqTPq~VAMsc+oBjaKkYWt z_O?O$Uiw9O`TE#6DjIKf%Yliu%ue>odE(2+OlJ?P!Xj?O3qq{Voh~{yA}>PrY1bue z-(7=_XVOm32}RE7i1CeS=-I^IVNKD>1^|ok_;lh627_0D&yMv|`g#KkvAb&tN)q*b zjwBbP@Z8NB9F*5}voF-w_*yn{r`~?&anv?K`^23pS;xwXNkx>R#D@%mb^1!)3)s9} z(2GeN=dvE>eT5dJ5m*U_aJgRik?V`MhC{bI)0aff6$j?#p_{2ogl?o2M#>(8> z&ABR*ySqES!N9Y)ntS;s{1R?G0=p9Co)j9zW} z=^fSh1&<*X^;2s`lz>;vosaKMk$h;ap$~)S`bmCRBmXHklRbt@YeweCSeDz<;Ph9V z701rBK-2v~11#}t1ca7u><}pxmB)7s*eLnRnIb-(W7;KY(GKf;pA64SJ<#-5LNXq{ zitqFr2lO~ayj&*t3nuQwyV>99PxQb-7~MD6&?v>faNRVDkUKU;`ta#`m4}d@NVjFs zrEO1UmK0Aje=W9~Pm3Gmip)Xn8W-sdm*AkrhXc)i>5q?}V1zp6^}<~F7}eZYJ-OcZ zKHkj@+iBA@2K`r`J#6aX4#>d#715_BW`iiRbHA6*Rb~%P+VMR-V%M(K$KNIYp!|mU zFObM!VE9l6=J~G!u6xQw7D_?R-KRIhyi+5W(P0C`l9md%g#apiz8m~P&V3RVV5TW6 z>R9$Cy`lSfupvn5H&v0-JWlw~ilJ}krqwpo=%V_LExFYq zUE+0;5pMedktH@ZXEjaG?KlKaA1xszH5DioqcF(4VqDm4^i& z4)%ad2!RK%bL2`*_Ul?kVw~lJ`NFeUz_hs@{`7hNb3hPU zVg=U|$iR2>R_a$nZ3YK%KP5AFCL+;1DGbrVUf_&ksZpkOHB{kyw}v_oV=9+J6_nY z(e9<^(7upUlO0Ttfqd6{iu1Qekvq1w+Vxu=XMq*u^!+7C)txg?X&Q+$yMS)E?x&2#F;1dtEH6%W5E5WpH4!YkEFtck(peX6DAYn8# z{d%ujT|}|zzXngFW|$l|=m>-oii-dH(70Sr9Ew}+6(DkrtZ5)IAXNCN0T(V|Te22= zc1{fZ@K!!_3ba|d)%Pl5yllE9_W zQ}V?qp0(eIECS=-nYFQ4L@MKkg|{Jpi3?bjIM*dhlA=ixZogT+4|{%AsL$29X-^uF zE1)m`8K2Z}mj5peizI#Q>1OrB3jutQ;dNZ)a*{UaJE&YS{J2&C8$NQ;2ExqG7JoRO zpyB-uVG%Lw^V}ON3{7`~h(4q>yc;7E8?U@8aiLhl)NZn}b+~9zwF{qwH4Q+WDSE$w zQ0^($hK!Wauj+8sKM91SnA|`fp+z6)W!n=TeEewd^vL(Wo?@=ReP5{kGo#-a(xSU^ z#P{SM$~_jSJigom1;QBnB9cmO!TU_AOSgMF6S@8Zz7QZ7v$lN|*=KXayIrtLM8X!v zvHvaWF*jt@04SKj(AKyPUgq<*xNl<^l@0u88~8O}8w#iZS^g3%dSHMDC!QTlfiSz0 zFh-6112}?PZdSbNkGn>GuFa{chka8h%h&I;be2BKKuxW#;1sQC)wsz?q_K-|b;y-Z zS;HOEq$z0Ex(v4CUYXvxJ1z2ehro40>03WbkR5kY!YJ3id1|S!UMGKiMvIW4C0T#_ zJ@PXRHD1hIT6wc8fNh>^K99eOVIAt46YVE>tOg>v!crRkuOT9Q@kj?OkyVW>@F&NM z>BQ12LYN*&-8VN$yE+-paaz{tEW1?~1C-4AFBHDjc~gdT`gG6}wa`_AvQs6Il?h%_ zq23YEKM|SNnL9u>%x!CUuWvMf*)8x3w~v>%-Q2iJe8!n)GtKIV13qlJWImY>7Fo}-dS-9H7UeC@mR`Z7C_t~CYxD7{cwjY*G=w1o4o6sm z8Kj~aiiI;I5~6E-tA_Il$oH;;NO&SsCTwzf{+`3Ge5yH3^|;IK8_)HCvCj%#ch9}) zySWs?#RW?Aq|`h#Zpoh5iUDTBqlAp5WT%D?0)0KID4gSUI~E9OOys~u0ip2ouN8YK zVM3CaZjPD zaU}uwKJYtCXCx4Y4Q50GW4Tu5oz6&t&Ww9%iD>h$_LxHb7Fh>KwRG;CEM5;TX)gzd z@di}XkHUF^WkDl@{}u>LO?hzU9^mDGQ&*9!Z+~zA_$LLtdm1*^SQzio0bbCSVYs7G z@cXyXMqk9vXu58l^)$BIpC%6!x`w-?&pRI3KlFX`xNQ}*k=^>=D8)3pC!uTRXr))@ zOcVx+ws^;GEa=p|JYi|BY9nfV0CV!%nsfAH2b>;1B&+oUT4a}!yi%GX;+j9!&TFL( zY&jZ)X_WXp95uXtcIo%;-w4Qtf;7nqxEt^O<6cTI{Mqu zu7R%ZLl+uHsZQN~(@sW7dA;2k=YuTqmJQCo)u{KGiCn0`>gPVicNRQNq2lfkd@>$U z2G4W|H_du^<%cx42@Fj$9+Ps|AcL^DE4*kL*(XWKZUC6)E2VDl?6_U+Piq?bsMAz= zid68gxYNFWZv~J;TA6V7r>ohrCs)2)JQ+t0pVGX83t_NjlK#{}s~6FWWg zq^1i0_AE7clum6~xY#xKm%PN>0Qjf-{ayi_(ZNg^z@JzDw(MOU%$AgtfZLy3L$fu? z^_pyE%hS@*0uUiMpBTRs*k*d))##b+I0yU6jC%7eNny^aWNZSw+M>GF<1M?iOdGf2 zyN&IEZ}}&dkv?UcbHG1MP-hih6+8xF_bU?5LOr$w%j+HxLAU(q^zjRHk0B3_{QHLp z@>`GZKW(gnFzMGe`gwV+MPHI^zJoAPI5=one=4e4d8C|f47nZ(bd~tE{>8X8aHpq|aS7l`- zKqmD4Ue5X{p=1K^AV8rZ>o1z#r#|>UoV`_49Z}OQx(NhHkU($^5Zr>hB)AjY2_Xb` zcL?qwxCeK4*&BD)jk`N+Tu9vFkc=X9EnMd1)Sba@emkLo+Na*?F8{59 z1NnjgR+`0$4Eb;ZZb{oSYW~QtH6@kZtgPI3(}c*;Aa1&s0(&yo$CtH70#lpdep4=| zI71Ulr~PiPQiEVbOaQw1osv>KVT$$sJwcG$K~aI+NsZH?x<#v#tZaDr=XE*_4QN8b zsF)2_s2FuDoUh0S5NMKzGG87O;q$wIZLo~S?1eU4oRc9|j#?+KMZTJRExjCLj$GMm z8tKWE@}!Kr!)sBm{Pi8bonJpCMp{BMH-}D&j>D+3u#(o~|7?9ga0N|ElkRU>1)>9~ERVTRJc}h;^+VwP4TK z7n7jTdE)nIEHr`60OZEbx(-f8vb1`MTYDT>cLY2-KLqC@xLc+I_J+IzIb`9%r2idTjKs zgarz)Jhsn|ZaQEmB_$;-ErLEfgwM9b8v6RA_@+Gvg#g7b=dJ~V3->od)e`sq@?Mkm z^gAk2A3n=TD5nNLH?rn>YTD5bv`q!9=d6sk>=%p8wZvDjK=#)tL-~A+w?0)~PN(yw8Gj;k4~L`xG3IcYJfwn2H)rEOHu?12}BMq2b}Mv$Hus z0Qu|n+w0@S-GhUaxVRtSh8E#n=rUSUGc;3G|AXHxkM#s-Y`&wtfXeYF5#FJM06zKe zt1|;3;Dc}3Xo2>5q6uB~-)NA}jI8folCTe&s7P;Xs9TRp9W>DAf(5^yE zv*CTC;pA9d6(cAsf)Ba?`MWdHtee{2bfHEKyk$6Fi^80?7v)RnF48XdXY|+btwu^k zs(=Xc{Ol}=*MS?k!($ZBcI>G?Batde_>#Y{Qh>99`o{J9^ zlwHODnK;O48I8I>fgA+$in3^%XU{9AjGdWsS*+G6w^k;4!s<^?~I>B3&0X_ zX|du{8lokzbsAQ4dMV+n0N9Ivf7AhLh|#zi^+B^!&;E7F*V;@D2l%v$1BIIACto`C zB+!YC+aFG5pAA2UgM$N5 zij;T->kzmEXeXR)J0`s5$)hY4KrjXU&RK)d=8=V0pZGkqJV_oM>l5gW*&&r+aOiU{ zF={lZ7wWLK>qHT9CJ-81`;o05vfMw&0&DQsl#(LbmA^*qQ4ahw1M;4N)u*{N)C8gb z?%&{8+8*rzA$UB4hC~ED9Ejifh?bdo1<;{Z8xL_1j>OTata!pkY#?{Nv&+P^E;0hk z3#%tmg)Fs<{Smf!khI}-p8_yv9M6$P?@1*`OVdG7D;&y!7j+8~yq%@5tB$~$qgw-a1Unn9j-cxC)=d&1$L8jkmo8=9c zl$mKD9vB-pvyjx*Ah*n$ew&?rQP3<0d$=*T197f?h(BUl*#c*Ya+_1(v=1DWeucGnVEErd+g4Uq z&CulJWMgAv_MgM!FSV_$0s;a{5_&{(0O^o&L_CN|r-Zo-;Qjt~`13E{y`VRuYq7nN z+im3+XIF=BLHRdvu|V63zfC-+@_X>T1wj96hGS$Ffv3X$%D$t_?w*D;$T@A-jNryy z`P%tL9utkK)!zjKIC%!%0HJ(jE11li7W++s!ZC5Wk(Tqr^|5-oxbTmNzC4}e&r&|J zAjUU;Ga}!YB3FNQZ0Hsv5T@H_A~odNN3pkLmWVyjTeh6Q_`&ioa1*#$a!@HyAmO&w z)zqA;XnS@Cd{Ym1_gC$}-r=%Y@w~s>2PzFLG)Mb?7#QLHvY}OKKHD&S7FKQO6EwX1 zObL{6IY2rv2u%}O5Nssd<(<-Y&dyV1cGTNXW$ZbJrDCj8Q^f`!YP7?HIIXkM9{eq% zDi;UQ`p1DX1^{F|^6S?xl=syCLO6YWebg>wgjY?v&!haOs9JWsv5rONW9j_dXDaEI zbYN~14@1fKAV380#CqrKQk)r24+z}FC|Hw=)dx&%7}XjGfOrkdDZB%ycG4Nui(TaN zl0ObadVM8Sl8zMsH#(|7=-tPY-B{@LwKF$2KN!XivA*^<){2+eUg%o5B+pi#3cjgv zn-7qZiy}~rO#b^4`kz8y!0wa=ToO6zse+V&;o*qTP)uZm7EuDeGLqMA>a6jE6WnH(6t9~H zN-FuO<$U=Rh=I>G1ia+s0A8Y5^&+P&ERUz+rzY=;PPnUOYlaqSRy1>a_icyiQVc@r zH1dxggl_C}P7mIdYcU4)osY%G*WB)-%Nu>;Y_K^U>Ypo8-ksxP`6h4be+t^z*jVwb zF-ISoo6`)MX@$q-L|m;7q17G4~AF`2WTVjl%pdV za@M|F^-XlTJ=bRvY8d~$D!OmPnlX9`gPvMX5JmOw&rG)C~B&Rd`1HJh=6_eLfMjsJ^h?12sup00r$%)rUJd| zjA3wzlFH2b)js1`VGvTfi^GNP5fMy&RD3cx*1eRKRcB;GxI{kfL+J1M3nN0F6nkZd z+)DG#wdmL@>GvP?tWxsO{lK0bwvV4o(ptPHIV7lUj?hX^Qb&%iigEJXSm6WS;&B># zr^4_IXj|Sdhwk-P-QBF@Y`|FS$|yyAPeI?me}_C>>rgbi!FGBhiI$g_t8JIMsq6z~hx{mi zN^m%5310YD-;vjBOY*Dtr)0NG(9qr2O(gBqlONR$HJ{ew8xURCH|ZpI8Z#7@ljcwd zh40Euq=(Ff+gZv9hYy?{sA`(dd*qiM1*Pi9!5q+>k*v;01_okjFqd_P)jrIx7=0EF zB*VN5*$VgiogwfHUN^B5`i0lhqMJ7v|L5|tP0TPA^^rqzO*k2gx; z0}nm*`m5BU#`Aa|z_YL5#FnlO$)1}TJo^+gB%?+uN{1~oTj!a&=2do5EhYF89a`2K zY#XW>RjN}R3G$SEhOi3~A|?^|13(z*{oi)m9i9@4B)}=GTTM3hB{U)OrHqd*7Y1Cz zNrAV6p5bxfIPwQiKPEOv8I7qu7H|1UH^1M#&1ow!PQZ$V@VKnsg@s{9=6|9z+RdV@ z;T;{MN0Oy?#a3?dq!D*0UJA+9Ex37R$*zJ zgLy;3RCIuC8$H7}^E(}BPeGVlABu|3@5!h6doPj z0q?R7`$JeU?w!L%hr#Y(-LEkzDfRIoY3VI!WcO&%(2gD5&A9CZ>A^SV*1p{M!#Vtz z1k47e-|l#PgUH+c(Uw$kW))ap-vUnzd7EleT%1tnO>f)3P(F1aFscb14;Va{y;KU- z;V#G@y`%hbtB8o|#`aALR=vViTe`kI4Zpgj&tbdd+ED4FS8x|XNOW@~aw~9tX1Iz@ z*r;E^6hH7Qgl~n`Ow&9rl_F9cv&!*0S_VwtmV z@QO&NPpqd0YR06Pn4;mH_oyv3ukM-T@6IPt!=EbXVF#80-rPA7UAy(IC1g(N=8O25 z1!@=g62qITsyMI1(!l{&NCMjrayYAR0s^^}5Rl?7Q0RiQ@wwfYso6+imi| zvK-^XB&x?Ig86A4Y_2r^cHm)UOhDa8BPt{d*=!l-6pz6^f**hTFs`8v$7+J?S@*6i z);JkLafcdheKq2iSVRYA@!qYPbcA&mybAVQa-vt!D7rk3$U&1cfLT#{{mzAy?S$;5 zlXk{qUSFs!XSiIIq`f6n_eqr8iiHyuYrXgOvZX81nVM>_BPJpiU=cVX&o@#p=Ya3B zh5Ot(TSnb?xFUNwNn|NQ(S>(LkwbVafH4m8a5EP%pM)1lKoah^5+8rYqI*~+m(#c2K61{XgL(%+xqPbKB9tRF% z`Y~4`)h4s#G(xajFteqz#2oy=omC%i6F4vGy*@vO>zE|25G39zN}GQ%?&!6yIaq>e zKR)0wmvcZMP7jKCY-Nh4+zWJxXoExi+M3uj4sYI|ruA&jZ$>mlguiV&ZSTENDUo6{ z8?=OtoAKV;nD6nRC+2G9qS~R~mp`__r5)TzTM&*8Z5I@QTq{gB8FWt z?8Cn)b-c_`>g{7^e^o#KqtpklVA^f#jp(vN7OE3^$}!gr#d(E5JrG~c-ycowq^4SD zs?5UZu&{(#SLI~xvwOv>V%SYG=Ul!`H^Ih8dAVN3+7J(~64Dp=5V+_*KRmyf>FX3d zwP~PAqA&3Ae`{0vh2*hLUCD?myhk*3W?wFv?q3}w^kUKB#97idl%o?DYXZ;TFr26D z&^^m*QQDsUJbz>oRPy&EunCbL>4Zs+!|FQbf%LRRtc!3daFS*6Qj8ClZd}g-evi4m zABRi#x_NMcVc9M%tGc>(de2-QqM$*Jt=;CGxBn)511naD-3k}SpfRShUSllLDk%?l zZE(mjm0J~DP76J~i?_Sky0Q;Yi|#o1H&DB1m&o{vFCWWm1Y5Z8%RyDJ3*U~h*Jw83 zdkRitggO?JHWWf#B{swE=~pnZOSA6Fm5bskcueK!iky>#bMfB6mln_4j!8l_Oc?wT zMJI+6I@>C0eB*1`1I^7S!(06f(Gis;U5`bs=J#Li&hsQxj>r=2rzir!-aXX3a1X&) z0(0TEMGsBSL(j3!pQP31RCd7mL#_t=_-|Jf*SWiL7Ed}6RAjsyR?4E2%Gbhu2BW#( z9S-9iYKj(4KgIu^c*032aUuwm(jB`oa28K4*hK{!Lw3M3ukwbY;l&v?oiqj;kqK(3 zW#$&=nZ3g+j`^6Xs>gZES*4CHjHi#f2Rk*U(Dl`Joa5bF3E6rt4UsVJH^yVMaBzym zKE?*lb)oLsH*H5q+c$ZQSWkbfBU&bb+)&hFciGk3;QOO9adB}82|W)J45{Unov3Q< z48}b{{L&d17^tvNDmtiYQ>FR{xK@Q+vN@&{b2V{4RfZlyIOIxZ z!cw?iOdnL}0IApPATj`hW!vd+Vvp$fF2SGc z7YL(lMhH$wR)y=aGauFIs#`x1k&#=?4ytbA%Q8{2DkE%P%CW4ncj>q`eqNuNF`JQD zkA~#x@Y3StE!|nMLs#KKaATgxirca*x8ix=cs0l{I{MW`zNLSc(}@n-Apshhm#wI} zkXu}5d}kf;@P-EB0cKrkH@99{($#cS-@zs(sFI_hbs*gjD!PDvH(Tv*``upON=HMYg9LX4iho? zEGq-HGKrJL3y)(hPoNX)u17k%W1(#*QUPz!SBH z9{JffI4aBeW5x#QL@DK#855G=F7V3>GbY1`dnWDIPRo*P{hKqblxn)fwx;}H%It5U zL(s1-(M3L1;A`$V-m~<|P?r27ZtHSnV)fnjV3C&=Ii^*ykBPxeEmt)%hzNcOoD9E! z(hu9J1y?~73i$o8m+uQVF7pgD%J}+k)|y^qJ8!<21}MP6k@5uz*{_Z)|4h~PTt!Lc znP6(wlH4n)w6rBz$5Qs-Mk}eP8u=Pk|7ENyfpU4VCoI(mAMkUG3uTRL9{=$D2%MpT znMKBTP?B97Cl=Bp11HHeyR@z9H2dIS1QE(%NdHV7biBjh4Z^HhAui&@52L_AAIE(8 z0`gy-E^7Bn#ecxJ5h4y{_hja@KZd*~ng!Kwh7myMh;XDw;`w1J1hjI!$OoYY(YIGR zTT?V@dc=%&FzOrN;wVc3C+8|SnyuF;4+rPioxx}7}cj^98Ou}t7G%fZBkO#cK zblQ@t6NTpHk7{aI)OBCDy%{cW2U^9^oCb~XpM9S#9hB9IW$Jdk{PAAa95OQIw$;N74u zXX=otcq)COH`b3vz`M*cO(;e!5UUgwrI(A%c14wl$2KSry+JP_2`4K}eU) zb(*^@;VKX_lhYDY`PN`Auef|gpcxu^8g=is$N2Ag>b-|I%gGjkS-)Di6;eNCl{J5H zdy`H`DxxR`oanHpM5>Z7H`MpkcAN9og3;S>{$#SZBeevFiy9pb72eL*5^F{TZB$+e z2eLEUuJb=oar{SL!I4^?ig-tAPkp3HEZu4zw49$DHgSznaH{w!D@L!bk*hKT-Le#q zzQ0O@iR)NrLT!VJPB0l>1#>-TjEX$$Lv^~;=Rzi-Qz5tn>8iAMHyO*ZPgZwGF70;>6qmkw#6`~WyJzz(dvEkkDixK6tW0@x(+qg)gNTlZZ}4@^WA!Nhawx4z4->c$Ksv}NNJYnj z-e#cL3@p1s9@34GA9OoUjiA%fBthLKG)d?dWGS@*UrHDuJY8ys>-uk1<4aA{7f6jRa#N@OLLZtpvlc6Nyyoo=7Ex znFgP?w#3lt*1A9X234o+XOoi_y(6gu1`7B$(c%#{8%`=q4D>Jh7PLDdA*Tbe%S@)h zirv+vZr9isXPw!E44<~~($LWKCTHgh6~k?s)Hh%gB@;h^??U<+!5h2plME$8YC_+8 zn{WWsq+A0x2|#RCz7Nq~!c)=pf->{yh`iin@6+q#eP9Pydecig8RtT$dstxezUkd8%+Zb!L5=h`P6>xC(+c~4m6hAL z#9b)p83h2UrL5GMAQMmAr$4**fVLvgI3VIvT3@Zp13zX=#cFPC1lh0(>Q8P|5q=S0 zq(jre(@QnXrAgVDl891dJY?;gLw$-$PkU(j7Y*d@-c~Qq!#KL;_mYdSif4XTF`qym z2gUmzNv2OR5=jDA9m?qfF|8v|@b0mVkhqZbXr>rv}%Rx5^&uHH&(r2tM=G;Kg@2{VfU zF@7R8@rV1kCiUIOXmfLOERA>Sw*0uTx>}hc=4^O&cyx;1qo-`FqDkz?27HpbPhfmi z;}h?&p2bgY3%nEy_@vI1f84x|B8Frnx%emDh3^7KuU|+)@SEA2@`+b}O4di?D}}!A zY)6#&;4E{zOy$81c?@}JXQCy{imj!?R^cGB!^Ios=zduoUI>LaOLD_Zw2c#VP!k3q z6~S*UP~C3nyUxa6mz~$ulnibh8>=4(^=_hceZeCzV2CG>=5A9efwi^<1qL#glN`bQ zH3ZJ7P%#;%f#jyz_KrUkG#=3%(YZxeK`U(4E z8RjM#TG8{B4`c@cF_(0wC!9^~U8Mm=^7>@!ob57Y`GcaTBjj)gdd%L~i$6-$%R- z-0p9WNtjY-dOQa33ZspD>zahytA@ezWd!9z1^q*i^9oxoZ3)pDCu5Pts4MPfC((Kb z|Ibl+Iat%nymYy={;tsaykBSc_+d_&ddwVy;G1kri$bo1t>)XbVMVt#*Z1_Pi&>X&js!K#{%JY`UC=LE2lNSB7dVs)vd7J5k zn^pB6%4{vjBj?w8&HP%F3(lpu*pynCsF3pbDI4CPT$DfM)lr((71>7n%4U%UktjI2 zff-w_ou6rf7RfBXsRh_h+#S4{J+OX79vvWNaE)UXK@Kmu5v3JDd@$O=s{f~SEA90b zP1UMv6GJekgi9=0HEKzV(^`SwZ%IF8>Y>u*K8@iI&7w5HHo(-tfA%y8b+yRX@0zp} ze*WcqFz5y+`l=-~g0XL(w_fXg6Egk*bwetKQuLQHV;4UlYWr&}{iDU;CyO|8Mq??v z6=eLNCj^d<&l9Pgi`w;^+I9YPL7h;&ZDS`B_=sZftHv(3SVyE8R}Fgxt9xKS?9EZF0`1Sa+n z#odM#CRT`+!2~SDl&2*z)QQn*VBCOq8vs%^^=>oj)X(8exslI6PPcVy&38M=)uop5 zTE27h>UUMmYM8%*f8B-R=oY>=sv4Ga(4#kwjpH=G^?_JbO8YkOCgijzm|gEy^~Sq$ z6&xx?U@tn@pxRoJ)Udo4Au=Muk3XgL>=~xT&}RUG!KylDHJV0OCw}$Lqp=DgXo^!G z@cJ`pM=c5p_6K1o1#4w|-AM(I$0$|LhH`wojGlKb^JRr+r{l`>Og;-Ap)&s+s4J!8 zBajJ*sOW16e44AFjO@2DQ5HHTrX}1Pq@=*WgnbYA=EiWa8}76ee%{R5$9dChw#hh~ z)!-p$K2kuuY)FIt3Td2RaiD$0R?Nd5Rb#NpmS)G=2O@|X8+(ReAU3-6j#Y20>bU8r zXQ=*@=S61A8!Xpzj2E*aiR^2CM=ytHe#MNgYz-(+0u0(*~|otI8M zxpi%0n?-PFjK3}|SJI1`#7yyclY@DmorUUkJYC-i4*YnD58X9r);9CR@dX| zto9k2S$;<{82aZ81Gb5jUX4Nwete;g z+gB9`vcr*DSO)^1(#JCI1^q{m6COhYPeeG)(eZ_*yJruo(f8Wdyv-xI%+` zX26cUG`mig^nAEcxvlFeQi)qyef@fk5q)H zvZ8?AH@#6e#wf;KJb4iv?)ibS>uI;P7fP-$oGIG#)w%7~@-1VNCJqp{X${=XmKG8)(0{0Jv5*YHJPr;{%jsosc%bpKQe*z2)q@Va@Rc3Ju zkg;0Q_8v_4(v=_7j8Dd4sd0!_U8m-G?b?T7L43U5o?3rPjs-z!wSm~;T}%ixckkKy zk9V)xaWBVHkm}PoWeQ0HYGfPIUzIN?q|GZ3swA_gvqdn_OV8D3n;_S7C+pkuhn5PTpS8UF(NW>Z6z*|2T) zOCUVi)JySde$;lNg$|Nb;=s4l1970g^jAEn44rxSdnbpBTB&_~hMoibY!CRm8${j6TKz5pr;z?>>LIy^Szi)O|Gvhv2&By7D%Y zW0C#9(M=svu532$o#gZgmnpQI-m2|fYn7!XacLAE*{}VXZ^i%*@QtFssaA0-4FemDRY-ZSbJhpNR)u$6^%b8M!U62Y3T1 zHt4Ddt|-P#Jc%U59OFLLdx&Hc5yItnLM4IlgS!u~v1rU)xtK>TO>BB*{@bzXh~dom z!OPZ1BS4Tb#KL2^EWn+pw8t1fy_c8uJD9Rr)WjErkx*~F?7ks(CCbafVgvB_-{LWQ z-fbs3*fW}#HpI)x7l{wbtI2xDg}8DoH}uwcX9#B+)TrI$l&hGyIPL?087i}u^T4sZIIZ$F6wR0~W zFRbUYxO$MuAR<0ngdwIuEH5=e3E*nI*MIaTZW8xqv}f0t?0;ADW8#=Kky&sldS?98 z#F{KN`K4gOTlMWY?i!DvYIwd$=jYBCY8M7dQ{Rw7Qket7I4NL@DRR_Ae2%7CT37Gy zc7P^byu5F58P{NUKu^b2u*Xd#5qEZWwq=quC0y6yoYkxmN?Wq>3R>oLwdh?~GFVg$ z$NfA0pBV$YL)VfTyy+AUYJ;f-HEl3hLNoXFKFVgBwX73rl2$RsqqF!s^_Gg@za=t*x!;G*}bBKbGsYL~z~#+(P2MeaB<)iB_q}DMUH5 zEzCy7?H2%SJ&D=F1n^N2(-rzQIqNWGg7cA5{jII~{j}Cy?G|sSj%HHqwInj`@5A$DqsgeaR~`B zdCF7yv9T&J>|_yTQRHV=kps;VQnSd*>1ATHOb}_*^tp;{;#M*)mM5A3!{nl71VZ62HMV0 z{qQX`Cn}0JZ*=!|`N7!~TJ%?V;b6ej%&mHSLj`pk?m29S=HY>cHsccS*7)n59&Uhg z2~aT(`>lRJXWe>@Zr`L^rk=_LkeOBNBkfA~Xks;+(3R6V0TR-| z)qVaWH@n(WXE>qJYmxdC^z`rVdu1uMQ87b%z9$doFtJ(EK+6<*k{)!r;E{N=ks_T46I8usi0+gk@~=l zI!DSY`LF60QhLcN=4$7lad!Zv2+`1Y+wKm1ACAk!=YF|YQUMwKWL2k>fWdj@ z*^GTm&F51$O^K1I0NUox?)d8tJs$D?qqt9299kS(^u2kD8;4orOW(jfjz$UJ&$bD@ zTbV`ZSOd(-0yn{U#=H(_B2~t&%>AFa9sh=iZo13l4^;EanI5A%jq@V_I{zsmP;Jp2d% zJPPr~m}=rT{B+6r&=>4Vnh{)}{lip&nS6T9td@wEu4~8%$Qc=qlvv3JZ^)Isy)NDQ z%2IybZ(|Ev&F&$s9BwD}`gS_S5UP>;2|TK#g&wU?AvQ!J@-NGQzQ=6v{AKmvol^su zkDrg)ONGJPau&t=r=GYcl=#=`!ly+0!LJm(Kb=oP*9(NTQyNoiRuEX^`|K|d(9&=I zfhRM2Mk$Be#F&DbHJP7tV}s4^h$#*Zzuyt>t?IV{EwYaPqLC866TNIRz1L{`RP`tH zH!I~y1k9VCX!-0lW14Rs34M8uK=(xMtNv{!ehv@)b){obh$I{ zWQQ)?^E>btb;`DmQGGHp!Bm0zdk?F;qy+T#^$+c$CghvpLZOXAwFDoX-55%<+-_5c z^k|n?cRPR$|Ag)Rw$($A_)IKmdL*pRCL4HhAD6OXZL+Q2MP8|o)}0LkUwQ)u%xjyX z`)VCQB*Z_f{b#GYl8-|E2SuIMmp@S!ANAY#VdD3r+yuiVt9JCJ-oHLWeYia)h^k_U2E{a10hCyN;J$}xGZOg-FR1po#ZSCuioe}*@r zk2C8X+05p?LDp!^`1_I_eOARBDIg~#Kl6_*2Tsh*JYCH-Km?7m-8#dGsOUAf0!tri znssgb8t2`_0nz;e&^afKp(^cNgYz4ZCMHl>l|#*L04F>Sbj^pkZPuuBAVJ~jJ6%1b zuT+K&ssy|*kSTqWz%&I_GzujJ8S5sC*+*@bGOgg%)p%|=%5%^H5Rd`)a2!h<;l_AF zO85O$h^c&>@2aMmz;vi|#)mtN!f${NaYeh{vHl&CR2XE1l70j#rIgpZ@GyKOx#Spa zorOgtXE%kuwEQrZ664B#=R;_P*%USM*R4b=WqpXuwV+}t=8LmVz2CNJxv)=mqA>^~ zmNoNIV$99g86Zr2d;Jh*tpIt9Jik(r_P7xf{xm{4S+8YI`9@r9HOVESB6#|73Yr`= z2h-j>1PDHvm$=`X2th<&NCuYuEw3oSlRb~s6{^Ya=14Hp9LZd*n$=?iud43zsV=s z?W9&fmySNpibMBAXo~I}?>;o057>g*!_NE(+uz_m^ajW-yKEV3hNSM!IONKPlsWu> z&k=B)kEQakM`M&!@wz2{nBMUjf!ewej#gByUx2^I8LpsBZC>^4R?ObQe@V>oOb$spIRg#{~ z&07F<(qyRSNh}QDB@{GEYVuovl(_$Mi=>GC^6F(6SD390cOzEJ8ou#RLQa%g4j!e5q$3^t8Z z-@*H810bm{^*+53IvQSy78cv|-bSSamAg|89cWzQ-~Y_{^xQsoOmt@RM6pjd`3FF! zfvg6=GGkQkZ3?WT_5h7L(ssa$#HTI!(8D0iE-s?AxBKlOroI&I^ue!u^8pfY<*%on z0Tj-}fVPJN43y&HIE=0W0V0lJ+&go`(777*um*YiS0Hsi1!s`@?}D;QDQP8~q@7=G z%y(lJgRR%2D(s8y_TD&I(D+*a z11aCFEZ**kmX?Ru_ucaKXh)PL=q&Fm--Q1RWW_$yrHi^uZeCKXTPZGf7tPqu&G!a# z&@#Ru|2=Y=yJQ2<5zZ0nMJT881-C%8(MTZLDeeQ!G`Pj2?Tw2~LaH_X=>_i7I1 zeGbTBDQmbZxHM&@!>!(%M#jcLz{(U_E21D=)bq%~TQA+-E?nKH7B6Oy`Xiw&t(~m2 zrL%)TSD%4|>{=r=v(ThMBmV*{_n9KFt+2T3G1)sBoarVYs%q zteVYX)i0*k&x(M6pPkJogX0`Olg4`6uxQ|ArYiqByNM$r!th{VY z1fHO#fq$f%x;G0cU?SzsjphO4w0eOEP5La8A%;b(BXM7T z-iwlw?ZN7xaIDU4OAh*zB&!1 zyzJa<17#CqXY0AFRLa5O)B?Q0A0JPnl^X|@VGTQ}YX%sfSMGUAb8z{aulG~|dro1J zIwID{u*$f|WHvJP{Q9sPVCd=%d0*zOsgX!pr|i!48wn64@&hNW@6QLIK{0GZ`eePr ziNK;{xc0Tn&9hz?8LJf^14WCZph?#wNaQV$%pSJ{P8()a*Nqw-lQ73()^a^kScCR* z;}bq0M6f+;{q<|=OVJDI=e?b7VX#>B_On0#5?doE9ru-hh-`PiS6fKh{H-@ha@#64 zP(g>i+_RzJEQED?XmMBZ+QTu#;kOk#B1qm3IQ$EtPR1P>ono-K=xT)pdUnt_Bk%=L zs$i5iD~n@G-9iAR0CNsHn9(`0h+&h${1%%A5^(?$AtGQ;@e4G}Dfv|JworvLfl}h)jI+n1mXeo z;UEwQ2@s%wKx@9he1bs405%N*s^fm~1iU7j_0V;oB5TJHA;KBdfMMdTvZ-5^z z>m^g5apK<@^T03UU7vtRYWdO~Eb^^jRR|EP;f4cVTk|~3X_H5xU@BCMLdPW68n6Z+ zh;{amCnoK(ODltcNEYiXpb}BUTDrQHhY{27fcCdQ?^#Vv)58eIPgtQJX=!QM*;RnR zi;smQA~-lWJX}^rCajG8yFplZxSpOK@C=1P1)sN~NRxmJIy;*}XSWk5h8KGRc{l+C zp$mMJB*VZHNIlOw8XFrk1U(jj8x8LQO@?7(!Zb8Ai+q$IwQn$`cz3Dy74+yxEziAu}MFE`p50Rv1;UF-~e+ZRC~ zDh4#B&GfvGR#sMab-j&M6xu&Lv^ca}pwlh<*)f9Xj85fhOB^2`|F6QuT8Dpw<^08* zQM4CO`5`nkRO}K^3tsL`7{PW%yzVdE0R5s>y8J`n+Zo5k`F23U)Kd@8ri&ej&AW~B&o;#j6|TVdfIAjzs9EfVYuG{;@C{PqH{lk6@J zW)8bBggGGUB{Ks912Hi%4K}OjC@8GxM?dkYd3bJT%XGL#^3(tKYozj&6%`dJWaQ=b z>de)EC%OX-YqhoM<7MO@czAi^6A~7fqp#oM6>Hhn_&xn&1k7EZuD)DB4c<@m$54{_ zJlaJ{z(%-NiG{r%{g6nLJ{i8k1g0J4qylu+1@MlMYKuPGtdzIhM030VXgWs?;0|^h zVw)CGo3o`_IZCubPnRmd(ivs9wfX$~N!@4n|A7%EEsqN<|1-1K7;2YmJfj(csp;uY zdpXhObqjy~{b1E;lMoQ>Z){YXjFCodKHqL)(9jf+3cAnn6J|`F@HZCq3Dr`zon1EZO zRI_8+7(hmG3xsUf+5tdr;V2f)k?)m`2?%u54=8UnzkWR*VrhFf5ko228%-u`x6zFu zbSsjj1azvt+Kd+dcUh52!AGo6JD)Q37C^Qx8jQ|qD;M~s%J_d(cc$@B_H7@pv|UBo zvxK6o5egv`b16%tG#Xj5%Nnv1B~-3V#n_iDlPz4AwK0}U2s6ec3?@v-z7J;Xb02eG zZ|)b*^ZDFwo)?ez<~+~i{2#yLcl?*{Njw?Vn42rUbStcW0r+}vAf{t&iImN&J5qT- zTDoRoHgxhwo;!-=dW1* z)ms+gibA3AzVm}{)F0-HfEVXF%f0iPKU)hi@P+I&74O$Cc_JhvByCrODYuL`L2?Xb=Di0`P#em-^+qc04@c7`87|@@wWA zoN)K_^h`-jjpXE|LlCYmHXeidwvWMs0n>$WkT;=jx`sI@l6lI)FT+kORmFP>&iTTu z6(0{zZ&Dja=pGmZxx;gFG8o-TzK_)<) z`+ym);9}H#=m=s$S)`S=vcOAS~z3`Ra{hXLsrH$gw4;Jhq7761jz|YU6 z_s?f`sJofS0yVEOeOhhsbPy4uIx|1d`W0hXVIsKm!`a+SaQ&JYvJw)L{Wvce3PK>% zTHI=}iHXYYgVmv-p>T$}@ImEAEOu+5f!n**MEG40Xd_S*DsJ{TUas3>B>$dSP#~pU z!%-%|j(>&U;xG)!Hv+2c=~G2T3XR4lqOu7Q+S(Cyb*#5%wV-hE2nd+deu&*lDtkQi z#q~!;qF7vfJQ-+3)?}E*P60W+rOvVA@R1|`lqtw+WQ5}XAp8Gq$^7q=`#GzU%Xh%#jn`)lxxQh$Y4PyKNxlnq@?pPt;j;t zl{x%8WTytB*M_XV@u_gB+vSf$c>g^XfrTs0`UVC*US7^y9;R(1((J-e!f89^l!U3wQ<#nLxdN6-|41yLNsJ36YQT%^-|7U?_r9cz@Ot*okgLtEQzpsKv7 zS;r*)T*2%6(WTadrdnAYGt}||y?7ZwOS+Ieu4FFj%Ai{RV$fSZ`Eq#KiraGSxllfr z<=Xq_&{TIpp~~*Ei@W`DD?CRDXSE`(LVU(vq1D$X;4yDm&d}*}NMli9VNFR4gpWmI zZKY!_8KLrilv!*roT*IOx2Kzjd^eC$=$sqxneyOzN0=0yP8PJ_xA+I2MpiL~L3boZI{hs7@gvECE%Yo7nFT>A{qy zCOfEV$3*p4!DS`|z7~sNoQ7qD+FG-B8-K4LF$pAdypOcFcuU#j_;@^&gw#}lLXXA&w z$Z9#plDA&L>MC%agXVDKC8eeD(hn5jN?*Qc%Hx@EalY+8DO*L)z|7`af6}qx`8YHH zV-WXvNHeVdFgJDd(j_uIxv1QBCJ*Fo&`+FESog{h?u zhET`jFQA0ui4KtdkG^MvbvbGTTpE7&>Y=Hr{M+KYI5;K^^fti-X}{s??!T+&_k4;g z`en78cteH~sYeXgt#VQ<58dZXj#DJ;5XJe?%6@Sjvdrn?xt=$((dp@YHx3)bjT1fpBZc zTga1T2BX4Fadm57vO7Hh5!01t7b&l31v!P#)-D1wxY|Fow8qwTC`oXiYtaAkGgH7R z-Vh32UY{<;<8W&977^gkc+XL+t*oL*N?~DR2f|;+3Fyki;}hhz&*mksi{?F8_IB#LkCs?L)z7eB6| zs>*Na=jXRSTyw;^GY!g53yCzkw8q)6Ic>?(H8ey=MLE~=&U5E`D4g84=o}eT;JAJx zE5PmN*!x3=yLwMcx{Tfp0S-4X0rm7hgF}#+!$4lXU*W=gVM%V83 z@CD+acaJ&1RCDN<bgS_lsh50z9ms0&{wijW16h=nP?MGT=6 z&jf7Sbwsg_w51u|c@%{3JsPdzW%(32IW_KSRAWtqy9r1OuruE;hCdDi8J! z4gvv^%CEN|3ie({U*8OFQx{7hvHuj@wOxhJHdqSCi&}l_l+Z#3b$RDMr+xW&On#$B z9HR?xps_J_9fhL6&lv%Q+p+xC)JTOpO+C&I*83fG6G7Gh_HO!C=m^?kTJ&bh8TLBU zhn(A#8R{D+h4H`onQCf&i~67K3SOZsx~#_a;N_fjI=6*&yE6-NeMi2Avi-UsDNf3baZb zdpRd)b*!>Soq$|hYY{A0-{0RK!O06aHrPf$V)60vO2oA8<>D)YAppNY z1!oL=ywNM|@Ej1quLEtC@a?hSxc*uWU(Dxt# Q?qY||?*@n>&4 Date: Tue, 9 Jan 2024 16:48:00 +1100 Subject: [PATCH 26/30] Version up --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 2636f2d8..8e8b43fb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: tidybulk Title: Brings transcriptomics to the tidyverse -Version: 1.13.5 +Version: 1.13.6 Authors@R: c(person("Stefano", "Mangiola", email = "mangiolastefano@gmail.com", role = c("aut", "cre")), person("Maria", "Doyle", email = "Maria.Doyle@petermac.org", From e17474953055d5a1f2ce348a21aac93284a23f38 Mon Sep 17 00:00:00 2001 From: chilampoon Date: Sun, 11 Feb 2024 21:47:48 -0500 Subject: [PATCH 27/30] resovle line char notes and some warnings --- .gitignore | 4 + NAMESPACE | 38 +- R/functions.R | 1118 ++++++++---- R/functions_SE.R | 464 +++-- R/methods.R | 1623 +++++++++++------ R/methods_SE.R | 499 +++-- R/validation.R | 64 +- man/adjust_abundance-methods.Rd | 61 +- man/aggregate_duplicates-methods.Rd | 28 +- man/as_SummarizedExperiment-methods.Rd | 4 +- man/as_matrix.Rd | 3 +- man/cluster_elements-methods.Rd | 33 +- man/deconvolve_cellularity-methods.Rd | 40 +- man/describe_transcript-methods.Rd | 6 +- man/ensembl_to_symbol-methods.Rd | 35 +- man/figures/plot_cluster-1.png | Bin 9188 -> 20847 bytes man/figures/plot_drop-1.png | Bin 10322 -> 24432 bytes man/figures/plot_drop2-1.png | Bin 9544 -> 26847 bytes man/figures/plot_normalise-1.png | Bin 35060 -> 55155 bytes man/figures/plot_rotate_1-1.png | Bin 10343 -> 24844 bytes man/figures/plot_rotate_2-1.png | Bin 13304 -> 29046 bytes man/figures/unnamed-chunk-14-1.png | Bin 37014 -> 55315 bytes man/fill_missing_abundance-methods.Rd | 9 +- man/get_bibliography-methods.Rd | 21 +- man/get_reduced_dimensions_UMAP_bulk.Rd | 19 +- man/get_reduced_dimensions_UMAP_bulk_SE.Rd | 19 +- man/identify_abundant-methods.Rd | 40 +- man/impute_missing_abundance-methods.Rd | 26 +- man/keep_abundant-methods.Rd | 43 +- man/keep_variable-methods.Rd | 39 +- man/pivot_sample-methods.Rd | 13 +- man/pivot_transcript-methods.Rd | 14 +- man/quantile_normalise_abundance-methods.Rd | 41 +- man/reduce_dimensions-methods.Rd | 40 +- man/remove_redundancy-methods.Rd | 54 +- man/rotate_dimensions-methods.Rd | 54 +- man/scale_abundance-methods.Rd | 45 +- man/symbol_to_entrez.Rd | 6 +- man/test_differential_abundance-methods.Rd | 81 +- man/test_differential_cellularity-methods.Rd | 32 +- man/test_gene_enrichment-methods.Rd | 58 +- man/test_gene_overrepresentation-methods.Rd | 19 +- man/test_gene_rank-methods.Rd | 26 +- ...test_stratification_cellularity-methods.Rd | 45 +- man/tidybulk-methods.Rd | 21 +- man/tidybulk_SAM_BAM-methods.Rd | 19 +- tidybulk.Rproj | 17 + 47 files changed, 3214 insertions(+), 1607 deletions(-) create mode 100644 .gitignore mode change 100755 => 100644 NAMESPACE create mode 100644 tidybulk.Rproj diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..5b6a0652 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.Rproj.user +.Rhistory +.RData +.Ruserdata diff --git a/NAMESPACE b/NAMESPACE old mode 100755 new mode 100644 index 13c99390..8a3171dc --- a/NAMESPACE +++ b/NAMESPACE @@ -62,35 +62,17 @@ exportMethods(scale_abundance) exportMethods(tidybulk) exportMethods(tidybulk_SAM_BAM) import(SummarizedExperiment) -import(broom) -import(class) import(e1071) -import(edgeR) import(lifecycle) -import(limma) import(lme4) import(methods) import(parallel) import(preprocessCore) import(readr) -import(sva) import(tibble) -importFrom(AnnotationDbi,mapIds) -importFrom(DESeq2,DESeq) -importFrom(DESeq2,DESeqDataSet) -importFrom(DESeq2,DESeqDataSetFromMatrix) -importFrom(DESeq2,results) importFrom(GenomicRanges,makeGRangesListFromDataFrame) importFrom(Matrix,colSums) -importFrom(Rtsne,Rtsne) -importFrom(S4Vectors,DataFrame) importFrom(S4Vectors,metadata) -importFrom(Seurat,CreateSeuratObject) -importFrom(Seurat,FindClusters) -importFrom(Seurat,FindNeighbors) -importFrom(Seurat,FindVariableFeatures) -importFrom(Seurat,RunPCA) -importFrom(Seurat,ScaleData) importFrom(SummarizedExperiment,SummarizedExperiment) importFrom(SummarizedExperiment,assays) importFrom(SummarizedExperiment,colData) @@ -99,8 +81,6 @@ importFrom(SummarizedExperiment,rowRanges) importFrom(betareg,betareg) importFrom(boot,logit) importFrom(broom,tidy) -importFrom(clusterProfiler,GSEA) -importFrom(clusterProfiler,enricher) importFrom(dplyr,across) importFrom(dplyr,anti_join) importFrom(dplyr,arrange) @@ -135,17 +115,10 @@ importFrom(dplyr,summarise) importFrom(dplyr,summarise_all) importFrom(dplyr,summarize) importFrom(dplyr,ungroup) -importFrom(edgeR,DGEList) -importFrom(edgeR,calcNormFactors) -importFrom(edgeR,estimateDisp) -importFrom(edgeR,filterByExpr) importFrom(functional,Compose) -importFrom(glmmSeq,glmmSeq) importFrom(glmmTMB,glmmTMBControl) importFrom(lifecycle,deprecate_soft) importFrom(lifecycle,deprecate_warn) -importFrom(limma,makeContrasts) -importFrom(limma,normalizeQuantiles) importFrom(magrittr,"%$%") importFrom(magrittr,"%>%") importFrom(magrittr,divide_by) @@ -155,17 +128,11 @@ importFrom(magrittr,multiply_by) importFrom(magrittr,set_colnames) importFrom(magrittr,set_rownames) importFrom(matrixStats,colSds) -importFrom(msigdbr,msigdbr) -importFrom(msigdbr,msigdbr_species) -importFrom(org.Hs.eg.db,org.Hs.eg.db) -importFrom(org.Mm.eg.db,org.Mm.eg.db) importFrom(parallel,clusterExport) importFrom(parallel,makeCluster) importFrom(parallel,mclapply) importFrom(pbapply,pblapply) importFrom(pbmcapply,pbmclapply) -importFrom(preprocessCore,normalize.quantiles.determine.target) -importFrom(preprocessCore,normalize.quantiles.use.target) importFrom(purrr,as_mapper) importFrom(purrr,map) importFrom(purrr,map2) @@ -221,8 +188,6 @@ importFrom(survival,coxph) importFrom(survival,survdiff) importFrom(survminer,ggsurvplot) importFrom(survminer,surv_fit) -importFrom(sva,ComBat) -importFrom(sva,ComBat_seq) importFrom(tibble,as_tibble) importFrom(tibble,enframe) importFrom(tibble,rowid_to_column) @@ -243,7 +208,6 @@ importFrom(ttservice,bind_rows) importFrom(utils,capture.output) importFrom(utils,data) importFrom(utils,head) +importFrom(utils,install.packages) importFrom(utils,packageDescription) importFrom(utils,tail) -importFrom(uwot,tumap) -importFrom(widyr,pairwise_cor) diff --git a/R/functions.R b/R/functions.R index 20ea0320..d12fe488 100755 --- a/R/functions.R +++ b/R/functions.R @@ -15,7 +15,7 @@ #' @return A tibble with an additional column #' #' -create_tt_from_tibble_bulk = function(.data, +create_tt_from_tibble_bulk <- function(.data, .sample, .transcript, .abundance, @@ -47,13 +47,14 @@ create_tt_from_tibble_bulk = function(.data, #' @importFrom purrr reduce #' #' @param file_names A character vector -#' @param genome A character string specifying an in-built annotation used for read summarization. It has four possible values including "mm10", "mm9", "hg38" and "hg19" +#' @param genome A character string specifying an in-built annotation used for +#' read summarization. It has four possible values including "mm10", "mm9", +#' "hg38" and "hg19" #' @param ... Further parameters passed to the function Rsubread::featureCounts #' #' @return A tibble of gene counts #' -create_tt_from_bam_sam_bulk <- - function(file_names, genome = "hg38", ...) { +create_tt_from_bam_sam_bulk <- function(file_names, genome = "hg38", ...) { # This function uses Subread to count the gene features, # annotate gene features with symbols, and # convert the data frame to tibble format @@ -76,7 +77,8 @@ create_tt_from_bam_sam_bulk <- edgeR::DGEList( counts = (.)$counts, genes = (.)$annotation[, c("GeneID", "Length")], - samples = (.)$stat %>% as_tibble() %>% gather(sample, temp,-Status) %>% spread(Status, temp) + samples = (.)$stat %>% as_tibble() %>% gather(sample, temp,-Status) %>% + spread(Status, temp) ) } %>% @@ -154,21 +156,16 @@ create_tt_from_bam_sam_bulk <- #' #' #' @import tibble -#' @importFrom dplyr select -#' @importFrom dplyr left_join -#' @importFrom dplyr group_by -#' @importFrom dplyr summarise -#' @importFrom dplyr mutate #' @importFrom rlang := #' @importFrom stats setNames -#' @importFrom edgeR calcNormFactors #' #' @param .data A tibble #' @param reference A reference matrix, not sure if used anymore #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param method A string character. The scaling method passed to the backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") +#' @param method A string character. The scaling method passed to the backend +#' function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") #' #' #' @return A list including the filtered data frame and the normalization factors @@ -245,22 +242,19 @@ add_scaled_counts_bulk.calcNormFactor <- function(.data, #' #' #' @import tibble -#' @importFrom dplyr select -#' @importFrom dplyr left_join -#' @importFrom dplyr group_by -#' @importFrom dplyr summarise -#' @importFrom dplyr mutate -#' @importFrom dplyr rename #' @importFrom magrittr equals #' @importFrom rlang := #' @importFrom stats median +#' @importFrom utils install.packages #' #' @param .data A tibble #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param method A character string. The scaling method passed to the backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") -#' @param reference_sample A character string. The name of the reference sample. If NULL the sample with highest total read count will be selected as reference. +#' @param method A character string. The scaling method passed to the backend +#' function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") +#' @param reference_sample A character string. The name of the reference sample. +#' If NULL the sample with highest total read count will be selected as reference. #' #' #' @return A tibble including additional columns @@ -277,6 +271,14 @@ get_scaled_counts_bulk <- function(.data, .transcript = enquo(.transcript) .abundance = enquo(.abundance) + # Check if package is installed, otherwise install + if (find.package("edgeR", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing edgeR needed for analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("edgeR", ask = FALSE) + } + # Reformat input data set df <- .data %>% @@ -296,8 +298,8 @@ get_scaled_counts_bulk <- function(.data, # If not specified take most abundance sample df %>% - dplyr::group_by(!!.sample) %>% - dplyr::summarise(sum = median(!!.abundance)) %>% + group_by(!!.sample) %>% + summarise(sum = median(!!.abundance)) %>% mutate(med = max(sum)) %>% mutate(diff = abs(sum - med)) %>% arrange(diff) %>% @@ -307,7 +309,9 @@ get_scaled_counts_bulk <- function(.data, ) # Communicate the reference if chosen by default - if(is.null(reference_sample)) message(sprintf("tidybulk says: the sample with largest library size %s was chosen as reference for scaling", reference)) + if(is.null(reference_sample)) message( + sprintf("tidybulk says: the sample with largest library size %s was chosen as reference for scaling", + reference)) nf_obj <- add_scaled_counts_bulk.calcNormFactor( @@ -363,43 +367,54 @@ get_scaled_counts_bulk <- function(.data, #' @keywords internal #' @noRd #' +#' +#' #' @import tibble -#' @import edgeR #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix +#' @importFrom utils install.packages #' @importFrom purrr when #' @importFrom rlang inform #' @importFrom tidyr spread #' @importFrom tidyr pivot_wider #' @importFrom dplyr slice -#' @importFrom limma makeContrasts +#' #' #' @param .data A tibble #' @param .formula a formula with no response variable, referring only to numeric variables #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param .contrasts A character vector. See edgeR makeContrasts specification for the parameter `contrasts`. If contrasts are not present the first covariate is the one the model is tested against (e.g., ~ factor_of_interest) -#' @param method A string character. Either "edgeR_quasi_likelihood" (i.e., QLF), "edgeR_likelihood_ratio" (i.e., LRT) -#' @param test_above_log2_fold_change A positive real value. This works for edgeR and limma_voom methods. It uses the `treat` function, which tests that the difference in abundance is bigger than this threshold rather than zero \url{https://pubmed.ncbi.nlm.nih.gov/19176553}. -#' @param scaling_method A character string. The scaling method passed to the backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") -#' @param omit_contrast_in_colnames If just one contrast is specified you can choose to omit the contrast label in the colnames. +#' @param .contrasts A character vector. See edgeR makeContrasts specification +#' for the parameter `contrasts`. If contrasts are not present the first +#' covariate is the one the model is tested against (e.g., ~ factor_of_interest) +#' @param method A string character. Either "edgeR_quasi_likelihood" (i.e., QLF), +#' "edgeR_likelihood_ratio" (i.e., LRT) +#' @param test_above_log2_fold_change A positive real value. This works for +#' edgeR and limma_voom methods. It uses the `treat` function, which tests +#' that the difference in abundance is bigger than this threshold rather than +#' zero \url{https://pubmed.ncbi.nlm.nih.gov/19176553}. +#' @param scaling_method A character string. The scaling method passed to the +#' backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE", +#' "upperquartile") +#' @param omit_contrast_in_colnames If just one contrast is specified you can +#' choose to omit the contrast label in the colnames. #' @param .sample_total_read_count #' #' @return A tibble with edgeR results #' -get_differential_transcript_abundance_bulk <- function(.data, - .formula, - .sample = NULL, - .transcript = NULL, - .abundance = NULL, - .contrasts = NULL, - method = "edgeR_quasi_likelihood", - test_above_log2_fold_change = NULL, - scaling_method = "TMM", - omit_contrast_in_colnames = FALSE, - prefix = "", - .sample_total_read_count = NULL) { +get_differential_transcript_abundance_bulk <- function(data, + .formula, + .sample = NULL, + .transcript = NULL, + .abundance = NULL, + .contrasts = NULL, + method = "edgeR_quasi_likelihood", + test_above_log2_fold_change = NULL, + scaling_method = "TMM", + omit_contrast_in_colnames = FALSE, + prefix = "", + .sample_total_read_count = NULL) { # Get column names .sample = enquo(.sample) .transcript = enquo(.transcript) @@ -463,12 +478,15 @@ get_differential_transcript_abundance_bulk <- function(.data, design = model.matrix( object = .formula, - data = df_for_edgeR %>% select(!!.sample, one_of(parse_formula(.formula))) %>% distinct %>% arrange(!!.sample) + data = df_for_edgeR %>% + select(!!.sample, one_of(parse_formula(.formula))) %>% + distinct %>% arrange(!!.sample) ) # Replace `:` with ___ because it creates error with edgeR if(design |> colnames() |> str_detect(":") |> any()) { - message("tidybulk says: the interaction term `:` has been replaced with `___` in the design matrix, in order to work with edgeR.") + message("tidybulk says: the interaction term `:` has been replaced ", + "with `___` in the design matrix, in order to work with edgeR.") colnames(design) = design |> colnames() |> str_replace(":", "___") } @@ -500,7 +518,9 @@ get_differential_transcript_abundance_bulk <- function(.data, colnames(design)[1] != "(Intercept)" ) ) - warning("tidybulk says: If you have (i) an intercept-free design (i.e. ~ 0 + factor) or you have a categorical factor of interest with more than 2 values you should use the `contrasts` argument.") + warning("tidybulk says: If you have (i) an intercept-free design", + "(i.e. ~ 0 + factor) or you have a categorical factor of interest with", + "more than 2 values you should use the `contrasts` argument.") my_contrasts = .contrasts %>% @@ -508,6 +528,17 @@ get_differential_transcript_abundance_bulk <- function(.data, ~ limma::makeContrasts(contrasts = .x, levels = design), ~ NULL) + # Check if package is installed, otherwise install + if (find.package("edgeR", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing edgeR needed for differential", + "transcript abundance analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("edgeR", ask = FALSE) + } + + + edgeR_object = df_for_edgeR %>% select(!!.transcript,!!.sample,!!.abundance) %>% @@ -523,7 +554,8 @@ get_differential_transcript_abundance_bulk <- function(.data, !quo_is_null(.sample_total_read_count) ~ { # New library size dataset - new_lib_size = .data %>% pivot_sample(!!.sample) %>% select(!!.sample, !!.sample_total_read_count) + new_lib_size = .data %>% pivot_sample(!!.sample) %>% + select(!!.sample, !!.sample_total_read_count) x = (.) x$samples$lib.size = @@ -538,15 +570,20 @@ get_differential_transcript_abundance_bulk <- function(.data, # Scale data if method is not "none" when( - scaling_method != "none" ~ (.) %>% edgeR::calcNormFactors(method = scaling_method), + scaling_method != "none" ~ (.) %>% + edgeR::calcNormFactors(method = scaling_method), ~ (.) ) %>% # select method when( - tolower(method) == "edger_likelihood_ratio" ~ (.) %>% edgeR::estimateDisp(design) %>% edgeR::glmFit(design), - tolower(method) == "edger_quasi_likelihood" ~ (.) %>% edgeR::estimateDisp(design) %>% edgeR::glmQLFit(design), - tolower(method) == "edger_robust_likelihood_ratio" ~ (.) %>% edgeR::estimateGLMRobustDisp(design) %>% edgeR::glmFit(design) + tolower(method) == "edger_likelihood_ratio" ~ (.) %>% + edgeR::estimateDisp(design) %>% edgeR::glmFit(design), + tolower(method) == "edger_quasi_likelihood" ~ (.) %>% + edgeR::estimateDisp(design) %>% edgeR::glmQLFit(design), + tolower(method) == "edger_robust_likelihood_ratio" ~ (.) %>% + edgeR::estimateGLMRobustDisp(design) %>% + edgeR::glmFit(design) ) @@ -561,9 +598,14 @@ get_differential_transcript_abundance_bulk <- function(.data, # select method when( - !is.null(test_above_log2_fold_change) ~ (.) %>% edgeR::glmTreat(coef = 2, contrast = my_contrasts, lfc=test_above_log2_fold_change), - tolower(method) %in% c("edger_likelihood_ratio", "edger_robust_likelihood_ratio") ~ (.) %>% edgeR::glmLRT(coef = 2, contrast = my_contrasts) , - tolower(method) == "edger_quasi_likelihood" ~ (.) %>% edgeR::glmQLFTest(coef = 2, contrast = my_contrasts) + !is.null(test_above_log2_fold_change) ~ (.) %>% + edgeR::glmTreat(coef = 2, contrast = my_contrasts, + lfc=test_above_log2_fold_change), + tolower(method) %in% c("edger_likelihood_ratio", + "edger_robust_likelihood_ratio") ~ (.) %>% + edgeR::glmLRT(coef = 2, contrast = my_contrasts), + tolower(method) == "edger_quasi_likelihood" ~ (.) %>% + edgeR::glmQLFTest(coef = 2, contrast = my_contrasts) ) %>% # Convert to tibble @@ -587,9 +629,14 @@ get_differential_transcript_abundance_bulk <- function(.data, # select method when( - !is.null(test_above_log2_fold_change) ~ (.) %>% edgeR::glmTreat(coef = 2, contrast = my_contrasts[, .x], lfc=test_above_log2_fold_change), - tolower(method) %in% c("edger_likelihood_ratio", "edger_robust_likelihood_ratio") ~ (.) %>% edgeR::glmLRT(coef = 2, contrast = my_contrasts[, .x]) , - tolower(method) == "edger_quasi_likelihood" ~ (.) %>% edgeR::glmQLFTest(coef = 2, contrast = my_contrasts[, .x]) + !is.null(test_above_log2_fold_change) ~ (.) %>% + edgeR::glmTreat(coef = 2, contrast = my_contrasts[, .x], + lfc=test_above_log2_fold_change), + tolower(method) %in% c("edger_likelihood_ratio", + "edger_robust_likelihood_ratio") ~ (.) %>% + edgeR::glmLRT(coef = 2, contrast = my_contrasts[, .x]) , + tolower(method) == "edger_quasi_likelihood" ~ (.) %>% + edgeR::glmQLFTest(coef = 2, contrast = my_contrasts[, .x]) ) %>% # Convert to tibble @@ -618,12 +665,16 @@ get_differential_transcript_abundance_bulk <- function(.data, # select method when( - tolower(method) == "edger_likelihood_ratio" ~ (.) %>% memorise_methods_used(c("edger", "edgeR_likelihood_ratio")), - tolower(method) == "edger_quasi_likelihood" ~ (.) %>% memorise_methods_used(c("edger", "edgeR_quasi_likelihood")), - tolower(method) == "edger_robust_likelihood_ratio" ~ (.) %>% memorise_methods_used(c("edger", "edger_robust_likelihood_ratio")) + tolower(method) == "edger_likelihood_ratio" ~ (.) %>% + memorise_methods_used(c("edger", "edgeR_likelihood_ratio")), + tolower(method) == "edger_quasi_likelihood" ~ (.) %>% + memorise_methods_used(c("edger", "edgeR_quasi_likelihood")), + tolower(method) == "edger_robust_likelihood_ratio" ~ (.) %>% + memorise_methods_used(c("edger", "edger_robust_likelihood_ratio")) ) %>% when( - !is.null(test_above_log2_fold_change) ~ (.) %>% memorise_methods_used("treat"), + !is.null(test_above_log2_fold_change) ~ (.) %>% + memorise_methods_used("treat"), ~ (.) ) %>% @@ -631,8 +682,9 @@ get_differential_transcript_abundance_bulk <- function(.data, attach_to_internals(edgeR_object, "edgeR") %>% # Communicate the attribute added { - - rlang::inform("tidybulk says: to access the raw results (fitted GLM) do `attr(..., \"internals\")$edgeR`", .frequency_id = "Access DE results edgeR", .frequency = "once") + rlang::inform(paste0("tidybulk says: to access the raw results (fitted GLM)", + " do `attr(..., \"internals\")$edgeR`"), + .frequency_id = "Access DE results edgeR", .frequency = "once") (.) } @@ -648,42 +700,50 @@ get_differential_transcript_abundance_bulk <- function(.data, #' @import tibble #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix +#' @importFrom utils install.packages #' @importFrom purrr when #' @importFrom rlang inform #' @importFrom tidyr spread #' @importFrom tidyr pivot_wider #' @importFrom dplyr slice -#' @importFrom edgeR estimateDisp -#' @importFrom glmmSeq glmmSeq +#' #' #' @param .data A tibble -#' @param .formula a formula with no response variable, referring only to numeric variables +#' @param .formula a formula with no response variable, referring only to +#' numeric variables #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column #' @param .contrasts A character vector. Not used for this method -#' @param method A string character. Either "edgeR_quasi_likelihood" (i.e., QLF), "edgeR_likelihood_ratio" (i.e., LRT) -#' @param test_above_log2_fold_change A positive real value. This works for edgeR and limma_voom methods. It uses the `treat` function, which tests that the difference in abundance is bigger than this threshold rather than zero \url{https://pubmed.ncbi.nlm.nih.gov/19176553}. -#' @param scaling_method A character string. The scaling method passed to the backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") -#' @param omit_contrast_in_colnames If just one contrast is specified you can choose to omit the contrast label in the colnames. +#' @param method A string character. Either "edgeR_quasi_likelihood" (i.e., QLF), +#' "edgeR_likelihood_ratio" (i.e., LRT) +#' @param test_above_log2_fold_change A positive real value. This works for +#' edgeR and limma_voom methods. It uses the `treat` function, which tests +#' that the difference in abundance is bigger than this threshold rather than +#' zero \url{https://pubmed.ncbi.nlm.nih.gov/19176553}. +#' @param scaling_method A character string. The scaling method passed to the +#' backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE", +#' "upperquartile") +#' @param omit_contrast_in_colnames If just one contrast is specified you can +#' choose to omit the contrast label in the colnames. #' @param .sample_total_read_count #' #' @return A tibble with glmmSeq results #' get_differential_transcript_abundance_glmmSeq <- function(.data, - .formula, - .sample = NULL, - .transcript = NULL, - .abundance = NULL, - .contrasts = NULL, - method , - test_above_log2_fold_change = NULL, - scaling_method = NULL, - omit_contrast_in_colnames = FALSE, - prefix = "", - .sample_total_read_count = NULL, - .dispersion = NULL, - ...) { + .formula, + .sample = NULL, + .transcript = NULL, + .abundance = NULL, + .contrasts = NULL, + method , + test_above_log2_fold_change = NULL, + scaling_method = NULL, + omit_contrast_in_colnames = FALSE, + prefix = "", + .sample_total_read_count = NULL, + .dispersion = NULL, + ...) { # Get column names .sample = enquo(.sample) .transcript = enquo(.transcript) @@ -693,7 +753,8 @@ get_differential_transcript_abundance_glmmSeq <- function(.data, # Check if omit_contrast_in_colnames is correctly setup if(omit_contrast_in_colnames & length(.contrasts) > 1){ - warning("tidybulk says: you can omit contrasts in column names only when maximum one contrast is present") + warning("tidybulk says: you can omit contrasts in column names only", + "when maximum one contrast is present") omit_contrast_in_colnames = FALSE } @@ -725,6 +786,24 @@ get_differential_transcript_abundance_glmmSeq <- function(.data, # ~ limma::makeContrasts(contrasts = .x, levels = design), # ~ NULL) + # Check if package is installed, otherwise install + if (find.package("edgeR", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing edgeR needed for differential", + " transcript abundance analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("edgeR", ask = FALSE) + } + + # Check if package is installed, otherwise install + if (find.package("glmmSeq", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing glmmSeq needed for differential ", + "transcript abundance analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("glmmSeq", ask = FALSE) + } + metadata = .data |> pivot_sample(!!.sample) |> @@ -747,9 +826,12 @@ get_differential_transcript_abundance_glmmSeq <- function(.data, ) if(quo_is_symbolic(.dispersion)) - dispersion = .data |> pivot_transcript(!!.transcript) |> select(!!.transcript, !!.dispersion) |> deframe() + dispersion = .data |> pivot_transcript(!!.transcript) |> + select(!!.transcript, !!.dispersion) |> deframe() else - dispersion = counts |> edgeR::estimateDisp(design = design) %$% tagwise.dispersion |> setNames(rownames(counts)) + dispersion = counts |> + edgeR::estimateDisp(design = design) %$% tagwise.dispersion |> + setNames(rownames(counts)) # # Check dispersion # if(!names(dispersion) |> sort() |> identical( @@ -765,7 +847,7 @@ get_differential_transcript_abundance_glmmSeq <- function(.data, glmmSeq_object = - glmmSeq::glmmSeq( .formula, + glmmSeq( .formula, countdata = counts , metadata = metadata, dispersion = dispersion, @@ -778,7 +860,9 @@ get_differential_transcript_abundance_glmmSeq <- function(.data, glmmSeq_object |> summary_lmmSeq() |> as_tibble(rownames = "gene") |> - mutate(across(starts_with("P_"), list(adjusted = function(x) p.adjust(x, method="BH")), .names = "{.col}_{.fn}")) |> + mutate(across(starts_with("P_"), + list(adjusted = function(x) p.adjust(x, method="BH")), + .names = "{.col}_{.fn}")) |> # Attach attributes reattach_internals(.data) %>% @@ -790,9 +874,9 @@ get_differential_transcript_abundance_glmmSeq <- function(.data, attach_to_internals(glmmSeq_object, "glmmSeq") %>% # Communicate the attribute added { - - rlang::inform("\ntidybulk says: to access the raw results (fitted GLM) do `attr(..., \"internals\")$glmmSeq`", .frequency_id = "Access DE results glmmSeq", .frequency = "once") - + rlang::inform(paste0("\ntidybulk says: to access the raw results", + " (fitted GLM) do `attr(..., \"internals\")$glmmSeq`"), + .frequency_id = "Access DE results glmmSeq", .frequency = "once") (.) } %>% @@ -808,38 +892,45 @@ get_differential_transcript_abundance_glmmSeq <- function(.data, #' @keywords internal #' @noRd #' +#' +#' #' @import tibble -#' @import limma #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix +#' @importFrom utils install.packages #' @importFrom purrr when #' @importFrom rlang inform #' @importFrom dplyr arrange -#' @importFrom edgeR DGEList #' #' @param .data A tibble -#' @param .formula a formula with no response variable, referring only to numeric variables +#' @param .formula a formula with no response variable, +#' referring only to numeric variables #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param .contrasts A character vector. See voom makeContrasts specification for the parameter `contrasts`. If contrasts are not present the first covariate is the one the model is tested against (e.g., ~ factor_of_interest) +#' @param .contrasts A character vector. See voom makeContrasts specification +#' for the parameter `contrasts`. If contrasts are not present the first +#' covariate is the one the model is tested against (e.g., ~ factor_of_interest) #' @param method A string character. Either "limma_voom", "limma_voom_sample_weights" -#' @param scaling_method A character string. The scaling method passed to the backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") -#' @param omit_contrast_in_colnames If just one contrast is specified you can choose to omit the contrast label in the colnames. +#' @param scaling_method A character string. The scaling method passed to the +#' backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE", +#' "upperquartile") +#' @param omit_contrast_in_colnames If just one contrast is specified you can +#' choose to omit the contrast label in the colnames. #' #' @return A tibble with voom results #' get_differential_transcript_abundance_bulk_voom <- function(.data, - .formula, - .sample = NULL, - .transcript = NULL, - .abundance = NULL, - .contrasts = NULL, - method = NULL, - test_above_log2_fold_change = NULL, - scaling_method = "TMM", - omit_contrast_in_colnames = FALSE, - prefix = "") { + .formula, + .sample = NULL, + .transcript = NULL, + .abundance = NULL, + .contrasts = NULL, + method = NULL, + test_above_log2_fold_change = NULL, + scaling_method = "TMM", + omit_contrast_in_colnames = FALSE, + prefix = "") { # Get column names .sample = enquo(.sample) .transcript = enquo(.transcript) @@ -847,7 +938,8 @@ get_differential_transcript_abundance_bulk_voom <- function(.data, # Check if omit_contrast_in_colnames is correctly setup if(omit_contrast_in_colnames & length(.contrasts) > 1){ - warning("tidybulk says: you can omit contrasts in column names only when maximum one contrast is present") + warning("tidybulk says: you can omit contrasts in column names ", + "only when maximum one contrast is present") omit_contrast_in_colnames = FALSE } @@ -869,7 +961,10 @@ get_differential_transcript_abundance_bulk_voom <- function(.data, design = model.matrix( object = .formula, - data = df_for_voom %>% select(!!.sample, one_of(parse_formula(.formula))) %>% distinct %>% arrange(!!.sample) + data = df_for_voom %>% + select(!!.sample, one_of(parse_formula(.formula))) %>% + distinct %>% + arrange(!!.sample) ) # Print the design column names in case I want contrasts @@ -886,6 +981,15 @@ get_differential_transcript_abundance_bulk_voom <- function(.data, ~ limma::makeContrasts(contrasts = .x, levels = design), ~ NULL) + # Check if package is installed, otherwise install + if (find.package("limma", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing limma needed for differential ", + "transcript abundance analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("limma", ask = FALSE) + } + voom_object = df_for_voom %>% select(!!.transcript,!!.sample,!!.abundance) %>% @@ -896,14 +1000,17 @@ get_differential_transcript_abundance_bulk_voom <- function(.data, # Scale data if method is not "none" when( - scaling_method != "none" ~ (.) %>% edgeR::calcNormFactors(method = scaling_method), + scaling_method != "none" ~ (.) %>% + edgeR::calcNormFactors(method = scaling_method), ~ (.) ) %>% # select method when( - tolower(method) == "limma_voom" ~ (.) %>% limma::voom(design, plot=FALSE), - tolower(method) == "limma_voom_sample_weights" ~ (.) %>% limma::voomWithQualityWeights(design, plot=FALSE) + tolower(method) == "limma_voom" ~ (.) %>% + limma::voom(design, plot=FALSE), + tolower(method) == "limma_voom_sample_weights" ~ (.) %>% + limma::voomWithQualityWeights(design, plot=FALSE) ) %>% limma::lmFit(design) @@ -918,7 +1025,8 @@ get_differential_transcript_abundance_bulk_voom <- function(.data, ~ .x %>% # Contrasts - limma::contrasts.fit(contrasts=my_contrasts, coefficients = when(my_contrasts, is.null(.) ~ 2)) %>% + limma::contrasts.fit(contrasts=my_contrasts, + coefficients = when(my_contrasts, is.null(.) ~ 2)) %>% limma::eBayes() %>% when( @@ -983,11 +1091,14 @@ get_differential_transcript_abundance_bulk_voom <- function(.data, # select method when( - tolower(method) == "limma_voom" ~ (.) %>% memorise_methods_used("voom"), - tolower(method) == "limma_voom_sample_weights" ~ (.) %>% memorise_methods_used("voom_sample_weights") + tolower(method) == "limma_voom" ~ (.) %>% + memorise_methods_used("voom"), + tolower(method) == "limma_voom_sample_weights" ~ (.) %>% + memorise_methods_used("voom_sample_weights") ) %>% when( - !is.null(test_above_log2_fold_change) ~ (.) %>% memorise_methods_used("treat"), + !is.null(test_above_log2_fold_change) ~ (.) %>% + memorise_methods_used("treat"), ~ (.) ) %>% @@ -995,59 +1106,71 @@ get_differential_transcript_abundance_bulk_voom <- function(.data, attach_to_internals(voom_object, "voom") %>% # Communicate the attribute added { - rlang::inform("tidybulk says: to access the raw results (fitted GLM) do `attr(..., \"internals\")$voom`", .frequency_id = "Access DE results voom", .frequency = "once") + rlang::inform(paste0("tidybulk says: to access the raw results ", + "(fitted GLM) do `attr(..., \"internals\")$voom`"), + .frequency_id = "Access DE results voom", .frequency = "once") (.) } } + #' Get differential transcription information to a tibble using DESeq2 #' #' @keywords internal #' @noRd #' +#' +#' #' @import tibble -#' @importFrom DESeq2 DESeqDataSet -#' @importFrom DESeq2 DESeq -#' @importFrom DESeq2 results #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix +#' @importFrom utils install.packages #' @importFrom purrr when #' @importFrom rlang inform #' @importFrom dplyr mutate_if #' #' @param .data A tibble -#' @param .formula a formula with no response variable, referring only to numeric variables +#' @param .formula a formula with no response variable, referring only to +#' numeric variables #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param .contrasts A character vector. See edgeR makeContrasts specification for the parameter `contrasts`. If contrasts are not present the first covariate is the one the model is tested against (e.g., ~ factor_of_interest) -#' @param method A string character. Either "edgeR_quasi_likelihood" (i.e., QLF), "edgeR_likelihood_ratio" (i.e., LRT) -#' @param scaling_method A character string. The scaling method passed to the backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") -#' @param omit_contrast_in_colnames If just one contrast is specified you can choose to omit the contrast label in the colnames. +#' @param .contrasts A character vector. See edgeR makeContrasts specification +#' for the parameter `contrasts`. If contrasts are not present the first +#' covariate is the one the model is tested against (e.g., ~ factor_of_interest) +#' @param method A string character. Either "edgeR_quasi_likelihood" +#' (i.e., QLF), "edgeR_likelihood_ratio" (i.e., LRT) +#' @param scaling_method A character string. The scaling method passed to the +#' backend function (i.e., edgeR::calcNormFactors; +#' "TMM","TMMwsp","RLE","upperquartile") +#' @param omit_contrast_in_colnames If just one contrast is specified you can +#' choose to omit the contrast label in the colnames. #' @param ... Additional arguments for DESeq2 #' #' @return A tibble with DESeq2 results #' get_differential_transcript_abundance_deseq2 <- function(.data, - .formula, - .sample = NULL, - .transcript = NULL, - .abundance = NULL, - .contrasts = NULL, - method = "deseq2", - test_above_log2_fold_change = NULL, - scaling_method = "TMM", - omit_contrast_in_colnames = FALSE, - prefix = "", - ...) { + .formula, + .sample = NULL, + .transcript = NULL, + .abundance = NULL, + .contrasts = NULL, + method = "deseq2", + test_above_log2_fold_change = NULL, + scaling_method = "TMM", + omit_contrast_in_colnames = FALSE, + prefix = "", + ...) { # Check if contrasts are of the same form if( .contrasts %>% is.null %>% not() & .contrasts %>% is("list") %>% not() ) - stop("tidybulk says: for DESeq2 the list of constrasts should be given in the form list(c(\"condition_column\",\"condition1\",\"condition2\")) i.e. list(c(\"genotype\",\"knockout\",\"wildtype\"))") + stop("tidybulk says: for DESeq2 the list of constrasts should be given in ", + "the form list(c(\"condition_column\",\"condition1\",\"condition2\")) ", + "i.e. list(c(\"genotype\",\"knockout\",\"wildtype\"))") # Get column names .sample = enquo(.sample) @@ -1056,10 +1179,20 @@ get_differential_transcript_abundance_deseq2 <- function(.data, # Check if omit_contrast_in_colnames is correctly setup if(omit_contrast_in_colnames & length(.contrasts) > 1){ - warning("tidybulk says: you can omit contrasts in column names only when maximum one contrast is present") + warning("tidybulk says: you can omit contrasts in column names ", + "only when maximum one contrast is present") omit_contrast_in_colnames = FALSE } + # Check if package is installed, otherwise install + if (find.package("DESeq2", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing DESeq2 needed for differential ", + "transcript abundance analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("DESeq2", ask = FALSE) + } + if (is.null(test_above_log2_fold_change)) { test_above_log2_fold_change <- 0 } @@ -1128,7 +1261,8 @@ get_differential_transcript_abundance_deseq2 <- function(.data, # Simple comparison discrete my_contrasts %>% is.null %>% not() & omit_contrast_in_colnames ~ (.) %>% - DESeq2::results(contrast = my_contrasts[[1]], lfcThreshold=test_above_log2_fold_change)%>% + DESeq2::results(contrast = my_contrasts[[1]], + lfcThreshold=test_above_log2_fold_change)%>% as_tibble(rownames = quo_name(.transcript)), # Multiple comparisons NOT USED AT THE MOMENT @@ -1140,11 +1274,13 @@ get_differential_transcript_abundance_deseq2 <- function(.data, ~ deseq2_obj %>% # select method - DESeq2::results(contrast = my_contrasts[[.x]], lfcThreshold=test_above_log2_fold_change) %>% + DESeq2::results(contrast = my_contrasts[[.x]], + lfcThreshold=test_above_log2_fold_change) %>% # Convert to tibble as_tibble(rownames = quo_name(.transcript)) %>% - mutate(constrast = sprintf("%s %s-%s", my_contrasts[[.x]][1], my_contrasts[[.x]][2], my_contrasts[[.x]][3]) ) + mutate(constrast = sprintf("%s %s-%s", my_contrasts[[.x]][1], + my_contrasts[[.x]][2], my_contrasts[[.x]][3])) ) %>% pivot_wider(values_from = -c(!!.transcript, constrast), @@ -1167,8 +1303,9 @@ get_differential_transcript_abundance_deseq2 <- function(.data, # Communicate the attribute added { - - rlang::inform("tidybulk says: to access the raw results (fitted GLM) do `attr(..., \"internals\")$DESeq2`", .frequency_id = "Access DE results deseq2", .frequency = "once") + rlang::inform(paste0("tidybulk says: to access the raw results ", + "(fitted GLM) do `attr(..., \"internals\")$DESeq2`"), + .frequency_id = "Access DE results deseq2", .frequency = "once") (.) } @@ -1179,10 +1316,12 @@ get_differential_transcript_abundance_deseq2 <- function(.data, #' @keywords internal #' @noRd #' +#' +#' #' @import tibble -#' @import broom #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix +#' @importFrom utils install.packages #' @importFrom purrr when #' @importFrom purrr map_lgl #' @importFrom stringr str_replace @@ -1191,13 +1330,17 @@ get_differential_transcript_abundance_deseq2 <- function(.data, #' @importFrom stringr str_remove #' @importFrom dplyr starts_with #' +#' #' @param .data A tibble -#' @param .formula a formula with no response variable, referring only to numeric variables +#' @param .formula a formula with no response variable, referring +#' only to numeric variables #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param method A string character. Either "edgeR_quasi_likelihood" (i.e., QLF), "edgeR_likelihood_ratio" (i.e., LRT) -#' @param reference A data frame. The transcript/cell_type data frame of integer transcript abundance +#' @param method A string character. Either "edgeR_quasi_likelihood" +#' (i.e., QLF), "edgeR_likelihood_ratio" (i.e., LRT) +#' @param reference A data frame. The transcript/cell_type data frame of +#' integer transcript abundance #' @param significance_threshold A real between 0 and 1 #' #' @return A tibble with edgeR results @@ -1218,6 +1361,12 @@ test_differential_cellularity_ <- function(.data, .transcript = enquo(.transcript) .abundance = enquo(.abundance) + + if (find.package("broom", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing broom needed for analyses") + install.packages("broom", repos = "https://cloud.r-project.org") + } + deconvoluted = .data %>% @@ -1252,7 +1401,8 @@ test_differential_cellularity_ <- function(.data, .formula %>% when( # If I have the dot, needed definitely for censored - format(.) %>% grepl("\\.", .) %>% any ~ format(.) %>% str_replace("([-\\+\\*~ ]?)(\\.)", "\\1.proportion_0_corrected"), + format(.) %>% grepl("\\.", .) %>% any ~ format(.) %>% + str_replace("([-\\+\\*~ ]?)(\\.)", "\\1.proportion_0_corrected"), # If normal formula ~ sprintf(".proportion_0_corrected%s", format(.)) @@ -1262,16 +1412,17 @@ test_differential_cellularity_ <- function(.data, # Test result = univariable_differential_tissue_composition(deconvoluted, - method, - .my_formula, - min_detected_proportion) %>% + method, + .my_formula, + min_detected_proportion) %>% # Attach attributes reattach_internals(.data) %>% # Add methods used when( - grepl("Surv", .my_formula) ~ (.) %>% memorise_methods_used(c("survival", "boot")), + grepl("Surv", .my_formula) ~ (.) %>% + memorise_methods_used(c("survival", "boot")), ~ (.) %>% memorise_methods_used("betareg") ) } else { @@ -1312,7 +1463,9 @@ test_differential_cellularity_ <- function(.data, reattach_internals(.data) %>% # Add methods used - when(grepl("Surv", .my_formula) ~ (.) %>% memorise_methods_used(c("survival", "boot"), object_containing_methods = .data), + when(grepl("Surv", .my_formula) ~ (.) %>% + memorise_methods_used(c("survival", "boot"), + object_containing_methods = .data), ~ (.)) } @@ -1337,6 +1490,7 @@ test_differential_cellularity_ <- function(.data, #' @import tibble #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix +#' @importFrom utils install.packages #' @importFrom purrr when #' @importFrom purrr map_lgl #' @importFrom stringr str_replace @@ -1346,12 +1500,15 @@ test_differential_cellularity_ <- function(.data, #' #' #' @param .data A tibble -#' @param .formula a formula with no response variable, referring only to numeric variables +#' @param .formula a formula with no response variable, referring +#' only to numeric variables #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param method A string character. Either "edgeR_quasi_likelihood" (i.e., QLF), "edgeR_likelihood_ratio" (i.e., LRT) -#' @param reference A data frame. The transcript/cell_type data frame of integer transcript abundance +#' @param method A string character. Either "edgeR_quasi_likelihood" +#' (i.e., QLF), "edgeR_likelihood_ratio" (i.e., LRT) +#' @param reference A data frame. The transcript/cell_type data frame of +#' integer transcript abundance #' @param significance_threshold A real between 0 and 1 #' #' @return A tibble with edgeR results @@ -1406,7 +1563,8 @@ test_stratification_cellularity_ <- function(.data, reattach_internals(.data) %>% # Add methods used - memorise_methods_used(c("survival", "boot", "survminer"), object_containing_methods = .data) + memorise_methods_used(c("survival", "boot", "survminer"), + object_containing_methods = .data) } %>% # Eliminate prefix @@ -1415,39 +1573,58 @@ test_stratification_cellularity_ <- function(.data, } + + #' Get gene enrichment analyses using EGSEA #' #' @keywords internal #' @noRd #' +#' +#' #' @import tibble #' @importFrom magrittr set_colnames #' @importFrom purrr map2_dfr #' @importFrom stats model.matrix +#' @importFrom utils install.packages +#' #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) -#' @param .formula A formula with no response variable, representing the desired linear model +#' @param .data A `tbl` (with at least three columns for sample, feature and +#' transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .formula A formula with no response variable, representing the +#' desired linear model #' @param .sample The name of the sample column #' @param .entrez The ENTREZ code of the transcripts/genes #' @param .abundance The name of the transcript/gene abundance column -#' @param .contrasts A character vector. See edgeR makeContrasts specification for the parameter `contrasts`. If contrasts are not present the first covariate is the one the model is tested against (e.g., ~ factor_of_interest) -#' @param methods A character vector. One or 3 or more methods to use in the testing (currently EGSEA errors if 2 are used). Type EGSEA::egsea.base() to see the supported GSE methods. -#' @param gene_sets A character vector or a list. It can take one or more of the following built-in collections as a character vector: c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "kegg_disease", "kegg_metabolism", "kegg_signaling"), to be used with EGSEA buildIdx. c1 is human specific. Alternatively, a list of user-supplied gene sets can be provided, to be used with EGSEA buildCustomIdx. In that case, each gene set is a character vector of Entrez IDs and the names of the list are the gene set names. +#' @param .contrasts A character vector. See edgeR makeContrasts specification +#' for the parameter `contrasts`. If contrasts are not present the first +#' covariate is the one the model is tested against (e.g., ~ factor_of_interest) +#' @param methods A character vector. One or 3 or more methods to use in the +#' testing (currently EGSEA errors if 2 are used). Type EGSEA::egsea.base() +#' to see the supported GSE methods. +#' @param gene_sets A character vector or a list. It can take one or more of +#' the following built-in collections as a character vector: c("h", "c1", "c2", +#' "c3", "c4", "c5", "c6", "c7", "kegg_disease", "kegg_metabolism", +#' "kegg_signaling"), to be used with EGSEA buildIdx. c1 is human specific. +#' Alternatively, a list of user-supplied gene sets can be provided, to be +#' used with EGSEA buildCustomIdx. In that case, each gene set is a character +#' vector of Entrez IDs and the names of the list are the gene set names. #' @param species A character. It can be human, mouse or rat. #' @param cores An integer. The number of cores available #' #' @return A tibble with edgeR results #' test_gene_enrichment_bulk_EGSEA <- function(.data, - .formula, - .sample = NULL, - .entrez, - .abundance = NULL, - .contrasts = NULL, - methods, - gene_sets, - species, - cores = 10) { + .formula, + .sample = NULL, + .entrez, + .abundance = NULL, + .contrasts = NULL, + methods, + gene_sets, + species, + cores = 10) { # Comply with CRAN NOTES . = NULL @@ -1477,14 +1654,18 @@ test_gene_enrichment_bulk_EGSEA <- function(.data, pull(n) %>% min %>% st(2)) - stop("tidybulk says: You need at least two replicates for each condition for EGSEA to work") + stop("tidybulk says: You need at least two replicates for each", + " condition for EGSEA to work") # Create design matrix design = model.matrix( object = .formula, - data = df_for_edgeR %>% select(!!.sample, one_of(parse_formula(.formula))) %>% distinct %>% arrange(!!.sample) + data = df_for_edgeR %>% + select(!!.sample, one_of(parse_formula(.formula))) %>% + distinct %>% + arrange(!!.sample) ) # Print the design column names in case I want contrasts @@ -1503,13 +1684,13 @@ test_gene_enrichment_bulk_EGSEA <- function(.data, # Check if package is installed, otherwise install if (find.package("EGSEA", quiet = TRUE) %>% length %>% equals(0)) { - stop(" - EGSEA not installed. Please install it. EGSEA requires manual installation to not overwhelm the user in case it is not needed. - BiocManager::install(\"EGSEA\", ask = FALSE) - ") + stop("EGSEA not installed. Please install it. EGSEA requires manual ", + "installation to not overwhelm the user in case it is not needed.", + "BiocManager::install(\"EGSEA\", ask = FALSE)") } if (!"EGSEA" %in% (.packages())) { - stop("EGSEA package not loaded. Please run library(\"EGSEA\"). With this setup, EGSEA require manual loading, for technical reasons.") + stop("EGSEA package not loaded. Please run library(\"EGSEA\"). ", + "With this setup, EGSEA require manual loading, for technical reasons.") } dge = @@ -1529,7 +1710,8 @@ test_gene_enrichment_bulk_EGSEA <- function(.data, if (is.list(gene_sets)) { - idx = buildCustomIdx(geneIDs = rownames(dge), species = species, gsets=gene_sets) + idx = buildCustomIdx(geneIDs = rownames(dge), + species = species, gsets=gene_sets) nonkegg_genesets = idx kegg_genesets = NULL @@ -1560,7 +1742,8 @@ test_gene_enrichment_bulk_EGSEA <- function(.data, } - idx = buildIdx(entrezIDs = rownames(dge), species = species, msigdb.gsets = msigdb.gsets, + idx = buildIdx(entrezIDs = rownames(dge), species = species, + msigdb.gsets = msigdb.gsets, kegg.exclude = kegg.exclude) # Due to a bug with kegg pathview overlays, this collection is run without report @@ -1586,7 +1769,7 @@ test_gene_enrichment_bulk_EGSEA <- function(.data, limma::voom(design, plot = FALSE) %>% # Execute EGSEA - egsea( + EGSEA::egsea( contrasts = my_contrasts, gs.annots = nonkegg_genesets, baseGSEAs = methods, @@ -1612,7 +1795,9 @@ test_gene_enrichment_bulk_EGSEA <- function(.data, } if (length(kegg_genesets) != 0) { - message("tidybulk says: due to a bug in the call to KEGG database (http://supportupgrade.bioconductor.org/p/122172/#122218), the analysis for this database is run without report production.") + message("tidybulk says: due to a bug in the call to KEGG database ", + "(http://supportupgrade.bioconductor.org/p/122172/#122218), ", + "the analysis for this database is run without report production.") res_kegg = dge %>% @@ -1655,7 +1840,8 @@ test_gene_enrichment_bulk_EGSEA <- function(.data, # add to bibliography if (exists("collections_bib")) { - out %>% memorise_methods_used(c("egsea", collections_bib, methods), object_containing_methods = .data) + out %>% memorise_methods_used(c("egsea", collections_bib, methods), + object_containing_methods = .data) } } @@ -1671,11 +1857,15 @@ test_gene_enrichment_bulk_EGSEA <- function(.data, #' @importFrom rlang := #' #' @param .data A tibble -#' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) -#' @param .feature A column symbol. The column that is represents entities to cluster (i.e., normally samples) -#' @param .element A column symbol. The column that is used to calculate distance (i.e., normally genes) +#' @param .abundance A column symbol with the value the clustering is based +#' on (e.g., `count`) +#' @param .feature A column symbol. The column that is represents entities to +#' cluster (i.e., normally samples) +#' @param .element A column symbol. The column that is used to calculate +#' distance (i.e., normally genes) #' @param of_samples A boolean -#' @param log_transform A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data) +#' @param log_transform A boolean, whether the value should be log-transformed +#' (e.g., TRUE for RNA sequencing data) #' @param ... Further parameters passed to the function kmeans #' #' @return A tibble with additional columns @@ -1692,7 +1882,8 @@ get_clusters_kmeans_bulk <- # Check if centers is in dots dots_args = rlang::dots_list(...) if ("centers" %in% names(dots_args) %>% not()) - stop("tidybulk says: for kmeans you need to provide the \"centers\" integer argument") + stop('tidybulk says: for kmeans you need to provide the ', + '"centers" integer argument') # Get column names .element = enquo(.element) @@ -1736,19 +1927,18 @@ get_clusters_kmeans_bulk <- #' #' @import tibble #' @importFrom rlang := -#' @importFrom Seurat CreateSeuratObject -#' @importFrom Seurat ScaleData -#' @importFrom Seurat FindVariableFeatures -#' @importFrom Seurat RunPCA -#' @importFrom Seurat FindNeighbors -#' @importFrom Seurat FindClusters +#' @importFrom utils install.packages #' #' @param .data A tibble -#' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) -#' @param .feature A column symbol. The column that is represents entities to cluster (i.e., normally samples) -#' @param .element A column symbol. The column that is used to calculate distance (i.e., normally genes) +#' @param .abundance A column symbol with the value the clustering +#' is based on (e.g., `count`) +#' @param .feature A column symbol. The column that is represents entities +#' to cluster (i.e., normally samples) +#' @param .element A column symbol. The column that is used to calculate +#' distance (i.e., normally genes) #' @param of_samples A boolean -#' @param log_transform A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data) +#' @param log_transform A boolean, whether the value should be +#' log-transformed (e.g., TRUE for RNA sequencing data) #' @param ... Further parameters passed to the function kmeans #' #' @return A tibble with additional columns @@ -1765,7 +1955,21 @@ get_clusters_SNN_bulk <- .element = enquo(.element) .feature = enquo(.feature) .abundance = enquo(.abundance) - + + # Check if package is installed, otherwise install + if (find.package("cluster", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing cluster") + install.packages("cluster", repos = "https://cloud.r-project.org") + } + if (find.package("Seurat", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing Seurat") + install.packages("Seurat", repos = "https://cloud.r-project.org") + } + if (find.package("KernSmooth", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing KernSmooth") + install.packages("KernSmooth", repos = "https://cloud.r-project.org") + } + my_df = .data %>% @@ -1813,13 +2017,18 @@ get_clusters_SNN_bulk <- #' @importFrom rlang inform #' #' @param .data A tibble -#' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) -#' @param .dims A integer vector corresponding to principal components of interest (e.g., 1:6) -#' @param .feature A column symbol. The column that is represents entities to cluster (i.e., normally genes) -#' @param .element A column symbol. The column that is used to calculate distance (i.e., normally samples) +#' @param .abundance A column symbol with the value the clustering +#' is based on (e.g., `count`) +#' @param .dims A integer vector corresponding to principal components of +#' interest (e.g., 1:6) +#' @param .feature A column symbol. The column that is represents entities to +#' cluster (i.e., normally genes) +#' @param .element A column symbol. The column that is used to calculate +#' distance (i.e., normally samples) #' @param top An integer. How many top genes to select #' @param of_samples A boolean -#' @param log_transform A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data) +#' @param log_transform A boolean, whether the value should be +#' log-transformed (e.g., TRUE for RNA sequencing data) #' #' @return A tibble with additional columns #' @@ -1846,7 +2055,8 @@ get_reduced_dimensions_MDS_bulk <- # Convert components to components list - if((length(components) %% 2) != 0 ) components = components %>% append(components[1]) + if((length(components) %% 2) != 0 ) components = components %>% + append(components[1]) components_list = split(components, ceiling(seq_along(components)/2)) # Loop over components list and calculate MDS. (I have to make this process more elegant) @@ -1863,7 +2073,8 @@ get_reduced_dimensions_MDS_bulk <- # Stop any column is not if not numeric or integer ifelse_pipe( - (.) %>% select(!!.abundance) %>% summarise_all(class) %>% `%in%`(c("numeric", "integer")) %>% `!`() %>% any(), + (.) %>% select(!!.abundance) %>% summarise_all(class) %>% + `%in%`(c("numeric", "integer")) %>% `!`() %>% any(), ~ stop(".abundance must be numerical or integer") ) %>% spread(!!.element,!!.abundance) %>% @@ -1907,8 +2118,9 @@ get_reduced_dimensions_MDS_bulk <- attach_to_internals(mds_object, "MDS") %>% # Communicate the attribute added { - - rlang::inform("tidybulk says: to access the raw results do `attr(..., \"internals\")$MDS`", .frequency_id = "Access MDS results", .frequency = "once") + rlang::inform(paste0("tidybulk says: to access the raw results do ", + "`attr(..., \"internals\")$MDS`"), + .frequency_id = "Access MDS results", .frequency = "once") (.) } @@ -1929,13 +2141,18 @@ get_reduced_dimensions_MDS_bulk <- #' @importFrom rlang inform #' #' @param .data A tibble -#' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) -#' @param .dims A integer vector corresponding to principal components of interest (e.g., 1:6) -#' @param .feature A column symbol. The column that is represents entities to cluster (i.e., normally genes) -#' @param .element A column symbol. The column that is used to calculate distance (i.e., normally samples) +#' @param .abundance A column symbol with the value the clustering is +#' based on (e.g., `count`) +#' @param .dims A integer vector corresponding to principal components of +#' interest (e.g., 1:6) +#' @param .feature A column symbol. The column that is represents entities +#' to cluster (i.e., normally genes) +#' @param .element A column symbol. The column that is used to calculate +#' distance (i.e., normally samples) #' @param top An integer. How many top genes to select #' @param of_samples A boolean -#' @param log_transform A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data) +#' @param log_transform A boolean, whether the value should be +#' log-transformed (e.g., TRUE for RNA sequencing data) #' @param scale A boolean #' @param ... Further parameters passed to the function prcomp #' @@ -1980,7 +2197,8 @@ get_reduced_dimensions_PCA_bulk <- # Stop any column is not if not numeric or integer ifelse_pipe( - (.) %>% select(!!.abundance) %>% summarise_all(class) %>% `%in%`(c("numeric", "integer", "bouble")) %>% not() %>% any(), + (.) %>% select(!!.abundance) %>% summarise_all(class) %>% + `%in%`(c("numeric", "integer", "bouble")) %>% not() %>% any(), ~ stop("tidybulk says: .abundance must be numerical or integer") ) %>% @@ -1997,16 +2215,16 @@ get_reduced_dimensions_PCA_bulk <- # First function ~ stop( - "tidybulk says: In calculating PCA there is no gene that have non NA values is all samples" + "tidybulk says: In calculating PCA there is no gene that have ", + "non NA values is all samples" ), # Second function ~ { warning( - " - tidybulk says: In PCA correlation there is < 100 genes that have non NA values is all samples. -The correlation calculation would not be reliable, -we suggest to partition the dataset for sample clusters. + "tidybulk says: In PCA correlation there is < 100 genes that have ", + "non NA values is all samples. The correlation calculation would ", + "not be reliable, we suggest to partition the dataset for sample clusters. " ) .x @@ -2053,11 +2271,12 @@ we suggest to partition the dataset for sample clusters. attach_to_internals(prcomp_obj, "PCA") %>% # Communicate the attribute added { - rlang::inform("tidybulk says: to access the raw results do `attr(..., \"internals\")$PCA`", .frequency_id = "Access PCA results", .frequency = "once") + rlang::inform(paste0("tidybulk says: to access the raw results do ", + "`attr(..., \"internals\")$PCA`"), + .frequency_id = "Access PCA results", .frequency = "once") (.) } - } #' Get tSNE @@ -2070,16 +2289,21 @@ we suggest to partition the dataset for sample clusters. #' @import tibble #' @importFrom rlang := #' @importFrom stats setNames -#' @importFrom Rtsne Rtsne +#' @importFrom utils install.packages #' #' @param .data A tibble -#' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) -#' @param .dims A integer vector corresponding to principal components of interest (e.g., 1:6) -#' @param .feature A column symbol. The column that is represents entities to cluster (i.e., normally genes) -#' @param .element A column symbol. The column that is used to calculate distance (i.e., normally samples) +#' @param .abundance A column symbol with the value the +#' clustering is based on (e.g., `count`) +#' @param .dims A integer vector corresponding to principal +#' components of interest (e.g., 1:6) +#' @param .feature A column symbol. The column that is represents +#' entities to cluster (i.e., normally genes) +#' @param .element A column symbol. The column that is used to +#' calculate distance (i.e., normally samples) #' @param top An integer. How many top genes to select #' @param of_samples A boolean -#' @param log_transform A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data) +#' @param log_transform A boolean, whether the value should be +#' log-transformed (e.g., TRUE for RNA sequencing data) #' @param ... Further parameters passed to the function Rtsne #' #' @return A tibble with additional columns @@ -2112,11 +2336,18 @@ get_reduced_dimensions_TSNE_bulk <- if (!"dims" %in% names(arguments)) arguments = arguments %>% c(dims = .dims) + + # Check if package is installed, otherwise install + if (find.package("Rtsne", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing Rtsne") + install.packages("Rtsne", repos = "https://cloud.r-project.org") + } + # Set perprexity to not be too high if (!"perplexity" %in% names(arguments)) { - perplexity_value <- (ncol(.data) - 1 / 3 / 2) - perplexity_value <- pmin(floor(perplexity_value), 30) - arguments$perplexity <- perplexity_value + arguments <- arguments %>% c(perplexity = (( + .data %>% distinct(!!.element) %>% nrow() %>% sum(-1) + ) / 3 / 2) %>% floor(.) %>% min(30)) } # If not enough samples stop @@ -2177,17 +2408,24 @@ get_reduced_dimensions_TSNE_bulk <- #' @import tibble #' @importFrom rlang := #' @importFrom stats setNames -#' @importFrom uwot tumap +#' @importFrom utils install.packages #' #' @param .data A tibble -#' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) -#' @param .dims A integer vector corresponding to principal components of interest (e.g., 1:6) -#' @param .feature A column symbol. The column that is represents entities to cluster (i.e., normally genes) -#' @param .element A column symbol. The column that is used to calculate distance (i.e., normally samples) +#' @param .abundance A column symbol with the value the clustering +#' is based on (e.g., `count`) +#' @param .dims A integer vector corresponding to principal components +#' of interest (e.g., 1:6) +#' @param .feature A column symbol. The column that is represents entities +#' to cluster (i.e., normally genes) +#' @param .element A column symbol. The column that is used to calculate +#' distance (i.e., normally samples) #' @param top An integer. How many top genes to select #' @param of_samples A boolean -#' @param log_transform A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data) -#' @param calculate_for_pca_dimensions An integer of length one. The number of PCA dimensions to based the UMAP calculatio on. If NULL all variable features are considered +#' @param log_transform A boolean, whether the value should be log-transformed +#' (e.g., TRUE for RNA sequencing data) +#' @param calculate_for_pca_dimensions An integer of length one. The number of +#' PCA dimensions to based the UMAP calculatio on. +#' If NULL all variable features are considered #' @param ... Further parameters passed to the function uwot #' #' @return A tibble with additional columns @@ -2210,7 +2448,8 @@ get_reduced_dimensions_UMAP_bulk <- !is(calculate_for_pca_dimensions, "numeric") | length(calculate_for_pca_dimensions) > 1 )) - stop("tidybulk says: the argument calculate_for_pca_dimensions should be NULL or an integer of size 1") + stop("tidybulk says: the argument calculate_for_pca_dimensions ", + "should be NULL or an integer of size 1") # Comply with CRAN NOTES . = NULL @@ -2229,6 +2468,12 @@ get_reduced_dimensions_UMAP_bulk <- if (!"init" %in% names(arguments)) arguments = arguments %>% c(init = "spca") + # Check if package is installed, otherwise install + if (find.package("uwot", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing uwot") + install.packages("uwot", repos = "https://cloud.r-project.org") + } + df_source = .data %>% @@ -2302,10 +2547,13 @@ get_reduced_dimensions_UMAP_bulk <- #' @param dimension_1_column A column symbol. The column of the dimension 1 #' @param dimension_2_column A column symbol. The column of the dimension 2 #' @param rotation_degrees A real number between 0 and 360 -#' @param .element A column symbol. The column that is used to calculate distance (i.e., normally samples) +#' @param .element A column symbol. The column that is used to +#' calculate distance (i.e., normally samples) #' @param of_samples A boolean -#' @param dimension_1_column_rotated A column symbol. The column of the dimension 1 rotated -#' @param dimension_2_column_rotated A column symbol. The column of the dimension 2 rotated +#' @param dimension_1_column_rotated A column symbol. +#' The column of the dimension 1 rotated +#' @param dimension_2_column_rotated A column symbol. +#' The column of the dimension 2 rotated #' #' @return A tibble with additional rotated columns #' @@ -2370,7 +2618,8 @@ get_rotated_dimensions = } #' Aggregates multiple counts from the same samples (e.g., from isoforms) -#' This function aggregates counts over samples, concatenates other character columns, and averages other numeric columns +#' This function aggregates counts over samples, +#' concatenates other character columns, and averages other numeric columns #' #' @keywords internal #' @noRd @@ -2483,23 +2732,31 @@ aggregate_duplicated_transcripts_bulk = # Through warning if there are logicals of factor in the data frame # because they cannot be merged if they are not unique - if (length(columns_to_be_converted)>0 & filter(count_duplicates, n_aggr>1) %>% nrow() %>% gt(0)) { + if (length(columns_to_be_converted)>0 & filter(count_duplicates, n_aggr>1) + %>% nrow() %>% gt(0)) { warning(paste(capture.output({ - cat(crayon::blue("tidybulk says: The following columns were converted to characters, as aggregating those classes with concatenation is not possible.\n")) + cat(crayon::blue("tidybulk says: The following columns were converted ", + "to characters, as aggregating those classes with ", + "concatenation is not possible.\n")) print(.data %>% select(columns_to_be_converted)) }), collapse = "\n")) } # Through warning if there are logicals of factor in the data frame # because they cannot be merged if they are not unique - if (length(non_standard_columns)>0 & filter(count_duplicates, n_aggr>1) %>% nrow() %>% gt(0)) { + if (length(non_standard_columns)>0 & filter(count_duplicates, n_aggr>1) %>% + nrow() %>% gt(0)) { warning(paste(capture.output({ - cat(crayon::blue("tidybulk says: If duplicates exist from the following columns, only the first instance was taken (lossy behaviour), as aggregating those classes with concatenation is not possible.\n")) + cat(crayon::blue("tidybulk says: If duplicates exist from the ", + "following columns, only the first instance was taken ", + "(lossy behaviour), as aggregating those classes with ", + "concatenation is not possible.\n")) print(.data %>% select(non_standard_columns)) }), collapse = "\n")) } - # aggregates read .data over samples, concatenates other character columns, and averages other numeric columns + # aggregates read .data over samples, concatenates other character + # columns, and averages other numeric columns .data %>% # transform logicals and factors @@ -2507,7 +2764,8 @@ aggregate_duplicated_transcripts_bulk = mutate_if(is.logical, as.character) %>% # Add the number of duplicates for each gene - dplyr::left_join(count_duplicates, by = c(quo_name(.sample), quo_name(.transcript))) %>% + dplyr::left_join(count_duplicates, + by = c(quo_name(.sample), quo_name(.transcript))) %>% # Anonymous function - binds the unique and the reduced genes, # in the way we have to reduce redundancy just for the duplicated genes @@ -2543,7 +2801,8 @@ aggregate_duplicated_transcripts_bulk = } #' Aggregates multiple counts from the same samples (e.g., from isoforms) -#' This function aggregates counts over samples, concatenates other character columns, and averages other numeric columns +#' This function aggregates counts over samples, concatenates other +#' character columns, and averages other numeric columns #' #' @keywords internal #' @noRd @@ -2588,7 +2847,9 @@ aggregate_duplicated_transcripts_DT = # tidybulk::scale_abundance(.sample_ = sample, .abundance_ = abundance, .transcript_ = transcript) if(.data %>% filter(is.na(!!.transcript_)) %>% nrow() %>% gt(0)){ - warning(sprintf("tidybulk says: some of your %s are NAs. Those will be eliminated to correctly aggregate the duplicates", quo_name(.transcript_))) + warning(sprintf(paste0("tidybulk says: some of your %s are NAs.", + "Those will be eliminated to correctly aggregate the duplicates"), + quo_name(.transcript_))) .data = .data %>% filter(!is.na(!!.transcript_)) } # Select which are the numerical columns @@ -2600,9 +2861,9 @@ aggregate_duplicated_transcripts_DT = # If scaled add the column to the exclusion ifelse_pipe(( - ".abundance_scaled" %in% (.data %>% get_tt_columns() %>% names) && - # .data %>% get_tt_columns() %$% .abundance_scaled %>% is.null %>% not() && - quo_name(.data %>% get_tt_columns() %$% .abundance_scaled) %in% (.data %>% colnames) + ".abundance_scaled" %in% (.data %>% get_tt_columns() %>% names) && + # .data %>% get_tt_columns() %$% .abundance_scaled %>% is.null %>% not() && + quo_name(.data %>% get_tt_columns() %$% .abundance_scaled) %in% (.data %>% colnames) ), ~ .x %>% select(-!!( .data %>% get_tt_columns() %$% .abundance_scaled @@ -2618,7 +2879,9 @@ aggregate_duplicated_transcripts_DT = ~ (.) ) - pasted_strings___ = stringi::stri_c(pull(.data,quo_name(.transcript_)), pull(.data,quo_name(.sample_)), sep = "_") + pasted_strings___ = stringi::stri_c(pull(.data,quo_name(.transcript_)), + pull(.data,quo_name(.sample_)), + sep = "_") #.data = .data %>% mutate(pasted_strings___ = pasted_strings___) duplicates = pasted_strings___%in%pasted_strings___[which(duplicated(pasted_strings___))] @@ -2651,41 +2914,43 @@ aggregate_duplicated_transcripts_DT = } -#' Drop redundant elements (e.g., samples) for which feature (e.g., genes) aboundances are correlated +#' Drop redundant elements (e.g., samples) for which feature +#' (e.g., genes) aboundances are correlated #' #' @keywords internal #' @noRd #' +#' +#' #' @import tibble #' @importFrom rlang := #' @importFrom dplyr anti_join -#' @importFrom dplyr mutate -#' @importFrom dplyr rename -#' @importFrom dplyr left_join -#' @importFrom dplyr select -#' @importFrom dplyr distinct -#' @importFrom widyr pairwise_cor #' #' @param .data A tibble -#' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) +#' @param .abundance A column symbol with the value the clustering +#' is based on (e.g., `count`) #' @param correlation_threshold A real number between 0 and 1 #' @param top An integer. How many top genes to select -#' @param .feature A column symbol. The column that is represents entities to cluster (i.e., normally genes) -#' @param .element A column symbol. The column that is used to calculate distance (i.e., normally samples) +#' @param .feature A column symbol. The column that is represents entities +#' to cluster (i.e., normally genes) +#' @param .element A column symbol. The column that is used to calculate +#' distance (i.e., normally samples) #' @param of_samples A boolean -#' @param log_transform A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data) +#' @param log_transform A boolean, whether the value should be log-transformed +#' (e.g., TRUE for RNA sequencing data) #' #' @return A tibble with redundant elements removed #' #' -remove_redundancy_elements_through_correlation <- function(.data, - .element = NULL, - .feature = NULL, - .abundance = NULL, - correlation_threshold = 0.9, - top = Inf, - of_samples = TRUE, - transform = identity) { +remove_redundancy_elements_through_correlation <- function( + .data, + .element = NULL, + .feature = NULL, + .abundance = NULL, + correlation_threshold = 0.9, + top = Inf, + of_samples = TRUE, + transform = identity) { # Comply with CRAN NOTES . = NULL @@ -2693,21 +2958,29 @@ remove_redundancy_elements_through_correlation <- function(.data, .element = enquo(.element) .feature = enquo(.feature) .abundance = enquo(.abundance) - col_names = get_elements_features_abundance(.data, .element, .feature, .abundance, of_samples) + col_names = get_elements_features_abundance(.data, .element, .feature, + .abundance, of_samples) .element = col_names$.element .feature = col_names$.feature .abundance = col_names$.abundance # Check if .data has more than one element if(.data %>% distinct(!!.element) %>% nrow() <= 1 ) - stop("tidybulk says: You must have more than one element (trancripts if of_samples == FALSE) to perform remove_redundancy") + stop("tidybulk says: You must have more than one element ", + "(trancripts if of_samples == FALSE) to perform remove_redundancy") + + # Check if package is installed, otherwise install + if (find.package("widyr", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing widyr needed for correlation analyses") + install.packages("widyr", repos = "https://cloud.r-project.org") + } # Get the redundant data frame .data.correlated = .data %>% # Prepare the data frame - dplyr::select(!!.feature,!!.element,!!.abundance) %>% + select(!!.feature,!!.element,!!.abundance) %>% # Filter variable genes keep_variable_transcripts(!!.element,!!.feature,!!.abundance, top = top) %>% @@ -2715,7 +2988,7 @@ remove_redundancy_elements_through_correlation <- function(.data, # Apply (log by default) transformation dplyr::mutate(!!.abundance := transform(!!.abundance)) %>% - dplyr::distinct() %>% + distinct() %>% # NO NEED OF RECTANGULAR # spread(!!.element,!!.abundance) %>% @@ -2760,7 +3033,7 @@ remove_redundancy_elements_through_correlation <- function(.data, upper = FALSE ) %>% filter(correlation > correlation_threshold) %>% - dplyr::distinct(item1) %>% + distinct(item1) %>% dplyr::rename(!!.element := item1) # Return non redundant data frame @@ -2782,7 +3055,8 @@ remove_redundancy_elements_through_correlation <- function(.data, #' @param .data A tibble #' @param Dim_a_column A column symbol. The column of one principal component #' @param Dim_b_column A column symbol. The column of another principal component -#' @param .element A column symbol. The column that is represents entities to cluster (i.e., normally samples) +#' @param .element A column symbol. The column that is represents entities +#' to cluster (i.e., normally samples) #' @param of_samples A boolean #' #' @return A tibble with pairs dropped @@ -2803,7 +3077,8 @@ remove_redundancy_elements_though_reduced_dimensions <- # Check if .data has more than one element if(.data %>% distinct(!!.element) %>% nrow() <= 1 ) - stop("tidybulk says: You must have more than one element (trancripts if of_samples == FALSE) to perform remove_redundancy") + stop("tidybulk says: You must have more than one element (trancripts ", + "if of_samples == FALSE) to perform remove_redundancy") Dim_a_column = enquo(Dim_a_column) Dim_b_column = enquo(Dim_b_column) @@ -3022,6 +3297,24 @@ run_llsr = function(mix, reference = X_cibersort, intercept= TRUE) { #' run_epic = function(mix, reference = NULL) { + # Check if package is installed, otherwise install + if (find.package("devtools", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing class needed for EPIC") + install.packages("devtools", repos = "https://cloud.r-project.org", + dependencies = c("Depends", "Imports")) + } + + # Check if package is installed, otherwise install + if (find.package("EPIC", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing class needed for EPIC") + devtools::install_github("GfellerLab/EPIC") + } + + if("EPIC" %in% .packages() %>% not) stop("tidybulk says: Please install and ", + "then load the package EPIC manually (i.e. library(EPIC)). ", + "This is because EPIC is not in Bioconductor or CRAN so it is not possible ", + "to seamlessly make EPIC part of the dependencies.") + # Get common markers if( reference |> is("data.frame") | reference |> is("matrix")){ markers = intersect(rownames(mix), rownames(reference)) @@ -3039,17 +3332,6 @@ run_epic = function(mix, reference = NULL) { # Check if it is not matrix or data.frame, for example DelayedMatrix if(!is(Y, "matrix") & !is(Y, "data.frame")) Y = as.matrix(Y) - - # Check if package is installed, otherwise install - if (find.package("EPIC", quiet = TRUE) %>% length %>% equals(0)) { - stop(" - EPIC not installed. Please install it. EPIC requires manual installation as it is not on Bioconductor or CRAN. - BiocManager::install(\"EPIC\", ask = FALSE) - ") - } - if (!"EPIC" %in% (.packages())) { - stop("EPIC package not loaded. Please run library(\"EPIC\"). With this setup, EPIC requires manual loading.") - } results <- EPIC(Y, reference = reference)$cellFractions %>% data.frame() #results[results < 0] <- 0 @@ -3067,19 +3349,22 @@ run_epic = function(mix, reference = NULL) { #' #' @import parallel #' @import preprocessCore -#' @import class -#' @import e1071 #' @importFrom stats setNames #' @importFrom rlang dots_list #' @importFrom magrittr equals +#' @importFrom utils install.packages #' #' @param .data A tibble #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param reference A data frame. The transcript/cell_type data frame of integer transcript abundance -#' @param method A character string. The method to be used. At the moment Cibersort (default) and llsr (linear least squares regression) are available. -#' @param prefix A character string. The prefix you would like to add to the result columns. It is useful if you want to reshape data. +#' @param reference A data frame. The transcript/cell_type data frame of +#' integer transcript abundance +#' @param method A character string. The method to be used. +#' At the moment Cibersort (default) and llsr (linear least squares regression) +#' are available. +#' @param prefix A character string. The prefix you would like to add to the +#' result columns. It is useful if you want to reshape data. #' @param ... Further parameters passed to the function Cibersort #' #' @return A tibble including additional columns @@ -3119,13 +3404,37 @@ get_cell_type_proportions = function(.data, # Execute do.call because I have to deal with ... method %>% tolower %>% equals("cibersort") ~ { + # Check if package is installed, otherwise install + if (find.package("class", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing class needed for Cibersort") + install.packages("class", repos = "https://cloud.r-project.org", + dependencies = c("Depends", "Imports")) + } + + # Check if package is installed, otherwise install + if (find.package("e1071", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing e1071 needed for Cibersort") + install.packages("e1071", repos = "https://cloud.r-project.org", + dependencies = c("Depends", "Imports")) + } + + # Check if package is installed, otherwise install + if (find.package("preprocessCore", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing preprocessCore needed for Cibersort") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("preprocessCore", ask = FALSE) + + } + # Choose reference reference = reference %>% when(is.null(.) ~ X_cibersort, ~ .) # Validate reference validate_signature(.data, reference, !!.transcript) - do.call(my_CIBERSORT, list(Y = ., X = reference, QN=FALSE) %>% c(dots_args)) %$% + do.call(my_CIBERSORT, list(Y = ., X = reference, QN=FALSE) %>% + c(dots_args)) %$% proportions %>% as_tibble(rownames = quo_name(.sample)) %>% select(-`P-value`,-Correlation,-RMSE) @@ -3159,8 +3468,16 @@ get_cell_type_proportions = function(.data, # Other (hidden for the moment) methods using third party wrapper https://icbi-lab.github.io/immunedeconv method %>% tolower %in% c("mcp_counter", "quantiseq", "xcell") ~ { + # # Check if package is installed, otherwise install + if (find.package("immunedeconv", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing immunedeconv") + devtools::install_github("icbi-lab/immunedeconv", upgrade = FALSE) + } + if(method %in% c("mcp_counter", "quantiseq", "xcell") & !"immunedeconv" %in% (.packages())) - stop("tidybulk says: for xcell, mcp_counter, or quantiseq deconvolution you should have the package immunedeconv attached. Please execute library(immunedeconv)") + stop("tidybulk says: for xcell, mcp_counter, or quantiseq ", + "deconvolution you should have the package immunedeconv attached. ", + "Please execute library(immunedeconv)") (.) %>% deconvolute(method %>% tolower, tumor = FALSE) %>% @@ -3169,7 +3486,8 @@ get_cell_type_proportions = function(.data, }, ~ stop( - "tidybulk says: please choose between llsr, cibersort, epic, mcp_counter, quantiseq, and xcell methods" + "tidybulk says: please choose between llsr, cibersort, epic, ", + "mcp_counter, quantiseq, and xcell methods" ) ) %>% @@ -3192,33 +3510,37 @@ get_cell_type_proportions = function(.data, #' @keywords internal #' @noRd #' +#' +#' #' @import tibble -#' @import sva #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix #' @importFrom stats as.formula +#' @importFrom utils install.packages #' @importFrom stats rnorm #' @importFrom stringr str_c #' #' @param .data A tibble -#' @param .formula a formula with no response variable, of the kind ~ factor_of_interest + batch +#' @param .formula a formula with no response variable, of the +#' kind ~ factor_of_interest + batch #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param log_transform A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data) +#' @param log_transform A boolean, whether the value should be log-transformed +#' (e.g., TRUE for RNA sequencing data) #' @param ... Further parameters passed to the function sva::ComBat #' #' @return A tibble with adjusted counts #' #' get_adjusted_counts_for_unwanted_variation_bulk <- function(.data, - .factor_unwanted, - .factor_of_interest, - .sample = NULL, - .transcript = NULL, - .abundance = NULL, - method = "combat_seq", - ...) { + .factor_unwanted, + .factor_of_interest, + .sample = NULL, + .transcript = NULL, + .abundance = NULL, + method = "combat_seq", + ...) { # Get column names .sample = enquo(.sample) .transcript = enquo(.transcript) @@ -3226,8 +3548,19 @@ get_adjusted_counts_for_unwanted_variation_bulk <- function(.data, .factor_of_interest = enquo(.factor_of_interest) .factor_unwanted = enquo(.factor_unwanted) + # Check if package is installed, otherwise install + if (find.package("sva", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing sva - Combat needed for ", + "adjustment for unwanted variation") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("sva", ask = FALSE) + } + + # New column name - value_adjusted = as.symbol(sprintf("%s%s", quo_name(.abundance), adjusted_string)) + value_adjusted = as.symbol(sprintf("%s%s", quo_name(.abundance), + adjusted_string)) df_for_combat <- .data %>% @@ -3243,9 +3576,12 @@ get_adjusted_counts_for_unwanted_variation_bulk <- function(.data, # Create design matrix design = model.matrix( - object = as.formula(sprintf("~ %s", .data |> select(!!.factor_of_interest) |> colnames() |> str_c(collapse = '+'))), + object = as.formula(sprintf("~ %s", .data |> + select(!!.factor_of_interest) |> + colnames() |> str_c(collapse = '+'))), # get first argument of the .formula - data = df_for_combat %>% select(!!.sample, !!.factor_of_interest) %>% distinct %>% arrange(!!.sample) + data = df_for_combat %>% select(!!.sample, !!.factor_of_interest) %>% + distinct %>% arrange(!!.sample) ) my_batch = @@ -3262,7 +3598,8 @@ get_adjusted_counts_for_unwanted_variation_bulk <- function(.data, # Stop any column is not if not numeric or integer ifelse_pipe( - (.) %>% select(!!.abundance) %>% summarise_all(class) %>% `%in%`(c("numeric", "integer")) %>% not() %>% any(), + (.) %>% select(!!.abundance) %>% summarise_all(class) %>% + `%in%`(c("numeric", "integer")) %>% not() %>% any(), ~ stop(".abundance must be numerical or integer") ) %>% @@ -3330,9 +3667,12 @@ get_adjusted_counts_for_unwanted_variation_bulk <- function(.data, unwanted_covariate_matrix = model.matrix( - object = as.formula(sprintf("~ 0 + %s", .data |> select(!!.factor_unwanted) |> colnames() |> str_c(collapse = '+'))), + object = as.formula(sprintf("~ 0 + %s", .data |> + select(!!.factor_unwanted) |> colnames() |> + str_c(collapse = '+'))), # get first argument of the .formula - data = df_for_combat %>% select(!!.sample, !!.factor_unwanted) %>% distinct %>% arrange(!!.sample) + data = df_for_combat %>% select(!!.sample, !!.factor_unwanted) %>% + distinct %>% arrange(!!.sample) ) adjusted_df = @@ -3355,7 +3695,8 @@ get_adjusted_counts_for_unwanted_variation_bulk <- function(.data, dplyr::mutate(!!.abundance := !!.abundance %>% as.integer) } else { - stop("tidybulk says: the argument \"method\" must be combat_seq, combat, or limma_remove_batch_effect") + stop("tidybulk says: the argument \"method\" must be combat_seq, combat, ", + "or limma_remove_batch_effect") } @@ -3379,7 +3720,8 @@ get_adjusted_counts_for_unwanted_variation_bulk <- function(.data, #' @param .transcript A character name of the transcript/gene column #' @param .abundance A character name of the read count column #' @param top An integer. How many top genes to select -#' @param log_transform A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data) +#' @param log_transform A boolean, whether the value should be log-transformed +#' (e.g., TRUE for RNA sequencing data) #' #' @return A tibble filtered genes #' @@ -3434,8 +3776,6 @@ keep_variable_transcripts = function(.data, #' @keywords internal #' @noRd #' -#' @import SummarizedExperiment -#' @importFrom S4Vectors DataFrame #' @importFrom utils data #' @importFrom tidyr pivot_longer #' @@ -3459,7 +3799,20 @@ tidybulk_to_SummarizedExperiment = function(.data, .sample = col_names$.sample .transcript = col_names$.transcript .abundance = col_names$.abundance - + + # Check if package is installed, otherwise install + if (find.package("SummarizedExperiment", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing SummarizedExperiment") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("SummarizedExperiment", ask = FALSE) + } + if (find.package("S4Vectors", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing S4Vectors") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("S4Vectors", ask = FALSE) + } # If present get the scaled abundance .abundance_scaled = .data %>% @@ -3481,12 +3834,14 @@ tidybulk_to_SummarizedExperiment = function(.data, feature_cols = col_direction$vertical_cols counts_cols = col_direction$counts_cols - colData = .data %>% select(!!.sample, sample_cols) %>% distinct %>% arrange(!!.sample) %>% { + colData = .data %>% select(!!.sample, sample_cols) %>% distinct %>% + arrange(!!.sample) %>% { S4Vectors::DataFrame((.) %>% select(-!!.sample), row.names = (.) %>% pull(!!.sample)) } - rowData = .data %>% select(!!.transcript, feature_cols) %>% distinct %>% arrange(!!.transcript) %>% { + rowData = .data %>% select(!!.transcript, feature_cols) %>% distinct %>% + arrange(!!.transcript) %>% { S4Vectors::DataFrame((.) %>% select(-!!.transcript), row.names = (.) %>% pull(!!.transcript)) } @@ -3514,7 +3869,8 @@ tidybulk_to_SummarizedExperiment = function(.data, } -#' This function is needed for DE in case the matrix is not rectangular, but includes NA +#' This function is needed for DE in case the matrix is not rectangular, +#' but includes NA #' #' @keywords internal #' @noRd @@ -3525,11 +3881,13 @@ tidybulk_to_SummarizedExperiment = function(.data, #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix #' @importFrom stats as.formula +#' @importFrom utils install.packages #' @importFrom tidyr complete #' @importFrom rlang quo_is_symbol #' #' @param .data A tibble -#' @param .formula a formula with no response variable, of the kind ~ factor_of_interest + batch +#' @param .formula a formula with no response variable, of the +#' kind ~ factor_of_interest + batch #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column @@ -3562,7 +3920,8 @@ fill_NA_using_formula = function(.data, colnames # Sample-wise columns - sample_col = .data %>% get_specific_annotation_columns(!!.sample) %>% outersect(col_formula) + sample_col = .data %>% get_specific_annotation_columns(!!.sample) %>% + outersect(col_formula) need_log = .data %>% pull(!!.abundance) %>% max(na.rm=TRUE) > 50 @@ -3572,10 +3931,12 @@ fill_NA_using_formula = function(.data, # Add missing pairs nest(ct_data = -c(col_formula)) %>% - mutate(ct_data = map(ct_data, ~ .x %>% droplevels() %>% complete(!!as.symbol(quo_name(.sample)), !!.transcript) )) %>% + mutate(ct_data = map(ct_data, ~ .x %>% droplevels() %>% + complete(!!as.symbol(quo_name(.sample)), !!.transcript) )) %>% unnest(ct_data) - # For non scaled counts create a pseudo scale based on library size, then calculate imputed and scale back + # For non scaled counts create a pseudo scale based on library size, + # then calculate imputed and scale back abundance_is_int = .data %>% slice(1) %>% pull(!!.abundance) %>% is("integer") .data = .data %>% @@ -3590,7 +3951,9 @@ fill_NA_using_formula = function(.data, # Divide the dataset .data_OK = .data %>% - anti_join(.data_completed %>% filter(!!.abundance %>% is.na) %>% select( !!.transcript, col_formula) %>% distinct(), by = c(quo_name(.transcript), col_formula)) %>% + anti_join(.data_completed %>% filter(!!.abundance %>% is.na) %>% + select( !!.transcript, col_formula) %>% distinct(), + by = c(quo_name(.transcript), col_formula)) %>% # Add the imputed column mutate(!!as.symbol(imputed_column) := !!.abundance) %>% @@ -3601,7 +3964,9 @@ fill_NA_using_formula = function(.data, .data_FIXED = .data %>% - inner_join(.data_completed %>% filter(!!.abundance %>% is.na) %>% select( !!.transcript, col_formula) %>% distinct(), by = c(quo_name(.transcript), col_formula)) %>% + inner_join(.data_completed %>% filter(!!.abundance %>% is.na) %>% + select( !!.transcript, col_formula) %>% distinct(), + by = c(quo_name(.transcript), col_formula)) %>% # attach NAs bind_rows( @@ -3623,8 +3988,13 @@ fill_NA_using_formula = function(.data, library_size = colSums(.x, na.rm = TRUE) .x = .x / library_size } - else message(sprintf("tidybulk says: %s appears not to be scaled for sequencing depth (missing _scaled suffix; if you think this column is idependent of sequencing depth ignore this message), therefore the imputation can produce non meaningful results if sequencing depth for samples are highly variable. If you use force_scaling = TRUE library size will be used for eliminatig some sequencig depth effect before imputation", .y)) - + else message(sprintf(paste0("tidybulk says: %s appears not to be scaled for ", + "sequencing depth (missing _scaled suffix; if you think this column is ", + "idependent of sequencing depth ignore this message), therefore the ", + "imputation can produce non meaningful results if sequencing depth for ", + "samples are highly variable. If you use force_scaling = TRUE library ", + "size will be used for eliminatig some sequencig depth effect ", + "before imputation"), .y)) # Log need_log = max(.x, na.rm=TRUE) > 50 @@ -3650,8 +4020,8 @@ fill_NA_using_formula = function(.data, .data_FIXED = .data_FIXED %>% - when( need_log ~ mutate(., !!.abundance := log1p(!!.abundance)), ~ (.) ) %>% - when( need_log & quo_is_symbol(.abundance_scaled) ~ mutate(., !!.abundance_scaled := log1p(!!.abundance_scaled)), ~ (.) ) %>% + when( need_log ~ mutate(., !!.abundance := log1p(!!.abundance)), ~ (.)) %>% + when( need_log & quo_is_symbol(.abundance_scaled) ~ mutate(., !!.abundance_scaled := log1p(!!.abundance_scaled)), ~ (.)) %>% # Group by covariate @@ -3679,11 +4049,14 @@ fill_NA_using_formula = function(.data, ) %>% # Through warning if group of size 1 - ifelse_pipe((.) %>% nrow() %>% `<` (2), warning("tidybulk says: According to your design matrix, u have sample groups of size < 2, so you your dataset could still be sparse.")) + ifelse_pipe((.) %>% nrow() %>% `<` (2), + warning("tidybulk says: According to your design matrix,", + " u have sample groups of size < 2, ", + "so you your dataset could still be sparse.")) )) %>% unnest(cov_data) %>% - when( need_log ~ mutate(., !!.abundance := exp(!!.abundance)-1), ~ (.) ) %>% - when( need_log & quo_is_symbol(.abundance_scaled) ~ mutate(., !!.abundance_scaled := exp(!!.abundance_scaled)-1), ~ (.) ) + when( need_log ~ mutate(., !!.abundance := exp(!!.abundance)-1), ~ (.)) %>% + when( need_log & quo_is_symbol(.abundance_scaled) ~ mutate(., !!.abundance_scaled := exp(!!.abundance_scaled)-1), ~ (.)) .data_OK %>% @@ -3699,7 +4072,8 @@ fill_NA_using_formula = function(.data, } -#' This function is needed for DE in case the matrix is not rectangular, but includes NA +#' This function is needed for DE in case the matrix is not rectangular, +#' but includes NA #' #' @keywords internal #' @noRd @@ -3760,11 +4134,15 @@ fill_NA_using_value = function(.data, ) # Select just features/covariates that have missing - combo_to_impute = df_to_impute %>% anti_join(.data, by=c(quo_names(.element), quo_names(.feature))) %>% select(!!.feature, !!.element) %>% distinct() + combo_to_impute = df_to_impute %>% + anti_join(.data, by=c(quo_names(.element), + quo_names(.feature))) %>% + select(!!.feature, !!.element) %>% distinct() # Impute using median df_to_impute %>% - inner_join(combo_to_impute, by = c(quo_names(.element), quo_names(.feature))) %>% + inner_join(combo_to_impute, by = c(quo_names(.element), + quo_names(.feature))) %>% # Fill mutate(!!.value := if_else(!!.value %>% is.na, fill_with, !!.value)) %>% @@ -3776,16 +4154,17 @@ fill_NA_using_value = function(.data, # In next command avoid error if no data to impute ifelse_pipe( nrow(.) > 0, - ~ .x %>% left_join(.data %>% pivot_sample(!!.element), by=quo_names(.element)) + ~ .x %>% left_join(.data %>% pivot_sample(!!.element), + by=quo_names(.element)) ) %>% # Add original dataset - bind_rows(.data %>% anti_join(combo_to_impute, by=c(quo_names(.feature), quo_names(.element)))) %>% + bind_rows(.data %>% anti_join(combo_to_impute, by=c(quo_names(.feature), + quo_names(.element)))) %>% select(.data %>% colnames) %>% # Reattach internals reattach_internals(.data) - } @@ -3866,13 +4245,25 @@ fill_NA_using_value = function(.data, #' @noRd #' #' @importFrom stats p.adjust -#' @importFrom msigdbr msigdbr -#' @importFrom clusterProfiler enricher -entrez_over_to_gsea = function(my_entrez_rank, species, gene_collections = NULL){ +entrez_over_to_gsea <- function(my_entrez_rank, species, gene_collections= NULL){ # From the page # https://yulab-smu.github.io/clusterProfiler-book/chapter5.html + # Check if package is installed, otherwise install + if (find.package("fastmatch", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing fastmatch needed for analyses") + install.packages("fastmatch", repos = "https://cloud.r-project.org") + } + + if (find.package("clusterProfiler", quiet = TRUE) %>% length %>% equals(0)) { + message("clusterProfiler not installed. Installing.") + BiocManager::install("clusterProfiler", ask = FALSE) + } + + + + # Get gene sets signatures msigdbr::msigdbr(species = species) %>% @@ -3903,6 +4294,7 @@ entrez_over_to_gsea = function(my_entrez_rank, species, gene_collections = NULL # format transcripts mutate(entrez = strsplit(geneID, "/")) %>% select(-geneID) + } @@ -3915,21 +4307,45 @@ entrez_over_to_gsea = function(my_entrez_rank, species, gene_collections = NULL #' @importFrom tibble rowid_to_column #' @importFrom stats p.adjust #' @importFrom purrr map -#' @importFrom clusterProfiler GSEA -#' @importFrom msigdbr msigdbr #' -entrez_rank_to_gsea = function(my_entrez_rank, species, gene_collections = NULL){ +entrez_rank_to_gsea <- function(my_entrez_rank, species, gene_collections= NULL){ + + # From the page + # https://yulab-smu.github.io/clusterProfiler-book/chapter5.html + + # Check if package is installed, otherwise install + if (find.package("fastmatch", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing fastmatch needed for analyses") + install.packages("fastmatch", repos = "https://cloud.r-project.org") + } + + if (find.package("clusterProfiler", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: clusterProfiler not installed. Installing.") + BiocManager::install("clusterProfiler", ask = FALSE) + } + + if (find.package("enrichplot", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: enrichplot not installed. tidybulk says: Installing.") + BiocManager::install("enrichplot", ask = FALSE) + } + + if (find.package("ggplot2", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing ggplot2 needed for analyses") + install.packages("ggplot2", repos = "https://cloud.r-project.org") + } # Get gene sets signatures if(is.null(gene_collections ) ) my_gene_collection = msigdbr::msigdbr(species = species) else if(gene_collections |> is("character")) - my_gene_collection = msigdbr::msigdbr(species = species) %>% filter( tolower(gs_cat) %in% tolower(gene_collections) ) + my_gene_collection = msigdbr::msigdbr(species = species) %>% + filter( tolower(gs_cat) %in% tolower(gene_collections) ) else if(gene_collections |> is("list")) - my_gene_collection = tibble(gs_name=names(.), entrez_gene = . ) %>% unnest(entrez_gene) %>% mutate(gs_cat = "user_defined") + my_gene_collection = tibble(gs_name=names(.), entrez_gene = . ) %>% + unnest(entrez_gene) %>% mutate(gs_cat = "user_defined") else - stop("tidybulk says: the gene sets should be either a character vector or a named list") - + stop("tidybulk says: the gene sets should be either a character ", + "vector or a named list") my_gene_collection |> diff --git a/R/functions_SE.R b/R/functions_SE.R index 31b9a110..b9228802 100755 --- a/R/functions_SE.R +++ b/R/functions_SE.R @@ -3,16 +3,22 @@ #' @keywords internal #' @noRd #' +#' +#' #' @import tibble #' @importFrom stats kmeans #' @importFrom rlang := #' #' @param .data A tibble -#' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) -#' @param .feature A column symbol. The column that is represents entities to cluster (i.e., normally samples) -#' @param .element A column symbol. The column that is used to calculate distance (i.e., normally genes) +#' @param .abundance A column symbol with the value the clustering is based on +#' (e.g., `count`) +#' @param .feature A column symbol. The column that is represents entities to +#' cluster (i.e., normally samples) +#' @param .element A column symbol. The column that is used to calculate +#' distance (i.e., normally genes) #' @param of_samples A boolean -#' @param transform A function that will tranform the counts, by default it is log1p for RNA sequencing data, but for avoinding tranformation you can use identity +#' @param transform A function that will tranform the counts, by default it is +#' log1p for RNA sequencing data, but for avoinding tranformation you can use identity #' @param ... Further parameters passed to the function kmeans #' #' @return A tibble with additional columns @@ -53,21 +59,22 @@ get_clusters_kmeans_bulk_SE <- #' @keywords internal #' @noRd #' +#' +#' #' @import tibble #' @importFrom rlang := -#' @importFrom Seurat CreateSeuratObject -#' @importFrom Seurat ScaleData -#' @importFrom Seurat FindVariableFeatures -#' @importFrom Seurat RunPCA -#' @importFrom Seurat FindNeighbors -#' @importFrom Seurat FindClusters +#' @importFrom utils install.packages #' #' @param .data A tibble -#' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) -#' @param .feature A column symbol. The column that is represents entities to cluster (i.e., normally samples) -#' @param .element A column symbol. The column that is used to calculate distance (i.e., normally genes) +#' @param .abundance A column symbol with the value the clustering is based on +#' (e.g., `count`) +#' @param .feature A column symbol. The column that is represents entities to +#' cluster (i.e., normally samples) +#' @param .element A column symbol. The column that is used to calculate +#' distance (i.e., normally genes) #' @param of_samples A boolean -#' @param transform A function that will tranform the counts, by default it is log1p for RNA sequencing data, but for avoinding tranformation you can use identity +#' @param transform A function that will tranform the counts, by default it is +#' log1p for RNA sequencing data, but for avoinding tranformation you can use identity #' @param ... Further parameters passed to the function kmeans #' #' @return A tibble with additional columns @@ -78,6 +85,21 @@ get_clusters_SNN_bulk_SE <- transform = log1p, ...) { + + # Check if package is installed, otherwise install + if (find.package("cluster", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing cluster") + install.packages("cluster", repos = "https://cloud.r-project.org") + } + if (find.package("Seurat", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing Seurat") + install.packages("Seurat", repos = "https://cloud.r-project.org") + } + if (find.package("KernSmooth", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing KernSmooth") + install.packages("KernSmooth", repos = "https://cloud.r-project.org") + } + ndims = min(c(nrow(.data), ncol(.data), 30))-1 .data %>% @@ -107,13 +129,18 @@ get_clusters_SNN_bulk_SE <- #' @importFrom stats setNames #' #' @param .data A tibble -#' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) -#' @param .dims A integer vector corresponding to principal components of interest (e.g., 1:6) -#' @param .feature A column symbol. The column that is represents entities to cluster (i.e., normally genes) -#' @param .element A column symbol. The column that is used to calculate distance (i.e., normally samples) +#' @param .abundance A column symbol with the value the clustering is based +#' on (e.g., `count`) +#' @param .dims A integer vector corresponding to principal components of +#' interest (e.g., 1:6) +#' @param .feature A column symbol. The column that is represents entities to +#' cluster (i.e., normally genes) +#' @param .element A column symbol. The column that is used to calculate +#' distance (i.e., normally samples) #' @param top An integer. How many top genes to select #' @param of_samples A boolean -#' @param transform A function that will tranform the counts, by default it is log1p for RNA sequencing data, but for avoinding tranformation you can use identity +#' @param transform A function that will tranform the counts, by default it +#' is log1p for RNA sequencing data, but for avoinding tranformation you can use identity #' @param scale A boolean #' #' @return A tibble with additional columns @@ -202,13 +229,19 @@ get_reduced_dimensions_MDS_bulk_SE <- #' @importFrom magrittr divide_by #' #' @param .data A tibble -#' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) -#' @param .dims A integer vector corresponding to principal components of interest (e.g., 1:6) -#' @param .feature A column symbol. The column that is represents entities to cluster (i.e., normally genes) -#' @param .element A column symbol. The column that is used to calculate distance (i.e., normally samples) +#' @param .abundance A column symbol with the value the clustering is +#' based on (e.g., `count`) +#' @param .dims A integer vector corresponding to principal components of +#' interest (e.g., 1:6) +#' @param .feature A column symbol. The column that is represents entities +#' to cluster (i.e., normally genes) +#' @param .element A column symbol. The column that is used to calculate +#' distance (i.e., normally samples) #' @param top An integer. How many top genes to select #' @param of_samples A boolean -#' @param transform A function that will tranform the counts, by default it is log1p for RNA sequencing data, but for avoinding tranformation you can use identity +#' @param transform A function that will tranform the counts, by default it +#' is log1p for RNA sequencing data, but for avoinding tranformation you can +#' use identity #' @param scale A boolean #' @param ... Further parameters passed to the function prcomp #' @@ -300,16 +333,21 @@ we suggest to partition the dataset for sample clusters. #' @import tibble #' @importFrom rlang := #' @importFrom stats setNames -#' @importFrom Rtsne Rtsne +#' @importFrom utils install.packages #' #' @param .data A tibble -#' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) -#' @param .dims A integer vector corresponding to principal components of interest (e.g., 1:6) -#' @param .feature A column symbol. The column that is represents entities to cluster (i.e., normally genes) -#' @param .element A column symbol. The column that is used to calculate distance (i.e., normally samples) +#' @param .abundance A column symbol with the value the clustering is +#' based on (e.g., `count`) +#' @param .dims A integer vector corresponding to principal components of +#' interest (e.g., 1:6) +#' @param .feature A column symbol. The column that is represents entities to +#' cluster (i.e., normally genes) +#' @param .element A column symbol. The column that is used to calculate +#' distance (i.e., normally samples) #' @param top An integer. How many top genes to select #' @param of_samples A boolean -#' @param transform A function that will tranform the counts, by default it is log1p for RNA sequencing data, but for avoinding tranformation you can use identity +#' @param transform A function that will tranform the counts, by default it is +#' log1p for RNA sequencing data, but for avoinding tranformation you can use identity #' @param scale A boolean #' @param ... Further parameters passed to the function Rtsne #' @@ -338,11 +376,18 @@ get_reduced_dimensions_TSNE_bulk_SE <- if (!"dims" %in% names(arguments)) arguments = arguments %>% c(dims = .dims) + + # Check if package is installed, otherwise install + if (find.package("Rtsne", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing Rtsne") + install.packages("Rtsne", repos = "https://cloud.r-project.org") + } + # Set perprexity to not be too high if (!"perplexity" %in% names(arguments)) { - perplexity_value <- (ncol(.data) - 1 / 3 / 2) - perplexity_value <- pmin(floor(perplexity_value), 30) - arguments$perplexity <- perplexity_value + arguments <- arguments %>% c(perplexity = (( + .data %>% distinct(!!.element) %>% nrow() %>% sum(-1) + ) / 3 / 2) %>% floor(.) %>% min(30)) } # If not enough samples stop @@ -352,6 +397,8 @@ get_reduced_dimensions_TSNE_bulk_SE <- # Calculate the most variable genes, from plotMDS Limma tsne_obj = do.call(Rtsne::Rtsne, c(list(t(.data)), arguments)) + + list( raw_result = tsne_obj, result = tsne_obj %$% @@ -373,20 +420,26 @@ get_reduced_dimensions_TSNE_bulk_SE <- #' #' #' @import tibble -#' @importFrom dplyr mutate #' @importFrom rlang := #' @importFrom stats setNames -#' @importFrom uwot tumap +#' @importFrom utils install.packages #' #' @param .data A tibble -#' @param .abundance A column symbol with the value the clustering is based on (e.g., `count`) -#' @param .dims A integer vector corresponding to principal components of interest (e.g., 1:6) -#' @param .feature A column symbol. The column that is represents entities to cluster (i.e., normally genes) -#' @param .element A column symbol. The column that is used to calculate distance (i.e., normally samples) +#' @param .abundance A column symbol with the value the clustering is +#' based on (e.g., `count`) +#' @param .dims A integer vector corresponding to principal components of +#' interest (e.g., 1:6) +#' @param .feature A column symbol. The column that is represents entities to +#' cluster (i.e., normally genes) +#' @param .element A column symbol. The column that is used to calculate +#' distance (i.e., normally samples) #' @param top An integer. How many top genes to select #' @param of_samples A boolean -#' @param transform A function that will tranform the counts, by default it is log1p for RNA sequencing data, but for avoinding tranformation you can use identity -#' @param calculate_for_pca_dimensions An integer of length one. The number of PCA dimensions to based the UMAP calculatio on. If NULL all variable features are considered +#' @param transform A function that will tranform the counts, by default it is +#' log1p for RNA sequencing data, but for avoinding tranformation you can use identity +#' @param calculate_for_pca_dimensions An integer of length one. The number of +#' PCA dimensions to based the UMAP calculatio on. If NULL all variable +#' features are considered #' @param ... Further parameters passed to the function uwot #' #' @return A tibble with additional columns @@ -414,6 +467,14 @@ get_reduced_dimensions_UMAP_bulk_SE <- if (!"init" %in% names(arguments)) arguments = arguments %>% c(init = "spca") + + # Check if package is installed, otherwise install + if (find.package("uwot", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing uwot") + install.packages("uwot", repos = "https://cloud.r-project.org") + } + + # Calculate based on PCA if(!is.null(calculate_for_pca_dimensions)) df_UMAP = @@ -483,7 +544,10 @@ filter_if_abundant_were_identified = function(.data){ when( ".abundant" %in% (rowData(.data) %>% colnames()) ~ .data[rowData(.data)[,".abundant"],], ~ { - warning("tidybulk says: highly abundant transcripts were not identified (i.e. identify_abundant()) or filtered (i.e., keep_abundant), therefore this operation will be performed on unfiltered data. In rare occasions this could be wanted. In standard whole-transcriptome workflows is generally unwanted.") + warning("tidybulk says: highly abundant transcripts were not identified ", + "(i.e. identify_abundant()) or filtered (i.e., keep_abundant), therefore ", + "this operation will be performed on unfiltered data. In rare occasions ", + "this could be wanted. In standard whole-transcriptome workflows is generally unwanted.") (.) } ) @@ -499,7 +563,8 @@ filter_if_abundant_were_identified = function(.data){ #' @param .transcript A character name of the transcript/gene column #' @param .abundance A character name of the read count column #' @param top An integer. How many top genes to select -#' @param transform A function that will tranform the counts, by default it is log1p for RNA sequencing data, but for avoinding tranformation you can use identity +#' @param transform A function that will tranform the counts, by default it is +#' log1p for RNA sequencing data, but for avoinding tranformation you can use identity #' #' @return A tibble filtered genes #' @@ -530,14 +595,16 @@ keep_variable_transcripts_SE = function(.data, } -#' Drop redundant elements (e.g., samples) for which feature (e.g., genes) aboundances are correlated +#' Drop redundant elements (e.g., samples) for which feature (e.g., genes) +#' aboundances are correlated #' #' @keywords internal #' @noRd #' +#' +#' #' @import tibble #' @importFrom rlang := -#' @importFrom widyr pairwise_cor #' #' @param .data A tibble #' @param correlation_threshold A real number between 0 and 1 @@ -548,11 +615,17 @@ keep_variable_transcripts_SE = function(.data, #' #' remove_redundancy_elements_through_correlation_SE <- function(.data, - correlation_threshold = 0.9, - of_samples = TRUE) { + correlation_threshold = 0.9, + of_samples = TRUE) { # Comply with CRAN NOTES . = NULL + # Check if package is installed, otherwise install + if (find.package("widyr", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing widyr needed for correlation analyses") + install.packages("widyr", repos = "https://cloud.r-project.org") + } + # Get the redundant data frame .data %>% @@ -661,35 +734,44 @@ remove_redundancy_elements_though_reduced_dimensions_SE <- #' #' #' @import tibble -#' @import edgeR #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix +#' @importFrom utils install.packages #' @importFrom purrr when #' @importFrom magrittr extract2 -#' @importFrom limma makeContrasts #' #' #' @param .data A tibble -#' @param .formula a formula with no response variable, referring only to numeric variables -#' @param .contrasts A character vector. See edgeR makeContrasts specification for the parameter `contrasts`. If contrasts are not present the first covariate is the one the model is tested against (e.g., ~ factor_of_interest) -#' @param method A string character. Either "edgeR_quasi_likelihood" (i.e., QLF), "edgeR_likelihood_ratio" (i.e., LRT) -#' @param test_above_log2_fold_change A positive real value. This works for edgeR and limma_voom methods. It uses the `treat` function, which tests that the difference in abundance is bigger than this threshold rather than zero \url{https://pubmed.ncbi.nlm.nih.gov/19176553}. -#' @param scaling_method A character string. The scaling method passed to the backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") -#' @param omit_contrast_in_colnames If just one contrast is specified you can choose to omit the contrast label in the colnames. +#' @param .formula a formula with no response variable, referring only to +#' numeric variables +#' @param .contrasts A character vector. See edgeR makeContrasts specification +#' for the parameter `contrasts`. If contrasts are not present the first +#' covariate is the one the model is tested against (e.g., ~ factor_of_interest) +#' @param method A string character. Either "edgeR_quasi_likelihood" (i.e., +#' QLF), "edgeR_likelihood_ratio" (i.e., LRT) +#' @param test_above_log2_fold_change A positive real value. This works for +#' edgeR and limma_voom methods. It uses the `treat` function, which tests that +#' the difference in abundance is bigger than this threshold rather than zero +#' \url{https://pubmed.ncbi.nlm.nih.gov/19176553}. +#' @param scaling_method A character string. The scaling method passed to the +#' backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE", +#' "upperquartile") +#' @param omit_contrast_in_colnames If just one contrast is specified you can +#' choose to omit the contrast label in the colnames. #' #' @return A tibble with edgeR results #' get_differential_transcript_abundance_bulk_SE <- function(.data, - .formula, - .abundance = NULL, - sample_annotation, - .contrasts = NULL, - method = "edgeR_quasi_likelihood", - test_above_log2_fold_change = NULL, - scaling_method = "TMM", - omit_contrast_in_colnames = FALSE, - prefix = "", - ...) { + .formula, + .abundance = NULL, + sample_annotation, + .contrasts = NULL, + method = "edgeR_quasi_likelihood", + test_above_log2_fold_change = NULL, + scaling_method = "TMM", + omit_contrast_in_colnames = FALSE, + prefix = "", + ...) { .abundance = enquo(.abundance) @@ -708,7 +790,8 @@ get_differential_transcript_abundance_bulk_SE <- function(.data, # Replace `:` with ___ because it creates error with edgeR if(design |> colnames() |> str_detect(":") |> any()) { - message("tidybulk says: the interaction term `:` has been replaced with `___` in the design matrix, in order to work with edgeR.") + message("tidybulk says: the interaction term `:` has been replaced ", + "with `___` in the design matrix, in order to work with edgeR.") colnames(design) = design |> colnames() |> str_replace(":", "___") } @@ -726,6 +809,13 @@ get_differential_transcript_abundance_bulk_SE <- function(.data, ~ limma::makeContrasts(contrasts = .x, levels = design), ~ NULL) + # Check if package is installed, otherwise install + if (find.package("edgeR", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing edgeR needed for differential transcript abundance analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("edgeR", ask = FALSE) + } # If no assay is specified take first my_assay = ifelse( @@ -749,9 +839,12 @@ get_differential_transcript_abundance_bulk_SE <- function(.data, # select method when( - tolower(method) == "edger_likelihood_ratio" ~ (.) %>% edgeR::estimateDisp(design) %>% edgeR::glmFit(design), - tolower(method) == "edger_quasi_likelihood" ~ (.) %>% edgeR::estimateDisp(design) %>% edgeR::glmQLFit(design), - tolower(method) == "edger_robust_likelihood_ratio" ~ (.) %>% edgeR::estimateGLMRobustDisp(design) %>% edgeR::glmFit(design) + tolower(method) == "edger_likelihood_ratio" ~ (.) %>% + edgeR::estimateDisp(design) %>% edgeR::glmFit(design), + tolower(method) == "edger_quasi_likelihood" ~ (.) %>% + edgeR::estimateDisp(design) %>% edgeR::glmQLFit(design), + tolower(method) == "edger_robust_likelihood_ratio" ~ (.) %>% + edgeR::estimateGLMRobustDisp(design) %>% edgeR::glmFit(design) ) # Return @@ -769,9 +862,14 @@ get_differential_transcript_abundance_bulk_SE <- function(.data, # select method when( - !is.null(test_above_log2_fold_change) ~ (.) %>% edgeR::glmTreat(coef = 2, contrast = my_contrasts, lfc=test_above_log2_fold_change), - tolower(method) %in% c("edger_likelihood_ratio", "edger_robust_likelihood_ratio") ~ (.) %>% edgeR::glmLRT(coef = 2, contrast = my_contrasts) , - tolower(method) == "edger_quasi_likelihood" ~ (.) %>% edgeR::glmQLFTest(coef = 2, contrast = my_contrasts) + !is.null(test_above_log2_fold_change) ~ (.) %>% + edgeR::glmTreat(coef = 2, contrast = my_contrasts, + lfc=test_above_log2_fold_change), + tolower(method) %in% c("edger_likelihood_ratio", + "edger_robust_likelihood_ratio") ~ (.) %>% + edgeR::glmLRT(coef = 2, contrast = my_contrasts) , + tolower(method) == "edger_quasi_likelihood" ~ (.) %>% + edgeR::glmQLFTest(coef = 2, contrast = my_contrasts) ) %>% # Convert to tibble @@ -795,9 +893,14 @@ get_differential_transcript_abundance_bulk_SE <- function(.data, # select method when( - !is.null(test_above_log2_fold_change) ~ (.) %>% edgeR::glmTreat(coef = 2, contrast = my_contrasts[, .x], lfc=test_above_log2_fold_change), - tolower(method) %in% c("edger_likelihood_ratio", "edger_robust_likelihood_ratio") ~ (.) %>% edgeR::glmLRT(coef = 2, contrast = my_contrasts[, .x]) , - tolower(method) == "edger_quasi_likelihood" ~ (.) %>% edgeR::glmQLFTest(coef = 2, contrast = my_contrasts[, .x]) + !is.null(test_above_log2_fold_change) ~ (.) %>% + edgeR::glmTreat(coef = 2, contrast = my_contrasts[, .x], + lfc=test_above_log2_fold_change), + tolower(method) %in% c("edger_likelihood_ratio", + "edger_robust_likelihood_ratio") ~ (.) %>% + edgeR::glmLRT(coef = 2, contrast = my_contrasts[, .x]) , + tolower(method) == "edger_quasi_likelihood" ~ (.) %>% + edgeR::glmQLFTest(coef = 2, contrast = my_contrasts[, .x]) ) %>% # Convert to tibble @@ -821,10 +924,6 @@ get_differential_transcript_abundance_bulk_SE <- function(.data, sprintf("%s%s", prefix, colnames(.)[2:ncol(.)]) )) ) - - - - } @@ -834,31 +933,36 @@ get_differential_transcript_abundance_bulk_SE <- function(.data, #' @noRd #' #' @import tibble -#' @import limma #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix +#' @importFrom utils install.packages #' @importFrom purrr when -#' @importFrom edgeR DGEList +#' #' #' @param .data A tibble -#' @param .formula a formula with no response variable, referring only to numeric variables -#' @param .contrasts A character vector. See voom makeContrasts specification for the parameter `contrasts`. If contrasts are not present the first covariate is the one the model is tested against (e.g., ~ factor_of_interest) +#' @param .formula a formula with no response variable, +#' referring only to numeric variables +#' @param .contrasts A character vector. See voom makeContrasts specification +#' for the parameter `contrasts`. If contrasts are not present the first +#' covariate is the one the model is tested against (e.g., ~ factor_of_interest) #' @param method A string character. Either "limma_voom", "limma_voom_sample_weights" -#' @param scaling_method A character string. The scaling method passed to the backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") -#' @param omit_contrast_in_colnames If just one contrast is specified you can choose to omit the contrast label in the colnames. +#' @param scaling_method A character string. The scaling method passed to the +#' backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") +#' @param omit_contrast_in_colnames If just one contrast is specified you can +#' choose to omit the contrast label in the colnames. #' #' @return A tibble with voom results #' get_differential_transcript_abundance_bulk_voom_SE <- function(.data, - .formula, - .abundance = NULL, - sample_annotation, - .contrasts = NULL, - method = NULL, - test_above_log2_fold_change = NULL, - scaling_method = "TMM", - omit_contrast_in_colnames = FALSE, - prefix = "") { + .formula, + .abundance = NULL, + sample_annotation, + .contrasts = NULL, + method = NULL, + test_above_log2_fold_change = NULL, + scaling_method = "TMM", + omit_contrast_in_colnames = FALSE, + prefix = "") { .abundance = enquo(.abundance) @@ -890,6 +994,14 @@ get_differential_transcript_abundance_bulk_voom_SE <- function(.data, ~ limma::makeContrasts(contrasts = .x, levels = design), ~ NULL) + # Check if package is installed, otherwise install + if (find.package("limma", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing limma needed for differential transcript abundance analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("limma", ask = FALSE) + } + # If no assay is specified take first my_assay = ifelse( quo_is_symbol(.abundance), @@ -914,7 +1026,8 @@ get_differential_transcript_abundance_bulk_voom_SE <- function(.data, # select method when( tolower(method) == "limma_voom" ~ (.) %>% limma::voom(design, plot=FALSE), - tolower(method) == "limma_voom_sample_weights" ~ (.) %>% limma::voomWithQualityWeights(design, plot=FALSE) + tolower(method) == "limma_voom_sample_weights" ~ (.) %>% + limma::voomWithQualityWeights(design, plot=FALSE) ) %>% limma::lmFit(design) @@ -933,7 +1046,8 @@ get_differential_transcript_abundance_bulk_voom_SE <- function(.data, ~ .x %>% # Contrasts - limma::contrasts.fit(contrasts=my_contrasts, coefficients = when(my_contrasts, is.null(.) ~ 2)) %>% + limma::contrasts.fit(contrasts=my_contrasts, + coefficients = when(my_contrasts, is.null(.) ~ 2)) %>% limma::eBayes() %>% when( @@ -1004,37 +1118,45 @@ get_differential_transcript_abundance_bulk_voom_SE <- function(.data, #' @keywords internal #' @noRd #' +#' +#' #' @import tibble #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix +#' @importFrom utils install.packages #' @importFrom purrr when -#' @importFrom edgeR estimateDisp -#' @importFrom glmmSeq glmmSeq +#' #' #' @param .data A tibble -#' @param .formula a formula with no response variable, referring only to numeric variables -#' @param .contrasts A character vector. See edgeR makeContrasts specification for the parameter `contrasts`. If contrasts are not present the first covariate is the one the model is tested against (e.g., ~ factor_of_interest) -#' @param method A string character. Either "edgeR_quasi_likelihood" (i.e., QLF), "edgeR_likelihood_ratio" (i.e., LRT) -#' @param scaling_method A character string. The scaling method passed to the backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") -#' @param omit_contrast_in_colnames If just one contrast is specified you can choose to omit the contrast label in the colnames. +#' @param .formula a formula with no response variable, referring only to +#' numeric variables +#' @param .contrasts A character vector. See edgeR makeContrasts specification +#' for the parameter `contrasts`. If contrasts are not present the first +#' covariate is the one the model is tested against (e.g., ~ factor_of_interest) +#' @param method A string character. Either "edgeR_quasi_likelihood" (i.e., QLF), +#' "edgeR_likelihood_ratio" (i.e., LRT) +#' @param scaling_method A character string. The scaling method passed to the +#' backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") +#' @param omit_contrast_in_colnames If just one contrast is specified you can +#' choose to omit the contrast label in the colnames. #' @param ... Additional arguments for glmmSeq #' #' @return A tibble with glmmSeq results #' get_differential_transcript_abundance_glmmSeq_SE <- function(.data, - .formula, - .abundance = NULL, - .contrasts = NULL, - sample_annotation , - method, + .formula, + .abundance = NULL, + .contrasts = NULL, + sample_annotation , + method, - test_above_log2_fold_change = NULL, + test_above_log2_fold_change = NULL, - scaling_method = "TMM", - omit_contrast_in_colnames = FALSE, - prefix = "", - .dispersion = NULL, - ...) { + scaling_method = "TMM", + omit_contrast_in_colnames = FALSE, + prefix = "", + .dispersion = NULL, + ...) { .abundance = enquo(.abundance) .dispersion = enquo(.dispersion) @@ -1044,7 +1166,9 @@ get_differential_transcript_abundance_glmmSeq_SE <- function(.data, .contrasts %>% is.null %>% not() & .contrasts %>% class %>% equals("list") %>% not() ) - stop("tidybulk says: for DESeq2 the list of constrasts should be given in the form list(c(\"condition_column\",\"condition1\",\"condition2\")) i.e. list(c(\"genotype\",\"knockout\",\"wildtype\"))") + stop("tidybulk says: for DESeq2 the list of constrasts should be given in ", + "the form list(c(\"condition_column\",\"condition1\",\"condition2\")) ", + "i.e. list(c(\"genotype\",\"knockout\",\"wildtype\"))") # Check if omit_contrast_in_colnames is correctly setup if(omit_contrast_in_colnames & length(.contrasts) > 1){ @@ -1052,7 +1176,6 @@ get_differential_transcript_abundance_glmmSeq_SE <- function(.data, omit_contrast_in_colnames = FALSE } - # # Check if package is installed, otherwise install # if (find.package("edgeR", quiet = TRUE) %>% length %>% equals(0)) { # message("tidybulk says: Installing edgeR needed for differential transcript abundance analyses") @@ -1069,7 +1192,6 @@ get_differential_transcript_abundance_glmmSeq_SE <- function(.data, BiocManager::install("glmmSeq", ask = FALSE) } - # If no assay is specified take first my_assay = ifelse( quo_is_symbol(.abundance), @@ -1095,9 +1217,11 @@ get_differential_transcript_abundance_glmmSeq_SE <- function(.data, ) if(quo_is_symbolic(.dispersion)) - dispersion = rowData(.data)[,quo_name(.dispersion),drop=FALSE] |> as_tibble(rownames = feature__$name) |> deframe() + dispersion = rowData(.data)[,quo_name(.dispersion),drop=FALSE] |> + as_tibble(rownames = feature__$name) |> deframe() else - dispersion = counts |> edgeR::estimateDisp(design = design) %$% tagwise.dispersion |> setNames(rownames(counts)) + dispersion = counts |> edgeR::estimateDisp(design = design) %$% tagwise.dispersion |> + setNames(rownames(counts)) # # Check dispersion # if(!names(dispersion) |> sort() |> identical( @@ -1113,7 +1237,7 @@ get_differential_transcript_abundance_glmmSeq_SE <- function(.data, glmmSeq_object = - glmmSeq::glmmSeq( .formula, + glmmSeq( .formula, countdata = counts , metadata = metadata |> as.data.frame(), dispersion = dispersion, @@ -1126,7 +1250,8 @@ get_differential_transcript_abundance_glmmSeq_SE <- function(.data, glmmSeq_object |> summary_lmmSeq() |> as_tibble(rownames = "transcript") |> - mutate(across(starts_with("P_"), list(adjusted = function(x) p.adjust(x, method="BH")), .names = "{.col}_{.fn}")) |> + mutate(across(starts_with("P_"), list(adjusted = function(x) p.adjust(x, method="BH")), + .names = "{.col}_{.fn}")) |> # Attach attributes reattach_internals(.data) %>% @@ -1162,39 +1287,41 @@ get_differential_transcript_abundance_glmmSeq_SE <- function(.data, #' @keywords internal #' @noRd #' -#' -#' #' @import tibble -#' @importFrom DESeq2 DESeqDataSet -#' @importFrom DESeq2 DESeq -#' @importFrom DESeq2 results -#' @importFrom DESeq2 DESeqDataSetFromMatrix #' @importFrom magrittr set_colnames #' @importFrom stats model.matrix +#' @importFrom utils install.packages #' @importFrom purrr when #' +#' #' @param .data A tibble -#' @param .formula a formula with no response variable, referring only to numeric variables -#' @param .contrasts A character vector. See edgeR makeContrasts specification for the parameter `contrasts`. If contrasts are not present the first covariate is the one the model is tested against (e.g., ~ factor_of_interest) -#' @param method A string character. Either "edgeR_quasi_likelihood" (i.e., QLF), "edgeR_likelihood_ratio" (i.e., LRT) -#' @param scaling_method A character string. The scaling method passed to the backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") -#' @param omit_contrast_in_colnames If just one contrast is specified you can choose to omit the contrast label in the colnames. +#' @param .formula a formula with no response variable, referring only to +#' numeric variables +#' @param .contrasts A character vector. See edgeR makeContrasts specification +#' for the parameter `contrasts`. If contrasts are not present the first +#' covariate is the one the model is tested against (e.g., ~ factor_of_interest) +#' @param method A string character. Either "edgeR_quasi_likelihood" (i.e., QLF), +#' "edgeR_likelihood_ratio" (i.e., LRT) +#' @param scaling_method A character string. The scaling method passed to the +#' backend function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") +#' @param omit_contrast_in_colnames If just one contrast is specified you can +#' choose to omit the contrast label in the colnames. #' @param ... Additional arguments for DESeq2 #' #' @return A tibble with DESeq2 results #' get_differential_transcript_abundance_deseq2_SE <- function(.data, - .formula, - .abundance = NULL, - .contrasts = NULL, - method = "deseq2", + .formula, + .abundance = NULL, + .contrasts = NULL, + method = "deseq2", - test_above_log2_fold_change = NULL, + test_above_log2_fold_change = NULL, - scaling_method = "TMM", - omit_contrast_in_colnames = FALSE, - prefix = "", - ...) { + scaling_method = "TMM", + omit_contrast_in_colnames = FALSE, + prefix = "", + ...) { .abundance = enquo(.abundance) @@ -1203,7 +1330,9 @@ get_differential_transcript_abundance_deseq2_SE <- function(.data, .contrasts %>% is.null %>% not() & .contrasts %>% class %>% equals("list") %>% not() ) - stop("tidybulk says: for DESeq2 the list of constrasts should be given in the form list(c(\"condition_column\",\"condition1\",\"condition2\")) i.e. list(c(\"genotype\",\"knockout\",\"wildtype\"))") + stop("tidybulk says: for DESeq2 the list of constrasts should be given in ", + "the form list(c(\"condition_column\",\"condition1\",\"condition2\")) ", + "i.e. list(c(\"genotype\",\"knockout\",\"wildtype\"))") # Check if omit_contrast_in_colnames is correctly setup if(omit_contrast_in_colnames & length(.contrasts) > 1){ @@ -1211,6 +1340,14 @@ get_differential_transcript_abundance_deseq2_SE <- function(.data, omit_contrast_in_colnames = FALSE } + # Check if package is installed, otherwise install + if (find.package("DESeq2", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing DESeq2 needed for differential transcript abundance analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("DESeq2", ask = FALSE) + } + if (is.null(test_above_log2_fold_change)) { test_above_log2_fold_change <- 0 } @@ -1259,15 +1396,18 @@ get_differential_transcript_abundance_deseq2_SE <- function(.data, (.) %>% DESeq2::results(contrast = c( parse_formula(.formula)[1], - deseq2_object@colData[,parse_formula(.formula)[1]] %>% as.factor() %>% levels %>% .[2], - deseq2_object@colData[,parse_formula(.formula)[1]] %>% as.factor() %>% levels %>% .[1] + deseq2_object@colData[,parse_formula(.formula)[1]] %>% + as.factor() %>% levels %>% .[2], + deseq2_object@colData[,parse_formula(.formula)[1]] %>% + as.factor() %>% levels %>% .[1] ), lfcThreshold=test_above_log2_fold_change) %>% as_tibble(rownames = "transcript"), # Simple comparison discrete my_contrasts %>% is.null %>% not() & omit_contrast_in_colnames ~ (.) %>% - DESeq2::results(contrast = my_contrasts[[1]], lfcThreshold=test_above_log2_fold_change)%>% + DESeq2::results(contrast = my_contrasts[[1]], + lfcThreshold=test_above_log2_fold_change)%>% as_tibble(rownames = "transcript"), # Multiple comparisons NOT USED AT THE MOMENT @@ -1279,11 +1419,13 @@ get_differential_transcript_abundance_deseq2_SE <- function(.data, ~ deseq2_obj %>% # select method - DESeq2::results(contrast = my_contrasts[[.x]], lfcThreshold=test_above_log2_fold_change) %>% + DESeq2::results(contrast = my_contrasts[[.x]], + lfcThreshold=test_above_log2_fold_change) %>% # Convert to tibble as_tibble(rownames = "transcript") %>% - mutate(constrast = sprintf("%s %s-%s", my_contrasts[[.x]][1], my_contrasts[[.x]][2], my_contrasts[[.x]][3]) ) + mutate(constrast = sprintf("%s %s-%s", my_contrasts[[.x]][1], + my_contrasts[[.x]][2], my_contrasts[[.x]][3]) ) ) %>% pivot_wider(values_from = -c(transcript, constrast), @@ -1307,9 +1449,6 @@ get_differential_transcript_abundance_deseq2_SE <- function(.data, #' #' @importFrom stringr str_remove #' @importFrom stringr str_replace_all -#' @importFrom broom tidy -#' @importFrom survival coxph -#' @importFrom betareg betareg #' multivariable_differential_tissue_composition_SE = function( deconvoluted, @@ -1334,6 +1473,16 @@ multivariable_differential_tissue_composition_SE = function( # Beta or Cox when( grepl("Surv", .my_formula) %>% any ~ { + # Check if package is installed, otherwise install + if (find.package("survival", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing betareg needed for analyses") + install.packages("survival", repos = "https://cloud.r-project.org") + } + + if (find.package("boot", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing boot needed for analyses") + install.packages("boot", repos = "https://cloud.r-project.org") + } (.) %>% survival::coxph(.my_formula, .) %>% @@ -1394,6 +1543,16 @@ univariable_differential_tissue_composition_SE = function( .x %>% when( grepl("Surv", .my_formula) %>% any ~ { + # Check if package is installed, otherwise install + if (find.package("survival", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing betareg needed for analyses") + install.packages("survival", repos = "https://cloud.r-project.org") + } + + if (find.package("boot", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing boot needed for analyses") + install.packages("boot", repos = "https://cloud.r-project.org") + } (.) %>% mutate(.proportion_0_corrected = .proportion_0_corrected %>% boot::logit()) %>% @@ -1402,6 +1561,11 @@ univariable_differential_tissue_composition_SE = function( select(-term) } , ~ { + # Check if package is installed, otherwise install + if (find.package("betareg", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing betareg needed for analyses") + install.packages("betareg", repos = "https://cloud.r-project.org") + } (.) %>% betareg::betareg(.my_formula, .) %>% broom::tidy() %>% diff --git a/R/methods.R b/R/methods.R index ab0e6a60..f52e1146 100755 --- a/R/methods.R +++ b/R/methods.R @@ -1,33 +1,37 @@ setOldClass("tidybulk") -#' Creates an annotated `tidybulk` tibble from a `tbl` or `SummarizedExperiment` object +#' Creates an annotated `tidybulk` tibble from a `tbl` or +#' `SummarizedExperiment` object #' #' `r lifecycle::badge("maturing")` #' -#' @description tidybulk() creates an annotated `tidybulk` tibble from a `tbl` -#' (with at least three columns for sample, feature and transcript abundance) -#' or `SummarizedExperiment` (more convenient if abstracted to tibble with -#' library(tidySummarizedExperiment)) +#' @description tidybulk() creates an annotated `tidybulk` tibble from a +#' `tbl` (with at least three columns for sample, feature and transcript +#' abundance) or `SummarizedExperiment` (more convenient if abstracted to +#' tibble with library(tidySummarizedExperiment)) #' #' @importFrom rlang enquo #' @importFrom rlang quo_is_missing -#' #' @import readr #' @import SummarizedExperiment #' @import methods #' #' @name tidybulk #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, feature +#' and transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param .abundance_scaled The name of the transcript/gene scaled abundance column +#' @param .abundance_scaled The name of the transcript/gene scaled +#' abundance column #' #' @details This function creates a tidybulk object and is useful if you want #' to avoid to specify .sample, .transcript and .abundance arguments all the times. #' The tidybulk object have an attribute called internals where these three -#' arguments are stored as metadata. They can be extracted as attr(, "internals"). +#' arguments are stored as metadata. They can be extracted as +#' attr(, "internals"). #' #' @return A `tidybulk` object #' @@ -65,7 +69,8 @@ setGeneric("tidybulk", function(.data, quo_is_missing(.sample) | quo_is_missing(.transcript) | quo_is_missing(.abundance) - ) stop("tidybulk says: the arguments .sample, .transcript and .abundance must include column names (not surrounded by quotes)") + ) stop("tidybulk says: the arguments .sample, .transcript and .abundance ", + "must include column names (not surrounded by quotes)") # Validate data frame if(do_validate()) validation(.data, @@ -111,10 +116,11 @@ setMethod("tidybulk", "tbl_df", .tidybulk) #' as_SummarizedExperiment #' -#' @description as_SummarizedExperiment() creates a `SummarizedExperiment` object from a `tbl` or `tidybulk` tbl formatted as | | | | <...> | +#' @description as_SummarizedExperiment() creates a `SummarizedExperiment` +#' object from a `tbl` or `tidybulk` tbl formatted as | | +#' | | <...> | +#' #' -#' @import SummarizedExperiment -#' @importFrom S4Vectors DataFrame #' @importFrom utils data #' @importFrom tidyr pivot_longer #' @@ -137,9 +143,9 @@ setGeneric("as_SummarizedExperiment", function(.data, .as_SummarizedExperiment = function(.data, - .sample = NULL, - .transcript = NULL, - .abundance = NULL) { + .sample = NULL, + .transcript = NULL, + .abundance = NULL) { # Fix NOTEs . = NULL @@ -148,11 +154,26 @@ setGeneric("as_SummarizedExperiment", function(.data, .sample = enquo(.sample) .transcript = enquo(.transcript) .abundance = enquo(.abundance) - col_names = get_sample_transcript_counts(.data, .sample, .transcript, .abundance) + col_names = get_sample_transcript_counts(.data, .sample, + .transcript, .abundance) .sample = col_names$.sample .transcript = col_names$.transcript .abundance = col_names$.abundance + # Check if package is installed, otherwise install + if (find.package("SummarizedExperiment", quiet = TRUE) |> length() |> equals(0)) { + message("Installing SummarizedExperiment") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("SummarizedExperiment", ask = FALSE) + } + if (find.package("S4Vectors", quiet = TRUE) |> length() %>% equals(0)) { + message("Installing S4Vectors") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("S4Vectors", ask = FALSE) + } + # If present get the scaled abundance .abundance_scaled = .data %>% @@ -220,7 +241,8 @@ setGeneric("as_SummarizedExperiment", function(.data, counts_cols) %>% distinct() %>% - pivot_longer( cols=-c(!!feature__$symbol,!!sample__$symbol), names_to="assay", values_to= ".a") %>% + pivot_longer( cols=-c(!!feature__$symbol,!!sample__$symbol), + names_to="assay", values_to= ".a") %>% nest(`data` = -`assay`) %>% mutate(`data` = `data` %>% map( ~ .x %>% @@ -289,21 +311,27 @@ setMethod("as_SummarizedExperiment", "tidybulk", .as_SummarizedExperiment) #' #' `r lifecycle::badge("maturing")` #' -#' @description tidybulk_SAM_BAM() creates a `tt` object from A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @description tidybulk_SAM_BAM() creates a `tt` object from A `tbl` +#' (with at least three columns for sample, feature and transcript abundance) +#' or `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) #' #' @importFrom rlang enquo #' -#' #' @name tidybulk_SAM_BAM #' #' @param file_names A character vector -#' @param genome A character string specifying an in-built annotation used for read summarization. It has four possible values including "mm10", "mm9", "hg38" and "hg19" +#' @param genome A character string specifying an in-built annotation used for +#' read summarization. It has four possible values including "mm10", "mm9", +#' "hg38" and "hg19" #' @param ... Further parameters passed to the function Rsubread::featureCounts #' -#' @details This function is based on FeatureCounts package (DOI: 10.1093/bioinformatics/btt656). This function creates a tidybulk object and is useful if you want -#' to avoid to specify .sample, .transcript and .abundance arguments all the times. -#' The tidybulk object have an attribute called internals where these three -#' arguments are stored as metadata. They can be extracted as attr(, "internals"). +#' @details This function is based on FeatureCounts package +#' (DOI: 10.1093/bioinformatics/btt656). This function creates a tidybulk +#' object and is useful if you want to avoid to specify .sample, +#' .transcript and .abundance arguments all the times. The tidybulk object +#' have an attribute called internals where these three arguments are stored +#' as metadata. They can be extracted as attr(, "internals"). #' #' Underlying core function #' Rsubread::featureCounts(annot.inbuilt = genome,nthreads = n_cores, ...) @@ -332,55 +360,63 @@ setGeneric("tidybulk_SAM_BAM", function(file_names, genome = "hg38", ...) #' #' @return A `tidybulk` object #' -setMethod("tidybulk_SAM_BAM", c(file_names = "character", genome = "character"), function(file_names, genome = "hg38", ...) +setMethod("tidybulk_SAM_BAM", c(file_names = "character", genome = "character"), + function(file_names, genome = "hg38", ...) create_tt_from_bam_sam_bulk(file_names = file_names, genome = genome, ...)) #' Scale the counts of transcripts/genes #' #' `r lifecycle::badge("maturing")` #' -#' @description scale_abundance() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and Scales transcript abundance compansating for sequencing depth (e.g., with TMM algorithm, Robinson and Oshlack doi.org/10.1186/gb-2010-11-3-r25). +#' @description scale_abundance() takes as input A `tbl` (with at least three +#' columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and Scales transcript abundance +#' compansating for sequencing depth (e.g., with TMM algorithm, +#' Robinson and Oshlack doi.org/10.1186/gb-2010-11-3-r25). #' #' @importFrom rlang enquo -#' #' @importFrom stats median #' #' @name scale_abundance #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, +#' feature and transcript abundance) or `SummarizedExperiment` +#' (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param method A character string. The scaling method passed to the back-end function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") -#' @param reference_sample A character string. The name of the reference sample. If NULL the sample with highest total read count will be selected as reference. -#' @param .subset_for_scaling A gene-wise quosure condition. This will be used to filter rows (features/genes) of the dataset. For example -#' @param action A character string between "add" (default) and "only". "add" joins the new information to the input tbl (default), "only" return a non-redundant tbl with the just new information. +#' @param method A character string. The scaling method passed to the back-end +#' function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile") +#' @param reference_sample A character string. The name of the reference sample. +#' If NULL the sample with highest total read count will be selected as reference. +#' @param .subset_for_scaling A gene-wise quosure condition. This will be used +#' to filter rows (features/genes) of the dataset. For example +#' @param action A character string between "add" (default) and "only". +#' "add" joins the new information to the input tbl (default), "only" +#' return a non-redundant tbl with the just new information. #' #' @param reference_selection_function DEPRECATED. please use reference_sample. #' #' @details Scales transcript abundance compensating for sequencing depth #' (e.g., with TMM algorithm, Robinson and Oshlack doi.org/10.1186/gb-2010-11-3-r25). -#' Lowly transcribed transcripts/genes (defined with minimum_counts and minimum_proportion parameters) -#' are filtered out from the scaling procedure. +#' Lowly transcribed transcripts/genes (defined with minimum_counts +#' and minimum_proportion parameters) are filtered out from the scaling procedure. #' The scaling inference is then applied back to all unfiltered data. #' #' Underlying method #' edgeR::calcNormFactors(.data, method = c("TMM","TMMwsp","RLE","upperquartile")) #' #' -#' -#' @return A tbl object with additional columns with scaled data as `_scaled` -#' +#' @return A tbl object with additional columns with scaled data +#' as `_scaled` #' #' @examples -#' -#' #' tidybulk::se_mini |> #' identify_abundant() |> #' scale_abundance() #' -#' -#' #' @docType methods #' @rdname scale_abundance-methods #' @export @@ -393,7 +429,6 @@ setGeneric("scale_abundance", function(.data, reference_sample = NULL, .subset_for_scaling = NULL, action = "add", - # DEPRECATED reference_selection_function = NULL) standardGeneric("scale_abundance")) @@ -409,8 +444,7 @@ setGeneric("scale_abundance", function(.data, action = "add", # DEPRECATED - reference_selection_function = NULL) -{ + reference_selection_function = NULL) { # Fix NOTEs . = NULL @@ -419,7 +453,8 @@ setGeneric("scale_abundance", function(.data, .sample = enquo(.sample) .transcript = enquo(.transcript) .abundance = enquo(.abundance) - col_names = get_sample_transcript_counts(.data, .sample, .transcript, .abundance) + col_names = get_sample_transcript_counts(.data, .sample, + .transcript, .abundance) .sample = col_names$.sample .transcript = col_names$.transcript .abundance = col_names$.abundance @@ -431,9 +466,9 @@ setGeneric("scale_abundance", function(.data, # DEPRECATION OF reference function if (is_present(reference_selection_function) & !is.null(reference_selection_function)) { - # Signal the deprecation to the user - deprecate_warn("1.1.8", "tidybulk::scale_abundance(reference_selection_function = )", details = "The argument reference_selection_function is now deprecated please use reference_sample. By default the reference selection function is max()") + deprecate_warn("1.1.8", "tidybulk::scale_abundance(reference_selection_function = )", + details = "The argument reference_selection_function is now deprecated please use reference_sample. By default the reference selection function is max()") } @@ -454,7 +489,11 @@ setGeneric("scale_abundance", function(.data, when( ".abundant" %in% colnames(.) ~ filter(., .abundant), ~ { - warning("tidybulk says: highly abundant transcripts were not identified (i.e. identify_abundant()) or filtered (i.e., keep_abundant), therefore this operation will be performed on unfiltered data. In rare occasions this could be wanted. In standard whole-transcriptome workflows is generally unwanted.") + warning("tidybulk says: highly abundant transcripts were not identified", + " (i.e. identify_abundant()) or filtered (i.e., keep_abundant), ", + "therefore this operation will be performed on unfiltered data. ", + "In rare occasions this could be wanted. In standard whole-transcriptome ", + "workflows is generally unwanted.") (.) } ) %>% @@ -466,7 +505,9 @@ setGeneric("scale_abundance", function(.data, ) %>% # Check I have genes left - when(nrow(.) == 0 ~ stop("tidybulk says: there are 0 genes that passes the filters (.abundant and/or .subset_for_scaling). Please check your filtering or your data."), ~ (.)) %>% + when(nrow(.) == 0 ~ stop("tidybulk says: there are 0 genes that passes ", + "the filters (.abundant and/or .subset_for_scaling). ", + "Please check your filtering or your data."), ~ (.)) %>% get_scaled_counts_bulk( .sample = !!.sample, @@ -513,7 +554,8 @@ setGeneric("scale_abundance", function(.data, else if (action == "only") .data_norm else stop( - "tidybulk says: action must be either \"add\" for adding this information to your data frame or \"get\" to just get the information" + "tidybulk says: action must be either \"add\" for adding this ", + "information to your data frame or \"get\" to just get the information" ) } @@ -521,26 +563,24 @@ setGeneric("scale_abundance", function(.data, #' scale_abundance #' #' @export -#' #' @inheritParams scale_abundance -#' #' @docType methods #' @rdname scale_abundance-methods #' -#' @return A tbl object with additional columns with scaled data as `_scaled` +#' @return A tbl object with additional columns with scaled data +#' as `_scaled` #' setMethod("scale_abundance", "spec_tbl_df", .scale_abundance) #' scale_abundance #' #' @export -#' #' @inheritParams scale_abundance -#' #' @docType methods #' @rdname scale_abundance-methods #' -#' @return A tbl object with additional columns with scaled data as `_scaled` +#' @return A tbl object with additional columns with scaled data +#' as `_scaled` #' setMethod("scale_abundance", "tbl_df", .scale_abundance) @@ -553,7 +593,8 @@ setMethod("scale_abundance", "tbl_df", .scale_abundance) #' @docType methods #' @rdname scale_abundance-methods #' -#' @return A tbl object with additional columns with scaled data as `_scaled` +#' @return A tbl object with additional columns with scaled data +#' as `_scaled` #' setMethod("scale_abundance", "tidybulk", .scale_abundance) @@ -563,61 +604,79 @@ setMethod("scale_abundance", "tidybulk", .scale_abundance) #' #' `r lifecycle::badge("maturing")` #' -#' @description quantile_normalise_abundance() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and Scales transcript abundance compansating for sequencing depth (e.g., with TMM algorithm, Robinson and Oshlack doi.org/10.1186/gb-2010-11-3-r25). +#' @description quantile_normalise_abundance() takes as input A `tbl` +#' (with at least three columns for sample, feature and transcript abundance) +#' or `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and Scales transcript abundance +#' compansating for sequencing depth (e.g., with TMM algorithm, Robinson +#' and Oshlack doi.org/10.1186/gb-2010-11-3-r25). #' #' @importFrom rlang enquo -#' #' @importFrom stats median #' @importFrom dplyr join_by -#' @importFrom limma normalizeQuantiles -#' @importFrom preprocessCore normalize.quantiles.use.target -#' @importFrom preprocessCore normalize.quantiles.determine.target -#' +#' #' @name quantile_normalise_abundance #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, +#' feature and transcript abundance) or `SummarizedExperiment` +#' (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param method A character string. Either "limma_normalize_quantiles" for limma::normalizeQuantiles or "preprocesscore_normalize_quantiles_use_target" for preprocessCore::normalize.quantiles.use.target for large-scale dataset, where limmma could not be compatible. -#' @param action A character string between "add" (default) and "only". "add" joins the new information to the input tbl (default), "only" return a non-redundant tbl with the just new information. +#' @param method A character string. Either "limma_normalize_quantiles" +#' for limma::normalizeQuantiles or +#' "preprocesscore_normalize_quantiles_use_target" for +#' preprocessCore::normalize.quantiles.use.target for large-scale dataset, +#' where limmma could not be compatible. +#' @param action A character string between "add" (default) and "only". +#' "add" joins the new information to the input tbl (default), +#' "only" return a non-redundant tbl with the just new information. +#' #' #' @details Scales transcript abundance compensating for sequencing depth #' (e.g., with TMM algorithm, Robinson and Oshlack doi.org/10.1186/gb-2010-11-3-r25). -#' Lowly transcribed transcripts/genes (defined with minimum_counts and minimum_proportion parameters) -#' are filtered out from the scaling procedure. +#' Lowly transcribed transcripts/genes (defined with minimum_counts and +#' minimum_proportion parameters) are filtered out from the scaling procedure. #' The scaling inference is then applied back to all unfiltered data. #' #' Underlying method #' edgeR::calcNormFactors(.data, method = c("TMM","TMMwsp","RLE","upperquartile")) #' -#' @return A tbl object with additional columns with scaled data as `_scaled` +#' +#' +#' @return A tbl object with additional columns with scaled data as +#' `_scaled` +#' #' #' @examples #' +#' #' tidybulk::se_mini |> #' quantile_normalise_abundance() #' +#' +#' #' @docType methods #' @rdname quantile_normalise_abundance-methods #' @export -setGeneric("quantile_normalise_abundance", function(.data, - .sample = NULL, - .transcript = NULL, - .abundance = NULL, - method = "limma_normalize_quantiles", - action = "add") +setGeneric("quantile_normalise_abundance", function( + .data, + .sample = NULL, + .transcript = NULL, + .abundance = NULL, + method = "limma_normalize_quantiles", + action = "add") standardGeneric("quantile_normalise_abundance")) # Set internal -.quantile_normalise_abundance = function(.data, +.quantile_normalise_abundance <- function(.data, .sample = NULL, .transcript = NULL, .abundance = NULL, method = "limma_normalize_quantiles", - action = "add") -{ + action = "add") { # Fix NOTEs . = NULL @@ -645,15 +704,32 @@ setGeneric("quantile_normalise_abundance", function(.data, dplyr::mutate(!!.sample := factor(!!.sample),!!.transcript := factor(!!.transcript)) |> pivot_wider(names_from = !!.sample, values_from = !!.abundance) |> as_matrix(rownames=!!.transcript) - + + if(tolower(method) == "limma_normalize_quantiles"){ + # Check if package is installed, otherwise install + if (find.package("limma", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing limma needed for analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("limma", ask = FALSE) + } + .data_norm = .data_norm |> limma::normalizeQuantiles() } else if(tolower(method) == "preprocesscore_normalize_quantiles_use_target"){ + # Check if package is installed, otherwise install + if (find.package("preprocessCore", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing preprocessCore needed for analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("preprocessCore", ask = FALSE) + } + .data_norm_quant = .data_norm |> preprocessCore::normalize.quantiles.use.target( @@ -699,7 +775,8 @@ setGeneric("quantile_normalise_abundance", function(.data, else if (action == "only") .data_norm else stop( - "tidybulk says: action must be either \"add\" for adding this information to your data frame or \"get\" to just get the information" + "tidybulk says: action must be either \"add\" for adding this ", + "information to your data frame or \"get\" to just get the information" ) } @@ -712,9 +789,11 @@ setGeneric("quantile_normalise_abundance", function(.data, #' @docType methods #' @rdname quantile_normalise_abundance-methods #' -#' @return A tbl object with additional columns with scaled data as `_scaled` +#' @return A tbl object with additional columns with scaled data +#' as `_scaled` #' -setMethod("quantile_normalise_abundance", "spec_tbl_df", .quantile_normalise_abundance) +setMethod("quantile_normalise_abundance", "spec_tbl_df", + .quantile_normalise_abundance) #' quantile_normalise_abundance #' @@ -725,7 +804,8 @@ setMethod("quantile_normalise_abundance", "spec_tbl_df", .quantile_normalise_abu #' @docType methods #' @rdname quantile_normalise_abundance-methods #' -#' @return A tbl object with additional columns with scaled data as `_scaled` +#' @return A tbl object with additional columns with scaled data +#' as `_scaled` #' setMethod("quantile_normalise_abundance", "tbl_df", .quantile_normalise_abundance) @@ -738,7 +818,8 @@ setMethod("quantile_normalise_abundance", "tbl_df", .quantile_normalise_abundanc #' @docType methods #' @rdname quantile_normalise_abundance-methods #' -#' @return A tbl object with additional columns with scaled data as `_scaled` +#' @return A tbl object with additional columns with scaled data +#' as `_scaled` #' setMethod("quantile_normalise_abundance", "tidybulk", .quantile_normalise_abundance) @@ -747,29 +828,43 @@ setMethod("quantile_normalise_abundance", "tidybulk", .quantile_normalise_abunda #' #' `r lifecycle::badge("maturing")` #' -#' @description cluster_elements() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and identify clusters in the data. +#' @description cluster_elements() takes as input A `tbl` (with at least +#' three columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and identify clusters in the data. #' #' @importFrom rlang enquo #' -#' #' @name cluster_elements #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, +#' feature and transcript abundance) or `SummarizedExperiment` +#' (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) #' @param .element The name of the element column (normally samples). #' @param .feature The name of the feature column (normally transcripts/genes) -#' @param .abundance The name of the column including the numerical value the clustering is based on (normally transcript abundance) -#' -#' @param method A character string. The cluster algorithm to use, at the moment k-means is the only algorithm included. -#' @param of_samples A boolean. In case the input is a tidybulk object, it indicates Whether the element column will be sample or transcript column -#' @param transform A function that will tranform the counts, by default it is log1p for RNA sequencing data, but for avoinding tranformation you can use identity -#' @param action A character string. Whether to join the new information to the input tbl (add), or just get the non-redundant tbl with the new information (get). +#' @param .abundance The name of the column including the numerical value the +#' clustering is based on (normally transcript abundance) +#' +#' @param method A character string. The cluster algorithm to use, at the +#' moment k-means is the only algorithm included. +#' @param of_samples A boolean. In case the input is a tidybulk object, +#' it indicates Whether the element column will be sample or transcript column +#' @param transform A function that will tranform the counts, by default it is +#' log1p for RNA sequencing data, but for avoinding tranformation you can +#' use identity +#' @param action A character string. Whether to join the new information to +#' the input tbl (add), or just get the non-redundant tbl with the new information (get). #' @param ... Further parameters passed to the function kmeans #' -#' @param log_transform DEPRECATED - A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data) +#' @param log_transform DEPRECATED - A boolean, whether the value should be +#' log-transformed (e.g., TRUE for RNA sequencing data) #' #' @details identifies clusters in the data, normally of samples. #' This function returns a tibble with additional columns for the cluster annotation. -#' At the moment only k-means (DOI: 10.2307/2346830) and SNN clustering (DOI:10.1016/j.cell.2019.05.031) is supported, the plan is to introduce more clustering methods. +#' At the moment only k-means (DOI: 10.2307/2346830) and SNN clustering +#' (DOI:10.1016/j.cell.2019.05.031) is supported, the plan is to introduce more +#' clustering methods. #' #' Underlying method for kmeans #' do.call(kmeans(.data, iter.max = 1000, ...) @@ -803,32 +898,25 @@ setGeneric("cluster_elements", function(.data, method, of_samples = TRUE, transform = log1p, - action = "add", ..., - # DEPRECATED log_transform = NULL ) standardGeneric("cluster_elements")) # Set internal -.cluster_elements = function(.data, - .element = NULL, - .feature = NULL, - .abundance = NULL, - method , - of_samples = TRUE, - transform = log1p, - - action = "add", - ..., - - # DEPRECATED - log_transform = NULL - - ) -{ +.cluster_elements <- function(.data, + .element = NULL, + .feature = NULL, + .abundance = NULL, + method , + of_samples = TRUE, + transform = log1p, + action = "add", + ..., + # DEPRECATED + log_transform = NULL) { # Fix NOTEs . = NULL @@ -837,7 +925,9 @@ setGeneric("cluster_elements", function(.data, if (is_present(log_transform) & !is.null(log_transform)) { # Signal the deprecation to the user - deprecate_warn("1.7.4", "tidybulk::test_differential_abundance(log_transform = )", details = "The argument log_transform is now deprecated, please use transform.") + deprecate_warn("1.7.4", + "tidybulk::test_differential_abundance(log_transform = )", + details = "The argument log_transform is now deprecated, please use transform.") if(log_transform == TRUE) transform = log1p } @@ -869,7 +959,11 @@ setGeneric("cluster_elements", function(.data, when( ".abundant" %in% colnames(.) ~ filter(., .abundant), ~ { - warning("tidybulk says: highly abundant transcripts were not identified (i.e. identify_abundant()) or filtered (i.e., keep_abundant), therefore this operation will be performed on unfiltered data. In rare occasions this could be wanted. In standard whole-transcriptome workflows is generally unwanted.") + warning("tidybulk says: highly abundant transcripts were not ", + "identified (i.e. identify_abundant()) or filtered (i.e., keep_abundant)", + ", therefore this operation will be performed on unfiltered data. ", + "In rare occasions this could be wanted. In standard ", + "whole-transcriptome workflows is generally unwanted.") (.) } ) %>% @@ -884,7 +978,9 @@ setGeneric("cluster_elements", function(.data, transform = transform, ... ), - method == "SNN" ~ stop("tidybulk says: Matrix package (v1.3-3) causes an error with Seurat::FindNeighbors used in this method. We are trying to solve this issue. At the moment this option in unaviable."), + method == "SNN" ~ stop("tidybulk says: Matrix package (v1.3-3) causes ", + "an error with Seurat::FindNeighbors used in this method. We are ", + "trying to solve this issue. At the moment this option in unaviable."), # get_clusters_SNN_bulk(., # .abundance = !!.abundance, # .element = !!.element, @@ -893,7 +989,7 @@ setGeneric("cluster_elements", function(.data, # transform = transform, # ... # ), - TRUE ~ stop("tidybulk says: the only supported methods are \"kmeans\" or \"SNN\" ") + TRUE ~ stop("tidybulk says: the only supported methods are \"kmeans\" or \"SNN\" ") ) @@ -902,7 +998,7 @@ setGeneric("cluster_elements", function(.data, if (action == "add"){ .data |> - dplyr::left_join( .data_procesed, by=quo_name(.element) ) |> + dplyr::left_join( .data_procesed, by=quo_name(.element) ) |> # Attach attributes reattach_internals(.data) @@ -915,7 +1011,7 @@ setGeneric("cluster_elements", function(.data, # Selecting the right columns pivot_sample(!!.element) |> - dplyr::left_join( .data_procesed, by=quo_name(.element) ) |> + dplyr::left_join( .data_procesed, by=quo_name(.element) ) |> # Attach attributes reattach_internals(.data) @@ -924,7 +1020,8 @@ setGeneric("cluster_elements", function(.data, else if (action == "only") .data_procesed else stop( - "tidybulk says: action must be either \"add\" for adding this information to your data frame or \"get\" to just get the information" + "tidybulk says: action must be either \"add\" for adding this ", + "information to your data frame or \"get\" to just get the information" ) } @@ -964,28 +1061,45 @@ setMethod("cluster_elements", "tidybulk", .cluster_elements) #' #' `r lifecycle::badge("maturing")` #' -#' @description reduce_dimensions() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and calculates the reduced dimensional space of the transcript abundance. +#' @description reduce_dimensions() takes as input A `tbl` (with at least +#' three columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and calculates the reduced dimensional +#' space of the transcript abundance. #' #' @importFrom rlang enquo #' -#' #' @name reduce_dimensions #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, +#' feature and transcript abundance) or `SummarizedExperiment` (more +#' convenient if abstracted to tibble with library(tidySummarizedExperiment)) #' @param .element The name of the element column (normally samples). #' @param .feature The name of the feature column (normally transcripts/genes) -#' @param .abundance The name of the column including the numerical value the clustering is based on (normally transcript abundance) +#' @param .abundance The name of the column including the numerical value +#' the clustering is based on (normally transcript abundance) #' -#' @param method A character string. The dimension reduction algorithm to use (PCA, MDS, tSNE). +#' @param method A character string. The dimension reduction algorithm to +#' use (PCA, MDS, tSNE). #' @param top An integer. How many top genes to select for dimensionality reduction -#' @param of_samples A boolean. In case the input is a tidybulk object, it indicates Whether the element column will be sample or transcript column -#' @param .dims An integer. The number of dimensions your are interested in (e.g., 4 for returning the first four principal components). -#' @param transform A function that will tranform the counts, by default it is log1p for RNA sequencing data, but for avoinding tranformation you can use identity -#' @param scale A boolean for method="PCA", this will be passed to the `prcomp` function. It is not included in the ... argument because although the default for `prcomp` if FALSE, it is advisable to set it as TRUE. -#' @param action A character string. Whether to join the new information to the input tbl (add), or just get the non-redundant tbl with the new information (get). -#' @param ... Further parameters passed to the function prcomp if you choose method="PCA" or Rtsne if you choose method="tSNE" -#' -#' @param log_transform DEPRECATED - A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data) +#' @param of_samples A boolean. In case the input is a tidybulk object, +#' it indicates Whether the element column will be sample or transcript column +#' @param .dims An integer. The number of dimensions your are interested in +#' (e.g., 4 for returning the first four principal components). +#' @param transform A function that will tranform the counts, by default +#' it is log1p for RNA sequencing data, but for avoinding tranformation you +#' can use identity +#' @param scale A boolean for method="PCA", this will be passed to the `prcomp` +#' function. It is not included in the ... argument because although the +#' default for `prcomp` if FALSE, it is advisable to set it as TRUE. +#' @param action A character string. Whether to join the new information to +#' the input tbl (add), or just get the non-redundant tbl with the new +#' information (get). +#' @param ... Further parameters passed to the function prcomp if you choose +#' method="PCA" or Rtsne if you choose method="tSNE" +#' +#' @param log_transform DEPRECATED - A boolean, whether the value should be +#' log-transformed (e.g., TRUE for RNA sequencing data) #' #' @details This function reduces the dimensions of the transcript abundances. #' It can use multi-dimensional scaling (MDS; DOI.org/10.1186/gb-2010-11-3-r25), @@ -1049,50 +1163,43 @@ setGeneric("reduce_dimensions", function(.data, .abundance = NULL, method, .dims = 2, - top = 500, of_samples = TRUE, transform = log1p, scale = TRUE, action = "add", ..., - # DEPRECATED log_transform = NULL - ) standardGeneric("reduce_dimensions")) # Set internal -.reduce_dimensions = function(.data, - .element = NULL, - .feature = NULL, - .abundance = NULL, - method, - .dims = 2, - - top = 500, - of_samples = TRUE, - transform = log1p, - scale = TRUE, - action = "add", - ..., - - # DEPRECATED - log_transform = NULL - - ) -{ +.reduce_dimensions <- function(.data, + .element = NULL, + .feature = NULL, + .abundance = NULL, + method, + .dims = 2, + top = 500, + of_samples = TRUE, + transform = log1p, + scale = TRUE, + action = "add", + ..., + # DEPRECATED + log_transform = NULL) { # Fix NOTEs . = NULL - - + # DEPRECATION OF log_transform if (is_present(log_transform) & !is.null(log_transform)) { # Signal the deprecation to the user - deprecate_warn("1.7.4", "tidybulk::test_differential_abundance(log_transform = )", details = "The argument log_transform is now deprecated, please use transform.") + deprecate_warn("1.7.4", + "tidybulk::test_differential_abundance(log_transform = )", + details = "The argument log_transform is now deprecated, please use transform.") if(log_transform == TRUE) transform = log1p } @@ -1135,13 +1242,15 @@ setGeneric("reduce_dimensions", function(.data, when( ".abundant" %in% colnames(.) ~ filter(., .abundant), ~ { - warning("tidybulk says: highly abundant transcripts were not identified (i.e. identify_abundant()) or filtered (i.e., keep_abundant), therefore this operation will be performed on unfiltered data. In rare occasions this could be wanted. In standard whole-transcriptome workflows is generally unwanted.") - (.) - } + warning("tidybulk says: highly abundant transcripts were not ", + "identified (i.e. identify_abundant()) or filtered (i.e., keep_abundant), ", + "therefore this operation will be performed on unfiltered data. ", + "In rare occasions this could be wanted. In standard whole-transcriptome ", + "workflows is generally unwanted.") + (.) } ) %>% - when( - tolower(method) == tolower("MDS") ~ get_reduced_dimensions_MDS_bulk(., + tolower(method) == tolower("MDS") ~ get_reduced_dimensions_MDS_bulk(., .abundance = !!.abundance, .dims = .dims, .element = !!.element, @@ -1151,7 +1260,7 @@ setGeneric("reduce_dimensions", function(.data, transform = transform, ... ), - tolower(method) == tolower("PCA") ~ get_reduced_dimensions_PCA_bulk(., + tolower(method) == tolower("PCA") ~ get_reduced_dimensions_PCA_bulk(., .abundance = !!.abundance, .dims = .dims, .element = !!.element, @@ -1172,16 +1281,17 @@ setGeneric("reduce_dimensions", function(.data, transform = transform, ... ), - tolower(method) == tolower("UMAP") ~ get_reduced_dimensions_UMAP_bulk(., - .abundance = !!.abundance, - .dims = .dims, - .element = !!.element, - .feature = !!.feature, - top = top, - of_samples = of_samples, - transform = transform, - scale = scale, - ... + tolower(method) == tolower("UMAP") ~ get_reduced_dimensions_UMAP_bulk( + ., + .abundance = !!.abundance, + .dims = .dims, + .element = !!.element, + .feature = !!.feature, + top = top, + of_samples = of_samples, + transform = transform, + scale = scale, + ... ), TRUE ~ stop("tidybulk says: method must be either \"MDS\" or \"PCA\" or \"tSNE\"") ) @@ -1213,7 +1323,8 @@ setGeneric("reduce_dimensions", function(.data, else if (action == "only") .data_processed else stop( - "tidybulk says: action must be either \"add\" for adding this information to your data frame or \"get\" to just get the information" + "tidybulk says: action must be either \"add\" for adding this ", + "information to your data frame or \"get\" to just get the information" ) @@ -1251,25 +1362,30 @@ setMethod("reduce_dimensions", "tidybulk", .reduce_dimensions) #' #' `r lifecycle::badge("maturing")` #' -#' @description rotate_dimensions() takes as input a `tbl` formatted as -#' | | | <...> | and calculates the rotated -#' dimensional space of the transcript abundance. +#' @description rotate_dimensions() takes as input a `tbl` formatted as +#' | | | <...> | and calculates the rotated +#' dimensional space of the transcript abundance. #' #' @importFrom rlang enquo #' -#' #' @name rotate_dimensions #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, feature and +#' transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) #' @param .element The name of the element column (normally samples). #' #' @param dimension_1_column A character string. The column of the dimension 1 #' @param dimension_2_column A character string. The column of the dimension 2 #' @param rotation_degrees A real number between 0 and 360 -#' @param of_samples A boolean. In case the input is a tidybulk object, it indicates Whether the element column will be sample or transcript column -#' @param dimension_1_column_rotated A character string. The column of the rotated dimension 1 (optional) -#' @param dimension_2_column_rotated A character string. The column of the rotated dimension 2 (optional) -#' @param action A character string. Whether to join the new information to the input tbl (add), or just get the non-redundant tbl with the new information (get). +#' @param of_samples A boolean. In case the input is a tidybulk object, +#' it indicates Whether the element column will be sample or transcript column +#' @param dimension_1_column_rotated A character string. The column of the +#' rotated dimension 1 (optional) +#' @param dimension_2_column_rotated A character string. The column of the +#' rotated dimension 2 (optional) +#' @param action A character string. Whether to join the new information to the +#' input tbl (add), or just get the non-redundant tbl with the new information (get). #' #' @details This function to rotate two dimensions such as the reduced dimensions. #' @@ -1284,21 +1400,19 @@ setMethod("reduce_dimensions", "tidybulk", .reduce_dimensions) #' ) |> as_matrix()) %*% m) #' } #' -#' -#' @return A tbl object with additional columns for the reduced dimensions. additional columns for the rotated dimensions. The rotated dimensions will be added to the original data set as ` rotated ` by default, or as specified in the input arguments. -#' +#' @return A tbl object with additional columns for the reduced dimensions. +#' additional columns for the rotated dimensions. The rotated dimensions will +#' be added to the original data set as ` rotated ` +#' by default, or as specified in the input arguments. #' #' @examples -#' #' counts.MDS = #' tidybulk::se_mini |> #' identify_abundant() |> #' reduce_dimensions( method="MDS", .dims = 3) #' #' counts.MDS.rotated = rotate_dimensions(counts.MDS, `Dim1`, `Dim2`, -#' rotation_degrees = 45, -#' .element = sample) -#' +#' rotation_degrees = 45, .element = sample) #' #' @docType methods #' @rdname rotate_dimensions-methods @@ -1316,7 +1430,7 @@ setGeneric("rotate_dimensions", function(.data, standardGeneric("rotate_dimensions")) # Set internal -.rotate_dimensions = function(.data, +.rotate_dimensions <- function(.data, dimension_1_column, dimension_2_column, rotation_degrees, @@ -1324,8 +1438,7 @@ setGeneric("rotate_dimensions", function(.data, of_samples = TRUE, dimension_1_column_rotated = NULL, dimension_2_column_rotated = NULL, - action = "add") -{ + action = "add") { # Fix NOTEs . = NULL @@ -1368,13 +1481,11 @@ setGeneric("rotate_dimensions", function(.data, ) if (action == "add"){ - .data |> dplyr::left_join( .data_processed, by = quo_name(.element) ) |> # Attach attributes reattach_internals(.data) - } else if (action == "get"){ @@ -1396,7 +1507,8 @@ setGeneric("rotate_dimensions", function(.data, else if (action == "only") .data_processed else stop( - "tidybulk says: action must be either \"add\" for adding this information to your data frame or \"get\" to just get the information" + "tidybulk says: action must be either \"add\" for adding this ", + "information to your data frame or \"get\" to just get the information" ) } @@ -1406,7 +1518,10 @@ setGeneric("rotate_dimensions", function(.data, #' @docType methods #' @rdname rotate_dimensions-methods #' -#' @return A tbl object with additional columns for the reduced dimensions. additional columns for the rotated dimensions. The rotated dimensions will be added to the original data set as ` rotated ` by default, or as specified in the input arguments. +#' @return A tbl object with additional columns for the reduced dimensions. +#' additional columns for the rotated dimensions. The rotated dimensions will +#' be added to the original data set as ` rotated ` +#' by default, or as specified in the input arguments. setMethod("rotate_dimensions", "spec_tbl_df", .rotate_dimensions) #' rotate_dimensions @@ -1415,7 +1530,10 @@ setMethod("rotate_dimensions", "spec_tbl_df", .rotate_dimensions) #' @docType methods #' @rdname rotate_dimensions-methods #' -#' @return A tbl object with additional columns for the reduced dimensions. additional columns for the rotated dimensions. The rotated dimensions will be added to the original data set as ` rotated ` by default, or as specified in the input arguments. +#' @return A tbl object with additional columns for the reduced dimensions. +#' additional columns for the rotated dimensions. The rotated dimensions will +#' be added to the original data set as ` rotated ` +#' by default, or as specified in the input arguments. setMethod("rotate_dimensions", "tbl_df", .rotate_dimensions) #' rotate_dimensions @@ -1424,47 +1542,72 @@ setMethod("rotate_dimensions", "tbl_df", .rotate_dimensions) #' @docType methods #' @rdname rotate_dimensions-methods #' -#' @return A tbl object with additional columns for the reduced dimensions. additional columns for the rotated dimensions. The rotated dimensions will be added to the original data set as ` rotated ` by default, or as specified in the input arguments. +#' @return A tbl object with additional columns for the reduced dimensions. +#' additional columns for the rotated dimensions. The rotated dimensions +#' will be added to the original data set as +#' ` rotated ` by default, or as +#' specified in the input arguments. setMethod("rotate_dimensions", "tidybulk", .rotate_dimensions) -#' Drop redundant elements (e.g., samples) for which feature (e.g., transcript/gene) abundances are correlated +#' Drop redundant elements (e.g., samples) for which feature (e.g., +#' transcript/gene) abundances are correlated #' #' `r lifecycle::badge("maturing")` #' -#' @description remove_redundancy() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) for correlation method or | | | <...> | for reduced_dimensions method, and returns a consistent object (to the input) with dropped elements (e.g., samples). +#' @description remove_redundancy() takes as input A `tbl` (with at least +#' three columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) for correlation method or | +#' | | <...> | for reduced_dimensions method, +#' and returns a consistent object (to the input) with dropped +#' elements (e.g., samples). #' #' @importFrom rlang enquo #' -#' #' @name remove_redundancy #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, feature +#' and transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) #' @param .element The name of the element column (normally samples). #' @param .feature The name of the feature column (normally transcripts/genes) -#' @param .abundance The name of the column including the numerical value the clustering is based on (normally transcript abundance) -#' -#' @param method A character string. The method to use, correlation and reduced_dimensions are available. The latter eliminates one of the most proximar pairs of samples in PCA reduced dimensions. -#' @param of_samples A boolean. In case the input is a tidybulk object, it indicates Whether the element column will be sample or transcript column -#' @param transform A function that will tranform the counts, by default it is log1p for RNA sequencing data, but for avoinding tranformation you can use identity +#' @param .abundance The name of the column including the numerical value the +#' clustering is based on (normally transcript abundance) +#' +#' @param method A character string. The method to use, correlation and +#' reduced_dimensions are available. The latter eliminates one of the most +#' proximar pairs of samples in PCA reduced dimensions. +#' @param of_samples A boolean. In case the input is a tidybulk object, +#' it indicates Whether the element column will be sample or transcript column +#' @param transform A function that will tranform the counts, by default it +#' is log1p for RNA sequencing data, but for avoinding tranformation you +#' can use identity #' @param correlation_threshold A real number between 0 and 1. For correlation based calculation. #' @param top An integer. How many top genes to select for correlation based method -#' @param Dim_a_column A character string. For reduced_dimension based calculation. The column of one principal component -#' @param Dim_b_column A character string. For reduced_dimension based calculation. The column of another principal component -#' -#' @param log_transform DEPRECATED - A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data) -#' -#' @details This function removes redundant elements from the original data set (e.g., samples or transcripts). -#' For example, if we want to define cell-type specific signatures with low sample redundancy. +#' @param Dim_a_column A character string. For reduced_dimension based +#' calculation. The column of one principal component +#' @param Dim_b_column A character string. For reduced_dimension based +#' calculation. The column of another principal component +#' +#' @param log_transform DEPRECATED - A boolean, whether the value +#' should be log-transformed (e.g., TRUE for RNA sequencing data) +#' +#' @details This function removes redundant elements from the original +#' data set (e.g., samples or transcripts). +#' For example, if we want to define cell-type specific signatures with +#' low sample redundancy. #' This function returns a tibble with dropped redundant elements (e.g., samples). #' Two redundancy estimation approaches are supported: -#' (i) removal of highly correlated clusters of elements (keeping a representative) with method="correlation"; +#' (i) removal of highly correlated clusters of elements (keeping a +#' representative) with method="correlation"; #' (ii) removal of most proximal element pairs in a reduced dimensional space. #' #' Underlying method for correlation: -#' widyr::pairwise_cor(sample, transcript,count, sort = TRUE, diag = FALSE, upper = FALSE) +#' widyr::pairwise_cor(sample, transcript,count, sort = TRUE, +#' diag = FALSE, upper = FALSE) #' #' Underlying custom method for reduced dimensions: #' select_closest_pairs = function(df) { @@ -1481,18 +1624,13 @@ setMethod("rotate_dimensions", "tidybulk", .rotate_dimensions) #' !`sample 2` %in% (pair |> select(1:2) |> as.character()) #' ) #' } -#' #' couples -#' #' } #' #' -#' #' @return A tbl object with with dropped redundant elements (e.g., samples). #' #' @examples -#' -#' #' tidybulk::se_mini |> #' identify_abundant() |> #' remove_redundancy( @@ -1540,25 +1678,19 @@ setGeneric("remove_redundancy", function(.data, standardGeneric("remove_redundancy")) # Set internal -.remove_redundancy = function(.data, - .element = NULL, - .feature = NULL, - .abundance = NULL, - method, - - of_samples = TRUE, - - correlation_threshold = 0.9, - top = Inf, - transform = identity, - - Dim_a_column = NULL, - Dim_b_column = NULL, - - # DEPRECATED - log_transform = NULL -) -{ +.remove_redundancy <- function(.data, + .element = NULL, + .feature = NULL, + .abundance = NULL, + method, + of_samples = TRUE, + correlation_threshold = 0.9, + top = Inf, + transform = identity, + Dim_a_column = NULL, + Dim_b_column = NULL, + # DEPRECATED + log_transform = NULL) { # Fix NOTEs . = NULL @@ -1567,7 +1699,9 @@ setGeneric("remove_redundancy", function(.data, if (is_present(log_transform) & !is.null(log_transform)) { # Signal the deprecation to the user - deprecate_warn("1.7.4", "tidybulk::test_differential_abundance(log_transform = )", details = "The argument log_transform is now deprecated, please use transform.") + deprecate_warn("1.7.4", + "tidybulk::test_differential_abundance(log_transform = )", + details = "The argument log_transform is now deprecated, please use transform.") if(log_transform == TRUE) transform = log1p } @@ -1613,7 +1747,9 @@ setGeneric("remove_redundancy", function(.data, } else stop( - "tidybulk says: method must be either \"correlation\" for dropping correlated elements or \"reduced_dimension\" to drop the closest pair according to two dimensions (e.g., PCA)" + "tidybulk says: method must be either \"correlation\" for dropping ", + "correlated elements or \"reduced_dimension\" to drop the closest pair ", + "according to two dimensions (e.g., PCA)" ) } @@ -1651,58 +1787,68 @@ setMethod("remove_redundancy", "tidybulk", .remove_redundancy) #' #' `r lifecycle::badge("maturing")` #' -#' @description adjust_abundance() takes as input A `tbl` -#' (with at least three columns for sample, feature and transcript abundance) -#' or `SummarizedExperiment` (more convenient if abstracted to tibble with +#' @description adjust_abundance() takes as input A `tbl` (with at least three +#' columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with #' library(tidySummarizedExperiment)) and returns a consistent object #' (to the input) with an additional adjusted abundance column. #' This method uses scaled counts if present. #' #' @importFrom rlang enquo #' -#' #' @name adjust_abundance #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) -#' @param .factor_unwanted A tidy select, e.g. column names without double quotation. c(batch, country) These are the factor that we want to adjust for, including unwanted batcheffect, and unwanted biological effects. -#' @param .factor_of_interest A tidy select, e.g. column names without double quotation. c(treatment) These are the factor that we want to preserve. +#' @param .data A `tbl` (with at least three columns for sample, feature +#' and transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .factor_unwanted A tidy select, e.g. column names without double +#' quotation. c(batch, country) These are the factor that we want to adjust for, +#' including unwanted batcheffect, and unwanted biological effects. +#' @param .factor_of_interest A tidy select, e.g. column names without double +#' quotation. c(treatment) These are the factor that we want to preserve. #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param method A character string. Methods include combat_seq (default), combat and limma_remove_batch_effect. +#' @param method A character string. Methods include combat_seq (default), +#' combat and limma_remove_batch_effect. #' -#' @param action A character string. Whether to join the new information to the input tbl (add), or just get the non-redundant tbl with the new information (get). +#' @param action A character string. Whether to join the new information to the +#' input tbl (add), or just get the non-redundant tbl with the new information (get). #' @param ... Further parameters passed to the function sva::ComBat #' -#' @param .formula DEPRECATED - A formula with no response variable, representing the desired linear model where the first covariate is the factor of interest and the second covariate is the unwanted variation (of the kind ~ factor_of_interest + batch) -#' @param transform DEPRECATED - A function that will tranform the counts, by default it is log1p for RNA sequencing data, but for avoinding tranformation you can use identity -#' @param inverse_transform DEPRECATED - A function that is the inverse of transform (e.g. expm1 is inverse of log1p). This is needed to tranform back the counts after analysis. -#' @param log_transform DEPRECATED - A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data) +#' @param .formula DEPRECATED - A formula with no response variable, +#' representing the desired linear model where the first covariate is the +#' factor of interest and the second covariate is the unwanted variation +#' (of the kind ~ factor_of_interest + batch) +#' @param transform DEPRECATED - A function that will tranform the counts, +#' by default it is log1p for RNA sequencing data, but for avoinding +#' tranformation you can use identity +#' @param inverse_transform DEPRECATED - A function that is the inverse of +#' transform (e.g. expm1 is inverse of log1p). This is needed to tranform +#' back the counts after analysis. +#' @param log_transform DEPRECATED - A boolean, whether the value should be +#' log-transformed (e.g., TRUE for RNA sequencing data) #' #' @details This function adjusts the abundance for (known) unwanted variation. -#' At the moment just an unwanted covariate is allowed at a time using Combat (DOI: 10.1093/bioinformatics/bts034) +#' At the moment just an unwanted covariate is allowed at a time using +#' Combat (DOI: 10.1093/bioinformatics/bts034) #' #' Underlying method: #' sva::ComBat(data, batch = my_batch, mod = design, prior.plots = FALSE, ...) #' -#' @return A consistent object (to the input) with additional columns for the adjusted counts as `_adjusted` -#' -#' -#' +#' @return A consistent object (to the input) with additional columns for +#' the adjusted counts as `_adjusted` #' #' @examples #' -#' -#' #' cm = tidybulk::se_mini #' cm$batch = 0 #' cm$batch[colnames(cm) %in% c("SRR1740035", "SRR1740043")] = 1 #' #' cm |> #' identify_abundant() |> -#' adjust_abundance(.factor_unwanted = batch, -#' .factor_of_interest = condition, -#' method="combat") +#' adjust_abundance( .factor_unwanted = batch, +#' .factor_of_interest = condition, method="combat" ) #' #' #' @docType methods @@ -1711,7 +1857,6 @@ setMethod("remove_redundancy", "tidybulk", .remove_redundancy) #' #' setGeneric("adjust_abundance", function(.data, - # DEPRECATED .formula = NULL, .factor_unwanted =NULL, @@ -1728,13 +1873,11 @@ setGeneric("adjust_abundance", function(.data, log_transform = NULL, transform = NULL, inverse_transform = NULL - ) standardGeneric("adjust_abundance")) # Set internal -.adjust_abundance = function(.data, - +.adjust_abundance <- function(.data, # DEPRECATED .formula = NULL, .factor_unwanted = NULL, @@ -1750,8 +1893,7 @@ setGeneric("adjust_abundance", function(.data, log_transform = NULL, transform = NULL, inverse_transform = NULL - ) -{ + ) { # Fix NOTEs . = NULL @@ -1767,7 +1909,8 @@ setGeneric("adjust_abundance", function(.data, if (is_present(log_transform) & !is.null(log_transform)) { # Signal the deprecation to the user - deprecate_warn("1.7.4", "tidybulk::test_differential_abundance(log_transform = )", + deprecate_warn("1.7.4", + "tidybulk::test_differential_abundance(log_transform = )", details = "The argument log_transform is now deprecated, please use transform.") if(log_transform){ @@ -1783,7 +1926,8 @@ setGeneric("adjust_abundance", function(.data, ) { # Signal the deprecation to the user - deprecate_warn("1.11.6", "tidybulk::test_differential_abundance(transform = )", details = "The argument transform and inverse_transform is now deprecated, please use method argument instead specifying \"combat\", \"combat_seq\" or \"limma_remove_batch_effect\".") + deprecate_warn("1.11.6", "tidybulk::test_differential_abundance(transform = )", + details = "The argument transform and inverse_transform is now deprecated, please use method argument instead specifying \"combat\", \"combat_seq\" or \"limma_remove_batch_effect\".") } @@ -1791,7 +1935,8 @@ setGeneric("adjust_abundance", function(.data, if (is_present(.formula) & !is.null(.formula)) { # Signal the deprecation to the user - deprecate_warn("1.11.6", "tidybulk::test_differential_abundance(.formula = )", details = "The argument .formula is now deprecated, please use factor_unwanted and factor_of_interest. Using the formula, the first factor is of interest and the second is unwanted") + deprecate_warn("1.11.6", "tidybulk::test_differential_abundance(.formula = )", + details = "The argument .formula is now deprecated, please use factor_unwanted and factor_of_interest. Using the formula, the first factor is of interest and the second is unwanted") # Check that .formula includes at least two covariates if (parse_formula(.formula) %>% length %>% st(2)) @@ -1835,9 +1980,12 @@ setGeneric("adjust_abundance", function(.data, when( ".abundant" %in% colnames(.) ~ filter(., .abundant), ~ { - warning("tidybulk says: highly abundant transcripts were not identified (i.e. identify_abundant()) or filtered (i.e., keep_abundant), therefore this operation will be performed on unfiltered data. In rare occasions this could be wanted. In standard whole-transcriptome workflows is generally unwanted.") - (.) - } + warning("tidybulk says: highly abundant transcripts were not ", + "identified (i.e. identify_abundant()) or filtered (i.e., keep_abundant), ", + "therefore this operation will be performed on unfiltered data. ", + "In rare occasions this could be wanted. In standard whole-transcriptome ", + "workflows is generally unwanted.") + (.) } ) |> get_adjusted_counts_for_unwanted_variation_bulk( @@ -1855,7 +2003,8 @@ setGeneric("adjust_abundance", function(.data, .data |> # Add adjusted column - dplyr::left_join(.data_processed, by = c(quo_name(.transcript), quo_name(.sample))) |> + dplyr::left_join(.data_processed, by = c(quo_name(.transcript), + quo_name(.sample))) |> # Attach attributes reattach_internals(.data) @@ -1884,7 +2033,8 @@ setGeneric("adjust_abundance", function(.data, else if (action == "only") .data_processed else stop( - "tidybulk says: action must be either \"add\" for adding this information to your data frame or \"get\" to just get the information" + "tidybulk says: action must be either \"add\" for adding this information ", + "to your data frame or \"get\" to just get the information" ) } @@ -1894,7 +2044,8 @@ setGeneric("adjust_abundance", function(.data, #' @docType methods #' @rdname adjust_abundance-methods #' -#' @return A consistent object (to the input) with additional columns for the adjusted counts as `_adjusted` +#' @return A consistent object (to the input) with additional columns for the +#' adjusted counts as `_adjusted` setMethod("adjust_abundance", "spec_tbl_df", .adjust_abundance) #' adjust_abundance @@ -1903,7 +2054,8 @@ setMethod("adjust_abundance", "spec_tbl_df", .adjust_abundance) #' @docType methods #' @rdname adjust_abundance-methods #' -#' @return A consistent object (to the input) with additional columns for the adjusted counts as `_adjusted` +#' @return A consistent object (to the input) with additional columns for the +#' adjusted counts as `_adjusted` setMethod("adjust_abundance", "tbl_df", .adjust_abundance) #' adjust_abundance @@ -1912,28 +2064,36 @@ setMethod("adjust_abundance", "tbl_df", .adjust_abundance) #' @docType methods #' @rdname adjust_abundance-methods #' -#' @return A consistent object (to the input) with additional columns for the adjusted counts as `_adjusted` +#' @return A consistent object (to the input) with additional columns for the +#' adjusted counts as `_adjusted` setMethod("adjust_abundance", "tidybulk", .adjust_abundance) -#' Aggregates multiple counts from the same samples (e.g., from isoforms), concatenates other character columns, and averages other numeric columns +#' Aggregates multiple counts from the same samples (e.g., from isoforms), +#' concatenates other character columns, and averages other numeric columns #' #' `r lifecycle::badge("maturing")` #' -#' @description aggregate_duplicates() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with aggregated transcripts that were duplicated. +#' @description aggregate_duplicates() takes as input A `tbl` (with at least +#' three columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a consistent object +#' (to the input) with aggregated transcripts that were duplicated. #' #' @importFrom rlang enquo #' -#' #' @name aggregate_duplicates #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, feature and +#' transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column #' -#' @param aggregation_function A function for counts aggregation (e.g., sum, median, or mean) +#' @param aggregation_function A function for counts aggregation (e.g., sum, +#' median, or mean) #' @param keep_integer A boolean. Whether to force the aggregated counts to integer #' #' @details This function aggregates duplicated transcripts (e.g., isoforms, ensembl). @@ -1949,7 +2109,8 @@ setMethod("adjust_abundance", "tidybulk", .adjust_abundance) #' group_by(!!.sample,!!.transcript) |> #' dplyr::mutate(!!.abundance := !!.abundance |> aggregation_function()) #' -#' @return A consistent object (to the input) with aggregated transcript abundance and annotation +#' @return A consistent object (to the input) with aggregated transcript +#' abundance and annotation #' #' #' @@ -1972,7 +2133,6 @@ setMethod("adjust_abundance", "tidybulk", .adjust_abundance) #' #' setGeneric("aggregate_duplicates", function(.data, - .sample = NULL, .transcript = NULL, .abundance = NULL, @@ -1981,8 +2141,7 @@ setGeneric("aggregate_duplicates", function(.data, standardGeneric("aggregate_duplicates")) # Set internal -.aggregate_duplicates = function(.data, - +.aggregate_duplicates <- function(.data, .sample = NULL, .transcript = NULL, .abundance = NULL, @@ -2024,7 +2183,8 @@ setGeneric("aggregate_duplicates", function(.data, # If I have a big data set else { - message("tidybulk says: for big data sets (>100 samples) this efficient implementation aggregates count columns and keeps the first instance for sample and transcript annotations") + message("tidybulk says: for big data sets (>100 samples) this efficient ", + "implementation aggregates count columns and keeps the first instance for sample and transcript annotations") aggregate_duplicated_transcripts_DT( .data, @@ -2044,7 +2204,8 @@ setGeneric("aggregate_duplicates", function(.data, #' @docType methods #' @rdname aggregate_duplicates-methods #' -#' @return A consistent object (to the input) with aggregated transcript abundance and annotation +#' @return A consistent object (to the input) with aggregated transcript +#' abundance and annotation setMethod("aggregate_duplicates", "spec_tbl_df", .aggregate_duplicates) #' aggregate_duplicates @@ -2053,7 +2214,8 @@ setMethod("aggregate_duplicates", "spec_tbl_df", .aggregate_duplicates) #' @docType methods #' @rdname aggregate_duplicates-methods #' -#' @return A consistent object (to the input) with aggregated transcript abundance and annotation +#' @return A consistent object (to the input) with aggregated transcript +#' abundance and annotation setMethod("aggregate_duplicates", "tbl_df", .aggregate_duplicates) #' aggregate_duplicates @@ -2062,7 +2224,8 @@ setMethod("aggregate_duplicates", "tbl_df", .aggregate_duplicates) #' @docType methods #' @rdname aggregate_duplicates-methods #' -#' @return A consistent object (to the input) with aggregated transcript abundance and annotation +#' @return A consistent object (to the input) with aggregated transcript +#' abundance and annotation setMethod("aggregate_duplicates", "tidybulk", .aggregate_duplicates) @@ -2071,21 +2234,35 @@ setMethod("aggregate_duplicates", "tidybulk", .aggregate_duplicates) #' #' `r lifecycle::badge("maturing")` #' -#' @description deconvolve_cellularity() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with the estimated cell type abundance for each sample +#' @description deconvolve_cellularity() takes as input A `tbl` (with at least +#' three columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a consistent object (to the +#' input) with the estimated cell type abundance for each sample #' #' @importFrom rlang enquo #' -#' #' @name deconvolve_cellularity #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, feature and +#' transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param reference A data frame. The methods cibersort and llsr can accept a custom rectangular dataframe with genes as rows names, cell types as column names and gene-transcript abundance as values. For exampler tidybulk::X_cibersort. The transcript/cell_type data frame of integer transcript abundance. If NULL, the default reference for each algorithm will be used. For llsr will be LM22. -#' @param method A character string. The method to be used. At the moment Cibersort (default, can accept custom reference), epic (can accept custom reference) and llsr (linear least squares regression, can accept custom reference), mcp_counter, quantiseq, xcell are available. -#' @param prefix A character string. The prefix you would like to add to the result columns. It is useful if you want to reshape data. -#' @param action A character string. Whether to join the new information to the input tbl (add), or just get the non-redundant tbl with the new information (get). +#' @param reference A data frame. The methods cibersort and llsr can accept a +#' custom rectangular dataframe with genes as rows names, cell types as column +#' names and gene-transcript abundance as values. For exampler tidybulk::X_cibersort. +#' The transcript/cell_type data frame of integer transcript abundance. If NULL, +#' the default reference for each algorithm will be used. For llsr will be LM22. +#' @param method A character string. The method to be used. At the moment +#' Cibersort (default, can accept custom reference), epic (can accept custom +#' reference) and llsr (linear least squares regression, can accept custom +#' reference), mcp_counter, quantiseq, xcell are available. +#' @param prefix A character string. The prefix you would like to add to the +#' result columns. It is useful if you want to reshape data. +#' @param action A character string. Whether to join the new information to the +#' input tbl (add), or just get the non-redundant tbl with the new information (get). #' @param ... Further parameters passed to the function Cibersort #' #' @details This function infers the cell type composition of our samples @@ -2094,14 +2271,11 @@ setMethod("aggregate_duplicates", "tidybulk", .aggregate_duplicates) #' Underlying method: #' CIBERSORT(Y = data, X = reference, ...) #' -#' @return A consistent object (to the input) including additional columns for each cell type estimated -#' -#' -#' +#' @return A consistent object (to the input) including additional columns +#' for each cell type estimated #' #' @examples #' -#' #' # Subsetting for time efficiency #' tidybulk::se_mini |> deconvolve_cellularity(cores = 1) #' @@ -2122,7 +2296,7 @@ setGeneric("deconvolve_cellularity", function(.data, standardGeneric("deconvolve_cellularity")) # Set internal -.deconvolve_cellularity = function(.data, +.deconvolve_cellularity <- function(.data, .sample = NULL, .transcript = NULL, .abundance = NULL, @@ -2168,9 +2342,8 @@ setGeneric("deconvolve_cellularity", function(.data, if (action == "add"){ .data |> - # Add new annotation - dplyr::left_join(.data_processed, by = quo_name(.sample) ) |> + dplyr::left_join(.data_processed, by = quo_name(.sample)) |> # Attach attributes reattach_internals(.data_processed) @@ -2178,8 +2351,6 @@ setGeneric("deconvolve_cellularity", function(.data, else if (action == "get"){ .data |> - - # Selecting the right columns pivot_sample(!!.sample) |> # @@ -2190,7 +2361,7 @@ setGeneric("deconvolve_cellularity", function(.data, # distinct() |> # Add new annotation - dplyr::left_join(.data_processed, by = quo_name(.sample) ) |> + dplyr::left_join(.data_processed, by = quo_name(.sample)) |> # Attach attributes reattach_internals(.data_processed) @@ -2199,7 +2370,8 @@ setGeneric("deconvolve_cellularity", function(.data, else if (action == "only") .data_processed else stop( - "tidybulk says: action must be either \"add\" for adding this information to your data frame or \"get\" to just get the information" + "tidybulk says: action must be either \"add\" for adding this ", + "information to your data frame or \"get\" to just get the information" ) } @@ -2209,7 +2381,8 @@ setGeneric("deconvolve_cellularity", function(.data, #' @docType methods #' @rdname deconvolve_cellularity-methods #' -#' @return A consistent object (to the input) including additional columns for each cell type estimated +#' @return A consistent object (to the input) including additional columns +#' for each cell type estimated setMethod("deconvolve_cellularity", "spec_tbl_df", .deconvolve_cellularity) @@ -2220,7 +2393,8 @@ setMethod("deconvolve_cellularity", #' @docType methods #' @rdname deconvolve_cellularity-methods #' -#' @return A consistent object (to the input) including additional columns for each cell type estimated +#' @return A consistent object (to the input) including additional columns +#' for each cell type estimated setMethod("deconvolve_cellularity", "tbl_df", .deconvolve_cellularity) #' deconvolve_cellularity @@ -2229,18 +2403,15 @@ setMethod("deconvolve_cellularity", "tbl_df", .deconvolve_cellularity) #' @docType methods #' @rdname deconvolve_cellularity-methods #' -#' @return A consistent object (to the input) including additional columns for each cell type estimated +#' @return A consistent object (to the input) including additional columns +#' for each cell type estimated setMethod("deconvolve_cellularity", "tidybulk", .deconvolve_cellularity) - - #' Get ENTREZ id from gene SYMBOL -#' -#' @importFrom org.Hs.eg.db org.Hs.eg.db -#' +#' #' @param .data A tt or tbl object. #' @param .transcript A character. The name of the gene symbol column. #' @param .sample The name of the sample column @@ -2251,9 +2422,9 @@ setMethod("deconvolve_cellularity", #' #' # This function was designed for data.frame #' # Convert from SummarizedExperiment for this example. It is NOT reccomended. -#' data(se_mini) -#' se_mini |> tidybulk() |> as_tibble() |> -#' symbol_to_entrez(.transcript = .feature, .sample = .sample) +#' +#' tidybulk::se_mini |> tidybulk() |> as_tibble() |> +#' symbol_to_entrez(.transcript = .feature, .sample = .sample) #' #' @export #' @@ -2270,6 +2441,14 @@ symbol_to_entrez = function(.data, col_names = get_sample_transcript(.data, .sample, .transcript) .transcript = col_names$.transcript + # Check if package is installed, otherwise install + if (find.package("org.Hs.eg.db", quiet = TRUE) |> length() |> equals(0)) { + message("Installing org.Hs.eg.db needed for annotation") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("org.Hs.eg.db", ask = FALSE) + } + .data |> # Solve the lower case @@ -2303,10 +2482,6 @@ symbol_to_entrez = function(.data, #' @param .data A tt or tbl object. #' @param .transcript A character. The name of the gene symbol column. #' -#' @importFrom org.Hs.eg.db org.Hs.eg.db -#' @importFrom org.Mm.eg.db org.Mm.eg.db -#' @importFrom AnnotationDbi mapIds -#' #' @return A tbl #' #' @examples @@ -2334,6 +2509,31 @@ setGeneric("describe_transcript", function(.data, col_names = get_transcript(.data, .transcript) .transcript = col_names$.transcript + + # Check if package is installed, otherwise install + if (find.package("org.Hs.eg.db", quiet = TRUE) |> length() |> equals(0)) { + message("Installing org.Hs.eg.db needed for differential transcript abundance analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("org.Hs.eg.db", ask = FALSE) + } + + # Check if package is installed, otherwise install + if (find.package("org.Mm.eg.db", quiet = TRUE) |> length() |> equals(0)) { + message("Installing org.Mm.eg.db needed for differential transcript abundance analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("org.Mm.eg.db", ask = FALSE) + } + + # Check if package is installed, otherwise install + if (find.package("AnnotationDbi", quiet = TRUE) |> length() |> equals(0)) { + message("Installing AnnotationDbi needed for differential transcript abundance analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("AnnotationDbi", ask = FALSE) + } + description_df = @@ -2407,29 +2607,36 @@ setMethod("describe_transcript", "tidybulk", .describe_transcript) #' #' \lifecycle{questioning} #' -#' @description ensembl_to_symbol() takes as input a `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with the additional transcript symbol column +#' @description ensembl_to_symbol() takes as input a `tbl` (with at least +#' three columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a consistent object +#' (to the input) with the additional transcript symbol column #' #' @importFrom rlang enquo #' -#' #' @name ensembl_to_symbol #' -#' @param .data a `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) -#' @param .ensembl A character string. The column that is represents ensembl gene id -#' -#' @param action A character string. Whether to join the new information to the input tbl (add), or just get the non-redundant tbl with the new information (get). -#' -#' @details This is useful since different resources use ensembl IDs while others use gene symbol IDs. At the moment this work for human (genes and transcripts) and mouse (genes) data. +#' @param .data a `tbl` (with at least three columns for sample, feature +#' and transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .ensembl A character string. The column that is represents +#' ensembl gene id #' -#' @return A consistent object (to the input) including additional columns for transcript symbol +#' @param action A character string. Whether to join the new information +#' to the input tbl (add), or just get the non-redundant tbl with the new +#' information (get). #' +#' @details This is useful since different resources use ensembl IDs while +#' others use gene symbol IDs. At the moment this work for human (genes and +#' transcripts) and mouse (genes) data. #' +#' @return A consistent object (to the input) including additional columns +#' for transcript symbol #' #' #' @examples #' -#' -#' #' # This function was designed for data.frame #' # Convert from SummarizedExperiment for this example. It is NOT reccomended. #' @@ -2448,10 +2655,9 @@ setGeneric("ensembl_to_symbol", function(.data, standardGeneric("ensembl_to_symbol")) # Set internal -.ensembl_to_symbol = function(.data, +.ensembl_to_symbol <- function(.data, .ensembl, - action = "add") -{ + action = "add") { # Fix NOTEs . = NULL @@ -2488,7 +2694,8 @@ setGeneric("ensembl_to_symbol", function(.data, else stop( - "tidybulk says: action must be either \"add\" for adding this information to your data frame or \"get\" to just get the information" + "tidybulk says: action must be either \"add\" for adding this ", + "information to your data frame or \"get\" to just get the information" ) } @@ -2499,7 +2706,8 @@ setGeneric("ensembl_to_symbol", function(.data, #' @docType methods #' @rdname ensembl_to_symbol-methods #' -#' @return A consistent object (to the input) including additional columns for transcript symbol +#' @return A consistent object (to the input) including additional columns +#' for transcript symbol setMethod("ensembl_to_symbol", "spec_tbl_df", .ensembl_to_symbol) #' ensembl_to_symbol @@ -2508,7 +2716,8 @@ setMethod("ensembl_to_symbol", "spec_tbl_df", .ensembl_to_symbol) #' @docType methods #' @rdname ensembl_to_symbol-methods #' -#' @return A consistent object (to the input) including additional columns for transcript symbol +#' @return A consistent object (to the input) including additional columns +#' for transcript symbol setMethod("ensembl_to_symbol", "tbl_df", .ensembl_to_symbol) #' ensembl_to_symbol @@ -2517,42 +2726,77 @@ setMethod("ensembl_to_symbol", "tbl_df", .ensembl_to_symbol) #' @docType methods #' @rdname ensembl_to_symbol-methods #' -#' @return A consistent object (to the input) including additional columns for transcript symbol +#' @return A consistent object (to the input) including additional columns +#' for transcript symbol setMethod("ensembl_to_symbol", "tidybulk", .ensembl_to_symbol) -#' Perform differential transcription testing using edgeR quasi-likelihood (QLT), edgeR likelihood-ratio (LR), limma-voom, limma-voom-with-quality-weights or DESeq2 +#' Perform differential transcription testing using edgeR quasi-likelihood +#' (QLT), edgeR likelihood-ratio (LR), limma-voom, +#' limma-voom-with-quality-weights or DESeq2 #' #' `r lifecycle::badge("maturing")` #' -#' @description test_differential_abundance() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with additional columns for the statistics from the hypothesis test. +#' @description test_differential_abundance() takes as input A `tbl` +#' (with at least three columns for sample, feature and transcript abundance) +#' or `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a consistent object (to the +#' input) with additional columns for the statistics from the hypothesis test. #' #' @importFrom rlang enquo #' -#' #' @name test_differential_abundance #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) -#' @param .formula A formula representing the desired linear model. If there is more than one factor, they should be in the order factor of interest + additional factors. +#' @param .data A `tbl` (with at least three columns for sample, feature and +#' transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .formula A formula representing the desired linear model. If there +#' is more than one factor, they should be in the order factor of interest + +#' additional factors. #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column #' -#' @param contrasts This parameter takes the format of the contrast parameter of the method of choice. For edgeR and limma-voom is a character vector. For DESeq2 is a list including a character vector of length three. The first covariate is the one the model is tested against (e.g., ~ factor_of_interest) -#' @param method A string character. Either "edgeR_quasi_likelihood" (i.e., QLF), "edgeR_likelihood_ratio" (i.e., LRT), "edger_robust_likelihood_ratio", "DESeq2", "limma_voom", "limma_voom_sample_weights" -#' @param test_above_log2_fold_change A positive real value. This works for edgeR and limma_voom methods. It uses the `treat` function, which tests that the difference in abundance is bigger than this threshold rather than zero \url{https://pubmed.ncbi.nlm.nih.gov/19176553}. -#' @param scaling_method A character string. The scaling method passed to the back-end functions: edgeR and limma-voom (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile"). Setting the parameter to \"none\" will skip the compensation for sequencing-depth for the method edgeR or limma-voom. -#' @param omit_contrast_in_colnames If just one contrast is specified you can choose to omit the contrast label in the colnames. -#' @param prefix A character string. The prefix you would like to add to the result columns. It is useful if you want to compare several methods. -#' @param action A character string. Whether to join the new information to the input tbl (add), or just get the non-redundant tbl with the new information (get). +#' @param contrasts This parameter takes the format of the contrast parameter +#' of the method of choice. For edgeR and limma-voom is a character vector. +#' For DESeq2 is a list including a character vector of length three. The first +#' covariate is the one the model is tested against (e.g., ~ factor_of_interest) +#' @param method A string character. Either "edgeR_quasi_likelihood" (i.e., QLF), +#' "edgeR_likelihood_ratio" (i.e., LRT), "edger_robust_likelihood_ratio", +#' "DESeq2", "limma_voom", "limma_voom_sample_weights" +#' @param test_above_log2_fold_change A positive real value. This works for edgeR +#' and limma_voom methods. It uses the `treat` function, which tests that the +#' difference in abundance is bigger than this threshold rather than zero +#' \url{https://pubmed.ncbi.nlm.nih.gov/19176553}. +#' @param scaling_method A character string. The scaling method passed to the +#' back-end functions: edgeR and limma-voom (i.e., edgeR::calcNormFactors; +#' "TMM","TMMwsp","RLE","upperquartile"). Setting the parameter to \"none\" +#' will skip the compensation for sequencing-depth for the method edgeR or limma-voom. +#' @param omit_contrast_in_colnames If just one contrast is specified you can +#' choose to omit the contrast label in the colnames. +#' @param prefix A character string. The prefix you would like to add to the +#' result columns. It is useful if you want to compare several methods. +#' @param action A character string. Whether to join the new information to the +#' input tbl (add), or just get the non-redundant tbl with the new information (get). #' @param significance_threshold DEPRECATED - A real between 0 and 1 (usually 0.05). -#' @param fill_missing_values DEPRECATED - A boolean. Whether to fill missing sample/transcript values with the median of the transcript. This is rarely needed. -#' @param .contrasts DEPRECATED - This parameter takes the format of the contrast parameter of the method of choice. For edgeR and limma-voom is a character vector. For DESeq2 is a list including a character vector of length three. The first covariate is the one the model is tested against (e.g., ~ factor_of_interest) -#' @param ... Further arguments passed to some of the internal functions. Currently, it is needed just for internal debug. -#' -#' -#' @details This function provides the option to use edgeR \url{https://doi.org/10.1093/bioinformatics/btp616}, limma-voom \url{https://doi.org/10.1186/gb-2014-15-2-r29}, limma_voom_sample_weights \url{https://doi.org/10.1093/nar/gkv412} or DESeq2 \url{https://doi.org/10.1186/s13059-014-0550-8} to perform the testing. -#' All methods use raw counts, irrespective of if scale_abundance or adjust_abundance have been calculated, therefore it is essential to add covariates such as batch effects (if applicable) in the formula. +#' @param fill_missing_values DEPRECATED - A boolean. Whether to fill missing +#' sample/transcript values with the median of the transcript. This is rarely needed. +#' @param .contrasts DEPRECATED - This parameter takes the format of the +#' contrast parameter of the method of choice. For edgeR and limma-voom is a +#' character vector. For DESeq2 is a list including a character vector of length +#' three. The first covariate is the one the model is tested against (e.g., ~ factor_of_interest) +#' @param ... Further arguments passed to some of the internal functions. +#' Currently, it is needed just for internal debug. +#' +#' +#' @details This function provides the option to use edgeR +#' \url{https://doi.org/10.1093/bioinformatics/btp616}, limma-voom +#' \url{https://doi.org/10.1186/gb-2014-15-2-r29}, limma_voom_sample_weights +#' \url{https://doi.org/10.1093/nar/gkv412} or DESeq2 +#' \url{https://doi.org/10.1186/s13059-014-0550-8} to perform the testing. +#' All methods use raw counts, irrespective of if scale_abundance or +#' adjust_abundance have been calculated, therefore it is essential to add +#' covariates such as batch effects (if applicable) in the formula. #' #' Underlying method for edgeR framework: #' @@ -2620,9 +2864,8 @@ setMethod("ensembl_to_symbol", "tidybulk", .ensembl_to_symbol) #' ) #' #' -#' @return A consistent object (to the input) with additional columns for the statistics from the test (e.g., log fold change, p-value and false discovery rate). -#' -#' +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the test (e.g., log fold change, p-value and false discovery rate). #' #' #' @examples @@ -2714,7 +2957,7 @@ setGeneric("test_differential_abundance", function(.data, # Set internal #' @importFrom rlang inform -.test_differential_abundance = function(.data, +.test_differential_abundance <- function(.data, .formula, .sample = NULL, .transcript = NULL, @@ -2725,16 +2968,13 @@ setGeneric("test_differential_abundance", function(.data, scaling_method = "TMM", omit_contrast_in_colnames = FALSE, prefix = "", - action = "add", ..., - # DEPRECATED significance_threshold = NULL, fill_missing_values = NULL, .contrasts = NULL - ) -{ + ) { # Fix NOTEs . = NULL @@ -2752,7 +2992,9 @@ setGeneric("test_differential_abundance", function(.data, if (is_present(significance_threshold) & !is.null(significance_threshold)) { # Signal the deprecation to the user - deprecate_warn("1.1.7", "tidybulk::test_differential_abundance(significance_threshold = )", details = "The argument significance_threshold is now deprecated, tigether with the column significance.") + deprecate_warn("1.1.7", + "tidybulk::test_differential_abundance(significance_threshold = )", + details = "The argument significance_threshold is now deprecated, tigether with the column significance.") } @@ -2760,15 +3002,17 @@ setGeneric("test_differential_abundance", function(.data, if (is_present(fill_missing_values) & !is.null(significance_threshold)) { # Signal the deprecation to the user - deprecate_warn("1.1.7", "tidybulk::test_differential_abundance(fill_missing_values = )", details = "The argument fill_missing_values is now deprecated, you will receive a warning/error instead. Please use externally the methods fill_missing_abundance or impute_missing_abundance instead.") - + deprecate_warn("1.1.7", + "tidybulk::test_differential_abundance(fill_missing_values = )", + details = "The argument fill_missing_values is now deprecated, you will receive a warning/error instead. Please use externally the methods fill_missing_abundance or impute_missing_abundance instead.") } # DEPRECATION OF .constrasts if (is_present(.contrasts) & !is.null(.contrasts)) { # Signal the deprecation to the user - deprecate_warn("1.7.4", "tidybulk::test_differential_abundance(.contrasts = )", details = "The argument .contrasts is now deprecated please use contrasts (without the dot).") + deprecate_warn("1.7.4", "tidybulk::test_differential_abundance(.contrasts = )", + details = "The argument .contrasts is now deprecated please use contrasts (without the dot).") contrasts = .contrasts } @@ -2797,7 +3041,10 @@ such as batch effects (if applicable) in the formula. when( ".abundant" %in% colnames(.) ~ filter(., .abundant), ~ { - warning("tidybulk says: highly abundant transcripts were not identified (i.e. identify_abundant()) or filtered (i.e., keep_abundant), therefore this operation will be performed on unfiltered data. In rare occasions this could be wanted. In standard whole-transcriptome workflows is generally unwanted.") + warning("tidybulk says: highly abundant transcripts were not identified ", + "(i.e. identify_abundant()) or filtered (i.e., keep_abundant), therefore ", + "this operation will be performed on unfiltered data. In rare occasions ", + "this could be wanted. In standard whole-transcriptome workflows is generally unwanted.") (.) } ) %>% @@ -2806,7 +3053,8 @@ such as batch effects (if applicable) in the formula. when( # edgeR - tolower(method) %in% c("edger_quasi_likelihood", "edger_likelihood_ratio", "edger_robust_likelihood_ratio") ~ + tolower(method) %in% c("edger_quasi_likelihood", "edger_likelihood_ratio", + "edger_robust_likelihood_ratio") ~ get_differential_transcript_abundance_bulk( ., .formula, @@ -2871,7 +3119,10 @@ such as batch effects (if applicable) in the formula. ), # Else error - TRUE ~ stop("tidybulk says: the only methods supported at the moment are \"edgeR_quasi_likelihood\" (i.e., QLF), \"edgeR_likelihood_ratio\" (i.e., LRT), \"limma_voom\", \"limma_voom_sample_weights\", \"DESeq2\", \"glmmseq_lme4\", \"glmmseq_glmmTMB\"") + TRUE ~ stop('tidybulk says: the only methods supported at the moment are', + '"edgeR_quasi_likelihood" (i.e., QLF), "edgeR_likelihood_ratio"', + '(i.e., LRT), "limma_voom", "limma_voom_sample_weights", ', + '"DESeq2", "glmmseq_lme4", "glmmseq_glmmTMB"') ) @@ -2900,7 +3151,8 @@ such as batch effects (if applicable) in the formula. else if (action == "only") .data_processed else stop( - "tidybulk says: action must be either \"add\" for adding this information to your data frame or \"get\" to just get the information" + "tidybulk says: action must be either \"add\" for adding this ", + "information to your data frame or \"get\" to just get the information" ) } @@ -2910,7 +3162,8 @@ such as batch effects (if applicable) in the formula. #' @docType methods #' @rdname test_differential_abundance-methods #' -#' @return A consistent object (to the input) with additional columns for the statistics from the test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the test (e.g., log fold change, p-value and false discovery rate). setMethod("test_differential_abundance", "spec_tbl_df", .test_differential_abundance) @@ -2921,7 +3174,9 @@ setMethod("test_differential_abundance", #' @docType methods #' @rdname test_differential_abundance-methods #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). setMethod("test_differential_abundance", "tbl_df", .test_differential_abundance) @@ -2932,7 +3187,9 @@ setMethod("test_differential_abundance", #' @docType methods #' @rdname test_differential_abundance-methods #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). setMethod("test_differential_abundance", "tidybulk", .test_differential_abundance) @@ -2945,25 +3202,37 @@ setMethod("test_differential_abundance", #' #' `r lifecycle::badge("maturing")` #' -#' @description keep_variable() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with additional columns for the statistics from the hypothesis test. +#' @description keep_variable() takes as input A `tbl` (with at least three +#' columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a consistent object +#' (to the input) with additional columns for the statistics from the +#' hypothesis test. #' #' @importFrom rlang enquo #' -#' #' @name keep_variable #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, feature +#' and transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column #' @param top Integer. Number of top transcript to consider -#' @param transform A function that will tranform the counts, by default it is log1p for RNA sequencing data, but for avoinding tranformation you can use identity +#' @param transform A function that will tranform the counts, by default it is +#' log1p for RNA sequencing data, but for avoinding tranformation you can use +#' identity #' -#' @param log_transform DEPRECATED - A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data) +#' @param log_transform DEPRECATED - A boolean, whether the value should be +#' log-transformed (e.g., TRUE for RNA sequencing data) #' -#' @details At the moment this function uses edgeR \url{https://doi.org/10.1093/bioinformatics/btp616} +#' @details At the moment this function uses edgeR +#' \url{https://doi.org/10.1093/bioinformatics/btp616} #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). #' #' Underlying method: #' s <- rowMeans((x - rowMeans(x)) ^ 2) @@ -2971,12 +3240,8 @@ setMethod("test_differential_abundance", #' x <- x[o[1L:top], , drop = FALSE] #' variable_trancripts = rownames(x) #' -#' -#' #' @examples #' -#' -#' #' keep_variable(tidybulk::se_mini, top = 500) #' #' @@ -2997,16 +3262,15 @@ setGeneric("keep_variable", function(.data, standardGeneric("keep_variable")) # Set internal -.keep_variable = function(.data, - .sample = NULL, - .transcript = NULL, - .abundance = NULL, - top = 500, - transform = log1p, - - # DEPRECATED - log_transform = NULL) -{ +.keep_variable <- function(.data, + .sample = NULL, + .transcript = NULL, + .abundance = NULL, + top = 500, + transform = log1p, + + # DEPRECATED + log_transform = NULL) { # Fix NOTEs . = NULL @@ -3015,7 +3279,9 @@ setGeneric("keep_variable", function(.data, if (is_present(log_transform) & !is.null(log_transform)) { # Signal the deprecation to the user - deprecate_warn("1.7.4", "tidybulk::test_differential_abundance(log_transform = )", details = "The argument log_transform is now deprecated, please use transform.") + deprecate_warn("1.7.4", + "tidybulk::test_differential_abundance(log_transform = )", + details = "The argument log_transform is now deprecated, please use transform.") if(log_transform == TRUE) transform = log1p } @@ -3047,7 +3313,9 @@ setGeneric("keep_variable", function(.data, #' @docType methods #' @rdname keep_variable-methods #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for +#' the statistics from the hypothesis test (e.g., log fold change, p-value +#' and false discovery rate). setMethod("keep_variable", "spec_tbl_df", .keep_variable) #' keep_variable @@ -3056,7 +3324,9 @@ setMethod("keep_variable", "spec_tbl_df", .keep_variable) #' @docType methods #' @rdname keep_variable-methods #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). setMethod("keep_variable", "tbl_df", .keep_variable) #' keep_variable @@ -3065,30 +3335,42 @@ setMethod("keep_variable", "tbl_df", .keep_variable) #' @docType methods #' @rdname keep_variable-methods #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). setMethod("keep_variable", "tidybulk", .keep_variable) #' find abundant transcripts #' #' `r lifecycle::badge("maturing")` #' -#' @description identify_abundant() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with additional columns for the statistics from the hypothesis test. +#' @description identify_abundant() takes as input A `tbl` (with at least three +#' columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a consistent object +#' (to the input) with additional columns for the statistics from the hypothesis test. #' #' @importFrom rlang enquo -#' #' @importFrom dplyr filter #' @importFrom tidyr drop_na -#' @importFrom edgeR filterByExpr #' #' @name identify_abundant #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, feature and +#' transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param factor_of_interest The name of the column of the factor of interest. This is used for defining sample groups for the filtering process. It uses the filterByExpr function from edgeR. -#' @param minimum_counts A real positive number. It is the threshold of count per million that is used to filter transcripts/genes out from the scaling procedure. -#' @param minimum_proportion A real positive number between 0 and 1. It is the threshold of proportion of samples for each transcripts/genes that have to be characterised by a cmp bigger than the threshold to be included for scaling procedure. +#' @param factor_of_interest The name of the column of the factor of interest. +#' This is used for defining sample groups for the filtering process. It uses +#' the filterByExpr function from edgeR. +#' @param minimum_counts A real positive number. It is the threshold of count +#' per million that is used to filter transcripts/genes out from the scaling procedure. +#' @param minimum_proportion A real positive number between 0 and 1. It is the +#' threshold of proportion of samples for each transcripts/genes that have to +#' be characterised by a cmp bigger than the threshold to be included for +#' scaling procedure. #' #' @details At the moment this function uses edgeR (DOI: 10.1093/bioinformatics/btp616) #' @@ -3100,15 +3382,12 @@ setMethod("keep_variable", "tidybulk", .keep_variable) #' min.prop = minimum_proportion #' ) #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). -#' -#' -#' +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). #' #' @examples #' -#' -#' #' identify_abundant( #' tidybulk::se_mini #' ) @@ -3128,14 +3407,13 @@ setGeneric("identify_abundant", function(.data, standardGeneric("identify_abundant")) # Set internal -.identify_abundant = function(.data, +.identify_abundant <- function(.data, .sample = NULL, .transcript = NULL, .abundance = NULL, factor_of_interest = NULL, minimum_counts = 10, - minimum_proportion = 0.7) -{ + minimum_proportion = 0.7) { # Fix NOTEs . = NULL @@ -3164,14 +3442,24 @@ setGeneric("identify_abundant", function(.data, } - if( ".abundant" %in% colnames(.data) ) return( .data |> reattach_internals(.data) ) + if(".abundant" %in% colnames(.data)) return(.data |> reattach_internals(.data)) + + + # Check if package is installed, otherwise install + if (find.package("edgeR", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing edgeR needed for differential transcript abundance analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("edgeR", ask = FALSE) + } # If character fail if( !is.null(factor_of_interest) && !factor_of_interest |> quo_is_null() && !factor_of_interest |> quo_is_symbolic() - ) stop("tidybulk says: factor_of_interest must be symbolic (i.e. column name/s not surrounded by single or double quotes) and not a character.") + ) stop("tidybulk says: factor_of_interest must be symbolic (i.e. ", + "column name/s not surrounded by single or double quotes) and not a character.") if( @@ -3257,7 +3545,9 @@ setGeneric("identify_abundant", function(.data, #' @docType methods #' @rdname identify_abundant-methods #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). setMethod("identify_abundant", "spec_tbl_df", .identify_abundant) #' identify_abundant @@ -3266,7 +3556,9 @@ setMethod("identify_abundant", "spec_tbl_df", .identify_abundant) #' @docType methods #' @rdname identify_abundant-methods #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). setMethod("identify_abundant", "tbl_df", .identify_abundant) #' identify_abundant @@ -3275,7 +3567,9 @@ setMethod("identify_abundant", "tbl_df", .identify_abundant) #' @docType methods #' @rdname identify_abundant-methods #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). setMethod("identify_abundant", "tidybulk", .identify_abundant) @@ -3283,21 +3577,34 @@ setMethod("identify_abundant", "tidybulk", .identify_abundant) #' #' \lifecycle{questioning} #' -#' @description keep_abundant() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with additional columns for the statistics from the hypothesis test. +#' @description keep_abundant() takes as input A `tbl` (with at least three +#' columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a consistent object +#' (to the input) with additional columns for the statistics from the +#' hypothesis test. #' #' @importFrom rlang enquo -#' #' @importFrom dplyr filter #' #' @name keep_abundant #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, feature and +#' transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param factor_of_interest The name of the column of the factor of interest. This is used for defining sample groups for the filtering process. It uses the filterByExpr function from edgeR. -#' @param minimum_counts A real positive number. It is the threshold of count per million that is used to filter transcripts/genes out from the scaling procedure. -#' @param minimum_proportion A real positive number between 0 and 1. It is the threshold of proportion of samples for each transcripts/genes that have to be characterised by a cmp bigger than the threshold to be included for scaling procedure. +#' @param factor_of_interest The name of the column of the factor of interest. +#' This is used for defining sample groups for the filtering process. It uses +#' the filterByExpr function from edgeR. +#' @param minimum_counts A real positive number. It is the threshold of count +#' per million that is used to filter transcripts/genes out from the scaling +#' procedure. +#' @param minimum_proportion A real positive number between 0 and 1. It is the +#' threshold of proportion of samples for each transcripts/genes that have to +#' be characterised by a cmp bigger than the threshold to be included for +#' scaling procedure. #' #' @details At the moment this function uses edgeR (DOI: 10.1093/bioinformatics/btp616) #' @@ -3309,15 +3616,12 @@ setMethod("identify_abundant", "tidybulk", .identify_abundant) #' min.prop = minimum_proportion #' ) #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). -#' -#' +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). #' #' #' @examples -#' -#' -#' #' keep_abundant( #' tidybulk::se_mini #' ) @@ -3337,15 +3641,13 @@ setGeneric("keep_abundant", function(.data, standardGeneric("keep_abundant")) # Set internal -.keep_abundant = function(.data, - .sample = NULL, - .transcript = NULL, - .abundance = NULL, - factor_of_interest = NULL, - minimum_counts = 10, - minimum_proportion = 0.7) -{ - +.keep_abundant <- function(.data, + .sample = NULL, + .transcript = NULL, + .abundance = NULL, + factor_of_interest = NULL, + minimum_counts = 10, + minimum_proportion = 0.7) { # Fix NOTEs . = NULL @@ -3389,7 +3691,9 @@ setGeneric("keep_abundant", function(.data, #' @docType methods #' @rdname keep_abundant-methods #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for +#' the statistics from the hypothesis test (e.g., log fold change, p-value +#' and false discovery rate). setMethod("keep_abundant", "spec_tbl_df", .keep_abundant) #' keep_abundant @@ -3398,7 +3702,9 @@ setMethod("keep_abundant", "spec_tbl_df", .keep_abundant) #' @docType methods #' @rdname keep_abundant-methods #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). setMethod("keep_abundant", "tbl_df", .keep_abundant) #' keep_abundant @@ -3407,7 +3713,9 @@ setMethod("keep_abundant", "tbl_df", .keep_abundant) #' @docType methods #' @rdname keep_abundant-methods #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). setMethod("keep_abundant", "tidybulk", .keep_abundant) @@ -3416,34 +3724,50 @@ setMethod("keep_abundant", "tidybulk", .keep_abundant) #' #' `r lifecycle::badge("maturing")` #' -#' @description test_gene_enrichment() takes as input a `tbl` -#' (with at least three columns for sample, feature and transcript abundance) -#' or `SummarizedExperiment` (more convenient if abstracted to tibble with +#' @description test_gene_enrichment() takes as input a `tbl` (with at least +#' three columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with #' library(tidySummarizedExperiment)) and returns a `tbl` of gene set information #' #' @importFrom rlang enquo #' -#' #' @name test_gene_enrichment #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) -#' @param .formula A formula with no response variable, representing the desired linear model +#' @param .data A `tbl` (with at least three columns for sample, feature and +#' transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .formula A formula with no response variable, representing the +#' desired linear model #' @param .sample The name of the sample column #' @param .entrez The ENTREZ ID of the transcripts/genes #' @param .abundance The name of the transcript/gene abundance column -#' @param contrasts This parameter takes the format of the contrast parameter of the method of choice. For edgeR and limma-voom is a character vector. For DESeq2 is a list including a character vector of length three. The first covariate is the one the model is tested against (e.g., ~ factor_of_interest) -#' @param methods A character vector. One or 3 or more methods to use in the testing (currently EGSEA errors if 2 are used). Type EGSEA::egsea.base() to see the supported GSE methods. -#' @param gene_sets A character vector or a list. It can take one or more of the following built-in collections as a character vector: c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "kegg_disease", "kegg_metabolism", "kegg_signaling"), to be used with EGSEA buildIdx. c1 is human specific. Alternatively, a list of user-supplied gene sets can be provided, to be used with EGSEA buildCustomIdx. In that case, each gene set is a character vector of Entrez IDs and the names of the list are the gene set names. +#' @param contrasts This parameter takes the format of the contrast parameter +#' of the method of choice. For edgeR and limma-voom is a character vector. +#' For DESeq2 is a list including a character vector of length three. The first +#' covariate is the one the model is tested against (e.g., ~ factor_of_interest) +#' @param methods A character vector. One or 3 or more methods to use in the +#' testing (currently EGSEA errors if 2 are used). Type EGSEA::egsea.base() to +#' see the supported GSE methods. +#' @param gene_sets A character vector or a list. It can take one or more of +#' the following built-in collections as a character vector: c("h", "c1", "c2", +#' "c3", "c4", "c5", "c6", "c7", "kegg_disease", "kegg_metabolism", +#' "kegg_signaling"), to be used with EGSEA buildIdx. c1 is human specific. +#' Alternatively, a list of user-supplied gene sets can be provided, to be used +#' with EGSEA buildCustomIdx. In that case, each gene set is a character vector +#' of Entrez IDs and the names of the list are the gene set names. #' @param species A character. It can be human, mouse or rat. #' @param cores An integer. The number of cores available #' #' @param method DEPRECATED. Please use methods. -#' @param .contrasts DEPRECATED - This parameter takes the format of the contrast parameter of the method of choice. For edgeR and limma-voom is a character vector. For DESeq2 is a list including a character vector of length three. The first covariate is the one the model is tested against (e.g., ~ factor_of_interest) -#' -#' @details This wrapper executes ensemble gene enrichment analyses of the dataset using EGSEA (DOI:0.12688/f1000research.12544.1) +#' @param .contrasts DEPRECATED - This parameter takes the format of the +#' contrast parameter of the method of choice. For edgeR and limma-voom is a +#' character vector. For DESeq2 is a list including a character vector of length +#' three. The first covariate is the one the model is tested against (e.g., ~ factor_of_interest) #' +#' @details This wrapper executes ensemble gene enrichment analyses of the +#' dataset using EGSEA (DOI:0.12688/f1000research.12544.1) #' -#' dge <- +#' dge = #' data |> #' keep_abundant( #' factor_of_interest = !!as.symbol(parse_formula(.formula)[[1]]), @@ -3455,11 +3779,11 @@ setMethod("keep_abundant", "tidybulk", .keep_abundant) #' as_matrix(rownames = !!.entrez) %>% #' edgeR::DGEList(counts = .) #' -#' idx <- buildIdx(entrezIDs = rownames(dge), species = species, -#' msigdb.gsets = msigdb.gsets, +#' idx = buildIdx(entrezIDs = rownames(dge), species = species, msigdb.gsets = msigdb.gsets, #' kegg.exclude = kegg.exclude) #' #' dge |> +#' #' # Calculate weights #' limma::voom(design, plot = FALSE) |> #' @@ -3474,15 +3798,17 @@ setMethod("keep_abundant", "tidybulk", .keep_abundant) #' ) #' #' @return A consistent object (to the input) - +#' +#' +#' #' #' @examples #' \dontrun{ #' #' library(SummarizedExperiment) -#' se <- tidybulk::se_mini -#' rowData(se)$entrez <- rownames(se) -#' df_entrez <- aggregate_duplicates(se, .transcript = entrez) +#' se = tidybulk::se_mini +#' rowData( se)$entrez = rownames(se ) +#' df_entrez = aggregate_duplicates(se,.transcript = entrez ) #' #' library("EGSEA") #' @@ -3492,10 +3818,9 @@ setMethod("keep_abundant", "tidybulk", .keep_abundant) #' .sample = sample, #' .entrez = entrez, #' .abundance = count, -#' methods = c("roast", "safe", "gage", -#' "padog", "globaltest", "ora"), -#' gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", -#' "kegg_disease", "kegg_metabolism", "kegg_signaling"), +#' methods = c("roast" , "safe", "gage" , "padog" , "globaltest", "ora" ), +#' gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", +#' "c7", "kegg_disease", "kegg_metabolism", "kegg_signaling"), #' species="human", #' cores = 2 #' ) @@ -3507,47 +3832,40 @@ setMethod("keep_abundant", "tidybulk", .keep_abundant) #' @export #' #' -setGeneric("test_gene_enrichment", function( - .data, - .formula, - .sample = NULL, - .entrez, - .abundance = NULL, - contrasts = NULL, - methods = c("camera", "roast", "safe", "gage", - "padog", "globaltest", "ora"), - gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", - "kegg_disease", "kegg_metabolism", "kegg_signaling"), - species, - cores = 10, - - # DEPRECATED - method = NULL, - .contrasts = NULL) - standardGeneric("test_gene_enrichment") -) - +setGeneric("test_gene_enrichment", function(.data, + .formula, + .sample = NULL, + .entrez, + .abundance = NULL, + contrasts = NULL, + methods = c("camera" , "roast" , "safe", "gage", "padog" , "globaltest", "ora"), + gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "kegg_disease", "kegg_metabolism", "kegg_signaling"), + species, + cores = 10, + # DEPRECATED + method = NULL, + .contrasts = NULL + ) + standardGeneric("test_gene_enrichment")) # Set internal #' @importFrom lifecycle deprecate_warn .test_gene_enrichment <- function( - .data, - .formula, - .sample = NULL, - .entrez, - .abundance = NULL, - contrasts = NULL, - methods = c("camera" , "roast" , "safe", "gage", - "padog", "globaltest", "ora" ), - gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", - "kegg_disease", "kegg_metabolism", "kegg_signaling"), - species, - cores = 10, - - # DEPRECATED - method = NULL, - .contrasts = NULL -) { + .data, + .formula, + .sample = NULL, + .entrez, + .abundance = NULL, + contrasts = NULL, + methods = c("camera" , "roast" , "safe", "gage", "padog", "globaltest", "ora" ), + gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", + "kegg_disease", "kegg_metabolism", "kegg_signaling"), + species, + cores = 10, + # DEPRECATED + method = NULL, + .contrasts = NULL + ) { # Fix NOTEs . = NULL @@ -3603,7 +3921,10 @@ setGeneric("test_gene_enrichment", function( when( ".abundant" %in% colnames(.) ~ filter(., .abundant), ~ { - warning("tidybulk says: highly abundant transcripts were not identified (i.e. identify_abundant()) or filtered (i.e., keep_abundant), therefore this operation will be performed on unfiltered data. In rare occasions this could be wanted. In standard whole-transcriptome workflows is generally unwanted.") + warning("tidybulk says: highly abundant transcripts were not identified ", + "(i.e. identify_abundant()) or filtered (i.e., keep_abundant), therefore ", + "this operation will be performed on unfiltered data. In rare occasions this ", + "could be wanted. In standard whole-transcriptome workflows is generally unwanted.") (.) } ) |> @@ -3661,24 +3982,32 @@ setMethod("test_gene_enrichment", #' #' `r lifecycle::badge("maturing")` #' -#' @description test_gene_overrepresentation() takes as input a `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a `tbl` with the GSEA statistics +#' @description test_gene_overrepresentation() takes as input a `tbl` +#' (with at least three columns for sample, feature and transcript abundance) +#' or `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a `tbl` with the GSEA statistics #' #' @importFrom rlang enquo #' @importFrom rlang quo_is_missing -#' @importFrom msigdbr msigdbr_species #' #' @name test_gene_overrepresentation #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, feature and +#' transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) #' @param .sample The name of the sample column #' @param .entrez The ENTREZ ID of the transcripts/genes #' @param .do_test A boolean column name symbol. It indicates the transcript to check -#' @param species A character. For example, human or mouse. MSigDB uses the latin species names (e.g., \"Mus musculus\", \"Homo sapiens\") -#' @param gene_sets A character vector. The subset of MSigDB datasets you want to test against (e.g. \"C2\"). If NULL all gene sets are used (suggested). This argument was added to avoid time overflow of the examples. +#' @param species A character. For example, human or mouse. MSigDB uses the +#' latin species names (e.g., \"Mus musculus\", \"Homo sapiens\") +#' @param gene_sets A character vector. The subset of MSigDB datasets you want +#' to test against (e.g. \"C2\"). If NULL all gene sets are used (suggested). +#' This argument was added to avoid time overflow of the examples. #' #' @param gene_set DEPRECATED. Use gene_sets instead. #' -#' @details This wrapper execute gene enrichment analyses of the dataset using a list of transcripts and GSEA. +#' @details This wrapper execute gene enrichment analyses of the dataset using +#' a list of transcripts and GSEA. #' This wrapper uses clusterProfiler (DOI: doi.org/10.1089/omi.2011.0118) on the back-end. #' #' Undelying method: @@ -3733,7 +4062,7 @@ setGeneric("test_gene_overrepresentation", function(.data, standardGeneric("test_gene_overrepresentation")) # Set internal -.test_gene_overrepresentation = function(.data, +.test_gene_overrepresentation <- function(.data, .entrez, .do_test, species, @@ -3741,7 +4070,6 @@ setGeneric("test_gene_overrepresentation", function(.data, gene_sets = NULL, gene_set = NULL # DEPRECATED ) { - # Comply with CRAN NOTES . = NULL @@ -3756,12 +4084,20 @@ setGeneric("test_gene_overrepresentation", function(.data, stop("tidybulk says: the .entrez parameter appears to no be set") # Check column type - if (.data %>% mutate(my_do_test = !!.do_test) %>% pull(my_do_test) |> is("logical") |> not() ) + if (.data %>% mutate(my_do_test = !!.do_test) %>% pull(my_do_test) |> is("logical") |> not() ) stop("tidybulk says: .do_test column must be logical (i.e., TRUE or FALSE)") + # Check packages msigdbr + # Check if package is installed, otherwise install + if (find.package("msigdbr", quiet = TRUE) |> length() |> equals(0)) { + message("msigdbr not installed. Installing.") + BiocManager::install("msigdbr", ask = FALSE) + } + # Check is correct species name if(species %in% msigdbr::msigdbr_species()$species_name |> not()) - stop(sprintf("tidybulk says: wrong species name. MSigDB uses the latin species names (e.g., %s)", paste(msigdbr::msigdbr_species()$species_name, collapse=", "))) + stop(sprintf("tidybulk says: wrong species name. MSigDB uses the latin species names (e.g., %s)", + paste(msigdbr::msigdbr_species()$species_name, collapse=", "))) .data |> #filter(!!.entrez %in% unique(m_df$entrez_gene)) |> @@ -3771,7 +4107,8 @@ setGeneric("test_gene_overrepresentation", function(.data, entrez_over_to_gsea(species, gene_collections = gene_sets ) |> # Add methods used - memorise_methods_used(c("clusterProfiler", "msigdbr", "msigdb"), object_containing_methods = .data) + memorise_methods_used(c("clusterProfiler", "msigdbr", "msigdb"), + object_containing_methods = .data) } @@ -3813,31 +4150,44 @@ setMethod("test_gene_overrepresentation", #' #' \lifecycle{maturing} #' -#' @description test_gene_rank() takes as input a `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a `tbl` with the GSEA statistics +#' @description test_gene_rank() takes as input a `tbl` (with at least three +#' columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a `tbl` with the GSEA statistics #' #' @importFrom rlang enquo #' @importFrom rlang quo_is_missing -#' @importFrom msigdbr msigdbr_species #' #' @name test_gene_rank #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, feature and +#' transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) #' @param .sample The name of the sample column #' @param .entrez The ENTREZ ID of the transcripts/genes #' @param .arrange_desc A column name of the column to arrange in decreasing order -#' @param species A character. For example, human or mouse. MSigDB uses the latin species names (e.g., \"Mus musculus\", \"Homo sapiens\") -#' @param gene_sets A character vector or a list. It can take one or more of the following built-in collections as a character vector: c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "kegg_disease", "kegg_metabolism", "kegg_signaling"), to be used with EGSEA buildIdx. c1 is human specific. Alternatively, a list of user-supplied gene sets can be provided, to be used with EGSEA buildCustomIdx. In that case, each gene set is a character vector of Entrez IDs and the names of the list are the gene set names. +#' @param species A character. For example, human or mouse. MSigDB uses the +#' latin species names (e.g., \"Mus musculus\", \"Homo sapiens\") +#' @param gene_sets A character vector or a list. It can take one or more of +#' the following built-in collections as a character vector: c("h", "c1", "c2", +#' "c3", "c4", "c5", "c6", "c7", "kegg_disease", "kegg_metabolism", +#' "kegg_signaling"), to be used with EGSEA buildIdx. c1 is human specific. +#' Alternatively, a list of user-supplied gene sets can be provided, to be used +#' with EGSEA buildCustomIdx. In that case, each gene set is a character vector +#' of Entrez IDs and the names of the list are the gene set names. #' #' @param gene_set DEPRECATED. Use gene_sets instead. #' -#' @details This wrapper execute gene enrichment analyses of the dataset using a list of transcripts and GSEA. +#' @details This wrapper execute gene enrichment analyses of the dataset using +#' a list of transcripts and GSEA. #' This wrapper uses clusterProfiler (DOI: doi.org/10.1089/omi.2011.0118) on the back-end. #' #' Undelying method: #'# Get gene sets signatures #'msigdbr::msigdbr(species = species) %>% #' -#' # Filter specific gene_sets if specified. This was introduced to speed up examples executionS +#' # Filter specific gene_sets if specified. This was introduced to speed up +#' examples executionS #' when( #' !is.null(gene_sets ) ~ filter(., gs_cat %in% gene_sets ), #' ~ (.) @@ -3859,8 +4209,6 @@ setMethod("test_gene_overrepresentation", #' @return A consistent object (to the input) #' #' -#' -#' #' @examples #' #' print("Not run for build time.") @@ -3898,7 +4246,7 @@ setGeneric("test_gene_rank", function(.data, standardGeneric("test_gene_rank")) # Set internal -.test_gene_rank = function(.data, +.test_gene_rank <- function(.data, .entrez, .arrange_desc, species, @@ -3914,7 +4262,8 @@ setGeneric("test_gene_rank", function(.data, if (is_present(gene_set) & !is.null(gene_set)) { # Signal the deprecation to the user - deprecate_warn("1.3.1", "tidybulk::test_gene_rank(gene_set = )", details = "The argument gene_set is now deprecated please use gene_sets.") + deprecate_warn("1.3.1", "tidybulk::test_gene_rank(gene_set = )", + details = "The argument gene_set is now deprecated please use gene_sets.") gene_sets = gene_set } @@ -3923,7 +4272,8 @@ setGeneric("test_gene_rank", function(.data, if (is_present(.sample) & !is.null(.sample)) { # Signal the deprecation to the user - deprecate_warn("1.13.2", "tidybulk::test_gene_rank(.sample = )", details = "The argument .sample is now deprecated and not needed anymore.") + deprecate_warn("1.13.2", "tidybulk::test_gene_rank(.sample = )", + details = "The argument .sample is now deprecated and not needed anymore.") } @@ -3939,6 +4289,13 @@ setGeneric("test_gene_rank", function(.data, if(quo_is_missing(.entrez)) stop("tidybulk says: the .entrez parameter appears to no be set") + # Check packages msigdbr + # Check if package is installed, otherwise install + if (find.package("msigdbr", quiet = TRUE) |> length() |> equals(0)) { + message("msigdbr not installed. Installing.") + BiocManager::install("msigdbr", ask = FALSE) + } + # Check is correct species name if(species %in% msigdbr::msigdbr_species()$species_name |> not()) stop(sprintf("tidybulk says: wrong species name. MSigDB uses the latin species names (e.g., %s)", paste(msigdbr::msigdbr_species()$species_name, collapse=", "))) @@ -4017,17 +4374,23 @@ setMethod("test_gene_rank", #' #' `r lifecycle::badge("maturing")` #' -#' @description pivot_sample() takes as input a `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a `tbl` with only sample-related columns -#' +#' @description pivot_sample() takes as input a `tbl` +#' (with at least three columns for sample, feature and transcript abundance) +#' or `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a `tbl` with only sample-related columns #' #' #' @name pivot_sample #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, feature and +#' transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) #' @param .sample The name of the sample column #' #' -#' @details This functon extracts only sample-related information for downstream analysis (e.g., visualisation). It is disruptive in the sense that it cannot be passed anymore to tidybulk function. +#' @details This functon extracts only sample-related information for +#' downstream analysis (e.g., visualisation). It is disruptive in the sense +#' that it cannot be passed anymore to tidybulk function. #' #' @return A `tbl` with transcript-related information #' @@ -4106,17 +4469,24 @@ setMethod("pivot_sample", #' #' `r lifecycle::badge("maturing")` #' -#' @description pivot_transcript() takes as input a `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a `tbl` with only transcript-related columns -#' +#' @description pivot_transcript() takes as input a `tbl` (with at least three +#' columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a `tbl` with only +#' transcript-related columns #' #' #' @name pivot_transcript #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, feature and +#' transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) #' @param .transcript The name of the transcript column #' #' -#' @details This functon extracts only transcript-related information for downstream analysis (e.g., visualisation). It is disruptive in the sense that it cannot be passed anymore to tidybulk function. +#' @details This functon extracts only transcript-related information for +#' downstream analysis (e.g., visualisation). It is disruptive in the sense +#' that it cannot be passed anymore to tidybulk function. #' #' @return A `tbl` with transcript-related information #' @@ -4196,11 +4566,14 @@ setMethod("pivot_transcript", #' #' \lifecycle{questioning} #' -#' @description fill_missing_abundance() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with new observations +#' @description fill_missing_abundance() takes as input A `tbl` (with at least +#' three columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a consistent object +#' (to the input) with new observations #' #' @importFrom rlang enquo #' -#' #' @name fill_missing_abundance #' #' @param .data A `tbl` formatted as | | | | <...> | @@ -4209,7 +4582,8 @@ setMethod("pivot_transcript", #' @param .abundance The name of the transcript abundance column #' @param fill_with A numerical abundance with which fill the missing data points #' -#' @details This function fills the abundance of missing sample-transcript pair using the median of the sample group defined by the formula +#' @details This function fills the abundance of missing sample-transcript +#' pair using the median of the sample group defined by the formula #' #' @return A consistent object (to the input) non-sparse abundance #' @@ -4303,22 +4677,35 @@ setMethod("fill_missing_abundance", "tidybulk", .fill_missing_abundance) #' #' `r lifecycle::badge("maturing")` #' -#' @description impute_missing_abundance() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with additional sample-transcript pairs with imputed transcript abundance. +#' @description impute_missing_abundance() takes as input A `tbl` (with at least +#' three columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a consistent object +#' (to the input) with additional sample-transcript pairs with imputed +#' transcript abundance. #' #' @importFrom rlang enquo #' -#' #' @name impute_missing_abundance #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) -#' @param .formula A formula with no response variable, representing the desired linear model where the first covariate is the factor of interest and the second covariate is the unwanted variation (of the kind ~ factor_of_interest + batch) +#' @param .data A `tbl` (with at least three columns for sample, feature +#' and transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .formula A formula with no response variable, representing the +#' desired linear model where the first covariate is the factor of interest +#' and the second covariate is the unwanted variation (of the kind ~ factor_of_interest + batch) #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param suffix A character string. This is added to the imputed count column names. If empty the count column are overwritten -#' @param force_scaling A boolean. In case a abundance-containing column is not scaled (columns with _scale suffix), setting force_scaling = TRUE will result in a scaling by library size, to compensating for a possible difference in sequencing depth. +#' @param suffix A character string. This is added to the imputed count column +#' names. If empty the count column are overwritten +#' @param force_scaling A boolean. In case a abundance-containing column is not +#' scaled (columns with _scale suffix), setting force_scaling = TRUE will result +#' in a scaling by library size, to compensating for a possible difference in +#' sequencing depth. #' -#' @details This function imputes the abundance of missing sample-transcript pair using the median of the sample group defined by the formula +#' @details This function imputes the abundance of missing sample-transcript +#' pair using the median of the sample group defined by the formula #' #' @return A consistent object (to the input) non-sparse abundance #' @@ -4351,7 +4738,7 @@ setGeneric("impute_missing_abundance", function(.data, standardGeneric("impute_missing_abundance")) # Set internal -.impute_missing_abundance = function(.data, +.impute_missing_abundance <- function(.data, .formula, .sample = NULL, .transcript = NULL, @@ -4434,25 +4821,41 @@ setMethod("impute_missing_abundance", "tidybulk", .impute_missing_abundance) #' #' `r lifecycle::badge("maturing")` #' -#' @description test_differential_cellularity() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with additional columns for the statistics from the hypothesis test. +#' @description test_differential_cellularity() takes as input A `tbl` (with at +#' least three columns for sample, feature and transcript abundance) or +#' `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a consistent object +#' (to the input) with additional columns for the statistics from the hypothesis test. #' #' @importFrom rlang enquo #' @importFrom stringr str_detect #' #' @name test_differential_cellularity #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) -#' @param .formula A formula representing the desired linear model. The formula can be of two forms: multivariable (recommended) or univariable Respectively: \"factor_of_interest ~ .\" or \". ~ factor_of_interest\". The dot represents cell-type proportions, and it is mandatory. If censored regression is desired (coxph) the formula should be of the form \"survival::Surv\(y, dead\) ~ .\" +#' @param .data A `tbl` (with at least three columns for sample, feature and +#' transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .formula A formula representing the desired linear model. The formula +#' can be of two forms: multivariable (recommended) or univariable +#' Respectively: \"factor_of_interest ~ .\" or \". ~ factor_of_interest\". +#' The dot represents cell-type proportions, and it is mandatory. If censored +#' regression is desired (coxph) the formula should be of the form \"survival::Surv\(y, dead\) ~ .\" #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param method A string character. Either \"cibersort\", \"epic\" or \"llsr\". The regression method will be chosen based on being multivariable: lm or cox-regression (both on logit-transformed proportions); or univariable: beta or cox-regression (on logit-transformed proportions). See .formula for multi- or univariable choice. -#' @param reference A data frame. The transcript/cell_type data frame of integer transcript abundance +#' @param method A string character. Either \"cibersort\", \"epic\" or \"llsr\". +#' The regression method will be chosen based on being multivariable: lm or +#' cox-regression (both on logit-transformed proportions); or univariable: +#' beta or cox-regression (on logit-transformed proportions). See .formula +#' for multi- or univariable choice. +#' @param reference A data frame. The transcript/cell_type data frame of +#' integer transcript abundance #' @param significance_threshold A real between 0 and 1 (usually 0.05). #' @param ... Further parameters passed to the method deconvolve_cellularity #' #' @details This routine applies a deconvolution method (e.g., Cibersort; DOI: 10.1038/nmeth.3337) -#' and passes the proportions inferred into a generalised linear model (DOI:dx.doi.org/10.1007/s11749-010-0189-z) +#' and passes the proportions inferred into a generalised linear model +#' (DOI:dx.doi.org/10.1007/s11749-010-0189-z) #' or a cox regression model (ISBN: 978-1-4757-3294-8) #' #' Underlying method for the generalised linear model: @@ -4480,7 +4883,9 @@ setMethod("impute_missing_abundance", "tidybulk", .impute_missing_abundance) #' mutate(.proportion_0_corrected = .proportion_0_corrected |> boot::logit()) %>% #' survival::coxph(.my_formula, .) #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for +#' the statistics from the hypothesis test (e.g., log fold change, p-value +#' and false discovery rate). #' #' #' @@ -4522,7 +4927,7 @@ setGeneric("test_differential_cellularity", function(.data, standardGeneric("test_differential_cellularity")) # Set internal -.test_differential_cellularity = function(.data, +.test_differential_cellularity <- function(.data, .formula, .sample = NULL, .transcript = NULL, @@ -4530,9 +4935,7 @@ setGeneric("test_differential_cellularity", function(.data, method = "cibersort", reference = X_cibersort, significance_threshold = 0.05, - ...) -{ - + ...) { # Fix NOTEs . = NULL @@ -4550,7 +4953,8 @@ setGeneric("test_differential_cellularity", function(.data, # Validate formula if(.formula |> format() |> str_detect(" \\.|\\. ", negate = TRUE)) - stop("tidybulk says: in the formula a dot must be present in either these forms \". ~\" or \"~ .\" with a white-space after or before respectively") + stop("tidybulk says: in the formula a dot must be present in either these ", + "forms \". ~\" or \"~ .\" with a white-space after or before respectively") test_differential_cellularity_( .data, @@ -4596,29 +5000,45 @@ setMethod("test_differential_cellularity", "tidybulk", .test_differential_cellularity) -#' Test of stratification of biological replicates based on tissue composition, one cell-type at the time, using Kaplan-meier curves. +#' Test of stratification of biological replicates based on tissue composition, +#' one cell-type at the time, using Kaplan-meier curves. #' #' `r lifecycle::badge("maturing")` #' -#' @description test_stratification_cellularity() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with additional columns for the statistics from the hypothesis test. +#' @description test_stratification_cellularity() takes as input A `tbl` +#' (with at least three columns for sample, feature and transcript abundance) +#' or `SummarizedExperiment` (more convenient if abstracted to tibble with +#' library(tidySummarizedExperiment)) and returns a consistent object +#' (to the input) with additional columns for the statistics from the hypothesis test. #' #' @importFrom rlang enquo -#' #' @importFrom stringr str_detect #' #' @name test_stratification_cellularity #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) -#' @param .formula A formula representing the desired linear model. The formula can be of two forms: multivariable (recommended) or univariable Respectively: \"factor_of_interest ~ .\" or \". ~ factor_of_interest\". The dot represents cell-type proportions, and it is mandatory. If censored regression is desired (coxph) the formula should be of the form \"survival::Surv\(y, dead\) ~ .\" +#' @param .data A `tbl` (with at least three columns for sample, feature and +#' transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .formula A formula representing the desired linear model. The formula +#' can be of two forms: multivariable (recommended) or univariable +#' Respectively: \"factor_of_interest ~ .\" or \". ~ factor_of_interest\". +#' The dot represents cell-type proportions, and it is mandatory. If censored +#' regression is desired (coxph) the formula should be of the form \"survival::Surv\(y, dead\) ~ .\" #' @param .sample The name of the sample column #' @param .transcript The name of the transcript/gene column #' @param .abundance The name of the transcript/gene abundance column -#' @param method A string character. Either \"cibersort\", \"epic\" or \"llsr\". The regression method will be chosen based on being multivariable: lm or cox-regression (both on logit-transformed proportions); or univariable: beta or cox-regression (on logit-transformed proportions). See .formula for multi- or univariable choice. -#' @param reference A data frame. The transcript/cell_type data frame of integer transcript abundance +#' @param method A string character. Either \"cibersort\", \"epic\" or \"llsr\". +#' The regression method will be chosen based on being multivariable: lm or +#' cox-regression (both on logit-transformed proportions); or univariable: beta +#' or cox-regression (on logit-transformed proportions). See .formula for +#' multi- or univariable choice. +#' @param reference A data frame. The transcript/cell_type data frame of integer +#' transcript abundance #' @param ... Further parameters passed to the method deconvolve_cellularity #' #' @details This routine applies a deconvolution method (e.g., Cibersort; DOI: 10.1038/nmeth.3337) -#' and passes the proportions inferred into a generalised linear model (DOI:dx.doi.org/10.1007/s11749-010-0189-z) +#' and passes the proportions inferred into a generalised linear model +#' (DOI:dx.doi.org/10.1007/s11749-010-0189-z) #' or a cox regression model (ISBN: 978-1-4757-3294-8) #' #' @@ -4635,14 +5055,12 @@ setMethod("test_differential_cellularity", #' mutate(.high_cellularity = .proportion > median(.proportion)) |> #' survival::survdiff(data = data, .my_formula) #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). -#' -#' -#' +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). #' + #' @examples -#' -#' #' tidybulk::se_mini |> #' test_stratification_cellularity( #' survival::Surv(days, dead) ~ ., @@ -4666,16 +5084,14 @@ setGeneric("test_stratification_cellularity", function(.data, standardGeneric("test_stratification_cellularity")) # Set internal -.test_stratification_cellularity = function(.data, +.test_stratification_cellularity <- function(.data, .formula, .sample = NULL, .transcript = NULL, .abundance = NULL, method = "cibersort", reference = X_cibersort, - ...) -{ - + ...) { # Fix NOTEs . = NULL @@ -4693,7 +5109,8 @@ setGeneric("test_stratification_cellularity", function(.data, # Validate formula if(.formula |> format() %>% str_detect(" \\.|\\. ", negate = TRUE)) - stop("tidybulk says: in the formula a dot must be present in either these forms \". ~\" or \"~ .\" with a white-space after or before respectively") + stop("tidybulk says: in the formula a dot must be present in either ", + "these forms \". ~\" or \"~ .\" with a white-space after or before respectively") test_stratification_cellularity_( .data, @@ -4748,25 +5165,25 @@ setMethod("test_stratification_cellularity", #' #' @importFrom rlang enquo #' -#' #' @name get_bibliography #' -#' @param .data A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +#' @param .data A `tbl` (with at least three columns for sample, feature +#' and transcript abundance) or `SummarizedExperiment` (more convenient if +#' abstracted to tibble with library(tidySummarizedExperiment)) #' -#' @details This methods returns the bibliography list of your workflow from the internals of a tidybulk object (attr(., "internals")) +#' @details This methods returns the bibliography list of your workflow from +#' the internals of a tidybulk object (attr(., "internals")) #' #' #' @examples -#' -#' #' get_bibliography(tidybulk::se_mini) #' #' -#' #' @docType methods #' @rdname get_bibliography-methods #' -#' @return NULL. It prints a list of bibliography references for the software used through the workflow. +#' @return NULL. It prints a list of bibliography references for the software +#' used through the workflow. #' @export #' setGeneric("get_bibliography", function(.data) @@ -4849,7 +5266,8 @@ setMethod("get_bibliography", #' @importFrom rlang quo_is_null #' #' @param tbl A tibble -#' @param rownames The column name of the input tibble that will become the rownames of the output matrix +#' @param rownames The column name of the input tibble that will become +#' the rownames of the output matrix #' @param do_check A boolean #' #' @return A matrix @@ -4869,7 +5287,6 @@ as_matrix <- function(tbl, rownames = enquo(rownames) tbl %>% - # Through warning if data frame is not numerical beside the rownames column (if present) ifelse_pipe( do_check && @@ -4882,7 +5299,8 @@ as_matrix <- function(tbl, unique() %>% `%in%`(c("numeric", "integer")) |> not() |> any(), ~ { - warning("tidybulk says: there are NON-numerical columns, the matrix will NOT be numerical") + warning("tidybulk says: there are NON-numerical columns, ", + "the matrix will NOT be numerical") .x } ) |> @@ -4900,4 +5318,3 @@ as_matrix <- function(tbl, as.matrix() } - diff --git a/R/methods_SE.R b/R/methods_SE.R index 6c3df48e..8d74142f 100755 --- a/R/methods_SE.R +++ b/R/methods_SE.R @@ -1,4 +1,3 @@ -#' @importFrom SummarizedExperiment assays .tidybulk_se = function(.data, .sample, .transcript, @@ -8,6 +7,14 @@ # Fix NOTEs . = NULL + # Check if package is installed, otherwise install + if (find.package("SummarizedExperiment", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing SummarizedExperiment") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("SummarizedExperiment", ask = FALSE) + } + # Make col names .sample = enquo(.sample) .transcript = enquo(.transcript) @@ -30,6 +37,9 @@ !!as.symbol(SummarizedExperiment::assays(.data)[1] %>% names ), !!norm_col # scaled counts if any ) + + + } #' tidybulk @@ -62,13 +72,15 @@ setMethod("tidybulk", "SummarizedExperiment", .tidybulk_se) #' setMethod("tidybulk", "RangedSummarizedExperiment", .tidybulk_se) + + + #' @importFrom magrittr multiply_by #' @importFrom magrittr divide_by #' @importFrom SummarizedExperiment assays #' @importFrom SummarizedExperiment colData #' @importFrom utils tail #' @importFrom stats na.omit -#' @importFrom edgeR calcNormFactors #' .scale_abundance_se = function(.data, .sample = NULL, @@ -86,11 +98,20 @@ setMethod("tidybulk", "RangedSummarizedExperiment", .tidybulk_se) # Fix NOTEs . = NULL + # Check if package is installed, otherwise install + if (find.package("edgeR", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing edgeR needed for analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("edgeR", ask = FALSE) + } + # DEPRECATION OF reference function if (is_present(reference_selection_function) & !is.null(reference_selection_function)) { # Signal the deprecation to the user - deprecate_warn("1.1.8", "tidybulk::scale_abundance(reference_selection_function = )", details = "The argument reference_selection_function is now deprecated please use reference_sample. By default the reference selection function is max()") + deprecate_warn("1.1.8", "tidybulk::scale_abundance(reference_selection_function = )", + details = "The argument reference_selection_function is now deprecated please use reference_sample. By default the reference selection function is max()") } @@ -138,8 +159,9 @@ setMethod("tidybulk", "RangedSummarizedExperiment", .tidybulk_se) ) # Communicate the reference if chosen by default - if(is.null(reference_sample)) message(sprintf("tidybulk says: the sample with largest library size %s was chosen as reference for scaling", reference)) - + if(is.null(reference_sample)) { + message(sprintf("tidybulk says: the sample with largest library size %s was chosen as reference for scaling", reference)) + } # Calculate TMM nf <- edgeR::calcNormFactors( @@ -186,7 +208,7 @@ setMethod("tidybulk", "RangedSummarizedExperiment", .tidybulk_se) memorise_methods_used(c("edger", "tmm")) %>% # Attach column internals - add_tt_columns(.abundance_scaled = !!(function(x, v) enquo(v))(x,!!as.symbol(value_scaled))) + add_tt_columns(.abundance_scaled = !!(function(x, v) enquo(v))(x,!!as.symbol(value_scaled))) } @@ -222,9 +244,6 @@ setMethod("scale_abundance", #' @importFrom SummarizedExperiment colData #' @importFrom utils tail #' @importFrom stats na.omit -#' @importFrom limma normalizeQuantiles -#' @importFrom preprocessCore normalize.quantiles.use.target -#' @importFrom preprocessCore normalize.quantiles.determine.target #' .quantile_normalise_abundance_se = function(.data, .sample = NULL, @@ -233,6 +252,7 @@ setMethod("scale_abundance", method = "limma_normalize_quantiles", action = NULL) { + # Fix NOTEs . = NULL @@ -262,6 +282,14 @@ setMethod("scale_abundance", else if(tolower(method) == "limma_normalize_quantiles"){ + # Check if package is installed, otherwise install + if (find.package("limma", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing limma needed for analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("limma", ask = FALSE) + } + .data_norm <- .data %>% assay(my_assay) |> @@ -272,6 +300,14 @@ setMethod("scale_abundance", } else if(tolower(method) == "preprocesscore_normalize_quantiles_use_target"){ + # Check if package is installed, otherwise install + if (find.package("preprocessCore", quiet = TRUE) %>% length %>% equals(0)) { + message("tidybulk says: Installing preprocessCore needed for analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("preprocessCore", ask = FALSE) + } + .data_norm = .data |> assay(my_assay) |> @@ -353,7 +389,9 @@ setMethod("quantile_normalise_abundance", method %>% when( (.) == "kmeans" ~ get_clusters_kmeans_bulk_SE, - (.) == "SNN" ~ stop("tidybulk says: Matrix package (v1.3-3) causes an error with Seurat::FindNeighbors used in this method. We are trying to solve this issue. At the moment this option in unaviable."), #get_clusters_SNN_bulk_SE, + (.) == "SNN" ~ stop("tidybulk says: Matrix package (v1.3-3) causes an ", + "error with Seurat::FindNeighbors used in this method. We are trying to ", + "solve this issue. At the moment this option in unaviable."), #get_clusters_SNN_bulk_SE, ~ stop("tidybulk says: the only supported methods are \"kmeans\" or \"SNN\" ") ) @@ -506,7 +544,8 @@ setMethod("cluster_elements", # Communicate the attribute added { - rlang::inform(sprintf("tidybulk says: to access the raw results do `attr(..., \"internals\")$%s`", method), .frequency_id = sprintf("Access %s results", method), .frequency = "always") + rlang::inform(sprintf("tidybulk says: to access the raw results do `attr(..., \"internals\")$%s`", method), + .frequency_id = sprintf("Access %s results", method), .frequency = "always") (.) } @@ -636,7 +675,7 @@ setMethod("rotate_dimensions", .rotate_dimensions_se) -.remove_redundancy_se = function(.data, +.remove_redundancy_se <- function(.data, .element = NULL, .feature = NULL, .abundance = NULL, @@ -711,7 +750,8 @@ setMethod("rotate_dimensions", ) } , ~ stop( - "tidybulk says: method must be either \"correlation\" for dropping correlated elements or \"reduced_dimension\" to drop the closest pair according to two dimensions (e.g., PCA)" + "tidybulk says: method must be either \"correlation\" for dropping ", + "correlated elements or \"reduced_dimension\" to drop the closest pair according to two dimensions (e.g., PCA)" ) ) @@ -727,7 +767,9 @@ setMethod("rotate_dimensions", when( method == "correlation" ~ memorise_methods_used(., "widyr"), method == "reduced_dimensions" ~ (.), - ~ stop("tidybulk says: method must be either \"correlation\" for dropping correlated elements or \"reduced_dimension\" to drop the closest pair according to two dimensions (e.g., PCA)") + ~ stop("tidybulk says: method must be either \"correlation\" for ", + "dropping correlated elements or \"reduced_dimension\" to drop ", + "the closest pair according to two dimensions (e.g., PCA)") ) } @@ -748,8 +790,6 @@ setMethod("remove_redundancy", #' @inheritParams remove_redundancy #' #' @importFrom rlang quo -#' @importFrom sva ComBat -#' @importFrom sva ComBat_seq #' #' @docType methods #' @rdname remove_redundancy-methods @@ -761,31 +801,33 @@ setMethod("remove_redundancy", .remove_redundancy_se) -.adjust_abundance_se = function(.data, - +.adjust_abundance_se <- function(.data, # DEPRECATED .formula = NULL, - .factor_unwanted = NULL, .factor_of_interest = NULL, - .abundance = NULL, - method = "combat_seq", - - ..., # DEPRECATED transform = NULL, inverse_transform = NULL ) { - # Fix NOTEs . = NULL .abundance = enquo(.abundance) + # Check if package is installed, otherwise install + if (find.package("sva", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing sva - Combat needed for adjustment for unwanted variation") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("sva", ask = FALSE) + } + + # DEPRECATION OF log_transform if ( (is_present(transform) & !is.null(transform)) | @@ -793,7 +835,9 @@ setMethod("remove_redundancy", ) { # Signal the deprecation to the user - deprecate_warn("1.11.6", "tidybulk::test_differential_abundance(transform = )", details = "The argument transform and inverse_transform is now deprecated, please use method argument instead specifying \"combat\" or \"combat_seq\".") + deprecate_warn("1.11.6", "tidybulk::test_differential_abundance(transform = )", + details = "The argument transform and inverse_transform is now deprecated, + please use method argument instead specifying \"combat\" or \"combat_seq\".") } @@ -805,12 +849,17 @@ setMethod("remove_redundancy", if (is_present(.formula) & !is.null(.formula)) { # Signal the deprecation to the user - deprecate_warn("1.11.6", "tidybulk::test_differential_abundance(.formula = )", details = "The argument .formula is now deprecated, please use factor_unwanted and factor_of_interest. Using the formula, the first factor is of interest and the second is unwanted") + deprecate_warn("1.11.6", "tidybulk::test_differential_abundance(.formula = )", + details = "The argument .formula is now deprecated, + please use factor_unwanted and factor_of_interest. + Using the formula, the first factor is of interest and the second is unwanted") # Check that .formula includes at least two covariates if (parse_formula(.formula) %>% length %>% st(2)) stop( - "The .formula must contain two covariates, the first being the factor of interest, the second being the factor of unwanted variation" + "The .formula must contain two covariates, + the first being the factor of interest, + the second being the factor of unwanted variation" ) # Check that .formula includes no more than two covariates at the moment @@ -830,7 +879,9 @@ setMethod("remove_redundancy", # Create design matrix design = model.matrix( - object = as.formula(sprintf("~ %s", colData(.data) |> as_tibble() |> select(!!.factor_of_interest) |> colnames() |> str_c(collapse = '+'))), + object = as.formula(sprintf("~ %s", colData(.data) |> as_tibble() |> + select(!!.factor_of_interest) |> + colnames() |> str_c(collapse = '+'))), # get first argument of the .formula data = colData(.data) ) @@ -846,19 +897,20 @@ setMethod("remove_redundancy", get_assay_scaled_if_exists_SE(.data) ) - if(tolower(method) == "combat") { + if(tolower(method) == "combat"){ + my_assay_adjusted = .data |> assay(my_assay) |> # Check if log transform is needed log1p() %>% - # Add little noise to avoid all 0s for a covariate that would error combat code (not statistics that would be fine) + # Add little noise to avoid all 0s for a covariate that would error combat + # code (not statistics that would be fine) `+` (rnorm(length(.), 0, 0.000001)) - for (i in colnames(my_batch)) { - my_assay_adjusted <- + for(i in colnames(my_batch)){ + my_assay_adjusted = my_assay_adjusted %>% - # Run combat sva::ComBat( batch = my_batch[,i] |> pull(1), @@ -869,11 +921,12 @@ setMethod("remove_redundancy", } # Tranfrom back - my_assay_adjusted <- - my_assay_adjusted %>% - apply(MARGIN=2, FUN=function(col) pmax(expm1(col), 0)) + my_assay_adjusted = + my_assay_adjusted |> + expm1() |> + (\(x) apply(x, 2, pmax, 0))() } - else if(tolower(method) == "combat_seq"){ + else if (tolower(method) == "combat_seq"){ my_assay_adjusted = .data %>% @@ -891,15 +944,18 @@ setMethod("remove_redundancy", } } - else if (tolower(method) == "limma_remove_batch_effect") { - unwanted_covariate_matrix <- + else if(tolower(method) == "limma_remove_batch_effect") { + + unwanted_covariate_matrix = model.matrix( - object = as.formula(sprintf("~ 0 + %s", colData(.data) |> as_tibble() |> select(!!.factor_unwanted) |> colnames() |> str_c(collapse = '+'))), + object = as.formula(sprintf("~ 0 + %s", colData(.data) |> as_tibble() |> + select(!!.factor_unwanted) |> colnames() |> + str_c(collapse = '+'))), # get first argument of the .formula data = colData(.data) ) - my_assay_adjusted <- + my_assay_adjusted = .data |> assay(my_assay) |> edgeR::cpm(log = T) |> @@ -908,21 +964,26 @@ setMethod("remove_redundancy", covariates = unwanted_covariate_matrix, ... ) |> - apply(MARGIN=2, FUN=function(col) pmax(expm1(col), 0)) + expm1() |> + apply(2, pmax, 0) + } else { - stop("tidybulk says: the argument \"method\" must be \"combat_seq\", \"combat\", or \"limma_remove_batch_effect\"") + stop("tidybulk says: the argument \"method\" must be \"combat_seq\", + \"combat\", or \"limma_remove_batch_effect\"") } # Add the assay - my_assay_scaled <- list(my_assay_adjusted) %>% setNames(value_adjusted) + my_assay_scaled = list(my_assay_adjusted) %>% setNames(value_adjusted) - assays(.data) <- assays(.data) %>% c(my_assay_scaled) + assays(.data) = assays(.data) %>% c(my_assay_scaled) # Return .data %>% + # Add methods memorise_methods_used("sva") %>% + # Attach column internals add_tt_columns(.abundance_adjusted = !!(function(x, v) enquo(v))(x, !!as.symbol(value_adjusted))) @@ -959,14 +1020,12 @@ setMethod("adjust_abundance", #' @importFrom SummarizedExperiment SummarizedExperiment #' @importFrom GenomicRanges makeGRangesListFromDataFrame #' @importFrom dplyr setdiff -.aggregate_duplicates_se = function(.data, - +.aggregate_duplicates_se <- function(.data, .sample = NULL, .transcript = NULL, .abundance = NULL, aggregation_function = sum, keep_integer = TRUE) { - # Fix NOTEs . = NULL @@ -974,12 +1033,19 @@ setMethod("adjust_abundance", .transcript = enquo(.transcript) - if(quo_is_null(.transcript)) stop("tidybulk says: using SummarizedExperiment with aggregate_duplicates, you need to specify .transcript parameter. It should be a feature-wise column (e.g. gene symbol) that you want to collapse he features with (e.g. ensembl). It cannot be the representation of rownames(SummarizedExperiment), as those are unique by definition, and not part of rowData per-se.") + if(quo_is_null(.transcript)) stop("tidybulk says: using SummarizedExperiment + with aggregate_duplicates, you need to specify .transcript parameter. + It should be a feature-wise column (e.g. gene symbol) that you want to + collapse he features with (e.g. ensembl). It cannot be the representation + of rownames(SummarizedExperiment), as those are unique by definition, + and not part of rowData per-se.") if(!quo_name(.transcript) %in% colnames( .data %>% rowData())) - stop("tidybulk says: the .transcript argument must be a feature-wise column names. The feature-wise information can be found with rowData()") + stop("tidybulk says: the .transcript argument must be a feature-wise column + names. The feature-wise information can be found with rowData()") if(!is.null(.sample) | !is.null(.abundance)) - warning("tidybulk says: for SummarizedExperiment objects only the argument .transcript (feature ID to collapse) is considered") + warning("tidybulk says: for SummarizedExperiment objects only the argument + .transcript (feature ID to collapse) is considered") collapse_function = function(x){ x %>% unique() %>% paste(collapse = "___") } @@ -1028,7 +1094,8 @@ setMethod("adjust_abundance", # If no duplicate exit if(!nrow(new_row_data) is.na() |> which() |> length() |> gt(0)) - stop(sprintf("tidybulk says: you have some %s that are NAs", quo_name(.transcript))) + stop(sprintf("tidybulk says: you have some %s that are NAs", + quo_name(.transcript))) .x = combineByRow(.x, aggregation_function) .x = .x[match(new_row_data[,quo_name(.transcript)], rownames(.x)),,drop=FALSE] @@ -1076,9 +1144,12 @@ setMethod("adjust_abundance", # Through warning if there are logicals of factor in the data frame # because they cannot be merged if they are not unique - if (length(non_standard_columns)>0 & new_range_data %>% pull(!!.transcript) %>% duplicated() %>% which() %>% length() %>% gt(0) ) { + if (length(non_standard_columns)>0 & new_range_data %>% + pull(!!.transcript) %>% duplicated() %>% which() %>% length() %>% gt(0) ) { warning(paste(capture.output({ - cat(crayon::blue("tidybulk says: If duplicates exist from the following columns, only the first instance was taken (lossy behaviour), as aggregating those classes with concatenation is not possible.\n")) + cat(crayon::blue("tidybulk says: If duplicates exist from the following + columns, only the first instance was taken (lossy behaviour), + as aggregating those classes with concatenation is not possible.\n")) print(rowData(.data)[1,non_standard_columns,drop=FALSE]) }), collapse = "\n")) } @@ -1146,13 +1217,13 @@ setMethod("aggregate_duplicates", .aggregate_duplicates_se) + #' @importFrom rlang quo_is_symbolic -.deconvolve_cellularity_se = function(.data, +.deconvolve_cellularity_se <- function(.data, reference = X_cibersort, method = "cibersort", prefix = "", ...) { - # Fix NOTEs . = NULL @@ -1187,13 +1258,37 @@ setMethod("aggregate_duplicates", # Execute do.call because I have to deal with ... method %>% tolower %>% equals("cibersort") ~ { + # Check if package is installed, otherwise install + if (find.package("class", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing class needed for Cibersort") + install.packages("class", repos = "https://cloud.r-project.org", + dependencies = c("Depends", "Imports")) + } + + # Check if package is installed, otherwise install + if (find.package("e1071", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing e1071 needed for Cibersort") + install.packages("e1071", repos = "https://cloud.r-project.org", + dependencies = c("Depends", "Imports")) + } + + # Check if package is installed, otherwise install + if (find.package("preprocessCore", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing preprocessCore needed for Cibersort") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("preprocessCore", ask = FALSE) + + } + # Choose reference reference = reference %>% when(is.null(.) ~ X_cibersort, ~ .) # Validate reference validate_signature_SE(., reference) - do.call(my_CIBERSORT, list(Y = ., X = reference, QN=FALSE) %>% c(dots_args)) %$% + do.call(my_CIBERSORT, list(Y = ., X = reference, QN=FALSE) %>% + c(dots_args)) %$% proportions %>% as_tibble(rownames = quo_name(.sample)) %>% select(-`P-value`,-Correlation,-RMSE) @@ -1227,8 +1322,16 @@ setMethod("aggregate_duplicates", # Other (hidden for the moment) methods using third party wrapper https://icbi-lab.github.io/immunedeconv method %>% tolower %in% c("mcp_counter", "quantiseq", "xcell") ~ { + # Check if package is installed, otherwise install + if (find.package("immunedeconv", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing immunedeconv") + devtools::install_github("icbi-lab/immunedeconv", upgrade = FALSE) + } + if(method %in% c("mcp_counter", "quantiseq", "xcell") & !"immunedeconv" %in% (.packages())) - stop("tidybulk says: for xcell, mcp_counter, or quantiseq deconvolution you should have the package immunedeconv attached. Please execute library(immunedeconv)") + stop("tidybulk says: for xcell, mcp_counter, + or quantiseq deconvolution you should have the package + immunedeconv attached. Please execute library(immunedeconv)") (.) %>% deconvolute(method %>% tolower, tumor = FALSE) %>% @@ -1301,8 +1404,7 @@ setMethod( scaling_method = "TMM", omit_contrast_in_colnames = FALSE, prefix = "", - ...) -{ + ...) { .abundance = enquo(.abundance) @@ -1313,7 +1415,8 @@ setMethod( if (is_present(.contrasts) & !is.null(.contrasts)) { # Signal the deprecation to the user - deprecate_warn("1.7.4", "tidybulk::test_differential_abundance(.contrasts = )", details = "The argument .contrasts is now deprecated please use contrasts (without the dot).") + deprecate_warn("1.7.4", "tidybulk::test_differential_abundance(.contrasts = )", + details = "The argument .contrasts is now deprecated please use contrasts (without the dot).") contrasts = .contrasts } @@ -1323,7 +1426,8 @@ setMethod( tidybulk says: All testing methods use raw counts, irrespective of if scale_abundance or adjust_abundance have been calculated. Therefore, it is essential to add covariates such as batch effects (if applicable) in the formula. -=====================================", .frequency_id = "All testing methods use raw counts", .frequency = "once") +=====================================", + .frequency_id = "All testing methods use raw counts", .frequency = "once") # Test test_above_log2_fold_change @@ -1333,7 +1437,8 @@ such as batch effects (if applicable) in the formula. # Filter abundant if performed .data = filter_if_abundant_were_identified(.data) - if(tolower(method) %in% c("edger_quasi_likelihood", "edger_likelihood_ratio", "edger_robust_likelihood_ratio")) + if(tolower(method) %in% c("edger_quasi_likelihood", "edger_likelihood_ratio", + "edger_robust_likelihood_ratio")) my_differential_abundance = get_differential_transcript_abundance_bulk_SE( .data, @@ -1397,7 +1502,10 @@ such as batch effects (if applicable) in the formula. ... ) else - stop("tidybulk says: the only methods supported at the moment are \"edgeR_quasi_likelihood\" (i.e., QLF), \"edgeR_likelihood_ratio\" (i.e., LRT), \"limma_voom\", \"limma_voom_sample_weights\", \"DESeq2\", \"glmmseq_lme4\", \"glmmseq_glmmTMB\"") + stop("tidybulk says: the only methods supported at the moment are + \"edgeR_quasi_likelihood\" (i.e., QLF), \"edgeR_likelihood_ratio\" + (i.e., LRT), \"limma_voom\", \"limma_voom_sample_weights\", \"DESeq2\", + \"glmmseq_lme4\", \"glmmseq_glmmTMB\"") statistics = @@ -1417,18 +1525,24 @@ such as batch effects (if applicable) in the formula. # Add bibliography when( - tolower(method) == "edger_likelihood_ratio" ~ (.) %>% memorise_methods_used(c("edger", "edgeR_likelihood_ratio")), - tolower(method) == "edger_quasi_likelihood" ~ (.) %>% memorise_methods_used(c("edger", "edgeR_quasi_likelihood")), - tolower(method) == "edger_robust_likelihood_ratio" ~ (.) %>% memorise_methods_used(c("edger", "edger_robust_likelihood_ratio")), + tolower(method) == "edger_likelihood_ratio" ~ (.) %>% + memorise_methods_used(c("edger", "edgeR_likelihood_ratio")), + tolower(method) == "edger_quasi_likelihood" ~ (.) %>% + memorise_methods_used(c("edger", "edgeR_quasi_likelihood")), + tolower(method) == "edger_robust_likelihood_ratio" ~ (.) %>% + memorise_methods_used(c("edger", "edger_robust_likelihood_ratio")), tolower(method) == "limma_voom" ~ (.) %>% memorise_methods_used("voom"), - tolower(method) == "limma_voom_sample_weights" ~ (.) %>% memorise_methods_used("voom_sample_weights"), + tolower(method) == "limma_voom_sample_weights" ~ (.) %>% + memorise_methods_used("voom_sample_weights"), tolower(method) == "deseq2" ~ (.) %>% memorise_methods_used("deseq2"), - tolower(method) %in% c("glmmseq_lme4", "glmmseq_glmmtmb") ~ (.) %>% memorise_methods_used("glmmseq"), + tolower(method) %in% c("glmmseq_lme4", "glmmseq_glmmtmb") ~ (.) %>% + memorise_methods_used("glmmseq"), ~ stop("tidybulk says: method not supported") ) %>% when( - !is.null(test_above_log2_fold_change) ~ (.) %>% memorise_methods_used("treat"), + !is.null(test_above_log2_fold_change) ~ (.) %>% + memorise_methods_used("treat"), ~ (.) ) %>% @@ -1436,7 +1550,10 @@ such as batch effects (if applicable) in the formula. # Communicate the attribute added { - rlang::inform(sprintf("tidybulk says: to access the raw results (fitted GLM) do `attr(..., \"internals\")$%s`", method), .frequency_id = sprintf("Access DE results %s", method), .frequency = "always") + rlang::inform(sprintf("tidybulk says: to access the raw results (fitted GLM) + do `attr(..., \"internals\")$%s`", method), + .frequency_id = sprintf("Access DE results %s", method), + .frequency = "always") (.) } @@ -1523,7 +1640,6 @@ setMethod("keep_variable", #' @importFrom purrr map_chr #' @importFrom tidyr unite #' @importFrom Matrix colSums -#' @importFrom edgeR filterByExpr #' #' @docType methods #' @rdname keep_variable-methods @@ -1534,15 +1650,13 @@ setMethod("keep_variable", "RangedSummarizedExperiment", .keep_variable_se) -.identify_abundant_se = function(.data, +.identify_abundant_se <- function(.data, .sample = NULL, .transcript = NULL, .abundance = NULL, factor_of_interest = NULL, minimum_counts = 10, - minimum_proportion = 0.7) -{ - + minimum_proportion = 0.7) { # Fix NOTEs . = NULL @@ -1555,7 +1669,9 @@ setMethod("keep_variable", !is.null(factor_of_interest) && !factor_of_interest |> quo_is_null() && !factor_of_interest |> quo_is_symbolic() - ) stop("tidybulk says: factor_of_interest must be symbolic (i.e. column name/s not surrounded by single or double quotes) and not a character.") + ) stop("tidybulk says: factor_of_interest must be symbolic + (i.e. column name/s not surrounded by single or double quotes) + and not a character.") # Check factor_of_interest @@ -1564,7 +1680,8 @@ setMethod("keep_variable", quo_is_symbolic(factor_of_interest) && (quo_names(factor_of_interest) %in% colnames(colData(.data)) |> all() %>% not()) ) - stop(sprintf("tidybulk says: the column %s is not present in colData", quo_names(factor_of_interest))) + stop(sprintf("tidybulk says: the column %s is not present in colData", + quo_names(factor_of_interest))) if (minimum_counts < 0) stop("The parameter minimum_counts must be > 0") @@ -1574,7 +1691,8 @@ setMethod("keep_variable", # If column is present use this instead of doing more work if(".abundant" %in% colnames(colData(.data))){ - message("tidybulk says: the column .abundant already exists in colData. Nothing was done") + message("tidybulk says: the column .abundant already exists in colData. + Nothing was done") # Return return(.data) @@ -1608,7 +1726,8 @@ setMethod("keep_variable", unlist() %in% c("numeric", "integer", "double") |> any() ) - stop("tidybulk says: The factor(s) of interest must not include continuous variables (e.g., integer,numeric, double).") + stop("tidybulk says: The factor(s) of interest must not include continuous + variables (e.g., integer,numeric, double).") string_factor_of_interest = colData(.data)[, factor_of_interest, drop=FALSE] |> @@ -1622,6 +1741,16 @@ setMethod("keep_variable", string_factor_of_interest = NULL } + + + # Check if package is installed, otherwise install + if (find.package("edgeR", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing edgeR needed for analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("edgeR", ask = FALSE) + } + # If no assay is specified take first my_assay = ifelse( quo_is_symbol(.abundance), @@ -1745,21 +1874,23 @@ setMethod("keep_abundant", #' #' #' -.test_gene_enrichment_SE = function(.data, - .formula, - .sample = NULL, - .entrez, - .abundance = NULL, - contrasts = NULL, - methods = c("camera" , "roast" , "safe", "gage" , "padog" , "globaltest", "ora" ), - gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "kegg_disease", "kegg_metabolism", "kegg_signaling"), - species, - cores = 10, - - # DEPRECATED - method = NULL, - .contrasts = NULL - ) { +.test_gene_enrichment_SE <- function( + .data, + .formula, + .sample = NULL, + .entrez, + .abundance = NULL, + contrasts = NULL, + methods = c("camera", "roast", "safe", "gage", "padog", "globaltest","ora"), + gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", + "kegg_disease", "kegg_metabolism", "kegg_signaling"), + species, + cores = 10, + + # DEPRECATED + method = NULL, + .contrasts = NULL + ) { # Fix NOTEs . = NULL @@ -1768,7 +1899,8 @@ setMethod("keep_abundant", if (is_present(method) & !is.null(method)) { # Signal the deprecation to the user - deprecate_warn("1.3.2", "tidybulk::test_gene_enrichment(method = )", details = "The argument method is now deprecated please use methods") + deprecate_warn("1.3.2", "tidybulk::test_gene_enrichment(method = )", + details = "The argument method is now deprecated please use methods") methods = method } @@ -1776,7 +1908,8 @@ setMethod("keep_abundant", if (is_present(.contrasts) & !is.null(.contrasts)) { # Signal the deprecation to the user - deprecate_warn("1.7.4", "tidybulk::test_differential_abundance(.contrasts = )", details = "The argument .contrasts is now deprecated please use contrasts (without the dot).") + deprecate_warn("1.7.4", "tidybulk::test_differential_abundance(.contrasts = )", + details = "The argument .contrasts is now deprecated please use contrasts (without the dot).") contrasts = .contrasts } @@ -1796,7 +1929,8 @@ setMethod("keep_abundant", # Check if duplicated entrez if(rowData(.data)[,quo_name(.entrez)] %>% duplicated() %>% any()) - stop("tidybulk says: There are duplicated .entrez IDs. Please use aggregate_duplicates(.transcript = entrez).") + stop("tidybulk says: There are duplicated .entrez IDs. + Please use aggregate_duplicates(.transcript = entrez).") # For use within when .my_data = .data @@ -1837,12 +1971,14 @@ setMethod("keep_abundant", # Check if package is installed, otherwise install if (find.package("EGSEA", quiet = TRUE) %>% length %>% equals(0)) { stop(" - EGSEA not installed. Please install it. EGSEA require manual installation for not overwelming the user in case it is not needed. - BiocManager::install(\"EGSEA\", ask = FALSE) + EGSEA not installed. Please install it. EGSEA require manual installation + for not overwelming the user in case it is not needed. + BiocManager::install(\"EGSEA\", ask = FALSE) ") } if (!"EGSEA" %in% (.packages())) { - stop("EGSEA package not loaded. Please run library(\"EGSEA\"). With this setup, EGSEA require manual loading, for technical reasons.") + stop("EGSEA package not loaded. Please run library(\"EGSEA\"). + With this setup, EGSEA require manual loading, for technical reasons.") } dge = @@ -1912,7 +2048,8 @@ setMethod("keep_abundant", } - idx = buildIdx(entrezIDs = rownames(dge), species = species, msigdb.gsets = msigdb.gsets, + idx = buildIdx(entrezIDs = rownames(dge), species = species, + msigdb.gsets = msigdb.gsets, kegg.exclude = kegg.exclude) # Due to a bug with kegg pathview overlays, this collection is run without report @@ -1965,7 +2102,9 @@ setMethod("keep_abundant", } if (length(kegg_genesets) != 0) { - message("tidybulk says: due to a bug in the call to KEGG database (http://supportupgrade.bioconductor.org/p/122172/#122218), the analysis for this database is run without report production.") + message("tidybulk says: due to a bug in the call to KEGG database + (http://supportupgrade.bioconductor.org/p/122172/#122218), + the analysis for this database is run without report production.") res_kegg = dge %>% @@ -2025,7 +2164,6 @@ setMethod("test_gene_enrichment", #' test_gene_enrichment #' @inheritParams test_gene_enrichment -#' @importFrom msigdbr msigdbr_species #' #' @docType methods #' @rdname test_gene_enrichment-methods @@ -2053,7 +2191,8 @@ setMethod("test_gene_enrichment", if (is_present(gene_set) & !is.null(gene_set)) { # Signal the deprecation to the user - deprecate_warn("1.3.1", "tidybulk::.test_gene_overrepresentation(gene_set = )", details = "The argument gene_set is now deprecated please use gene_sets.") + deprecate_warn("1.3.1", "tidybulk::.test_gene_overrepresentation(gene_set = )", + details = "The argument gene_set is now deprecated please use gene_sets.") gene_sets = gene_set } @@ -2070,12 +2209,22 @@ setMethod("test_gene_enrichment", stop("tidybulk says: the .entrez parameter appears to no be set") # Check column type - if (.data %>% rowData() %>% as_tibble(rownames = f_(.data)$name) %>% mutate(my_do_test = !!.do_test) %>% pull(my_do_test) |> is("logical") %>% not()) + if (.data %>% rowData() %>% as_tibble(rownames = f_(.data)$name) %>% + mutate(my_do_test = !!.do_test) %>% pull(my_do_test) |> is("logical") %>% not()) stop("tidybulk says: .do_test column must be logical (i.e., TRUE or FALSE)") + # Check packages msigdbr + # Check if package is installed, otherwise install + if (find.package("msigdbr", quiet = TRUE) %>% length %>% equals(0)) { + message("msigdbr not installed. Installing.") + BiocManager::install("msigdbr", ask = FALSE) + } + # Check is correct species name if(species %in% msigdbr::msigdbr_species()$species_name %>% not()) - stop(sprintf("tidybulk says: wrong species name. MSigDB uses the latin species names (e.g., %s)", paste(msigdbr::msigdbr_species()$species_name, collapse=", "))) + stop(sprintf("tidybulk says: wrong species name. MSigDB uses the latin species + names (e.g., %s)", paste(msigdbr::msigdbr_species()$species_name, + collapse=", "))) # # Check if missing entrez # if(.data %>% filter(!!.entrez %>% is.na) %>% nrow() %>% gt(0) ){ @@ -2091,7 +2240,9 @@ setMethod("test_gene_enrichment", entrez_over_to_gsea(species, gene_collections = gene_sets) %>% # Add methods used - memorise_methods_used(c("clusterProfiler", "msigdbr", "msigdb"), object_containing_methods = .data) + memorise_methods_used(c("clusterProfiler", "msigdbr", "msigdb"), + object_containing_methods = .data) + } @@ -2108,8 +2259,7 @@ setMethod("test_gene_overrepresentation", #' test_gene_overrepresentation #' @inheritParams test_gene_overrepresentation -#' @importFrom msigdbr msigdbr_species -#' +#' #' @docType methods #' @rdname test_gene_overrepresentation-methods #' @@ -2136,7 +2286,8 @@ setMethod("test_gene_overrepresentation", if (is_present(gene_set) & !is.null(gene_set)) { # Signal the deprecation to the user - deprecate_warn("1.3.1", "tidybulk::test_gene_rank(gene_set = )", details = "The argument gene_set is now deprecated please use gene_sets.") + deprecate_warn("1.3.1", "tidybulk::test_gene_rank(gene_set = )", + details = "The argument gene_set is now deprecated please use gene_sets.") gene_sets = gene_set } @@ -2153,9 +2304,18 @@ setMethod("test_gene_overrepresentation", if(quo_is_missing(.entrez)) stop("tidybulk says: the .entrez parameter appears to no be set") + # Check packages msigdbr + # Check if package is installed, otherwise install + if (find.package("msigdbr", quiet = TRUE) %>% length %>% equals(0)) { + message("msigdbr not installed. Installing.") + BiocManager::install("msigdbr", ask = FALSE) + } + # Check is correct species name if(species %in% msigdbr::msigdbr_species()$species_name %>% not()) - stop(sprintf("tidybulk says: wrong species name. MSigDB uses the latin species names (e.g., %s)", paste(msigdbr::msigdbr_species()$species_name, collapse=", "))) + stop(sprintf("tidybulk says: wrong species name. MSigDB uses the + latin species names (e.g., %s)", + paste(msigdbr::msigdbr_species()$species_name, collapse=", "))) .data %>% pivot_transcript() %>% @@ -2165,7 +2325,8 @@ setMethod("test_gene_overrepresentation", entrez_rank_to_gsea(species, gene_collections = gene_sets)%>% # Add methods used. It is here and not in functions because I need the original .data - memorise_methods_used(c("clusterProfiler", "enrichplot"), object_containing_methods = .data) %>% + memorise_methods_used(c("clusterProfiler", "enrichplot"), + object_containing_methods = .data) %>% when( gene_sets %>% is("character") ~ (.) %>% memorise_methods_used("msigdbr"), ~ (.) @@ -2301,14 +2462,13 @@ setMethod("pivot_transcript", .pivot_transcript) -.impute_missing_abundance_se = function(.data, +.impute_missing_abundance_se <- function(.data, .formula, .sample = NULL, .transcript = NULL, .abundance = NULL, suffix = "", force_scaling = FALSE) { - # Fix NOTEs . = NULL @@ -2335,7 +2495,13 @@ setMethod("pivot_transcript", library_size = colSums(.x, na.rm = TRUE) .x = .x / library_size } - else message(sprintf("tidybulk says: %s appears not to be scaled for sequencing depth (missing _scaled suffix; if you think this column is idependent of sequencing depth ignore this message), therefore the imputation can produce non meaningful results if sequencing depth for samples are highly variable. If you use force_scaling = TRUE library size will be used for eliminatig some sequencig depth effect before imputation", .y)) + else message(sprintf("tidybulk says: %s appears not to be scaled for + sequencing depth (missing _scaled suffix; if you think this column is + idependent of sequencing depth ignore this message), therefore the + imputation can produce non meaningful results if sequencing depth for + samples are highly variable. If you use force_scaling = TRUE library + size will be used for eliminatig some sequencig depth effect before + imputation", .y)) # Log need_log = max(.x, na.rm=TRUE) > 50 @@ -2406,6 +2572,7 @@ setMethod("impute_missing_abundance", #' #' @importFrom stringr str_replace #' +#' #' @return A `SummarizedExperiment` object #' setMethod("impute_missing_abundance", @@ -2414,16 +2581,20 @@ setMethod("impute_missing_abundance", -.test_differential_cellularity_se = function(.data, +.test_differential_cellularity_se <- function(.data, .formula, method = "cibersort", reference = X_cibersort, - ...) -{ + ...) { # Fix NOTEs . = NULL + if (find.package("broom", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing broom needed for analyses") + install.packages("broom", repos = "https://cloud.r-project.org") + } + deconvoluted = .data %>% @@ -2461,7 +2632,8 @@ setMethod("impute_missing_abundance", .formula %>% when( # If I have the dot, needed definitely for censored - format(.) %>% grepl("\\.", .) %>% any ~ format(.) %>% str_replace("([-\\+\\*~ ]?)(\\.)", "\\1.proportion_0_corrected"), + format(.) %>% grepl("\\.", .) %>% any ~ format(.) %>% + str_replace("([-\\+\\*~ ]?)(\\.)", "\\1.proportion_0_corrected"), # If normal formula ~ sprintf(".proportion_0_corrected%s", format(.)) @@ -2471,16 +2643,17 @@ setMethod("impute_missing_abundance", # Test univariable_differential_tissue_composition_SE(deconvoluted, - method, - .my_formula, - min_detected_proportion) %>% + method, + .my_formula, + min_detected_proportion) %>% # Attach attributes reattach_internals(.data) %>% # Add methods used when( - grepl("Surv", .my_formula) ~ (.) %>% memorise_methods_used(c("survival", "boot")), + grepl("Surv", .my_formula) ~ (.) %>% + memorise_methods_used(c("survival", "boot")), ~ (.) %>% memorise_methods_used("betareg") ) }, @@ -2516,15 +2689,16 @@ setMethod("impute_missing_abundance", # Test multivariable_differential_tissue_composition_SE(deconvoluted, - method, - .my_formula, - min_detected_proportion) %>% + method, + .my_formula, + min_detected_proportion) %>% # Attach attributes reattach_internals(.data) %>% # Add methods used - when(grepl("Surv", .my_formula) ~ (.) %>% memorise_methods_used(c("survival", "boot")), + when(grepl("Surv", .my_formula) ~ (.) %>% + memorise_methods_used(c("survival", "boot")), ~ (.)) }) %>% @@ -2565,22 +2739,22 @@ setMethod( # Set internal #' @importFrom stringr str_replace -.test_stratification_cellularity_SE = function(.data, +.test_stratification_cellularity_SE <- function(.data, .formula, .sample = NULL, .transcript = NULL, .abundance = NULL, method = "cibersort", reference = X_cibersort, - ...) -{ + ...) { # Fix NOTEs . = NULL # Validate formula if(.formula %>% format() %>% grepl(" \\.|\\. ", .) %>% not) - stop("tidybulk says: in the formula a dot must be present in either these forms \". ~\" or \"~ .\" with a white-space after or before respectively") + stop("tidybulk says: in the formula a dot must be present in either these + forms \". ~\" or \"~ .\" with a white-space after or before respectively") deconvoluted = .data %>% @@ -2625,7 +2799,9 @@ setMethod( #' @docType methods #' @rdname test_stratification_cellularity-methods #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). setMethod("test_stratification_cellularity", "SummarizedExperiment", .test_stratification_cellularity_SE) @@ -2636,21 +2812,23 @@ setMethod("test_stratification_cellularity", #' @docType methods #' @rdname test_stratification_cellularity-methods #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). setMethod("test_stratification_cellularity", "RangedSummarizedExperiment", .test_stratification_cellularity_SE) - - #' get_bibliography #' @inheritParams get_bibliography #' #' @docType methods #' @rdname get_bibliography-methods #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). setMethod("get_bibliography", "SummarizedExperiment", .get_bibliography) @@ -2661,7 +2839,9 @@ setMethod("get_bibliography", #' @docType methods #' @rdname get_bibliography-methods #' -#' @return A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +#' @return A consistent object (to the input) with additional columns for the +#' statistics from the hypothesis test (e.g., log fold change, p-value and +#' false discovery rate). setMethod("get_bibliography", "RangedSummarizedExperiment", .get_bibliography) @@ -2670,9 +2850,6 @@ setMethod("get_bibliography", #' #' @importFrom SummarizedExperiment rowData #' @importFrom tibble enframe -#' @importFrom AnnotationDbi mapIds -#' @importFrom org.Hs.eg.db org.Hs.eg.db -#' @importFrom org.Mm.eg.db org.Mm.eg.db #' #' @inheritParams describe_transcript #' @@ -2682,12 +2859,36 @@ setMethod("get_bibliography", #' @return A `SummarizedExperiment` object #' #' -.describe_transcript_SE = function(.data, +.describe_transcript_SE <- function(.data, .transcript = NULL) { # Fix NOTEs . = NULL + # Check if package is installed, otherwise install + if (find.package("org.Hs.eg.db", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing org.Hs.eg.db needed for differential transcript abundance analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("org.Hs.eg.db", ask = FALSE) + } + + # Check if package is installed, otherwise install + if (find.package("org.Mm.eg.db", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing org.Mm.eg.db needed for differential transcript abundance analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("org.Mm.eg.db", ask = FALSE) + } + + # Check if package is installed, otherwise install + if (find.package("AnnotationDbi", quiet = TRUE) %>% length %>% equals(0)) { + message("Installing AnnotationDbi needed for differential transcript abundance analyses") + if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager", repos = "https://cloud.r-project.org") + BiocManager::install("AnnotationDbi", ask = FALSE) + } + .transcript = enquo(.transcript) # Transcript rownames by default @@ -2747,8 +2948,10 @@ setMethod("get_bibliography", #' @docType methods #' @rdname describe_transcript-methods #' -#' @return A consistent object (to the input) including additional columns for transcript symbol -setMethod("describe_transcript", "SummarizedExperiment", .describe_transcript_SE) +#' @return A consistent object (to the input) including additional +#' columns for transcript symbol +setMethod("describe_transcript", "SummarizedExperiment", + .describe_transcript_SE) #' describe_transcript #' @inheritParams describe_transcript @@ -2756,5 +2959,7 @@ setMethod("describe_transcript", "SummarizedExperiment", .describe_transcript_SE #' @docType methods #' @rdname describe_transcript-methods #' -#' @return A consistent object (to the input) including additional columns for transcript symbol -setMethod("describe_transcript", "RangedSummarizedExperiment", .describe_transcript_SE) +#' @return A consistent object (to the input) including additional columns +#' for transcript symbol +setMethod("describe_transcript", "RangedSummarizedExperiment", + .describe_transcript_SE) diff --git a/R/validation.R b/R/validation.R index 462d181c..8c360e70 100755 --- a/R/validation.R +++ b/R/validation.R @@ -16,7 +16,7 @@ #' #' @return A tbl #' -check_if_wrong_input = function(.data, list_input, expected_type) { +check_if_wrong_input <- function(.data, list_input, expected_type) { # Do the check if (list_input %>% map( ~ .x %>% class() %>% `[` (1)) %>% @@ -119,11 +119,12 @@ check_if_attribute_present = function(.data) { "tt_columns" %in% (.data %>% attr("internals") %>% names) } -eliminate_sparse_transcripts = function(.data, .transcript){ +eliminate_sparse_transcripts <- function(.data, .transcript){ # Parse column names .transcript = enquo(.transcript) - - warning("tidybulk says: Some transcripts have been omitted from the analysis because not present in every sample.") + + warning("tidybulk says: Some transcripts have been omitted from the analysis ", + "because not present in every sample.") .data %>% add_count(!!.transcript, name = "my_n") %>% @@ -132,7 +133,6 @@ eliminate_sparse_transcripts = function(.data, .transcript){ } check_if_data_rectangular = function(.data, .sample, .transcript, .abundance){ - # Parse column names .sample = enquo(.sample) .transcript = enquo(.transcript) @@ -150,15 +150,15 @@ check_if_data_rectangular = function(.data, .sample, .transcript, .abundance){ } -warning_if_data_is_not_rectangular = function(.data, .sample, .transcript, .abundance){ - +warning_if_data_is_not_rectangular <- function(.data, .sample, .transcript, .abundance) { # Parse column names .sample = enquo(.sample) .transcript = enquo(.transcript) .abundance = enquo(.abundance) if(!check_if_data_rectangular(.data, !!.sample, !!.transcript, !!.abundance)) - warning("tidybulk says: the data does not have the same number of transcript per sample. The data set is not rectangular.") + warning("tidybulk says: the data does not have the same number of transcript ", + "per sample. The data set is not rectangular.") } @@ -170,14 +170,17 @@ error_if_data_is_not_rectangular = function(.data, .sample, .transcript, .abunda .abundance = enquo(.abundance) if(!check_if_data_rectangular(.data, !!.sample, !!.transcript, !!.abundance)) - stop("tidybulk says: the data must have the same number of transcript per sample. Check again that you have not filtered single observations accidentally. If you have missing data you can use fill_missing_abundance() or impute_missing_abundance()") + stop("tidybulk says: the data must have the same number of transcript per sample. ", + "Check again that you have not filtered single observations accidentally. ", + "If you have missing data you can use fill_missing_abundance() or impute_missing_abundance()") } tidybulk_to_tbl = function(.data) { .data %>% drop_class(c("tidybulk", "tt")) } -validation_default = function(.data, + +validation_default <- function(.data, .sample, .transcript, .abundance, @@ -193,11 +196,14 @@ validation_default = function(.data, if (type == "hard" & !is_missing) stop( - "tidybulk says: One or more columns that should include sample identifier, transcript identified or transcript abundance are missing from your data frame." + "tidybulk says: One or more columns that should include sample identifier, ", + "transcript identified or transcript abundance are missing from your data frame." ) if (type == "soft" & !is_missing) { warning( - "tidybulk says: One or more columns that should include sample identifier, transcript identified or transcript abundance are missing from your data frame. The tidybulk object has been converted to a `tbl`" + "tidybulk says: One or more columns that should include sample identifier, ", + "transcript identified or transcript abundance are missing from your data frame. ", + "The tidybulk object has been converted to a `tbl`" ) return(.data %>% tidybulk_to_tbl) } @@ -207,11 +213,13 @@ validation_default = function(.data, if (type == "hard" & !is_type) stop( - "tidybulk says: The column provided as .sample .transcript or .abundance do not comply with the required types (, , )." + "tidybulk says: The column provided as .sample .transcript or .abundance do not ", + "comply with the required types (, , )." ) if (type == "soft" & !is_type) { warning( - "tidybulk says: The column provided as .sample .transcript or .abundance do not comply with the required types. The tidybulk object has been converted to a `tbl`" + "tidybulk says: The column provided as .sample .transcript or .abundance do not ", + "comply with the required types. The tidybulk object has been converted to a `tbl`" ) return(.data %>% tidybulk_to_tbl) } @@ -262,9 +270,9 @@ validation <- function(.data, UseMethod("validation", .data) } -validation.default = validation_default +validation.default <- validation_default -validation.tidybulk = function(.data, +validation.tidybulk <- function(.data, .sample = NULL, .transcript = NULL, .abundance = NULL, @@ -275,11 +283,16 @@ validation.tidybulk = function(.data, if (type == "hard" & !is_attr) stop( - "tidybulk says: The object provided has tidybulk class but no attribute containing the column names (attr(., \"internals\")). You must have used an external function that eliminated the attributes. Insert a valid tidybulk object or provide `.sample`, `.transcript`, `.abundance` column names as arguments " + "tidybulk says: The object provided has tidybulk class but no attribute ", + "containing the column names (attr(., \"internals\")). You must have used ", + "an external function that eliminated the attributes. Insert a valid ", + "tidybulk object or provide `.sample`, `.transcript`, `.abundance` column names as arguments " ) if (type == "soft" & !is_attr) { warning( - "tidybulk says: The object provided has tidybulk class but no attribute containing the column names (attr(., \"internals\")). You must have used an external function that eliminated the attributes. The tidybulk object has been converted to a `tbl`" + "tidybulk says: The object provided has tidybulk class but no attribute ", + "containing the column names (attr(., \"internals\")). You must have used an ", + "external function that eliminated the attributes. The tidybulk object has been converted to a `tbl`" ) return(.data %>% tidybulk_to_tbl) } @@ -312,12 +325,14 @@ validate_signature = function(.data, reference, .transcript){ if(length(overlapping_genes) == 0 ) stop(sprintf( - "\ntidybulk says: You have NO genes in common between the query data and the reference data. Please check again your input dataframes\nthe genes in the reference look like this %s", paste(rownames(reference)[1:10], collapse = ", ") + "\ntidybulk says: You have NO genes in common between the query data and the reference data. Please check again your input dataframes\nthe genes in the reference look like this %s", + paste(rownames(reference)[1:10], collapse = ", ") )) if ( length(overlapping_genes) %>% st(50) ) warning(sprintf( - "\ntidybulk says: You have less than 50 genes in common between the query data and the reference data. Please check again your input dataframes\nthe genes in the reference look like this %s", paste(rownames(reference)[1:10], collapse = ", ") + "\ntidybulk says: You have less than 50 genes in common between the query data and the reference data. Please check again your input dataframes\nthe genes in the reference look like this %s", + paste(rownames(reference)[1:10], collapse = ", ") )) # Check if rownames exist @@ -327,18 +342,19 @@ validate_signature = function(.data, reference, .transcript){ } -validate_signature_SE = function(assay, reference){ - +validate_signature_SE <- function(assay, reference) { overlapping_genes = (rownames(assay) %in% rownames(reference)) %>% which if(length(overlapping_genes) == 0 ) stop(sprintf( - "\ntidybulk says: You have NO genes in common between the query data and the reference data. Please check again your input dataframes\nthe genes in the reference look like this %s", paste(rownames(reference)[1:10], collapse = ", ") + "\ntidybulk says: You have NO genes in common between the query data and ", + "the reference data. Please check again your input dataframes\nthe genes in the reference look like this %s", paste(rownames(reference)[1:10], collapse = ", ") )) if ( length(overlapping_genes) %>% st(50) ) warning(sprintf( - "\ntidybulk says: You have less than 50 genes in common between the query data and the reference data. Please check again your input dataframes\nthe genes in the reference look like this %s", paste(rownames(reference)[1:10], collapse = ", ") + "\ntidybulk says: You have less than 50 genes in common between the query data and the reference data. Please check again your input dataframes\nthe genes in the reference look like this %s", + paste(rownames(reference)[1:10], collapse = ", ") )) # Check if rownames exist diff --git a/man/adjust_abundance-methods.Rd b/man/adjust_abundance-methods.Rd index 7eac35aa..11587724 100644 --- a/man/adjust_abundance-methods.Rd +++ b/man/adjust_abundance-methods.Rd @@ -107,13 +107,21 @@ adjust_abundance( ) } \arguments{ -\item{.data}{A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment))} +\item{.data}{A `tbl` (with at least three columns for sample, feature +and transcript abundance) or `SummarizedExperiment` (more convenient if +abstracted to tibble with library(tidySummarizedExperiment))} -\item{.formula}{DEPRECATED - A formula with no response variable, representing the desired linear model where the first covariate is the factor of interest and the second covariate is the unwanted variation (of the kind ~ factor_of_interest + batch)} +\item{.formula}{DEPRECATED - A formula with no response variable, +representing the desired linear model where the first covariate is the +factor of interest and the second covariate is the unwanted variation +(of the kind ~ factor_of_interest + batch)} -\item{.factor_unwanted}{A tidy select, e.g. column names without double quotation. c(batch, country) These are the factor that we want to adjust for, including unwanted batcheffect, and unwanted biological effects.} +\item{.factor_unwanted}{A tidy select, e.g. column names without double +quotation. c(batch, country) These are the factor that we want to adjust for, +including unwanted batcheffect, and unwanted biological effects.} -\item{.factor_of_interest}{A tidy select, e.g. column names without double quotation. c(treatment) These are the factor that we want to preserve.} +\item{.factor_of_interest}{A tidy select, e.g. column names without double +quotation. c(treatment) These are the factor that we want to preserve.} \item{.sample}{The name of the sample column} @@ -121,35 +129,46 @@ adjust_abundance( \item{.abundance}{The name of the transcript/gene abundance column} -\item{method}{A character string. Methods include combat_seq (default), combat and limma_remove_batch_effect.} +\item{method}{A character string. Methods include combat_seq (default), +combat and limma_remove_batch_effect.} -\item{action}{A character string. Whether to join the new information to the input tbl (add), or just get the non-redundant tbl with the new information (get).} +\item{action}{A character string. Whether to join the new information to the +input tbl (add), or just get the non-redundant tbl with the new information (get).} \item{...}{Further parameters passed to the function sva::ComBat} -\item{log_transform}{DEPRECATED - A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data)} +\item{log_transform}{DEPRECATED - A boolean, whether the value should be +log-transformed (e.g., TRUE for RNA sequencing data)} -\item{transform}{DEPRECATED - A function that will tranform the counts, by default it is log1p for RNA sequencing data, but for avoinding tranformation you can use identity} +\item{transform}{DEPRECATED - A function that will tranform the counts, +by default it is log1p for RNA sequencing data, but for avoinding +tranformation you can use identity} -\item{inverse_transform}{DEPRECATED - A function that is the inverse of transform (e.g. expm1 is inverse of log1p). This is needed to tranform back the counts after analysis.} +\item{inverse_transform}{DEPRECATED - A function that is the inverse of +transform (e.g. expm1 is inverse of log1p). This is needed to tranform +back the counts after analysis.} } \value{ -A consistent object (to the input) with additional columns for the adjusted counts as `_adjusted` +A consistent object (to the input) with additional columns for +the adjusted counts as `_adjusted` -A consistent object (to the input) with additional columns for the adjusted counts as `_adjusted` +A consistent object (to the input) with additional columns for the +adjusted counts as `_adjusted` -A consistent object (to the input) with additional columns for the adjusted counts as `_adjusted` +A consistent object (to the input) with additional columns for the +adjusted counts as `_adjusted` -A consistent object (to the input) with additional columns for the adjusted counts as `_adjusted` +A consistent object (to the input) with additional columns for the +adjusted counts as `_adjusted` A `SummarizedExperiment` object A `SummarizedExperiment` object } \description{ -adjust_abundance() takes as input A `tbl` -(with at least three columns for sample, feature and transcript abundance) -or `SummarizedExperiment` (more convenient if abstracted to tibble with +adjust_abundance() takes as input A `tbl` (with at least three +columns for sample, feature and transcript abundance) or +`SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with an additional adjusted abundance column. This method uses scaled counts if present. @@ -158,24 +177,22 @@ This method uses scaled counts if present. `r lifecycle::badge("maturing")` This function adjusts the abundance for (known) unwanted variation. -At the moment just an unwanted covariate is allowed at a time using Combat (DOI: 10.1093/bioinformatics/bts034) +At the moment just an unwanted covariate is allowed at a time using +Combat (DOI: 10.1093/bioinformatics/bts034) Underlying method: sva::ComBat(data, batch = my_batch, mod = design, prior.plots = FALSE, ...) } \examples{ - - cm = tidybulk::se_mini cm$batch = 0 cm$batch[colnames(cm) \%in\% c("SRR1740035", "SRR1740043")] = 1 cm |> identify_abundant() |> -adjust_abundance(.factor_unwanted = batch, - .factor_of_interest = condition, - method="combat") +adjust_abundance( .factor_unwanted = batch, +.factor_of_interest = condition, method="combat" ) } diff --git a/man/aggregate_duplicates-methods.Rd b/man/aggregate_duplicates-methods.Rd index 8a38c69b..ecfe699b 100644 --- a/man/aggregate_duplicates-methods.Rd +++ b/man/aggregate_duplicates-methods.Rd @@ -8,7 +8,8 @@ \alias{aggregate_duplicates,tidybulk-method} \alias{aggregate_duplicates,SummarizedExperiment-method} \alias{aggregate_duplicates,RangedSummarizedExperiment-method} -\title{Aggregates multiple counts from the same samples (e.g., from isoforms), concatenates other character columns, and averages other numeric columns} +\title{Aggregates multiple counts from the same samples (e.g., from isoforms), +concatenates other character columns, and averages other numeric columns} \usage{ aggregate_duplicates( .data, @@ -65,7 +66,9 @@ aggregate_duplicates( ) } \arguments{ -\item{.data}{A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment))} +\item{.data}{A `tbl` (with at least three columns for sample, feature and +transcript abundance) or `SummarizedExperiment` (more convenient if +abstracted to tibble with library(tidySummarizedExperiment))} \item{.sample}{The name of the sample column} @@ -73,25 +76,34 @@ aggregate_duplicates( \item{.abundance}{The name of the transcript/gene abundance column} -\item{aggregation_function}{A function for counts aggregation (e.g., sum, median, or mean)} +\item{aggregation_function}{A function for counts aggregation (e.g., sum, +median, or mean)} \item{keep_integer}{A boolean. Whether to force the aggregated counts to integer} } \value{ -A consistent object (to the input) with aggregated transcript abundance and annotation +A consistent object (to the input) with aggregated transcript +abundance and annotation -A consistent object (to the input) with aggregated transcript abundance and annotation +A consistent object (to the input) with aggregated transcript +abundance and annotation -A consistent object (to the input) with aggregated transcript abundance and annotation +A consistent object (to the input) with aggregated transcript +abundance and annotation -A consistent object (to the input) with aggregated transcript abundance and annotation +A consistent object (to the input) with aggregated transcript +abundance and annotation A `SummarizedExperiment` object A `SummarizedExperiment` object } \description{ -aggregate_duplicates() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with aggregated transcripts that were duplicated. +aggregate_duplicates() takes as input A `tbl` (with at least +three columns for sample, feature and transcript abundance) or +`SummarizedExperiment` (more convenient if abstracted to tibble with +library(tidySummarizedExperiment)) and returns a consistent object +(to the input) with aggregated transcripts that were duplicated. } \details{ `r lifecycle::badge("maturing")` diff --git a/man/as_SummarizedExperiment-methods.Rd b/man/as_SummarizedExperiment-methods.Rd index 374e2f35..bb737668 100644 --- a/man/as_SummarizedExperiment-methods.Rd +++ b/man/as_SummarizedExperiment-methods.Rd @@ -55,5 +55,7 @@ A `SummarizedExperiment` object A `SummarizedExperiment` object } \description{ -as_SummarizedExperiment() creates a `SummarizedExperiment` object from a `tbl` or `tidybulk` tbl formatted as | | | | <...> | +as_SummarizedExperiment() creates a `SummarizedExperiment` + object from a `tbl` or `tidybulk` tbl formatted as | | + | | <...> | } diff --git a/man/as_matrix.Rd b/man/as_matrix.Rd index f03e4296..4a217ba8 100644 --- a/man/as_matrix.Rd +++ b/man/as_matrix.Rd @@ -9,7 +9,8 @@ as_matrix(tbl, rownames = NULL, do_check = TRUE) \arguments{ \item{tbl}{A tibble} -\item{rownames}{The column name of the input tibble that will become the rownames of the output matrix} +\item{rownames}{The column name of the input tibble that will become +the rownames of the output matrix} \item{do_check}{A boolean} } diff --git a/man/cluster_elements-methods.Rd b/man/cluster_elements-methods.Rd index e1302075..4264f521 100644 --- a/man/cluster_elements-methods.Rd +++ b/man/cluster_elements-methods.Rd @@ -89,25 +89,35 @@ cluster_elements( ) } \arguments{ -\item{.data}{A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment))} +\item{.data}{A `tbl` (with at least three columns for sample, +feature and transcript abundance) or `SummarizedExperiment` +(more convenient if abstracted to tibble with +library(tidySummarizedExperiment))} \item{.element}{The name of the element column (normally samples).} \item{.feature}{The name of the feature column (normally transcripts/genes)} -\item{.abundance}{The name of the column including the numerical value the clustering is based on (normally transcript abundance)} +\item{.abundance}{The name of the column including the numerical value the +clustering is based on (normally transcript abundance)} -\item{method}{A character string. The cluster algorithm to use, at the moment k-means is the only algorithm included.} +\item{method}{A character string. The cluster algorithm to use, at the +moment k-means is the only algorithm included.} -\item{of_samples}{A boolean. In case the input is a tidybulk object, it indicates Whether the element column will be sample or transcript column} +\item{of_samples}{A boolean. In case the input is a tidybulk object, +it indicates Whether the element column will be sample or transcript column} -\item{transform}{A function that will tranform the counts, by default it is log1p for RNA sequencing data, but for avoinding tranformation you can use identity} +\item{transform}{A function that will tranform the counts, by default it is +log1p for RNA sequencing data, but for avoinding tranformation you can +use identity} -\item{action}{A character string. Whether to join the new information to the input tbl (add), or just get the non-redundant tbl with the new information (get).} +\item{action}{A character string. Whether to join the new information to +the input tbl (add), or just get the non-redundant tbl with the new information (get).} \item{...}{Further parameters passed to the function kmeans} -\item{log_transform}{DEPRECATED - A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data)} +\item{log_transform}{DEPRECATED - A boolean, whether the value should be +log-transformed (e.g., TRUE for RNA sequencing data)} } \value{ A tbl object with additional columns with cluster labels @@ -123,14 +133,19 @@ A `SummarizedExperiment` object A `SummarizedExperiment` object } \description{ -cluster_elements() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and identify clusters in the data. +cluster_elements() takes as input A `tbl` (with at least + three columns for sample, feature and transcript abundance) or + `SummarizedExperiment` (more convenient if abstracted to tibble with + library(tidySummarizedExperiment)) and identify clusters in the data. } \details{ `r lifecycle::badge("maturing")` identifies clusters in the data, normally of samples. This function returns a tibble with additional columns for the cluster annotation. -At the moment only k-means (DOI: 10.2307/2346830) and SNN clustering (DOI:10.1016/j.cell.2019.05.031) is supported, the plan is to introduce more clustering methods. +At the moment only k-means (DOI: 10.2307/2346830) and SNN clustering +(DOI:10.1016/j.cell.2019.05.031) is supported, the plan is to introduce more +clustering methods. Underlying method for kmeans do.call(kmeans(.data, iter.max = 1000, ...) diff --git a/man/deconvolve_cellularity-methods.Rd b/man/deconvolve_cellularity-methods.Rd index 9125e4d9..48b4c20d 100644 --- a/man/deconvolve_cellularity-methods.Rd +++ b/man/deconvolve_cellularity-methods.Rd @@ -83,7 +83,9 @@ deconvolve_cellularity( ) } \arguments{ -\item{.data}{A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment))} +\item{.data}{A `tbl` (with at least three columns for sample, feature and +transcript abundance) or `SummarizedExperiment` (more convenient if +abstracted to tibble with library(tidySummarizedExperiment))} \item{.sample}{The name of the sample column} @@ -91,31 +93,48 @@ deconvolve_cellularity( \item{.abundance}{The name of the transcript/gene abundance column} -\item{reference}{A data frame. The methods cibersort and llsr can accept a custom rectangular dataframe with genes as rows names, cell types as column names and gene-transcript abundance as values. For exampler tidybulk::X_cibersort. The transcript/cell_type data frame of integer transcript abundance. If NULL, the default reference for each algorithm will be used. For llsr will be LM22.} +\item{reference}{A data frame. The methods cibersort and llsr can accept a +custom rectangular dataframe with genes as rows names, cell types as column +names and gene-transcript abundance as values. For exampler tidybulk::X_cibersort. +The transcript/cell_type data frame of integer transcript abundance. If NULL, +the default reference for each algorithm will be used. For llsr will be LM22.} -\item{method}{A character string. The method to be used. At the moment Cibersort (default, can accept custom reference), epic (can accept custom reference) and llsr (linear least squares regression, can accept custom reference), mcp_counter, quantiseq, xcell are available.} +\item{method}{A character string. The method to be used. At the moment +Cibersort (default, can accept custom reference), epic (can accept custom +reference) and llsr (linear least squares regression, can accept custom +reference), mcp_counter, quantiseq, xcell are available.} -\item{prefix}{A character string. The prefix you would like to add to the result columns. It is useful if you want to reshape data.} +\item{prefix}{A character string. The prefix you would like to add to the +result columns. It is useful if you want to reshape data.} -\item{action}{A character string. Whether to join the new information to the input tbl (add), or just get the non-redundant tbl with the new information (get).} +\item{action}{A character string. Whether to join the new information to the +input tbl (add), or just get the non-redundant tbl with the new information (get).} \item{...}{Further parameters passed to the function Cibersort} } \value{ -A consistent object (to the input) including additional columns for each cell type estimated +A consistent object (to the input) including additional columns +for each cell type estimated -A consistent object (to the input) including additional columns for each cell type estimated +A consistent object (to the input) including additional columns +for each cell type estimated -A consistent object (to the input) including additional columns for each cell type estimated +A consistent object (to the input) including additional columns +for each cell type estimated -A consistent object (to the input) including additional columns for each cell type estimated +A consistent object (to the input) including additional columns +for each cell type estimated A `SummarizedExperiment` object A `SummarizedExperiment` object } \description{ -deconvolve_cellularity() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with the estimated cell type abundance for each sample +deconvolve_cellularity() takes as input A `tbl` (with at least +three columns for sample, feature and transcript abundance) or +`SummarizedExperiment` (more convenient if abstracted to tibble with +library(tidySummarizedExperiment)) and returns a consistent object (to the +input) with the estimated cell type abundance for each sample } \details{ `r lifecycle::badge("maturing")` @@ -128,7 +147,6 @@ CIBERSORT(Y = data, X = reference, ...) } \examples{ - # Subsetting for time efficiency tidybulk::se_mini |> deconvolve_cellularity(cores = 1) diff --git a/man/describe_transcript-methods.Rd b/man/describe_transcript-methods.Rd index 8bf4e5ee..4e243201 100644 --- a/man/describe_transcript-methods.Rd +++ b/man/describe_transcript-methods.Rd @@ -41,9 +41,11 @@ A consistent object (to the input) including additional columns for transcript s A `SummarizedExperiment` object -A consistent object (to the input) including additional columns for transcript symbol +A consistent object (to the input) including additional +columns for transcript symbol -A consistent object (to the input) including additional columns for transcript symbol +A consistent object (to the input) including additional columns +for transcript symbol } \description{ Get DESCRIPTION from gene SYMBOL for Human and Mouse diff --git a/man/ensembl_to_symbol-methods.Rd b/man/ensembl_to_symbol-methods.Rd index 2ea0a01a..c528883c 100644 --- a/man/ensembl_to_symbol-methods.Rd +++ b/man/ensembl_to_symbol-methods.Rd @@ -17,33 +17,46 @@ ensembl_to_symbol(.data, .ensembl, action = "add") \S4method{ensembl_to_symbol}{tidybulk}(.data, .ensembl, action = "add") } \arguments{ -\item{.data}{a `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment))} +\item{.data}{a `tbl` (with at least three columns for sample, feature +and transcript abundance) or `SummarizedExperiment` (more convenient if +abstracted to tibble with library(tidySummarizedExperiment))} -\item{.ensembl}{A character string. The column that is represents ensembl gene id} +\item{.ensembl}{A character string. The column that is represents +ensembl gene id} -\item{action}{A character string. Whether to join the new information to the input tbl (add), or just get the non-redundant tbl with the new information (get).} +\item{action}{A character string. Whether to join the new information +to the input tbl (add), or just get the non-redundant tbl with the new +information (get).} } \value{ -A consistent object (to the input) including additional columns for transcript symbol +A consistent object (to the input) including additional columns +for transcript symbol -A consistent object (to the input) including additional columns for transcript symbol +A consistent object (to the input) including additional columns +for transcript symbol -A consistent object (to the input) including additional columns for transcript symbol +A consistent object (to the input) including additional columns +for transcript symbol -A consistent object (to the input) including additional columns for transcript symbol +A consistent object (to the input) including additional columns +for transcript symbol } \description{ -ensembl_to_symbol() takes as input a `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with the additional transcript symbol column +ensembl_to_symbol() takes as input a `tbl` (with at least +three columns for sample, feature and transcript abundance) or +`SummarizedExperiment` (more convenient if abstracted to tibble with +library(tidySummarizedExperiment)) and returns a consistent object +(to the input) with the additional transcript symbol column } \details{ \lifecycle{questioning} -This is useful since different resources use ensembl IDs while others use gene symbol IDs. At the moment this work for human (genes and transcripts) and mouse (genes) data. +This is useful since different resources use ensembl IDs while +others use gene symbol IDs. At the moment this work for human (genes and +transcripts) and mouse (genes) data. } \examples{ - - # This function was designed for data.frame # Convert from SummarizedExperiment for this example. It is NOT reccomended. diff --git a/man/figures/plot_cluster-1.png b/man/figures/plot_cluster-1.png index 22eb553ce952fef0fd2766407b39a7065de873cd..bbaeaaed9ca9a7d0596535540451ce23b326de19 100644 GIT binary patch literal 20847 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 I@$)zT1z9p`#{d8T literal 9188 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 Ms+uY!rJE1`2mfJN0{{R3 diff --git a/man/figures/plot_drop-1.png b/man/figures/plot_drop-1.png index 3842de3ac9638151a644754abd823a2f9f125583..fdaaf789013179a69b69535d2440cfabcf162a3a 100644 GIT binary patch literal 24432 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 literal 10322 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 diff --git a/man/figures/plot_drop2-1.png b/man/figures/plot_drop2-1.png index 095755d55234a82b42a1fc022cc93217c228a1b4..12f943fcb39762b01e310e988c6e81bd97b6a46a 100644 GIT binary patch literal 26847 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 literal 9544 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 diff --git a/man/figures/plot_normalise-1.png b/man/figures/plot_normalise-1.png index 8c6d5d0e3212f78b5a6169c0544e62976293cb2d..19092d3e38b733d92047576f09424812906acb77 100644 GIT binary patch literal 55155 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 diff --git a/man/figures/plot_rotate_1-1.png b/man/figures/plot_rotate_1-1.png index e240bb48143bbe21606e00f5bf1804982ce4fe13..3d50c395e4777a86a6ae067a56cf7c013cac95be 100644 GIT binary patch literal 24844 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 F{{n|mRGk0- literal 10343 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 diff --git a/man/figures/plot_rotate_2-1.png b/man/figures/plot_rotate_2-1.png index 2600394971fbe6f80b3208e4683d5ecb6f3774ab..a9aba09d52bb2693cd2f7a5323e3962872976a3f 100644 GIT binary patch literal 29046 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 G(EkC!CzZnh literal 13304 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 diff --git a/man/figures/unnamed-chunk-14-1.png b/man/figures/unnamed-chunk-14-1.png index 9ac5de4acffdbf20f9a6791893e4c37f005f428d..bfa30c1813b3f4914a52c1332dcc40b8301c0af6 100644 GIT binary patch literal 55315 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

-^TS#& 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 F{{TO&z!v}j literal 37014 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 TuiOVMkWl6(Hpb_scaled` +A tbl object with additional columns with scaled data as + `_scaled` -A tbl object with additional columns with scaled data as `_scaled` +A tbl object with additional columns with scaled data +as `_scaled` -A tbl object with additional columns with scaled data as `_scaled` +A tbl object with additional columns with scaled data + as `_scaled` -A tbl object with additional columns with scaled data as `_scaled` +A tbl object with additional columns with scaled data +as `_scaled` A `SummarizedExperiment` object A `SummarizedExperiment` object } \description{ -quantile_normalise_abundance() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and Scales transcript abundance compansating for sequencing depth (e.g., with TMM algorithm, Robinson and Oshlack doi.org/10.1186/gb-2010-11-3-r25). +quantile_normalise_abundance() takes as input A `tbl` + (with at least three columns for sample, feature and transcript abundance) + or `SummarizedExperiment` (more convenient if abstracted to tibble with + library(tidySummarizedExperiment)) and Scales transcript abundance + compansating for sequencing depth (e.g., with TMM algorithm, Robinson + and Oshlack doi.org/10.1186/gb-2010-11-3-r25). } \details{ `r lifecycle::badge("maturing")` Scales transcript abundance compensating for sequencing depth (e.g., with TMM algorithm, Robinson and Oshlack doi.org/10.1186/gb-2010-11-3-r25). -Lowly transcribed transcripts/genes (defined with minimum_counts and minimum_proportion parameters) -are filtered out from the scaling procedure. +Lowly transcribed transcripts/genes (defined with minimum_counts and +minimum_proportion parameters) are filtered out from the scaling procedure. The scaling inference is then applied back to all unfiltered data. Underlying method @@ -107,7 +125,10 @@ edgeR::calcNormFactors(.data, method = c("TMM","TMMwsp","RLE","upperquartile")) } \examples{ + tidybulk::se_mini |> quantile_normalise_abundance() + + } diff --git a/man/reduce_dimensions-methods.Rd b/man/reduce_dimensions-methods.Rd index b0c60955..ac87bf96 100644 --- a/man/reduce_dimensions-methods.Rd +++ b/man/reduce_dimensions-methods.Rd @@ -107,31 +107,45 @@ reduce_dimensions( ) } \arguments{ -\item{.data}{A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment))} +\item{.data}{A `tbl` (with at least three columns for sample, +feature and transcript abundance) or `SummarizedExperiment` (more +convenient if abstracted to tibble with library(tidySummarizedExperiment))} \item{.element}{The name of the element column (normally samples).} \item{.feature}{The name of the feature column (normally transcripts/genes)} -\item{.abundance}{The name of the column including the numerical value the clustering is based on (normally transcript abundance)} +\item{.abundance}{The name of the column including the numerical value +the clustering is based on (normally transcript abundance)} -\item{method}{A character string. The dimension reduction algorithm to use (PCA, MDS, tSNE).} +\item{method}{A character string. The dimension reduction algorithm to +use (PCA, MDS, tSNE).} -\item{.dims}{An integer. The number of dimensions your are interested in (e.g., 4 for returning the first four principal components).} +\item{.dims}{An integer. The number of dimensions your are interested in +(e.g., 4 for returning the first four principal components).} \item{top}{An integer. How many top genes to select for dimensionality reduction} -\item{of_samples}{A boolean. In case the input is a tidybulk object, it indicates Whether the element column will be sample or transcript column} +\item{of_samples}{A boolean. In case the input is a tidybulk object, +it indicates Whether the element column will be sample or transcript column} -\item{transform}{A function that will tranform the counts, by default it is log1p for RNA sequencing data, but for avoinding tranformation you can use identity} +\item{transform}{A function that will tranform the counts, by default +it is log1p for RNA sequencing data, but for avoinding tranformation you +can use identity} -\item{scale}{A boolean for method="PCA", this will be passed to the `prcomp` function. It is not included in the ... argument because although the default for `prcomp` if FALSE, it is advisable to set it as TRUE.} +\item{scale}{A boolean for method="PCA", this will be passed to the `prcomp` +function. It is not included in the ... argument because although the +default for `prcomp` if FALSE, it is advisable to set it as TRUE.} -\item{action}{A character string. Whether to join the new information to the input tbl (add), or just get the non-redundant tbl with the new information (get).} +\item{action}{A character string. Whether to join the new information to +the input tbl (add), or just get the non-redundant tbl with the new +information (get).} -\item{...}{Further parameters passed to the function prcomp if you choose method="PCA" or Rtsne if you choose method="tSNE"} +\item{...}{Further parameters passed to the function prcomp if you choose +method="PCA" or Rtsne if you choose method="tSNE"} -\item{log_transform}{DEPRECATED - A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data)} +\item{log_transform}{DEPRECATED - A boolean, whether the value should be +log-transformed (e.g., TRUE for RNA sequencing data)} } \value{ A tbl object with additional columns for the reduced dimensions @@ -147,7 +161,11 @@ A `SummarizedExperiment` object A `SummarizedExperiment` object } \description{ -reduce_dimensions() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and calculates the reduced dimensional space of the transcript abundance. +reduce_dimensions() takes as input A `tbl` (with at least + three columns for sample, feature and transcript abundance) or + `SummarizedExperiment` (more convenient if abstracted to tibble with + library(tidySummarizedExperiment)) and calculates the reduced dimensional + space of the transcript abundance. } \details{ `r lifecycle::badge("maturing")` diff --git a/man/remove_redundancy-methods.Rd b/man/remove_redundancy-methods.Rd index 58a05cf1..a55f3d84 100644 --- a/man/remove_redundancy-methods.Rd +++ b/man/remove_redundancy-methods.Rd @@ -8,7 +8,8 @@ \alias{remove_redundancy,tidybulk-method} \alias{remove_redundancy,SummarizedExperiment-method} \alias{remove_redundancy,RangedSummarizedExperiment-method} -\title{Drop redundant elements (e.g., samples) for which feature (e.g., transcript/gene) abundances are correlated} +\title{Drop redundant elements (e.g., samples) for which feature (e.g., +transcript/gene) abundances are correlated} \usage{ remove_redundancy( .data, @@ -101,29 +102,40 @@ remove_redundancy( ) } \arguments{ -\item{.data}{A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment))} +\item{.data}{A `tbl` (with at least three columns for sample, feature +and transcript abundance) or `SummarizedExperiment` (more convenient if +abstracted to tibble with library(tidySummarizedExperiment))} \item{.element}{The name of the element column (normally samples).} \item{.feature}{The name of the feature column (normally transcripts/genes)} -\item{.abundance}{The name of the column including the numerical value the clustering is based on (normally transcript abundance)} +\item{.abundance}{The name of the column including the numerical value the +clustering is based on (normally transcript abundance)} -\item{method}{A character string. The method to use, correlation and reduced_dimensions are available. The latter eliminates one of the most proximar pairs of samples in PCA reduced dimensions.} +\item{method}{A character string. The method to use, correlation and +reduced_dimensions are available. The latter eliminates one of the most +proximar pairs of samples in PCA reduced dimensions.} -\item{of_samples}{A boolean. In case the input is a tidybulk object, it indicates Whether the element column will be sample or transcript column} +\item{of_samples}{A boolean. In case the input is a tidybulk object, +it indicates Whether the element column will be sample or transcript column} \item{correlation_threshold}{A real number between 0 and 1. For correlation based calculation.} \item{top}{An integer. How many top genes to select for correlation based method} -\item{transform}{A function that will tranform the counts, by default it is log1p for RNA sequencing data, but for avoinding tranformation you can use identity} +\item{transform}{A function that will tranform the counts, by default it +is log1p for RNA sequencing data, but for avoinding tranformation you +can use identity} -\item{Dim_a_column}{A character string. For reduced_dimension based calculation. The column of one principal component} +\item{Dim_a_column}{A character string. For reduced_dimension based +calculation. The column of one principal component} -\item{Dim_b_column}{A character string. For reduced_dimension based calculation. The column of another principal component} +\item{Dim_b_column}{A character string. For reduced_dimension based +calculation. The column of another principal component} -\item{log_transform}{DEPRECATED - A boolean, whether the value should be log-transformed (e.g., TRUE for RNA sequencing data)} +\item{log_transform}{DEPRECATED - A boolean, whether the value +should be log-transformed (e.g., TRUE for RNA sequencing data)} } \value{ A tbl object with with dropped redundant elements (e.g., samples). @@ -139,20 +151,30 @@ A `SummarizedExperiment` object A `SummarizedExperiment` object } \description{ -remove_redundancy() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) for correlation method or | | | <...> | for reduced_dimensions method, and returns a consistent object (to the input) with dropped elements (e.g., samples). +remove_redundancy() takes as input A `tbl` (with at least + three columns for sample, feature and transcript abundance) or + `SummarizedExperiment` (more convenient if abstracted to tibble with + library(tidySummarizedExperiment)) for correlation method or | + | | <...> | for reduced_dimensions method, + and returns a consistent object (to the input) with dropped + elements (e.g., samples). } \details{ `r lifecycle::badge("maturing")` -This function removes redundant elements from the original data set (e.g., samples or transcripts). -For example, if we want to define cell-type specific signatures with low sample redundancy. +This function removes redundant elements from the original + data set (e.g., samples or transcripts). +For example, if we want to define cell-type specific signatures with +low sample redundancy. This function returns a tibble with dropped redundant elements (e.g., samples). Two redundancy estimation approaches are supported: -(i) removal of highly correlated clusters of elements (keeping a representative) with method="correlation"; +(i) removal of highly correlated clusters of elements (keeping a +representative) with method="correlation"; (ii) removal of most proximal element pairs in a reduced dimensional space. Underlying method for correlation: -widyr::pairwise_cor(sample, transcript,count, sort = TRUE, diag = FALSE, upper = FALSE) +widyr::pairwise_cor(sample, transcript,count, sort = TRUE, + diag = FALSE, upper = FALSE) Underlying custom method for reduced dimensions: select_closest_pairs = function(df) { @@ -169,14 +191,10 @@ select_closest_pairs = function(df) { !`sample 2` %in% (pair |> select(1:2) |> as.character()) ) } - couples - } } \examples{ - - tidybulk::se_mini |> identify_abundant() |> remove_redundancy( diff --git a/man/rotate_dimensions-methods.Rd b/man/rotate_dimensions-methods.Rd index 8825daa9..6d018171 100644 --- a/man/rotate_dimensions-methods.Rd +++ b/man/rotate_dimensions-methods.Rd @@ -83,7 +83,9 @@ rotate_dimensions( ) } \arguments{ -\item{.data}{A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment))} +\item{.data}{A `tbl` (with at least three columns for sample, feature and +transcript abundance) or `SummarizedExperiment` (more convenient if +abstracted to tibble with library(tidySummarizedExperiment))} \item{dimension_1_column}{A character string. The column of the dimension 1} @@ -93,31 +95,48 @@ rotate_dimensions( \item{.element}{The name of the element column (normally samples).} -\item{of_samples}{A boolean. In case the input is a tidybulk object, it indicates Whether the element column will be sample or transcript column} +\item{of_samples}{A boolean. In case the input is a tidybulk object, +it indicates Whether the element column will be sample or transcript column} -\item{dimension_1_column_rotated}{A character string. The column of the rotated dimension 1 (optional)} +\item{dimension_1_column_rotated}{A character string. The column of the +rotated dimension 1 (optional)} -\item{dimension_2_column_rotated}{A character string. The column of the rotated dimension 2 (optional)} +\item{dimension_2_column_rotated}{A character string. The column of the +rotated dimension 2 (optional)} -\item{action}{A character string. Whether to join the new information to the input tbl (add), or just get the non-redundant tbl with the new information (get).} +\item{action}{A character string. Whether to join the new information to the +input tbl (add), or just get the non-redundant tbl with the new information (get).} } \value{ -A tbl object with additional columns for the reduced dimensions. additional columns for the rotated dimensions. The rotated dimensions will be added to the original data set as ` rotated ` by default, or as specified in the input arguments. - -A tbl object with additional columns for the reduced dimensions. additional columns for the rotated dimensions. The rotated dimensions will be added to the original data set as ` rotated ` by default, or as specified in the input arguments. - -A tbl object with additional columns for the reduced dimensions. additional columns for the rotated dimensions. The rotated dimensions will be added to the original data set as ` rotated ` by default, or as specified in the input arguments. - -A tbl object with additional columns for the reduced dimensions. additional columns for the rotated dimensions. The rotated dimensions will be added to the original data set as ` rotated ` by default, or as specified in the input arguments. +A tbl object with additional columns for the reduced dimensions. + additional columns for the rotated dimensions. The rotated dimensions will + be added to the original data set as ` rotated ` + by default, or as specified in the input arguments. + +A tbl object with additional columns for the reduced dimensions. + additional columns for the rotated dimensions. The rotated dimensions will + be added to the original data set as ` rotated ` + by default, or as specified in the input arguments. + +A tbl object with additional columns for the reduced dimensions. + additional columns for the rotated dimensions. The rotated dimensions will + be added to the original data set as ` rotated ` + by default, or as specified in the input arguments. + +A tbl object with additional columns for the reduced dimensions. + additional columns for the rotated dimensions. The rotated dimensions + will be added to the original data set as + ` rotated ` by default, or as + specified in the input arguments. A `SummarizedExperiment` object A `SummarizedExperiment` object } \description{ -rotate_dimensions() takes as input a `tbl` formatted as - | | | <...> | and calculates the rotated - dimensional space of the transcript abundance. +rotate_dimensions() takes as input a `tbl` formatted as + | | | <...> | and calculates the rotated + dimensional space of the transcript abundance. } \details{ `r lifecycle::badge("maturing")` @@ -136,15 +155,12 @@ Underlying custom method: } } \examples{ - counts.MDS = tidybulk::se_mini |> identify_abundant() |> reduce_dimensions( method="MDS", .dims = 3) counts.MDS.rotated = rotate_dimensions(counts.MDS, `Dim1`, `Dim2`, - rotation_degrees = 45, - .element = sample) - + rotation_degrees = 45, .element = sample) } diff --git a/man/scale_abundance-methods.Rd b/man/scale_abundance-methods.Rd index 21cd6476..42956d65 100644 --- a/man/scale_abundance-methods.Rd +++ b/man/scale_abundance-methods.Rd @@ -83,7 +83,10 @@ scale_abundance( ) } \arguments{ -\item{.data}{A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment))} +\item{.data}{A `tbl` (with at least three columns for sample, +feature and transcript abundance) or `SummarizedExperiment` +(more convenient if abstracted to tibble with +library(tidySummarizedExperiment))} \item{.sample}{The name of the sample column} @@ -91,51 +94,61 @@ scale_abundance( \item{.abundance}{The name of the transcript/gene abundance column} -\item{method}{A character string. The scaling method passed to the back-end function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile")} +\item{method}{A character string. The scaling method passed to the back-end +function (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile")} -\item{reference_sample}{A character string. The name of the reference sample. If NULL the sample with highest total read count will be selected as reference.} +\item{reference_sample}{A character string. The name of the reference sample. +If NULL the sample with highest total read count will be selected as reference.} -\item{.subset_for_scaling}{A gene-wise quosure condition. This will be used to filter rows (features/genes) of the dataset. For example} +\item{.subset_for_scaling}{A gene-wise quosure condition. This will be used +to filter rows (features/genes) of the dataset. For example} -\item{action}{A character string between "add" (default) and "only". "add" joins the new information to the input tbl (default), "only" return a non-redundant tbl with the just new information.} +\item{action}{A character string between "add" (default) and "only". +"add" joins the new information to the input tbl (default), "only" +return a non-redundant tbl with the just new information.} \item{reference_selection_function}{DEPRECATED. please use reference_sample.} } \value{ -A tbl object with additional columns with scaled data as `_scaled` +A tbl object with additional columns with scaled data +as `_scaled` -A tbl object with additional columns with scaled data as `_scaled` +A tbl object with additional columns with scaled data +as `_scaled` -A tbl object with additional columns with scaled data as `_scaled` +A tbl object with additional columns with scaled data +as `_scaled` -A tbl object with additional columns with scaled data as `_scaled` +A tbl object with additional columns with scaled data +as `_scaled` A `SummarizedExperiment` object A `SummarizedExperiment` object } \description{ -scale_abundance() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and Scales transcript abundance compansating for sequencing depth (e.g., with TMM algorithm, Robinson and Oshlack doi.org/10.1186/gb-2010-11-3-r25). +scale_abundance() takes as input A `tbl` (with at least three + columns for sample, feature and transcript abundance) or + `SummarizedExperiment` (more convenient if abstracted to tibble with + library(tidySummarizedExperiment)) and Scales transcript abundance + compansating for sequencing depth (e.g., with TMM algorithm, + Robinson and Oshlack doi.org/10.1186/gb-2010-11-3-r25). } \details{ `r lifecycle::badge("maturing")` Scales transcript abundance compensating for sequencing depth (e.g., with TMM algorithm, Robinson and Oshlack doi.org/10.1186/gb-2010-11-3-r25). -Lowly transcribed transcripts/genes (defined with minimum_counts and minimum_proportion parameters) -are filtered out from the scaling procedure. +Lowly transcribed transcripts/genes (defined with minimum_counts +and minimum_proportion parameters) are filtered out from the scaling procedure. The scaling inference is then applied back to all unfiltered data. Underlying method edgeR::calcNormFactors(.data, method = c("TMM","TMMwsp","RLE","upperquartile")) } \examples{ - - tidybulk::se_mini |> identify_abundant() |> scale_abundance() - - } diff --git a/man/symbol_to_entrez.Rd b/man/symbol_to_entrez.Rd index d61a335b..e6f0b591 100644 --- a/man/symbol_to_entrez.Rd +++ b/man/symbol_to_entrez.Rd @@ -23,8 +23,8 @@ Get ENTREZ id from gene SYMBOL # This function was designed for data.frame # Convert from SummarizedExperiment for this example. It is NOT reccomended. -data(se_mini) -se_mini |> tidybulk() |> as_tibble() |> - symbol_to_entrez(.transcript = .feature, .sample = .sample) + +tidybulk::se_mini |> tidybulk() |> as_tibble() |> +symbol_to_entrez(.transcript = .feature, .sample = .sample) } diff --git a/man/test_differential_abundance-methods.Rd b/man/test_differential_abundance-methods.Rd index d21594b9..2b7b9c62 100755 --- a/man/test_differential_abundance-methods.Rd +++ b/man/test_differential_abundance-methods.Rd @@ -8,7 +8,9 @@ \alias{test_differential_abundance,tidybulk-method} \alias{test_differential_abundance,SummarizedExperiment-method} \alias{test_differential_abundance,RangedSummarizedExperiment-method} -\title{Perform differential transcription testing using edgeR quasi-likelihood (QLT), edgeR likelihood-ratio (LR), limma-voom, limma-voom-with-quality-weights or DESeq2} +\title{Perform differential transcription testing using edgeR quasi-likelihood +(QLT), edgeR likelihood-ratio (LR), limma-voom, +limma-voom-with-quality-weights or DESeq2} \usage{ test_differential_abundance( .data, @@ -125,9 +127,13 @@ test_differential_abundance( ) } \arguments{ -\item{.data}{A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment))} +\item{.data}{A `tbl` (with at least three columns for sample, feature and +transcript abundance) or `SummarizedExperiment` (more convenient if +abstracted to tibble with library(tidySummarizedExperiment))} -\item{.formula}{A formula representing the desired linear model. If there is more than one factor, they should be in the order factor of interest + additional factors.} +\item{.formula}{A formula representing the desired linear model. If there +is more than one factor, they should be in the order factor of interest + +additional factors.} \item{.sample}{The name of the sample column} @@ -135,49 +141,84 @@ test_differential_abundance( \item{.abundance}{The name of the transcript/gene abundance column} -\item{contrasts}{This parameter takes the format of the contrast parameter of the method of choice. For edgeR and limma-voom is a character vector. For DESeq2 is a list including a character vector of length three. The first covariate is the one the model is tested against (e.g., ~ factor_of_interest)} +\item{contrasts}{This parameter takes the format of the contrast parameter +of the method of choice. For edgeR and limma-voom is a character vector. +For DESeq2 is a list including a character vector of length three. The first +covariate is the one the model is tested against (e.g., ~ factor_of_interest)} -\item{method}{A string character. Either "edgeR_quasi_likelihood" (i.e., QLF), "edgeR_likelihood_ratio" (i.e., LRT), "edger_robust_likelihood_ratio", "DESeq2", "limma_voom", "limma_voom_sample_weights"} +\item{method}{A string character. Either "edgeR_quasi_likelihood" (i.e., QLF), +"edgeR_likelihood_ratio" (i.e., LRT), "edger_robust_likelihood_ratio", +"DESeq2", "limma_voom", "limma_voom_sample_weights"} -\item{test_above_log2_fold_change}{A positive real value. This works for edgeR and limma_voom methods. It uses the `treat` function, which tests that the difference in abundance is bigger than this threshold rather than zero \url{https://pubmed.ncbi.nlm.nih.gov/19176553}.} +\item{test_above_log2_fold_change}{A positive real value. This works for edgeR +and limma_voom methods. It uses the `treat` function, which tests that the +difference in abundance is bigger than this threshold rather than zero +\url{https://pubmed.ncbi.nlm.nih.gov/19176553}.} -\item{scaling_method}{A character string. The scaling method passed to the back-end functions: edgeR and limma-voom (i.e., edgeR::calcNormFactors; "TMM","TMMwsp","RLE","upperquartile"). Setting the parameter to \"none\" will skip the compensation for sequencing-depth for the method edgeR or limma-voom.} +\item{scaling_method}{A character string. The scaling method passed to the +back-end functions: edgeR and limma-voom (i.e., edgeR::calcNormFactors; +"TMM","TMMwsp","RLE","upperquartile"). Setting the parameter to \"none\" +will skip the compensation for sequencing-depth for the method edgeR or limma-voom.} -\item{omit_contrast_in_colnames}{If just one contrast is specified you can choose to omit the contrast label in the colnames.} +\item{omit_contrast_in_colnames}{If just one contrast is specified you can +choose to omit the contrast label in the colnames.} -\item{prefix}{A character string. The prefix you would like to add to the result columns. It is useful if you want to compare several methods.} +\item{prefix}{A character string. The prefix you would like to add to the +result columns. It is useful if you want to compare several methods.} -\item{action}{A character string. Whether to join the new information to the input tbl (add), or just get the non-redundant tbl with the new information (get).} +\item{action}{A character string. Whether to join the new information to the +input tbl (add), or just get the non-redundant tbl with the new information (get).} -\item{...}{Further arguments passed to some of the internal functions. Currently, it is needed just for internal debug.} +\item{...}{Further arguments passed to some of the internal functions. +Currently, it is needed just for internal debug.} \item{significance_threshold}{DEPRECATED - A real between 0 and 1 (usually 0.05).} -\item{fill_missing_values}{DEPRECATED - A boolean. Whether to fill missing sample/transcript values with the median of the transcript. This is rarely needed.} +\item{fill_missing_values}{DEPRECATED - A boolean. Whether to fill missing +sample/transcript values with the median of the transcript. This is rarely needed.} -\item{.contrasts}{DEPRECATED - This parameter takes the format of the contrast parameter of the method of choice. For edgeR and limma-voom is a character vector. For DESeq2 is a list including a character vector of length three. The first covariate is the one the model is tested against (e.g., ~ factor_of_interest)} +\item{.contrasts}{DEPRECATED - This parameter takes the format of the +contrast parameter of the method of choice. For edgeR and limma-voom is a +character vector. For DESeq2 is a list including a character vector of length +three. The first covariate is the one the model is tested against (e.g., ~ factor_of_interest)} } \value{ -A consistent object (to the input) with additional columns for the statistics from the test (e.g., log fold change, p-value and false discovery rate). +A consistent object (to the input) with additional columns for the +statistics from the test (e.g., log fold change, p-value and false discovery rate). -A consistent object (to the input) with additional columns for the statistics from the test (e.g., log fold change, p-value and false discovery rate). +A consistent object (to the input) with additional columns for the +statistics from the test (e.g., log fold change, p-value and false discovery rate). -A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +A consistent object (to the input) with additional columns for the +statistics from the hypothesis test (e.g., log fold change, p-value and +false discovery rate). -A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +A consistent object (to the input) with additional columns for the +statistics from the hypothesis test (e.g., log fold change, p-value and +false discovery rate). A `SummarizedExperiment` object A `SummarizedExperiment` object } \description{ -test_differential_abundance() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with additional columns for the statistics from the hypothesis test. +test_differential_abundance() takes as input A `tbl` +(with at least three columns for sample, feature and transcript abundance) +or `SummarizedExperiment` (more convenient if abstracted to tibble with +library(tidySummarizedExperiment)) and returns a consistent object (to the +input) with additional columns for the statistics from the hypothesis test. } \details{ `r lifecycle::badge("maturing")` -This function provides the option to use edgeR \url{https://doi.org/10.1093/bioinformatics/btp616}, limma-voom \url{https://doi.org/10.1186/gb-2014-15-2-r29}, limma_voom_sample_weights \url{https://doi.org/10.1093/nar/gkv412} or DESeq2 \url{https://doi.org/10.1186/s13059-014-0550-8} to perform the testing. -All methods use raw counts, irrespective of if scale_abundance or adjust_abundance have been calculated, therefore it is essential to add covariates such as batch effects (if applicable) in the formula. +This function provides the option to use edgeR +\url{https://doi.org/10.1093/bioinformatics/btp616}, limma-voom +\url{https://doi.org/10.1186/gb-2014-15-2-r29}, limma_voom_sample_weights +\url{https://doi.org/10.1093/nar/gkv412} or DESeq2 +\url{https://doi.org/10.1186/s13059-014-0550-8} to perform the testing. +All methods use raw counts, irrespective of if scale_abundance or +adjust_abundance have been calculated, therefore it is essential to add +covariates such as batch effects (if applicable) in the formula. Underlying method for edgeR framework: diff --git a/man/test_differential_cellularity-methods.Rd b/man/test_differential_cellularity-methods.Rd index e706193e..a5768c47 100644 --- a/man/test_differential_cellularity-methods.Rd +++ b/man/test_differential_cellularity-methods.Rd @@ -83,9 +83,15 @@ test_differential_cellularity( ) } \arguments{ -\item{.data}{A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment))} +\item{.data}{A `tbl` (with at least three columns for sample, feature and +transcript abundance) or `SummarizedExperiment` (more convenient if +abstracted to tibble with library(tidySummarizedExperiment))} -\item{.formula}{A formula representing the desired linear model. The formula can be of two forms: multivariable (recommended) or univariable Respectively: \"factor_of_interest ~ .\" or \". ~ factor_of_interest\". The dot represents cell-type proportions, and it is mandatory. If censored regression is desired (coxph) the formula should be of the form \"survival::Surv\(y, dead\) ~ .\"} +\item{.formula}{A formula representing the desired linear model. The formula +can be of two forms: multivariable (recommended) or univariable +Respectively: \"factor_of_interest ~ .\" or \". ~ factor_of_interest\". +The dot represents cell-type proportions, and it is mandatory. If censored +regression is desired (coxph) the formula should be of the form \"survival::Surv\(y, dead\) ~ .\"} \item{.sample}{The name of the sample column} @@ -93,29 +99,41 @@ test_differential_cellularity( \item{.abundance}{The name of the transcript/gene abundance column} -\item{method}{A string character. Either \"cibersort\", \"epic\" or \"llsr\". The regression method will be chosen based on being multivariable: lm or cox-regression (both on logit-transformed proportions); or univariable: beta or cox-regression (on logit-transformed proportions). See .formula for multi- or univariable choice.} +\item{method}{A string character. Either \"cibersort\", \"epic\" or \"llsr\". +The regression method will be chosen based on being multivariable: lm or +cox-regression (both on logit-transformed proportions); or univariable: +beta or cox-regression (on logit-transformed proportions). See .formula +for multi- or univariable choice.} -\item{reference}{A data frame. The transcript/cell_type data frame of integer transcript abundance} +\item{reference}{A data frame. The transcript/cell_type data frame of +integer transcript abundance} \item{significance_threshold}{A real between 0 and 1 (usually 0.05).} \item{...}{Further parameters passed to the method deconvolve_cellularity} } \value{ -A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +A consistent object (to the input) with additional columns for +the statistics from the hypothesis test (e.g., log fold change, p-value +and false discovery rate). A `SummarizedExperiment` object A `SummarizedExperiment` object } \description{ -test_differential_cellularity() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with additional columns for the statistics from the hypothesis test. +test_differential_cellularity() takes as input A `tbl` (with at +least three columns for sample, feature and transcript abundance) or +`SummarizedExperiment` (more convenient if abstracted to tibble with +library(tidySummarizedExperiment)) and returns a consistent object +(to the input) with additional columns for the statistics from the hypothesis test. } \details{ `r lifecycle::badge("maturing")` This routine applies a deconvolution method (e.g., Cibersort; DOI: 10.1038/nmeth.3337) -and passes the proportions inferred into a generalised linear model (DOI:dx.doi.org/10.1007/s11749-010-0189-z) +and passes the proportions inferred into a generalised linear model +(DOI:dx.doi.org/10.1007/s11749-010-0189-z) or a cox regression model (ISBN: 978-1-4757-3294-8) Underlying method for the generalised linear model: diff --git a/man/test_gene_enrichment-methods.Rd b/man/test_gene_enrichment-methods.Rd index 43180fc0..b790d115 100644 --- a/man/test_gene_enrichment-methods.Rd +++ b/man/test_gene_enrichment-methods.Rd @@ -107,9 +107,12 @@ test_gene_enrichment( ) } \arguments{ -\item{.data}{A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment))} +\item{.data}{A `tbl` (with at least three columns for sample, feature and +transcript abundance) or `SummarizedExperiment` (more convenient if +abstracted to tibble with library(tidySummarizedExperiment))} -\item{.formula}{A formula with no response variable, representing the desired linear model} +\item{.formula}{A formula with no response variable, representing the +desired linear model} \item{.sample}{The name of the sample column} @@ -117,11 +120,22 @@ test_gene_enrichment( \item{.abundance}{The name of the transcript/gene abundance column} -\item{contrasts}{This parameter takes the format of the contrast parameter of the method of choice. For edgeR and limma-voom is a character vector. For DESeq2 is a list including a character vector of length three. The first covariate is the one the model is tested against (e.g., ~ factor_of_interest)} +\item{contrasts}{This parameter takes the format of the contrast parameter +of the method of choice. For edgeR and limma-voom is a character vector. +For DESeq2 is a list including a character vector of length three. The first +covariate is the one the model is tested against (e.g., ~ factor_of_interest)} -\item{methods}{A character vector. One or 3 or more methods to use in the testing (currently EGSEA errors if 2 are used). Type EGSEA::egsea.base() to see the supported GSE methods.} +\item{methods}{A character vector. One or 3 or more methods to use in the +testing (currently EGSEA errors if 2 are used). Type EGSEA::egsea.base() to +see the supported GSE methods.} -\item{gene_sets}{A character vector or a list. It can take one or more of the following built-in collections as a character vector: c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "kegg_disease", "kegg_metabolism", "kegg_signaling"), to be used with EGSEA buildIdx. c1 is human specific. Alternatively, a list of user-supplied gene sets can be provided, to be used with EGSEA buildCustomIdx. In that case, each gene set is a character vector of Entrez IDs and the names of the list are the gene set names.} +\item{gene_sets}{A character vector or a list. It can take one or more of +the following built-in collections as a character vector: c("h", "c1", "c2", +"c3", "c4", "c5", "c6", "c7", "kegg_disease", "kegg_metabolism", +"kegg_signaling"), to be used with EGSEA buildIdx. c1 is human specific. +Alternatively, a list of user-supplied gene sets can be provided, to be used +with EGSEA buildCustomIdx. In that case, each gene set is a character vector +of Entrez IDs and the names of the list are the gene set names.} \item{species}{A character. It can be human, mouse or rat.} @@ -129,7 +143,10 @@ test_gene_enrichment( \item{method}{DEPRECATED. Please use methods.} -\item{.contrasts}{DEPRECATED - This parameter takes the format of the contrast parameter of the method of choice. For edgeR and limma-voom is a character vector. For DESeq2 is a list including a character vector of length three. The first covariate is the one the model is tested against (e.g., ~ factor_of_interest)} +\item{.contrasts}{DEPRECATED - This parameter takes the format of the +contrast parameter of the method of choice. For edgeR and limma-voom is a +character vector. For DESeq2 is a list including a character vector of length +three. The first covariate is the one the model is tested against (e.g., ~ factor_of_interest)} } \value{ A consistent object (to the input) @@ -145,18 +162,18 @@ A consistent object (to the input) A consistent object (to the input) } \description{ -test_gene_enrichment() takes as input a `tbl` -(with at least three columns for sample, feature and transcript abundance) -or `SummarizedExperiment` (more convenient if abstracted to tibble with +test_gene_enrichment() takes as input a `tbl` (with at least +three columns for sample, feature and transcript abundance) or +`SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a `tbl` of gene set information } \details{ `r lifecycle::badge("maturing")` -This wrapper executes ensemble gene enrichment analyses of the dataset using EGSEA (DOI:0.12688/f1000research.12544.1) +This wrapper executes ensemble gene enrichment analyses of the +dataset using EGSEA (DOI:0.12688/f1000research.12544.1) - -dge <- +dge = data |> keep_abundant( factor_of_interest = !!as.symbol(parse_formula(.formula)[[1]]), @@ -168,11 +185,11 @@ dge <- as_matrix(rownames = !!.entrez) %>% edgeR::DGEList(counts = .) -idx <- buildIdx(entrezIDs = rownames(dge), species = species, - msigdb.gsets = msigdb.gsets, +idx = buildIdx(entrezIDs = rownames(dge), species = species, msigdb.gsets = msigdb.gsets, kegg.exclude = kegg.exclude) dge |> + # Calculate weights limma::voom(design, plot = FALSE) |> @@ -190,9 +207,9 @@ dge |> \dontrun{ library(SummarizedExperiment) -se <- tidybulk::se_mini -rowData(se)$entrez <- rownames(se) -df_entrez <- aggregate_duplicates(se, .transcript = entrez) +se = tidybulk::se_mini +rowData( se)$entrez = rownames(se ) +df_entrez = aggregate_duplicates(se,.transcript = entrez ) library("EGSEA") @@ -202,10 +219,9 @@ library("EGSEA") .sample = sample, .entrez = entrez, .abundance = count, - methods = c("roast", "safe", "gage", - "padog", "globaltest", "ora"), - gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", - "kegg_disease", "kegg_metabolism", "kegg_signaling"), + methods = c("roast" , "safe", "gage" , "padog" , "globaltest", "ora" ), + gene_sets = c("h", "c1", "c2", "c3", "c4", "c5", "c6", + "c7", "kegg_disease", "kegg_metabolism", "kegg_signaling"), species="human", cores = 2 ) diff --git a/man/test_gene_overrepresentation-methods.Rd b/man/test_gene_overrepresentation-methods.Rd index 74c98237..f679ec50 100644 --- a/man/test_gene_overrepresentation-methods.Rd +++ b/man/test_gene_overrepresentation-methods.Rd @@ -71,17 +71,22 @@ test_gene_overrepresentation( ) } \arguments{ -\item{.data}{A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment))} +\item{.data}{A `tbl` (with at least three columns for sample, feature and +transcript abundance) or `SummarizedExperiment` (more convenient if +abstracted to tibble with library(tidySummarizedExperiment))} \item{.entrez}{The ENTREZ ID of the transcripts/genes} \item{.do_test}{A boolean column name symbol. It indicates the transcript to check} -\item{species}{A character. For example, human or mouse. MSigDB uses the latin species names (e.g., \"Mus musculus\", \"Homo sapiens\")} +\item{species}{A character. For example, human or mouse. MSigDB uses the +latin species names (e.g., \"Mus musculus\", \"Homo sapiens\")} \item{.sample}{The name of the sample column} -\item{gene_sets}{A character vector. The subset of MSigDB datasets you want to test against (e.g. \"C2\"). If NULL all gene sets are used (suggested). This argument was added to avoid time overflow of the examples.} +\item{gene_sets}{A character vector. The subset of MSigDB datasets you want +to test against (e.g. \"C2\"). If NULL all gene sets are used (suggested). +This argument was added to avoid time overflow of the examples.} \item{gene_set}{DEPRECATED. Use gene_sets instead.} } @@ -99,12 +104,16 @@ A `SummarizedExperiment` object A `RangedSummarizedExperiment` object } \description{ -test_gene_overrepresentation() takes as input a `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a `tbl` with the GSEA statistics +test_gene_overrepresentation() takes as input a `tbl` +(with at least three columns for sample, feature and transcript abundance) +or `SummarizedExperiment` (more convenient if abstracted to tibble with +library(tidySummarizedExperiment)) and returns a `tbl` with the GSEA statistics } \details{ `r lifecycle::badge("maturing")` -This wrapper execute gene enrichment analyses of the dataset using a list of transcripts and GSEA. +This wrapper execute gene enrichment analyses of the dataset using +a list of transcripts and GSEA. This wrapper uses clusterProfiler (DOI: doi.org/10.1089/omi.2011.0118) on the back-end. Undelying method: diff --git a/man/test_gene_rank-methods.Rd b/man/test_gene_rank-methods.Rd index dadabd6c..d9d854df 100644 --- a/man/test_gene_rank-methods.Rd +++ b/man/test_gene_rank-methods.Rd @@ -71,17 +71,26 @@ test_gene_rank( ) } \arguments{ -\item{.data}{A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment))} +\item{.data}{A `tbl` (with at least three columns for sample, feature and +transcript abundance) or `SummarizedExperiment` (more convenient if +abstracted to tibble with library(tidySummarizedExperiment))} \item{.entrez}{The ENTREZ ID of the transcripts/genes} \item{.arrange_desc}{A column name of the column to arrange in decreasing order} -\item{species}{A character. For example, human or mouse. MSigDB uses the latin species names (e.g., \"Mus musculus\", \"Homo sapiens\")} +\item{species}{A character. For example, human or mouse. MSigDB uses the +latin species names (e.g., \"Mus musculus\", \"Homo sapiens\")} \item{.sample}{The name of the sample column} -\item{gene_sets}{A character vector or a list. It can take one or more of the following built-in collections as a character vector: c("h", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "kegg_disease", "kegg_metabolism", "kegg_signaling"), to be used with EGSEA buildIdx. c1 is human specific. Alternatively, a list of user-supplied gene sets can be provided, to be used with EGSEA buildCustomIdx. In that case, each gene set is a character vector of Entrez IDs and the names of the list are the gene set names.} +\item{gene_sets}{A character vector or a list. It can take one or more of +the following built-in collections as a character vector: c("h", "c1", "c2", +"c3", "c4", "c5", "c6", "c7", "kegg_disease", "kegg_metabolism", +"kegg_signaling"), to be used with EGSEA buildIdx. c1 is human specific. +Alternatively, a list of user-supplied gene sets can be provided, to be used +with EGSEA buildCustomIdx. In that case, each gene set is a character vector +of Entrez IDs and the names of the list are the gene set names.} \item{gene_set}{DEPRECATED. Use gene_sets instead.} } @@ -99,19 +108,24 @@ A `SummarizedExperiment` object A `RangedSummarizedExperiment` object } \description{ -test_gene_rank() takes as input a `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a `tbl` with the GSEA statistics +test_gene_rank() takes as input a `tbl` (with at least three +columns for sample, feature and transcript abundance) or +`SummarizedExperiment` (more convenient if abstracted to tibble with +library(tidySummarizedExperiment)) and returns a `tbl` with the GSEA statistics } \details{ \lifecycle{maturing} -This wrapper execute gene enrichment analyses of the dataset using a list of transcripts and GSEA. +This wrapper execute gene enrichment analyses of the dataset using +a list of transcripts and GSEA. This wrapper uses clusterProfiler (DOI: doi.org/10.1089/omi.2011.0118) on the back-end. Undelying method: # Get gene sets signatures msigdbr::msigdbr(species = species) %>% -# Filter specific gene_sets if specified. This was introduced to speed up examples executionS +# Filter specific gene_sets if specified. This was introduced to speed up +examples executionS when( !is.null(gene_sets ) ~ filter(., gs_cat %in% gene_sets ), ~ (.) diff --git a/man/test_stratification_cellularity-methods.Rd b/man/test_stratification_cellularity-methods.Rd index be7e469d..4663b41e 100644 --- a/man/test_stratification_cellularity-methods.Rd +++ b/man/test_stratification_cellularity-methods.Rd @@ -8,7 +8,8 @@ \alias{test_stratification_cellularity,tidybulk-method} \alias{test_stratification_cellularity,SummarizedExperiment-method} \alias{test_stratification_cellularity,RangedSummarizedExperiment-method} -\title{Test of stratification of biological replicates based on tissue composition, one cell-type at the time, using Kaplan-meier curves.} +\title{Test of stratification of biological replicates based on tissue composition, +one cell-type at the time, using Kaplan-meier curves.} \usage{ test_stratification_cellularity( .data, @@ -77,9 +78,15 @@ test_stratification_cellularity( ) } \arguments{ -\item{.data}{A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment))} +\item{.data}{A `tbl` (with at least three columns for sample, feature and +transcript abundance) or `SummarizedExperiment` (more convenient if +abstracted to tibble with library(tidySummarizedExperiment))} -\item{.formula}{A formula representing the desired linear model. The formula can be of two forms: multivariable (recommended) or univariable Respectively: \"factor_of_interest ~ .\" or \". ~ factor_of_interest\". The dot represents cell-type proportions, and it is mandatory. If censored regression is desired (coxph) the formula should be of the form \"survival::Surv\(y, dead\) ~ .\"} +\item{.formula}{A formula representing the desired linear model. The formula +can be of two forms: multivariable (recommended) or univariable +Respectively: \"factor_of_interest ~ .\" or \". ~ factor_of_interest\". +The dot represents cell-type proportions, and it is mandatory. If censored +regression is desired (coxph) the formula should be of the form \"survival::Surv\(y, dead\) ~ .\"} \item{.sample}{The name of the sample column} @@ -87,27 +94,43 @@ test_stratification_cellularity( \item{.abundance}{The name of the transcript/gene abundance column} -\item{method}{A string character. Either \"cibersort\", \"epic\" or \"llsr\". The regression method will be chosen based on being multivariable: lm or cox-regression (both on logit-transformed proportions); or univariable: beta or cox-regression (on logit-transformed proportions). See .formula for multi- or univariable choice.} +\item{method}{A string character. Either \"cibersort\", \"epic\" or \"llsr\". +The regression method will be chosen based on being multivariable: lm or +cox-regression (both on logit-transformed proportions); or univariable: beta +or cox-regression (on logit-transformed proportions). See .formula for +multi- or univariable choice.} -\item{reference}{A data frame. The transcript/cell_type data frame of integer transcript abundance} +\item{reference}{A data frame. The transcript/cell_type data frame of integer +transcript abundance} \item{...}{Further parameters passed to the method deconvolve_cellularity} } \value{ -A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +A consistent object (to the input) with additional columns for the +statistics from the hypothesis test (e.g., log fold change, p-value and +false discovery rate). -A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +A consistent object (to the input) with additional columns for the +statistics from the hypothesis test (e.g., log fold change, p-value and +false discovery rate). -A consistent object (to the input) with additional columns for the statistics from the hypothesis test (e.g., log fold change, p-value and false discovery rate). +A consistent object (to the input) with additional columns for the +statistics from the hypothesis test (e.g., log fold change, p-value and +false discovery rate). } \description{ -test_stratification_cellularity() takes as input A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) and returns a consistent object (to the input) with additional columns for the statistics from the hypothesis test. +test_stratification_cellularity() takes as input A `tbl` +(with at least three columns for sample, feature and transcript abundance) +or `SummarizedExperiment` (more convenient if abstracted to tibble with +library(tidySummarizedExperiment)) and returns a consistent object +(to the input) with additional columns for the statistics from the hypothesis test. } \details{ `r lifecycle::badge("maturing")` This routine applies a deconvolution method (e.g., Cibersort; DOI: 10.1038/nmeth.3337) -and passes the proportions inferred into a generalised linear model (DOI:dx.doi.org/10.1007/s11749-010-0189-z) +and passes the proportions inferred into a generalised linear model +(DOI:dx.doi.org/10.1007/s11749-010-0189-z) or a cox regression model (ISBN: 978-1-4757-3294-8) @@ -125,8 +148,6 @@ deconvolve_cellularity( survival::survdiff(data = data, .my_formula) } \examples{ - - tidybulk::se_mini |> test_stratification_cellularity( survival::Surv(days, dead) ~ ., diff --git a/man/tidybulk-methods.Rd b/man/tidybulk-methods.Rd index b7439c81..a6fba8f8 100644 --- a/man/tidybulk-methods.Rd +++ b/man/tidybulk-methods.Rd @@ -7,7 +7,8 @@ \alias{tidybulk,tbl_df-method} \alias{tidybulk,SummarizedExperiment-method} \alias{tidybulk,RangedSummarizedExperiment-method} -\title{Creates an annotated `tidybulk` tibble from a `tbl` or `SummarizedExperiment` object} +\title{Creates an annotated `tidybulk` tibble from a `tbl` or +`SummarizedExperiment` object} \usage{ tidybulk(.data, .sample, .transcript, .abundance, .abundance_scaled = NULL) @@ -20,7 +21,9 @@ tidybulk(.data, .sample, .transcript, .abundance, .abundance_scaled = NULL) \S4method{tidybulk}{RangedSummarizedExperiment}(.data, .sample, .transcript, .abundance, .abundance_scaled = NULL) } \arguments{ -\item{.data}{A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment))} +\item{.data}{A `tbl` (with at least three columns for sample, feature +and transcript abundance) or `SummarizedExperiment` (more convenient if +abstracted to tibble with library(tidySummarizedExperiment))} \item{.sample}{The name of the sample column} @@ -28,7 +31,8 @@ tidybulk(.data, .sample, .transcript, .abundance, .abundance_scaled = NULL) \item{.abundance}{The name of the transcript/gene abundance column} -\item{.abundance_scaled}{The name of the transcript/gene scaled abundance column} +\item{.abundance_scaled}{The name of the transcript/gene scaled +abundance column} } \value{ A `tidybulk` object @@ -42,10 +46,10 @@ A `tidybulk` object A `tidybulk` object } \description{ -tidybulk() creates an annotated `tidybulk` tibble from a `tbl` -(with at least three columns for sample, feature and transcript abundance) -or `SummarizedExperiment` (more convenient if abstracted to tibble with -library(tidySummarizedExperiment)) +tidybulk() creates an annotated `tidybulk` tibble from a + `tbl` (with at least three columns for sample, feature and transcript + abundance) or `SummarizedExperiment` (more convenient if abstracted to + tibble with library(tidySummarizedExperiment)) } \details{ `r lifecycle::badge("maturing")` @@ -53,7 +57,8 @@ library(tidySummarizedExperiment)) This function creates a tidybulk object and is useful if you want to avoid to specify .sample, .transcript and .abundance arguments all the times. The tidybulk object have an attribute called internals where these three -arguments are stored as metadata. They can be extracted as attr(, "internals"). +arguments are stored as metadata. They can be extracted as +attr(, "internals"). } \examples{ diff --git a/man/tidybulk_SAM_BAM-methods.Rd b/man/tidybulk_SAM_BAM-methods.Rd index 7087bddd..d7840e70 100644 --- a/man/tidybulk_SAM_BAM-methods.Rd +++ b/man/tidybulk_SAM_BAM-methods.Rd @@ -13,7 +13,9 @@ tidybulk_SAM_BAM(file_names, genome = "hg38", ...) \arguments{ \item{file_names}{A character vector} -\item{genome}{A character string specifying an in-built annotation used for read summarization. It has four possible values including "mm10", "mm9", "hg38" and "hg19"} +\item{genome}{A character string specifying an in-built annotation used for +read summarization. It has four possible values including "mm10", "mm9", +"hg38" and "hg19"} \item{...}{Further parameters passed to the function Rsubread::featureCounts} } @@ -23,15 +25,20 @@ A `tidybulk` object A `tidybulk` object } \description{ -tidybulk_SAM_BAM() creates a `tt` object from A `tbl` (with at least three columns for sample, feature and transcript abundance) or `SummarizedExperiment` (more convenient if abstracted to tibble with library(tidySummarizedExperiment)) +tidybulk_SAM_BAM() creates a `tt` object from A `tbl` + (with at least three columns for sample, feature and transcript abundance) + or `SummarizedExperiment` (more convenient if abstracted to tibble with + library(tidySummarizedExperiment)) } \details{ `r lifecycle::badge("maturing")` -This function is based on FeatureCounts package (DOI: 10.1093/bioinformatics/btt656). This function creates a tidybulk object and is useful if you want -to avoid to specify .sample, .transcript and .abundance arguments all the times. -The tidybulk object have an attribute called internals where these three -arguments are stored as metadata. They can be extracted as attr(, "internals"). +This function is based on FeatureCounts package + (DOI: 10.1093/bioinformatics/btt656). This function creates a tidybulk + object and is useful if you want to avoid to specify .sample, + .transcript and .abundance arguments all the times. The tidybulk object + have an attribute called internals where these three arguments are stored + as metadata. They can be extracted as attr(, "internals"). Underlying core function Rsubread::featureCounts(annot.inbuilt = genome,nthreads = n_cores, ...) diff --git a/tidybulk.Rproj b/tidybulk.Rproj new file mode 100644 index 00000000..21a4da08 --- /dev/null +++ b/tidybulk.Rproj @@ -0,0 +1,17 @@ +Version: 1.0 + +RestoreWorkspace: Default +SaveWorkspace: Default +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: Sweave +LaTeX: pdfLaTeX + +BuildType: Package +PackageUseDevtools: Yes +PackageInstallArgs: --no-multiarch --with-keep.source From fba863a51c6d99069716b41a5705aa9610a12859 Mon Sep 17 00:00:00 2001 From: chilampoon Date: Mon, 12 Feb 2024 00:06:14 -0500 Subject: [PATCH 28/30] resolve doc warnings --- .gitignore | 1 + NAMESPACE | 2 + R/functions.R | 2 +- R/methods.R | 129 ++++------------------------- R/methods_SE.R | 51 ------------ R/validation.R | 3 +- man/figures/plot_cluster-1.png | Bin 20847 -> 9188 bytes man/figures/plot_drop-1.png | Bin 24432 -> 10322 bytes man/figures/plot_drop2-1.png | Bin 26847 -> 9544 bytes man/figures/plot_normalise-1.png | Bin 55155 -> 35060 bytes man/figures/plot_rotate_1-1.png | Bin 24844 -> 10343 bytes man/figures/plot_rotate_2-1.png | Bin 29046 -> 13304 bytes man/figures/unnamed-chunk-14-1.png | Bin 55315 -> 37014 bytes 13 files changed, 24 insertions(+), 164 deletions(-) diff --git a/.gitignore b/.gitignore index 5b6a0652..da84f740 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .Rhistory .RData .Ruserdata +.Rproj diff --git a/NAMESPACE b/NAMESPACE index 8a3171dc..597aaf6d 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -19,6 +19,7 @@ S3method(summarise,tidybulk) S3method(summarize,tidybulk) S3method(ungroup,tidybulk) S3method(unnest,nested_tidybulk) +S3method(validation,tidybulk) export("%>%") export(adjust_abundance) export(aggregate_duplicates) @@ -56,6 +57,7 @@ export(test_stratification_cellularity) export(tibble) export(tidybulk) export(tidybulk_SAM_BAM) +export(validation_default) exportMethods(as_SummarizedExperiment) exportMethods(quantile_normalise_abundance) exportMethods(scale_abundance) diff --git a/R/functions.R b/R/functions.R index d12fe488..7736ba6e 100755 --- a/R/functions.R +++ b/R/functions.R @@ -821,7 +821,7 @@ get_differential_transcript_abundance_glmmSeq <- function(.data, # Create design matrix for dispersion, removing random effects design = model.matrix( - object = .formula |> eliminate_random_effects(), + object = .formula |> lme4::nobars(), data = metadata ) diff --git a/R/methods.R b/R/methods.R index f52e1146..80133da2 100755 --- a/R/methods.R +++ b/R/methods.R @@ -47,18 +47,18 @@ setOldClass("tidybulk") #' @export #' setGeneric("tidybulk", function(.data, - .sample, - .transcript, - .abundance, - .abundance_scaled = NULL) - standardGeneric("tidybulk")) + .sample, + .transcript, + .abundance, + .abundance_scaled = NULL) + standardGeneric("tidybulk")) # Set internal -.tidybulk = function(.data, - .sample, - .transcript, - .abundance, - .abundance_scaled = NULL) { +.tidybulk <- function(.data, + .sample, + .transcript, + .abundance, + .abundance_scaled = NULL) { # Make col names .sample = enquo(.sample) .transcript = enquo(.transcript) @@ -89,8 +89,6 @@ setGeneric("tidybulk", function(.data, #' #' @export #' -#' @inheritParams tidybulk -#' #' @docType methods #' @rdname tidybulk-methods #' @@ -104,8 +102,6 @@ setMethod("tidybulk", "spec_tbl_df", .tidybulk) #' #' @importFrom purrr map2 #' -#' @inheritParams tidybulk -#' #' @docType methods #' @rdname tidybulk-methods #' @@ -136,16 +132,16 @@ setMethod("tidybulk", "tbl_df", .tidybulk) #' @export #' setGeneric("as_SummarizedExperiment", function(.data, - .sample = NULL, - .transcript = NULL, - .abundance = NULL) + .sample = NULL, + .transcript = NULL, + .abundance = NULL) standardGeneric("as_SummarizedExperiment")) -.as_SummarizedExperiment = function(.data, - .sample = NULL, - .transcript = NULL, - .abundance = NULL) { +.as_SummarizedExperiment <- function(.data, + .sample = NULL, + .transcript = NULL, + .abundance = NULL) { # Fix NOTEs . = NULL @@ -271,8 +267,6 @@ setGeneric("as_SummarizedExperiment", function(.data, #' #' @export #' -#' @inheritParams as_SummarizedExperiment -#' #' @docType methods #' @rdname as_SummarizedExperiment-methods #' @@ -284,8 +278,6 @@ setMethod("as_SummarizedExperiment", "spec_tbl_df", .as_SummarizedExperiment) #' #' @export #' -#' @inheritParams as_SummarizedExperiment -#' #' @docType methods #' @rdname as_SummarizedExperiment-methods #' @@ -297,8 +289,6 @@ setMethod("as_SummarizedExperiment", "tbl_df", .as_SummarizedExperiment) #' #' @export #' -#' @inheritParams as_SummarizedExperiment -#' #' @docType methods #' @rdname as_SummarizedExperiment-methods #' @@ -353,8 +343,6 @@ setGeneric("tidybulk_SAM_BAM", function(file_names, genome = "hg38", ...) #' #' @export #' -#' @inheritParams tidybulk_SAM_BAM-methods -#' #' @docType methods #' @rdname tidybulk_SAM_BAM-methods #' @@ -434,7 +422,7 @@ setGeneric("scale_abundance", function(.data, standardGeneric("scale_abundance")) # Set internal -.scale_abundance = function(.data, +.scale_abundance <- function(.data, .sample = NULL, .transcript = NULL, .abundance = NULL, @@ -442,7 +430,6 @@ setGeneric("scale_abundance", function(.data, reference_sample = NULL, .subset_for_scaling = NULL, action = "add", - # DEPRECATED reference_selection_function = NULL) { @@ -563,7 +550,6 @@ setGeneric("scale_abundance", function(.data, #' scale_abundance #' #' @export -#' @inheritParams scale_abundance #' @docType methods #' @rdname scale_abundance-methods #' @@ -575,7 +561,6 @@ setMethod("scale_abundance", "spec_tbl_df", .scale_abundance) #' scale_abundance #' #' @export -#' @inheritParams scale_abundance #' @docType methods #' @rdname scale_abundance-methods #' @@ -588,8 +573,6 @@ setMethod("scale_abundance", "tbl_df", .scale_abundance) #' #' @export #' -#' @inheritParams scale_abundance -#' #' @docType methods #' @rdname scale_abundance-methods #' @@ -784,8 +767,6 @@ setGeneric("quantile_normalise_abundance", function( #' #' @export #' -#' @inheritParams quantile_normalise_abundance -#' #' @docType methods #' @rdname quantile_normalise_abundance-methods #' @@ -799,8 +780,6 @@ setMethod("quantile_normalise_abundance", "spec_tbl_df", #' #' @export #' -#' @inheritParams quantile_normalise_abundance -#' #' @docType methods #' @rdname quantile_normalise_abundance-methods #' @@ -813,8 +792,6 @@ setMethod("quantile_normalise_abundance", "tbl_df", .quantile_normalise_abundanc #' #' @export #' -#' @inheritParams quantile_normalise_abundance -#' #' @docType methods #' @rdname quantile_normalise_abundance-methods #' @@ -1027,7 +1004,6 @@ setGeneric("cluster_elements", function(.data, } #' cluster_elements -#' @inheritParams cluster_elements #' #' @docType methods #' @rdname cluster_elements-methods @@ -1037,7 +1013,6 @@ setGeneric("cluster_elements", function(.data, setMethod("cluster_elements", "spec_tbl_df", .cluster_elements) #' cluster_elements -#' @inheritParams cluster_elements #' #' @docType methods #' @rdname cluster_elements-methods @@ -1047,7 +1022,6 @@ setMethod("cluster_elements", "spec_tbl_df", .cluster_elements) setMethod("cluster_elements", "tbl_df", .cluster_elements) #' cluster_elements -#' @inheritParams cluster_elements #' #' @docType methods #' @rdname cluster_elements-methods @@ -1331,7 +1305,6 @@ setGeneric("reduce_dimensions", function(.data, } #' reduce_dimensions -#' @inheritParams reduce_dimensions #' #' @docType methods #' @rdname reduce_dimensions-methods @@ -1340,7 +1313,6 @@ setGeneric("reduce_dimensions", function(.data, setMethod("reduce_dimensions", "spec_tbl_df", .reduce_dimensions) #' reduce_dimensions -#' @inheritParams reduce_dimensions #' #' @docType methods #' @rdname reduce_dimensions-methods @@ -1349,7 +1321,6 @@ setMethod("reduce_dimensions", "spec_tbl_df", .reduce_dimensions) setMethod("reduce_dimensions", "tbl_df", .reduce_dimensions) #' reduce_dimensions -#' @inheritParams reduce_dimensions #' #' @docType methods #' @rdname reduce_dimensions-methods @@ -1513,7 +1484,6 @@ setGeneric("rotate_dimensions", function(.data, } #' rotate_dimensions -#' @inheritParams rotate_dimensions #' #' @docType methods #' @rdname rotate_dimensions-methods @@ -1525,7 +1495,6 @@ setGeneric("rotate_dimensions", function(.data, setMethod("rotate_dimensions", "spec_tbl_df", .rotate_dimensions) #' rotate_dimensions -#' @inheritParams rotate_dimensions #' #' @docType methods #' @rdname rotate_dimensions-methods @@ -1537,7 +1506,6 @@ setMethod("rotate_dimensions", "spec_tbl_df", .rotate_dimensions) setMethod("rotate_dimensions", "tbl_df", .rotate_dimensions) #' rotate_dimensions -#' @inheritParams rotate_dimensions #' #' @docType methods #' @rdname rotate_dimensions-methods @@ -1755,7 +1723,6 @@ setGeneric("remove_redundancy", function(.data, } #' remove_redundancy -#' @inheritParams remove_redundancy #' #' @docType methods #' @rdname remove_redundancy-methods @@ -1764,7 +1731,6 @@ setGeneric("remove_redundancy", function(.data, setMethod("remove_redundancy", "spec_tbl_df", .remove_redundancy) #' remove_redundancy -#' @inheritParams remove_redundancy #' #' @docType methods #' @rdname remove_redundancy-methods @@ -1773,7 +1739,6 @@ setMethod("remove_redundancy", "spec_tbl_df", .remove_redundancy) setMethod("remove_redundancy", "tbl_df", .remove_redundancy) #' remove_redundancy -#' @inheritParams remove_redundancy #' #' @docType methods #' @rdname remove_redundancy-methods @@ -2039,7 +2004,6 @@ setGeneric("adjust_abundance", function(.data, } #' adjust_abundance -#' @inheritParams adjust_abundance #' #' @docType methods #' @rdname adjust_abundance-methods @@ -2049,7 +2013,6 @@ setGeneric("adjust_abundance", function(.data, setMethod("adjust_abundance", "spec_tbl_df", .adjust_abundance) #' adjust_abundance -#' @inheritParams adjust_abundance #' #' @docType methods #' @rdname adjust_abundance-methods @@ -2059,7 +2022,6 @@ setMethod("adjust_abundance", "spec_tbl_df", .adjust_abundance) setMethod("adjust_abundance", "tbl_df", .adjust_abundance) #' adjust_abundance -#' @inheritParams adjust_abundance #' #' @docType methods #' @rdname adjust_abundance-methods @@ -2199,7 +2161,6 @@ setGeneric("aggregate_duplicates", function(.data, } #' aggregate_duplicates -#' @inheritParams aggregate_duplicates #' #' @docType methods #' @rdname aggregate_duplicates-methods @@ -2209,7 +2170,6 @@ setGeneric("aggregate_duplicates", function(.data, setMethod("aggregate_duplicates", "spec_tbl_df", .aggregate_duplicates) #' aggregate_duplicates -#' @inheritParams aggregate_duplicates #' #' @docType methods #' @rdname aggregate_duplicates-methods @@ -2219,7 +2179,6 @@ setMethod("aggregate_duplicates", "spec_tbl_df", .aggregate_duplicates) setMethod("aggregate_duplicates", "tbl_df", .aggregate_duplicates) #' aggregate_duplicates -#' @inheritParams aggregate_duplicates #' #' @docType methods #' @rdname aggregate_duplicates-methods @@ -2376,7 +2335,6 @@ setGeneric("deconvolve_cellularity", function(.data, } #' deconvolve_cellularity -#' @inheritParams deconvolve_cellularity #' #' @docType methods #' @rdname deconvolve_cellularity-methods @@ -2388,7 +2346,6 @@ setMethod("deconvolve_cellularity", .deconvolve_cellularity) #' deconvolve_cellularity -#' @inheritParams deconvolve_cellularity #' #' @docType methods #' @rdname deconvolve_cellularity-methods @@ -2398,7 +2355,6 @@ setMethod("deconvolve_cellularity", setMethod("deconvolve_cellularity", "tbl_df", .deconvolve_cellularity) #' deconvolve_cellularity -#' @inheritParams deconvolve_cellularity #' #' @docType methods #' @rdname deconvolve_cellularity-methods @@ -2576,7 +2532,6 @@ setGeneric("describe_transcript", function(.data, #' describe_transcript -#' @inheritParams describe_transcript #' #' @docType methods #' @rdname describe_transcript-methods @@ -2585,7 +2540,6 @@ setGeneric("describe_transcript", function(.data, setMethod("describe_transcript", "spec_tbl_df", .describe_transcript) #' describe_transcript -#' @inheritParams describe_transcript #' #' @docType methods #' @rdname describe_transcript-methods @@ -2594,7 +2548,6 @@ setMethod("describe_transcript", "spec_tbl_df", .describe_transcript) setMethod("describe_transcript", "tbl_df", .describe_transcript) #' describe_transcript -#' @inheritParams describe_transcript #' #' @docType methods #' @rdname describe_transcript-methods @@ -2701,7 +2654,6 @@ setGeneric("ensembl_to_symbol", function(.data, } #' ensembl_to_symbol -#' @inheritParams ensembl_to_symbol #' #' @docType methods #' @rdname ensembl_to_symbol-methods @@ -2711,7 +2663,6 @@ setGeneric("ensembl_to_symbol", function(.data, setMethod("ensembl_to_symbol", "spec_tbl_df", .ensembl_to_symbol) #' ensembl_to_symbol -#' @inheritParams ensembl_to_symbol #' #' @docType methods #' @rdname ensembl_to_symbol-methods @@ -2721,7 +2672,6 @@ setMethod("ensembl_to_symbol", "spec_tbl_df", .ensembl_to_symbol) setMethod("ensembl_to_symbol", "tbl_df", .ensembl_to_symbol) #' ensembl_to_symbol -#' @inheritParams ensembl_to_symbol #' #' @docType methods #' @rdname ensembl_to_symbol-methods @@ -3157,7 +3107,6 @@ such as batch effects (if applicable) in the formula. } #' test_differential_abundance -#' @inheritParams test_differential_abundance #' #' @docType methods #' @rdname test_differential_abundance-methods @@ -3169,7 +3118,6 @@ setMethod("test_differential_abundance", .test_differential_abundance) #' test_differential_abundance -#' @inheritParams test_differential_abundance #' #' @docType methods #' @rdname test_differential_abundance-methods @@ -3182,7 +3130,6 @@ setMethod("test_differential_abundance", .test_differential_abundance) #' test_differential_abundance -#' @inheritParams test_differential_abundance #' #' @docType methods #' @rdname test_differential_abundance-methods @@ -3308,7 +3255,6 @@ setGeneric("keep_variable", function(.data, } #' keep_variable -#' @inheritParams keep_variable #' #' @docType methods #' @rdname keep_variable-methods @@ -3319,7 +3265,6 @@ setGeneric("keep_variable", function(.data, setMethod("keep_variable", "spec_tbl_df", .keep_variable) #' keep_variable -#' @inheritParams keep_variable #' #' @docType methods #' @rdname keep_variable-methods @@ -3330,7 +3275,6 @@ setMethod("keep_variable", "spec_tbl_df", .keep_variable) setMethod("keep_variable", "tbl_df", .keep_variable) #' keep_variable -#' @inheritParams keep_variable #' #' @docType methods #' @rdname keep_variable-methods @@ -3540,7 +3484,6 @@ setGeneric("identify_abundant", function(.data, } #' keep_abundant -#' @inheritParams identify_abundant #' #' @docType methods #' @rdname identify_abundant-methods @@ -3551,7 +3494,6 @@ setGeneric("identify_abundant", function(.data, setMethod("identify_abundant", "spec_tbl_df", .identify_abundant) #' identify_abundant -#' @inheritParams identify_abundant #' #' @docType methods #' @rdname identify_abundant-methods @@ -3562,7 +3504,6 @@ setMethod("identify_abundant", "spec_tbl_df", .identify_abundant) setMethod("identify_abundant", "tbl_df", .identify_abundant) #' identify_abundant -#' @inheritParams identify_abundant #' #' @docType methods #' @rdname identify_abundant-methods @@ -3686,7 +3627,6 @@ setGeneric("keep_abundant", function(.data, } #' keep_abundant -#' @inheritParams keep_abundant #' #' @docType methods #' @rdname keep_abundant-methods @@ -3697,7 +3637,6 @@ setGeneric("keep_abundant", function(.data, setMethod("keep_abundant", "spec_tbl_df", .keep_abundant) #' keep_abundant -#' @inheritParams keep_abundant #' #' @docType methods #' @rdname keep_abundant-methods @@ -3708,7 +3647,6 @@ setMethod("keep_abundant", "spec_tbl_df", .keep_abundant) setMethod("keep_abundant", "tbl_df", .keep_abundant) #' keep_abundant -#' @inheritParams keep_abundant #' #' @docType methods #' @rdname keep_abundant-methods @@ -3946,7 +3884,6 @@ setGeneric("test_gene_enrichment", function(.data, } #' test_gene_enrichment -#' @inheritParams test_gene_enrichment #' #' @docType methods #' @rdname test_gene_enrichment-methods @@ -3957,7 +3894,6 @@ setMethod("test_gene_enrichment", .test_gene_enrichment) #' test_gene_enrichment -#' @inheritParams test_gene_enrichment #' #' @docType methods #' @rdname test_gene_enrichment-methods @@ -3968,7 +3904,6 @@ setMethod("test_gene_enrichment", .test_gene_enrichment) #' test_gene_enrichment -#' @inheritParams test_gene_enrichment #' #' @docType methods #' @rdname test_gene_enrichment-methods @@ -4114,7 +4049,6 @@ setGeneric("test_gene_overrepresentation", function(.data, } #' test_gene_overrepresentation -#' @inheritParams test_gene_overrepresentation #' #' @docType methods #' @rdname test_gene_overrepresentation-methods @@ -4125,7 +4059,6 @@ setMethod("test_gene_overrepresentation", .test_gene_overrepresentation) #' test_gene_overrepresentation -#' @inheritParams test_gene_overrepresentation #' #' @docType methods #' @rdname test_gene_overrepresentation-methods @@ -4136,7 +4069,6 @@ setMethod("test_gene_overrepresentation", .test_gene_overrepresentation) #' test_gene_overrepresentation -#' @inheritParams test_gene_overrepresentation #' #' @docType methods #' @rdname test_gene_overrepresentation-methods @@ -4337,7 +4269,6 @@ setGeneric("test_gene_rank", function(.data, } #' test_gene_rank -#' @inheritParams test_gene_rank #' #' @docType methods #' @rdname test_gene_rank-methods @@ -4348,7 +4279,6 @@ setMethod("test_gene_rank", .test_gene_rank) #' test_gene_rank -#' @inheritParams test_gene_rank #' #' @docType methods #' @rdname test_gene_rank-methods @@ -4359,7 +4289,6 @@ setMethod("test_gene_rank", .test_gene_rank) #' test_gene_rank -#' @inheritParams test_gene_rank #' #' @docType methods #' @rdname test_gene_rank-methods @@ -4436,7 +4365,6 @@ setGeneric("pivot_sample", function(.data, } #' pivot_sample -#' @inheritParams pivot_sample #' #' @docType methods #' @rdname pivot_sample-methods @@ -4446,7 +4374,6 @@ setMethod("pivot_sample", .pivot_sample) #' pivot_sample -#' @inheritParams pivot_sample #' #' @docType methods #' @rdname pivot_sample-methods @@ -4456,7 +4383,6 @@ setMethod("pivot_sample", .pivot_sample) #' pivot_sample -#' @inheritParams pivot_sample #' #' @docType methods #' @rdname pivot_sample-methods @@ -4532,7 +4458,6 @@ setGeneric("pivot_transcript", function(.data, } #' pivot_transcript -#' @inheritParams pivot_transcript #' #' @docType methods #' @rdname pivot_transcript-methods @@ -4542,7 +4467,6 @@ setMethod("pivot_transcript", .pivot_transcript) #' pivot_transcript -#' @inheritParams pivot_transcript #' #' @docType methods #' @rdname pivot_transcript-methods @@ -4552,7 +4476,6 @@ setMethod("pivot_transcript", .pivot_transcript) #' pivot_transcript -#' @inheritParams pivot_transcript #' #' @docType methods #' @rdname pivot_transcript-methods @@ -4645,7 +4568,6 @@ setGeneric("fill_missing_abundance", function(.data, } #' fill_missing_abundance -#' @inheritParams fill_missing_abundance #' #' @docType methods #' @rdname fill_missing_abundance-methods @@ -4654,7 +4576,6 @@ setGeneric("fill_missing_abundance", function(.data, setMethod("fill_missing_abundance", "spec_tbl_df", .fill_missing_abundance) #' fill_missing_abundance -#' @inheritParams fill_missing_abundance #' #' @docType methods #' @rdname fill_missing_abundance-methods @@ -4663,7 +4584,6 @@ setMethod("fill_missing_abundance", "spec_tbl_df", .fill_missing_abundance) setMethod("fill_missing_abundance", "tbl_df", .fill_missing_abundance) #' fill_missing_abundance -#' @inheritParams fill_missing_abundance #' #' @docType methods #' @rdname fill_missing_abundance-methods @@ -4788,7 +4708,6 @@ setGeneric("impute_missing_abundance", function(.data, } #' impute_missing_abundance -#' @inheritParams impute_missing_abundance #' #' @docType methods #' @rdname impute_missing_abundance-methods @@ -4797,7 +4716,6 @@ setGeneric("impute_missing_abundance", function(.data, setMethod("impute_missing_abundance", "spec_tbl_df", .impute_missing_abundance) #' impute_missing_abundance -#' @inheritParams impute_missing_abundance #' #' @docType methods #' @rdname impute_missing_abundance-methods @@ -4806,7 +4724,6 @@ setMethod("impute_missing_abundance", "spec_tbl_df", .impute_missing_abundance) setMethod("impute_missing_abundance", "tbl_df", .impute_missing_abundance) #' impute_missing_abundance -#' @inheritParams impute_missing_abundance #' #' @docType methods #' @rdname impute_missing_abundance-methods @@ -4971,7 +4888,6 @@ setGeneric("test_differential_cellularity", function(.data, } #' test_differential_cellularity -#' @inheritParams test_differential_cellularity #' #' @docType methods #' @rdname test_differential_cellularity-methods @@ -4981,7 +4897,6 @@ setMethod("test_differential_cellularity", .test_differential_cellularity) #' test_differential_cellularity -#' @inheritParams test_differential_cellularity #' #' @docType methods #' @rdname test_differential_cellularity-methods @@ -4991,7 +4906,6 @@ setMethod("test_differential_cellularity", .test_differential_cellularity) #' test_differential_cellularity -#' @inheritParams test_differential_cellularity #' #' @docType methods #' @rdname test_differential_cellularity-methods @@ -5126,7 +5040,6 @@ setGeneric("test_stratification_cellularity", function(.data, } #' test_stratification_cellularity -#' @inheritParams test_stratification_cellularity #' #' @docType methods #' @rdname test_stratification_cellularity-methods @@ -5136,7 +5049,6 @@ setMethod("test_stratification_cellularity", .test_stratification_cellularity) #' test_stratification_cellularity -#' @inheritParams test_stratification_cellularity #' #' @docType methods #' @rdname test_stratification_cellularity-methods @@ -5146,7 +5058,6 @@ setMethod("test_stratification_cellularity", .test_stratification_cellularity) #' test_stratification_cellularity -#' @inheritParams test_stratification_cellularity #' #' @docType methods #' @rdname test_stratification_cellularity-methods @@ -5218,7 +5129,6 @@ setGeneric("get_bibliography", function(.data) } #' get_bibliography -#' @inheritParams get_bibliography #' #' @docType methods #' @rdname get_bibliography-methods @@ -5228,7 +5138,6 @@ setMethod("get_bibliography", .get_bibliography) #' get_bibliography -#' @inheritParams get_bibliography #' #' @docType methods #' @rdname get_bibliography-methods @@ -5238,7 +5147,6 @@ setMethod("get_bibliography", .get_bibliography) #' get_bibliography -#' @inheritParams get_bibliography #' #' @docType methods #' @rdname get_bibliography-methods @@ -5248,7 +5156,6 @@ setMethod("get_bibliography", .get_bibliography) #' get_bibliography -#' @inheritParams get_bibliography #' #' @docType methods #' @rdname get_bibliography-methods diff --git a/R/methods_SE.R b/R/methods_SE.R index 8d74142f..989c2d9b 100755 --- a/R/methods_SE.R +++ b/R/methods_SE.R @@ -50,8 +50,6 @@ #' @export #' #' -#' @inheritParams tidybulk -#' #' @docType methods #' @rdname tidybulk-methods #' @@ -63,8 +61,6 @@ setMethod("tidybulk", "SummarizedExperiment", .tidybulk_se) #' #' @export #' -#' @inheritParams tidybulk -#' #' @docType methods #' @rdname tidybulk-methods #' @@ -213,7 +209,6 @@ setMethod("tidybulk", "RangedSummarizedExperiment", .tidybulk_se) } #' scale_abundance -#' @inheritParams scale_abundance #' #' @docType methods #' @rdname scale_abundance-methods @@ -225,7 +220,6 @@ setMethod("scale_abundance", .scale_abundance_se) #' scale_abundance -#' @inheritParams scale_abundance #' #' @docType methods #' @rdname scale_abundance-methods @@ -343,7 +337,6 @@ setMethod("scale_abundance", } #' quantile_normalise_abundance -#' @inheritParams quantile_normalise_abundance #' #' @docType methods #' @rdname quantile_normalise_abundance-methods @@ -355,7 +348,6 @@ setMethod("quantile_normalise_abundance", .quantile_normalise_abundance_se) #' quantile_normalise_abundance -#' @inheritParams quantile_normalise_abundance #' #' @docType methods #' @rdname quantile_normalise_abundance-methods @@ -425,7 +417,6 @@ setMethod("quantile_normalise_abundance", } #' cluster_elements -#' @inheritParams cluster_elements #' #' @docType methods #' @rdname cluster_elements-methods @@ -437,7 +428,6 @@ setMethod("cluster_elements", .cluster_elements_se) #' cluster_elements -#' @inheritParams cluster_elements #' #' @importFrom rlang inform #' @@ -554,7 +544,6 @@ setMethod("cluster_elements", } #' reduce_dimensions -#' @inheritParams reduce_dimensions #' #' @docType methods #' @rdname reduce_dimensions-methods @@ -566,7 +555,6 @@ setMethod("reduce_dimensions", .reduce_dimensions_se) #' reduce_dimensions -#' @inheritParams reduce_dimensions #' #' @docType methods #' @rdname reduce_dimensions-methods @@ -651,7 +639,6 @@ setMethod("reduce_dimensions", } #' rotate_dimensions -#' @inheritParams rotate_dimensions #' #' @docType methods #' @rdname rotate_dimensions-methods @@ -663,7 +650,6 @@ setMethod("rotate_dimensions", .rotate_dimensions_se) #' rotate_dimensions -#' @inheritParams rotate_dimensions #' #' @docType methods #' @rdname rotate_dimensions-methods @@ -775,7 +761,6 @@ setMethod("rotate_dimensions", } #' remove_redundancy -#' @inheritParams remove_redundancy #' #' @docType methods #' @rdname remove_redundancy-methods @@ -787,7 +772,6 @@ setMethod("remove_redundancy", .remove_redundancy_se) #' remove_redundancy -#' @inheritParams remove_redundancy #' #' @importFrom rlang quo #' @@ -991,7 +975,6 @@ setMethod("remove_redundancy", } #' adjust_abundance -#' @inheritParams adjust_abundance #' #' @docType methods #' @rdname adjust_abundance-methods @@ -1003,7 +986,6 @@ setMethod("adjust_abundance", .adjust_abundance_se) #' adjust_abundance -#' @inheritParams adjust_abundance #' #' @docType methods #' @rdname adjust_abundance-methods @@ -1193,7 +1175,6 @@ setMethod("adjust_abundance", } #' aggregate_duplicates -#' @inheritParams aggregate_duplicates #' #' @docType methods #' @rdname aggregate_duplicates-methods @@ -1205,7 +1186,6 @@ setMethod("aggregate_duplicates", .aggregate_duplicates_se) #' aggregate_duplicates -#' @inheritParams aggregate_duplicates #' #' @docType methods #' @rdname aggregate_duplicates-methods @@ -1366,7 +1346,6 @@ setMethod("aggregate_duplicates", } #' deconvolve_cellularity -#' @inheritParams deconvolve_cellularity #' #' @docType methods #' @rdname deconvolve_cellularity-methods @@ -1378,7 +1357,6 @@ setMethod("deconvolve_cellularity", .deconvolve_cellularity_se) #' deconvolve_cellularity -#' @inheritParams deconvolve_cellularity #' #' @importFrom rlang inform #' @@ -1563,7 +1541,6 @@ such as batch effects (if applicable) in the formula. } #' test_differential_abundance -#' @inheritParams test_differential_abundance #' #' @docType methods #' @rdname test_differential_abundance-methods @@ -1577,7 +1554,6 @@ setMethod( ) #' test_differential_abundance -#' @inheritParams test_differential_abundance #' #' @docType methods #' @rdname test_differential_abundance-methods @@ -1623,7 +1599,6 @@ setMethod( } #' keep_variable -#' @inheritParams keep_variable #' #' @docType methods #' @rdname keep_variable-methods @@ -1635,7 +1610,6 @@ setMethod("keep_variable", .keep_variable_se) #' keep_variable -#' @inheritParams keep_variable #' #' @importFrom purrr map_chr #' @importFrom tidyr unite @@ -1785,7 +1759,6 @@ setMethod("keep_variable", #' identify_abundant -#' @inheritParams identify_abundant #' #' @docType methods #' @rdname identify_abundant-methods @@ -1797,7 +1770,6 @@ setMethod("identify_abundant", .identify_abundant_se) #' identify_abundant -#' @inheritParams identify_abundant #' #' @docType methods #' @rdname identify_abundant-methods @@ -1843,7 +1815,6 @@ setMethod("identify_abundant", } #' keep_abundant -#' @inheritParams keep_abundant #' #' @docType methods #' @rdname keep_abundant-methods @@ -1855,7 +1826,6 @@ setMethod("keep_abundant", .keep_abundant_se) #' keep_abundant -#' @inheritParams keep_abundant #' #' @docType methods #' @rdname keep_abundant-methods @@ -2152,7 +2122,6 @@ setMethod("keep_abundant", } #' test_gene_enrichment -#' @inheritParams test_gene_enrichment #' #' @docType methods #' @rdname test_gene_enrichment-methods @@ -2163,7 +2132,6 @@ setMethod("test_gene_enrichment", .test_gene_enrichment_SE) #' test_gene_enrichment -#' @inheritParams test_gene_enrichment #' #' @docType methods #' @rdname test_gene_enrichment-methods @@ -2247,7 +2215,6 @@ setMethod("test_gene_enrichment", } #' test_gene_overrepresentation -#' @inheritParams test_gene_overrepresentation #' #' @docType methods #' @rdname test_gene_overrepresentation-methods @@ -2258,7 +2225,6 @@ setMethod("test_gene_overrepresentation", .test_gene_overrepresentation_SE) #' test_gene_overrepresentation -#' @inheritParams test_gene_overrepresentation #' #' @docType methods #' @rdname test_gene_overrepresentation-methods @@ -2336,7 +2302,6 @@ setMethod("test_gene_overrepresentation", } #' test_gene_rank -#' @inheritParams test_gene_rank #' #' @docType methods #' @rdname test_gene_rank-methods @@ -2347,7 +2312,6 @@ setMethod("test_gene_rank", .test_gene_rank_SE) #' test_gene_rank -#' @inheritParams test_gene_rank #' #' @docType methods #' @rdname test_gene_rank-methods @@ -2383,7 +2347,6 @@ setMethod("test_gene_rank", } #' pivot_sample -#' @inheritParams pivot_sample #' #' @docType methods #' @rdname pivot_sample-methods @@ -2394,7 +2357,6 @@ setMethod("pivot_sample", .pivot_sample) #' pivot_sample -#' @inheritParams pivot_sample #' #' @docType methods #' @rdname pivot_sample-methods @@ -2440,7 +2402,6 @@ setMethod("pivot_sample", } #' pivot_transcript -#' @inheritParams pivot_transcript #' #' @docType methods #' @rdname pivot_transcript-methods @@ -2451,7 +2412,6 @@ setMethod("pivot_transcript", .pivot_transcript) #' pivot_transcript -#' @inheritParams pivot_transcript #' #' @docType methods #' @rdname pivot_transcript-methods @@ -2550,7 +2510,6 @@ setMethod("pivot_transcript", #' impute_missing_abundance -#' @inheritParams impute_missing_abundance #' #' @docType methods #' @rdname impute_missing_abundance-methods @@ -2565,7 +2524,6 @@ setMethod("impute_missing_abundance", .impute_missing_abundance_se) #' impute_missing_abundance -#' @inheritParams impute_missing_abundance #' #' @docType methods #' @rdname impute_missing_abundance-methods @@ -2710,7 +2668,6 @@ setMethod("impute_missing_abundance", } #' test_differential_cellularity -#' @inheritParams test_differential_cellularity #' #' @docType methods #' @rdname test_differential_cellularity-methods @@ -2724,7 +2681,6 @@ setMethod( ) #' test_differential_cellularity -#' @inheritParams test_differential_cellularity #' #' @docType methods #' @rdname test_differential_cellularity-methods @@ -2794,7 +2750,6 @@ setMethod( } #' test_stratification_cellularity -#' @inheritParams test_stratification_cellularity #' #' @docType methods #' @rdname test_stratification_cellularity-methods @@ -2807,7 +2762,6 @@ setMethod("test_stratification_cellularity", .test_stratification_cellularity_SE) #' test_stratification_cellularity -#' @inheritParams test_stratification_cellularity #' #' @docType methods #' @rdname test_stratification_cellularity-methods @@ -2821,7 +2775,6 @@ setMethod("test_stratification_cellularity", #' get_bibliography -#' @inheritParams get_bibliography #' #' @docType methods #' @rdname get_bibliography-methods @@ -2834,7 +2787,6 @@ setMethod("get_bibliography", .get_bibliography) #' get_bibliography -#' @inheritParams get_bibliography #' #' @docType methods #' @rdname get_bibliography-methods @@ -2851,7 +2803,6 @@ setMethod("get_bibliography", #' @importFrom SummarizedExperiment rowData #' @importFrom tibble enframe #' -#' @inheritParams describe_transcript #' #' @docType methods #' @rdname describe_transcript-methods @@ -2943,7 +2894,6 @@ setMethod("get_bibliography", } #' describe_transcript -#' @inheritParams describe_transcript #' #' @docType methods #' @rdname describe_transcript-methods @@ -2954,7 +2904,6 @@ setMethod("describe_transcript", "SummarizedExperiment", .describe_transcript_SE) #' describe_transcript -#' @inheritParams describe_transcript #' #' @docType methods #' @rdname describe_transcript-methods diff --git a/R/validation.R b/R/validation.R index 8c360e70..5530d394 100755 --- a/R/validation.R +++ b/R/validation.R @@ -179,7 +179,7 @@ tidybulk_to_tbl = function(.data) { .data %>% drop_class(c("tidybulk", "tt")) } - +#'@export validation_default <- function(.data, .sample, .transcript, @@ -272,6 +272,7 @@ validation <- function(.data, validation.default <- validation_default +#'@export validation.tidybulk <- function(.data, .sample = NULL, .transcript = NULL, diff --git a/man/figures/plot_cluster-1.png b/man/figures/plot_cluster-1.png index bbaeaaed9ca9a7d0596535540451ce23b326de19..22eb553ce952fef0fd2766407b39a7065de873cd 100644 GIT binary patch literal 9188 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 Ms+uY!rJE1`2mfJN0{{R3 literal 20847 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 I@$)zT1z9p`#{d8T diff --git a/man/figures/plot_drop-1.png b/man/figures/plot_drop-1.png index fdaaf789013179a69b69535d2440cfabcf162a3a..3842de3ac9638151a644754abd823a2f9f125583 100644 GIT binary patch literal 10322 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 literal 24432 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 diff --git a/man/figures/plot_drop2-1.png b/man/figures/plot_drop2-1.png index 12f943fcb39762b01e310e988c6e81bd97b6a46a..095755d55234a82b42a1fc022cc93217c228a1b4 100644 GIT binary patch literal 9544 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 literal 26847 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 diff --git a/man/figures/plot_normalise-1.png b/man/figures/plot_normalise-1.png index 19092d3e38b733d92047576f09424812906acb77..8c6d5d0e3212f78b5a6169c0544e62976293cb2d 100644 GIT binary patch literal 35060 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 literal 55155 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 literal 24844 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 F{{n|mRGk0- diff --git a/man/figures/plot_rotate_2-1.png b/man/figures/plot_rotate_2-1.png index a9aba09d52bb2693cd2f7a5323e3962872976a3f..2600394971fbe6f80b3208e4683d5ecb6f3774ab 100644 GIT binary patch literal 13304 zcmd^m2UL{nmgP?p1Q84bK|u5hN>q@Xyr3WoA_Ag7fg%|sNzN)s$tqbuML|*_Ip-u< z1cV~zU{Pd>T+Au&>({S)diC_1UNdXf8kSeDP*wl`pYNP~_TK0C^3H7~T51+*1VLz( zZ(O^JAf)dRgk+406uz^uc;hkraoG08gQo~`w2t^6Nt4YNBLq2vC|~7X&$ZtvXrK-rnAymK9$| zC)cAHaQ*sqkzOq=jFo77JC~)yOIGWg`$n`V9UY4T9pexIyE>cpVcG{&E}BYz{#lc* zmC=zXqpQJobI(!GH+;*S{j&qI9XQ?V&L8!pu`Vt)b}C9S7ht7{8SURbW8bKvydQm_rrG`vF#=klJkD4uLa z%zP_}GLBilsAIGitDHrpRj2BN_`FgLvA*GwkFtN{H~G;Vki*A`qkvDXx5;d zX!f!;=e6#y`e8!_jf1UxWfzK%DlH@L-ygTEDdlMD??zGCt?tcaDH*)hIi?o^DMFFZ zDiz}_GF&pfzHReIFR28C@lJU5#ZM|hNzVKiBd;<-N}bef8Y)*$aDS&ODe@{>>&T}u zE-83b$|?5wTs$_(G?DNmKIvkZJ)5X`Zj1yZH8aF%D@L+x59F zv5~>glM`)Rb|Ok!KaX`)T+8|?HgX;rbEaSZauvS%&?rHJO1+d}ivo5jCl#uQ$jE6N z&Qk`(u+J6hwLUuiI4RI+^7_?%7Jeq=&QX#uYKLDv%2ak^)z5@*+uPgTgta7G>-hLM zR3!YhZ}C^r3ocHNce)+>ns>#%d}^~`44QT>D^+$tG0B_7aTyb9H4k(1X3HW~-&dWi zxD*B^rdy{_6aKBk!vgWPZ$Lc?(FQuwO6eT zGeoNz>#FFFm^{TKA3T5l+{ec!E+d~BumFu!Ojd81J1$oK>C=>?T3t`^#Dw9CnukJ> zyPf05iB-QSz|S8kG9K>dqr|`*(s(aR=P;*-r)TyW^My~bTN|whPt5IvZ;~N|3|3#->;ef>Zj`G()dv3>0~hmeO4^Z#aID4 zi}*9j&y@;TIy_+2e^HjrqJS+$o5y8#ohO*S5ub&#hJ(3eyMBR#2#m}}6qCD#OVfE& zyB$!`BBk}TMLJo>i*}-hZ67EMT8TbTP=I>sO*Pk{Wk2yvGBGcV7hqqZZ(%W`@q5vj ze~_-dvjStsN912{@*e@EyeSW3#jTdu*4!L{qC%=e=$F~KWM#c}@wm_c8b&@UTH278 zFVnQM^^+AtWDoY9zAPX?hA2sv9!2r%I<3#C@2(EoRLPkC`1I$CLs<{~O zMXmZ%RO6@aQ6aXJdu-*D?)w{kO`&YNKXq*|9QdWtQ6r)DSm9K)Bw2eJGUP_nv2sc& z$6uONUiY#_g{RHKt`77-OSGxRz#lHt^;i)p73A6CvW88vx%c|E%+~YNHo0d8x{8 zxZwGMLPBsO6}#oGYes!kNO+jf=A{>hXzjh`w(!k!b8{SCTOSkxj=ugyiWD>5?s6A> zQ8R|a@%wHqmMyVdF*{QRw^4RxjN!8FSap)ujP;V{2I`Bv~npu+qfwxrYo1 z57k)zx1``dE#8(mDQEP;aRm9Xtn9?j#mBec+$Z5pD5w8uGg>KD1>uZ83y1Yi;^_hn zK&G%s8`aUH?2-;<4h|01){DP-GiYdNq6JVqMe>M`)ERgw96gR^vMFq-KW8%9z-xYT z^0AHU_H^`8)dAt{+qYi(JI%cG$QUC$VcOlhcezwz#%?%s`gWO}7PHp7dGl3$I&`_` zKAR6uojPT#ZKzK%(GM4<0;V642Y4fDLN+RLfHkxM;D&GcNZRV>WvzHzS|U11RrHRTq?7_-n~@57CKamAd5a4 z>xmZQwSFhKZ|miosasp4D~x|;K7hc!eEITmV{n8nD{@sbbWBD|M@J`HzoO*|+RbeL4uXyaNbP%E}T+QyNy!hNHH_XQkqVoRf+rNqEHC@mK9Nk(|4VY{F$XI zs9Tr`y>)H2vufoi2_n#V(M?U{QLXRg$Bi*6DgFKTIqSFAW;O2KooS0*YvIivdf3T* z``x#W4#0^RI1V^uXnS4BO1gzs4^C*2A$q<(o0?&=J9E>maIo9cr-V(YIDh@j!a@gJ z$m_iQPJHE%yR19js?MJ_L@}9OzB?aEHZzmYy*fH7%6haCMHTVp&E(ROcO5Il6X>p5 zWOTF`+)@*}`@-^gow>RBqeqW$0|hj+v=#Q#H}Bl}PK#fdot<@=TUttrjy5$A;NyEI z>6q?WayvotuMRFI6!oIPFf9$8ezVV!(>KK&$Z7F7u-i|cuC;u>m!Z|24?XqbZ+=@g zXnew2DE3_yB~325XVYf6=k&}}XDvf5(!{}*hPPyE_ zf1jC|+05W5HT6KLV+Q?1TdZ)=s8?Bbb~eVUG9u?RH8nLUDXGP$jCANCrRc%V`^Aa% zw1O8euHf-eLJoFzInXs?Res;qac5_9^R&#v0es};0hlu9rJ<6ixK@bh7x=ifyrwXY zY*ZPZ_NY1_?)tg|s!v3<+fnA+xpQaF))L;PnB%+2O!6=$dBbB@p)Lc;=467SqoXla zg&bm({}H&HLORIZV6FDw3XOYkY-D82`;-@ZM`zz`W8eg?a91$jRJ=Tz`?wqrG< zq@?6l6d$peZN9E8FE7JIh97bx$V+&|XRO=ZyFZ}v60-d`B_j3TI39e7{)c7PHxZk$0z08%_VPKL7y9b zp#-k`hFh)BynBWV6-kM>Fp`dFB*?hq0q+^*fiKp1$&7S%+U%^)=b3g!p;(Zsvha%Q zii*G4VHco4TU#5H8x^NTZ@S~w@}qyj04<2IzUM~or%!(*cl86XY8!ZNOf|oOLZoH6 z68`&>taH~i;bS|#eY;=bwgCys#CLzWNsh3R;5>3UR^?!)ugWO;(C;p#S&D{w9UvUL z;ymiP3AepqaL6F_HrwyZO`fbsr9OPPxw+X+`Uov8t~aC4kA~^v$B%#9qd;s=oUU|Yr%wTKk8Pyn@Cfe&twu#U@>Im^`+JWlAoSsMr6dRyv}v>wyQ>kv z45T4o19S{2Z^9m&&GF;MQ`C|KeqWNjJk@R7j|rORW}9%QO3Wpwn|>=%LBVVQER}ds zRVQ-<*@iBlsiPAY8CmeK=J`d9l!ehMIbL2O)I(KD&CZe_PUPiEP>O7l4)+VKFk>|@ z4m%=OU5AWjBRo7j8bjI23>&CHu=bH6wn`BB^iVdb#r~XRU=^M_>%gfJYnDehE!5=p z^Xq>@HelWfE|sr>dc!4X-66WbQ2lxj__? zf78GJ$m{-NtHAw_j9xcLV8{m{9Do`Wah_mjf>htMBXA`OV0C@i zy$y)%ZBxG5J;t~-N;U3^`AE5|d?2TSzr#Ym-PE@TGRmW;FFo{G_yH~0S7V)>OIUaf zD$Pmy^ku{PZxQF9Ke%lC(t4={H%1FLrc-1M6w*Mdh)=Kh>-+a-WM%d5DIjfPt>9tfc7{EkdSTdRUF9cAq_W&X@_PC=DcitfZp_I3KJwiW>VkehH8qvFK|NIQ2?`v%ZMDuNLyGyK0Mh~80R6_5!q^Mmp8H*I z#M}q$NKJH0zaGSxO9MH4j>tS9sR65R{rz$l{a+seiI?%%vQ536(Bg5U^=YRJcLoo1 zAR^`Ycs&TxtPH>c9w*B66*vvV)+!@I)RV|&g9yT_VfW*wivjEtVgJo-&9t4;{z-<|s*#t^UR)ct>nJZTwmgoUAtxG( zuf@mKq=Dyqtu}M>dZd5(@~xo(65<5h4Ns60g1kEh8u9XFbz;=%s((lQ+CPIr{{&zq z--R>XQT$^C9FAD21(G8QDfmq{tU8u&%1v;OQN3 z0~@Q;t;A&0Jn?V68HhTZjeH;tlK?pd#e69m>!wPp^8%&iI21P=ZgKLA<&f^v4$QE? zd-J%~MtNhn%%664EAVN4^rG?n7cP7$E-wE1^{b*AI3`&@2U`fbYCo6Gfqhe;!_OF$ z`9VaLm*}OGX3|C%mpu`UZ{->?5^{BSFEioOBO{^X^zAQq&66nsS|;nX(BE>8=3giu z@NY=4m5mKrDylCLq`>%yknx-Dv4$uTspazP*T)}J`2__9(H?ryZ1h?P`~bMfty{N@ zRmF`s$2fiIfj|HfMlbMybL?OCug0SI_5Tmum*1xOUuJcK;YB#F2(*=`uBxM!7My!2 z_-&tp!4rp513FK%nRB`HZVcO&0Dpgc>d2wwuDRUtJEy>2nf<3=*Y?%_J#UNna7bU5 zcWcff;r7WXOI5>bWk+*cNo-FXTlU#muO-Fevp0mz3%j`q-T6!IxPHNjh^m`eG}Wq5 zwduSUL5|+mX;?dhjqCFTM2xj>jHCe*dYUh3(P_tzMnK?@Pb>Yh&%}E9 ztw@>AeoDo;#}PDqz^iVSYuZC2Wl4<8Qxk?r@e$(tPQ{6ejW`xL_7&j+bd27vgi6t> z#zp=d|0VTah?MpF z+S2}Sg)uDs`o@!i{ENcEd5Wbx0s?rT0};Pf8>)}?kc5rXdF$c^!TBPNl^@8F*Y$_WMphXPtU}O+nps@I-0MG z6Qdb|HkZJqmMCr2e+lDP+_STR1yg7PS2PMvZVS5Mvtk%K3al)UJ%_ca5=4D`Ekpu_8eW^m*>AC>XPX~n! zqN`P4Dy6l#Sy@Fz+H23HJ4KaSC5E1zU7+l2bg84$l_3(P8i+-eaRzJD0{TLR;VUGe`z#hL)q1`{0-vM^8!?4TSoG!^1f` zUKdbNQ2|sD#D#Ygn{&R+C;@nOZjgNhSleh+8TgEMoH)_86ZJ2FVLYnyk8Pg;+fE-m zn7OWG;_GxRl9gay??GZ1B};-h1ODZXPgM{rAy20Vx#Muo6)-c?K9=$MRAZesi~>I&0{nc zOsr$aj^zfCzHLx-3b%pQ5A1AZW##<&^FZE89p+!J*|ERvf_oYp8|&%OMDol!8CjI>gJ6b#S~R$ zl(wgc0ulLJZvC&-$3M~c$*fIleGkXIfdZmslUxTq(19gCbf^;eTrbuek_FqBo&ECW zK@%k8=HjrfMn>cce$Xbs&rfUqJS(_+WlmX>>xNl(I{3XCR2lP!tRm{kWdjf=mg!VYD-SiJ#_}+-cP;lJFoO%Attt>?Mfc zX}ToWnb?sEcYu*`(DsL3{7JRa%$=lJ&>0*Y3{K^zPoKbO07;jeE(m^3*Ohi7A*~HR zw6>0pq+xwvZLR!lBOnF{3hRaboZNI$y&t*B1*Zi} zwD@*WFsVeJ3;;cH#0@xtkjD3xI^jwI1g55pRJ&JKSJ8SULSX2aw8z10OXSIb1DGrf zXfEITl^(8uZEYq`%baksTVrHR#S|12lZ_!kkU6hjx$Uhq!T+JFW|#~-y3DQs{pl)M z=}FU2jTfyT+(yDu$!vwyWVel6TwG!mGkPtAVrSapO})+J0&EPdzrTOhYy{~?^x(mf zMw{z^W3TUyD*!8f2(&_FWu-P+&u)>2i)&_kHmRz^u(qxaSQY^UVx~^PFQ7$g(ks4j zDgZQMfV~zy7dY#|({Mm_wzsnh8Qn;d^~}x7dm=grA*!n*x-efs@HfBVW<6q6s;h}0 zClZOf0RC``pY|-EByzMX?Is&vp5V5K!vn|-G~vL30yh!F3QW*?la=V8v>_nai(BzF zm6zk&iS882c~}J8DJA!{nRakeJpo6^$;pY}26j(L$0r#Q{MpL2BHIwoHA5%D8u6hq4kusS-{ajP9+MPhCVLX+S>Z^ zew7#CF8p0cXw{9B0IH~~tLs*@K(FJl#8}q7jG`iE(6 z`h*=V`!aJ}iWa^Hp2gfC@a4;6@*uPuwmI+-aKqUr-r zi08MD>EzW6hlHDCmvLK%cu7E%00CPZ+(9=D4Gs18_YV!}x!;1CkLK6Cr>D2Kzd1@Y z;JptBcqa~yB*1>i%vI-GYyblBqE8w_ShZ7z4Rbu!yOf+qTus5&@TI4dUcRcV+?@F! zFVS`8)UFJzj~kUsweVbNVr;B=XXHVA?Ktwhn~vquWNwiuvCgg6V0(DQGR|^sxAnt5N>{c9)rPbVEde{`MSOR zK(K>NWIy-)!>SsH0jVm%WAaB%i!UdK$x3?eTw$8|z%x=xn)nDL4PZ797`y%Np^x?4 z-yHz7g{Fe)g&AM$UZu+lQP~34vD#kR4=xww;*@ooh=jTrlGQOE-((X$S zmJ(5sj_QI!_Vn<8nagSZ!-o&!<<`M}UIQcYw71a10v)-7y|qz(8yKJHzRS1h20{Cu1$s3ojc2A(;_zTS!*+)0bqnf4+fzw9|!_*akwn(w1hp3T_PeP3_MmE zK)GV~Zd2R|50=_R^jhDj$C!cAPQjI#rI_hQ+SJuIdI@ z)XrW{w3a>^l)L0ierPa^6|uYrCOSYYU^_9!YH*iXfI`onJp&p7+7>2;bW~Jx;M~Ai z1sI5eg2IX8$6GQ1AsG4Ye=mHZ3vD0Zsbb@&Zs-UR%1zp0zI^!-7#Ii+s8#>hamfRf zjt^}~%?yl;Fl@;I4-Y;ZPG}bfVd*`rV|G_iebeQ6u$&}D3ydFDlKRG;=?*}-8Muu5 zwIrfokP}Pi5!srTPBArcQU*4c{`&nt9TEN$)5QPhUaCcG6tYmqX5Y_KHGO9Tj|>MhddT>3_+uaXqTEXT3FyeX>)mQV_KJ;~U%#NFD=lV5 z^<}TM{kahtH8QL+JZke`1Yd4BH$zBmbe(qzc*ph`2B-I zXcSEMoPYH+TZtA~_ANqpD<%*Co&HWU*uD2w=H|?rG{CXp?OOmT!#;U!4B|lXbQRo z7FvKvU_TZ@3&fs2Dzd_)ouv0><`$AVxwMm$fPsRE z`7=#p7CN)@UL&7@Em)Y4Bmj6Q=)mFO;gFzO_*L+}uUP)Hf|dh)4P4N&{c>j*WeVyQ ze+SDD5<@EKh@hPIH0WN%>(_y~P*PHgng94hL}cS7cj6bA7y%~*c6rg48Bi9cU^rfQ zyA&T^n_-Tgdq>swOgzjH4jnq=v^ca4`O0wM{;IN8BJK75HpOIUf`jzCSiGghVne#q zY8k8kxW8s$YD@OTmUi#$*x-;5#|3fq69;c-gsu^dkDF{_x{FeYlmX!X$jl0tGo7q^fZFy z4-MF1143qVC>gs0bkCPw!T*R|xe?3|0U4o>RO08f3^4`CW~=10-k&q%(k!^~8pojf z0Z8irok~g?g?_-RCoCf)BQ7ou9iE%p6j~rmEP#eV*MN1k#YkRlXlYmwyTJ3I6Z!i3 z&Xq3S|B{a4Hb}}*6hF|dI#@|}%Jn|*0t5%$j4F4r`_+>s9|%%W`@XHBqJPapW?>T* z@RMPGAlZDNQ|>@-ycJqyo5>o8J3;+&V#+Ts+wR_X{M932H{pxMhBmG~)p`^G0#ZH@ zmL3?HnAF~ht5dB2p9SwicKy2o{@@`%j4?F%1ztHIJuu^_!oN$BaTf(qYH+Zlt*<`< z8wnhzPw&B*Nu;OSCZ|j01pN?hD6~m9kn!Bp)RNjBrp>lh;2F|jKtJ#zw03@43(c^- zmr<%7d!RNdG3ibC{3P9iqx7j3gFPnfLpsd-9^z?6;!;qL6Y2u!W@ly^8yjZ`Nf1O+ zBcqc{+Ows^ksBN!uP>3TC@Y`3Z0I|AvFR`wXT1SoH5!(E_V(5~MZ`;ICQ*gWO{pyL zcOaAD0S{49ZZ3^_!-5Sg?wI>!c!JRlOH0HJ4dN;h>@tgjDdml?1Ur301* zr?b0Rb$|*XZCS<(MVqgzP-j|jgN#~%y<6#r)jm)nKpH@T9_HlX?KjDT$=GO9Q!30s z_;vEXwYO(2Ps<0we2DlWUtc}JaDQ(P2Ba?YKhASr z1IX`$>C@D=W1RKCMqw{#+_KXZ7Jh-Iv%5}3z#@-&vLdiC0VuG6r+2kXl5fs-M;Q_b&{f?obVR=ObD1rxs zwDY&3TwGmc2wRgdvyu-4hb8I(CuA%aS4#T1qo;(7fC)hb4OV%31A_+0o^#=mmLAF( zdjBWcEtoF&N!B zf|L{#`x{_15J%k*$19*ub2^~NG$71o_p;Rjz3XoInV#k^5^>pL!D?TC0W2s*yfJW5 zke-J*fBg8t!`BaC1~wBK$?IN1U)$N44ZBTMQf}KN=~k*RkU4qM$lwdAtgzWAS5PVu z*OxsCL>)+vVSx^@=7`gHmZ#QoFL5sY;O2lL2e(A;@$K|=5i=#!K9?E zwG~@9XiaRkt$XTvUS0$MJ=nhx^!>_F3?oO)C90HQ*xvCA2;k=CUK%LKfQeA(sH}Y8 z!h%)PDrAcvJ)i^r+y=`j6b;oS8Og@g1~(aDg$%7h=02sM;B-aetUL!}g%6f4itx`r6r+tLBpmVg{_p77Li)I zYIgOFT%pHB>0(bUsh7dQ4&|M&6Cy0EL3NCsUB7Y+V!fK`!Q%ljcJWlon4Yx&UjctL zJsn!i0ZHdym`~4EwW&xt-yP4qS75Sqrfcuf3f4qD=G>k|(4m~# z>_c8PZ>J%$#>$n~d|20dwG9q)G79Q144G9;6npMEq57WM+r#u7E-BNLCs?^?F->xr}Yi&GVtRqm%-S0nknqL;{ad^ris40L*K32w;APOV~|%)?f{mc zF2%RQf!IE;$2=c~b+rfZp>+DQ| zb+;}vy$Ux+KMFvst(_f7{eCzG;9!Nd(SzAFgW9}LX$jTO$T~u%XVYuXCIpNWSZc$J z*3%URI1sgL&yx4=t4BxW`1q`#NtU7w+&l7eb4kg_6+e{JiTtV8_sr&dXgNo19MV`ZMeUE3Da#6x&Vu(vuxJ zazjPMV=_bx0Ox`)vzYa}$9}Nt;NtGy2{;MuAN2B%E4ZYCz101*7E%Hj)X)W8)YT)< zSYTil-6`#0Yr*scjfL$FMxugz{+x8T1@E)DvEe!KlKZZPMyhJO$t7l3z95t(m+9Nv zuL3pM1Y6kO*Eip+%MeDPefM4ABtY;U2GIhRn_$)6N9+!9TcUjJ_Fo1ilm_;8)tyfV zCfi$+VQ?*W78Vu`4&uDCzb@0GhM`f>PcWNrtSN+*>G<(gm|IJTMI~jdqPgMVy~mzW zo)!z#Dn8ty0Sw8&8B7r?QDC0)qXz`%*t@*%PV|)}(h62_M&i;|Eq_I}dB?^&EQnWp zd=S}C@>kHxILEZY-@feuk^^-9`}gl}aX`?XdaJJqzz#W`kI zk$Ddb{2>W62bhtt4%URyWM^Bp}CfjQ$+dt?Q3ZHhtK~9tG#Tc literal 29046 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 G(EkC!CzZnh diff --git a/man/figures/unnamed-chunk-14-1.png b/man/figures/unnamed-chunk-14-1.png index bfa30c1813b3f4914a52c1332dcc40b8301c0af6..9ac5de4acffdbf20f9a6791893e4c37f005f428d 100644 GIT binary patch literal 37014 zcma%ib8sJDxc4_`(Ac(Z+jf&QZW`NW8#T6VCynjKw$a!&@Ah}+{`t3kDqcpSyEuBj5sSFRkSS0wMPO`v*2? zS7HnT5rbsJMZUOaoUXflQ!`lvT{_j7%@!y;=sT?~WKuMrOqCn@7+WM?NKhr+9 zXd&V^e^L>Sp^$5|rgpv%n2BW{CwzDzvq@WXF0e^MoVci7qvGOHvRlpIKjDXziStJm zg~|O9w6KaH3_}tab7JT(1ze$s;V*&96etjkkR%Wp*PpqYED%`~0vXC3xR`@_LD8*N zvqcI_9k+2Wn~Ub`tse>m77Z&KRp6iv1TS|k>$}*tA8XOmz-`|)g5a=bW@pzwI!)`A z-|UWuj9KqoF+i8LOMPvI<_23Nx5K>~RmiO^|NY70S4Wku;#!M<)DHC`gJ5L2#||AbXSF^? z&p>3yAKwuyBF`}m&>uAPkiok_(a55VDwSk36s!W%bQ~f>;Qt=pBHSMH?7*wBMu#C% z0{d@n9Ki?)-tqfCZ*w-RsPS9aiKlrr$sSUM#GfLImh_{fKF!06Wu--6p~MCsnIBpXQ`){1cj`H&-Oumh<289YRb-41k=QI5Ut_m@LE@X&?vj6AV96 z$MP&DyXNPbsOslIGlbbal<^~6*#-+X^xzNVcX0liUI=T8oUS8liR-eg<7OXl+{}G= zMzARVj!KpGveRL{)4}@;J3S8eZ*jWh2rFzj$=C_Jl23Af5%(fXqM7Yml#m2rljYjr zm^K}^D=INIi=vk(fMTlH&&pW~75@H#JL?4da+s)ea4w{qJz31A`HbYpvx|v4y;1U{ zx>@jn@n$3tu@!dUj^H?q^b3mov`+*kmlH=iek_MqU2a^)tz_j-QIDorYHN#bzx8=4 zthH>upFv`au+2kUwrmO8^@aRuW974CrHEdIdb@`GZeQH&nWic7B`W%&T6KsX)Z8?0`F@+db(9{r7gwbhMp#$j(wS4b8(uZ`{#WiVmvK_{=?^@YGQpG|fLac(K=H<60Y>ULH&)O9*_ z(KqzQEfur|?YHYurf6Ia%h4nTB%#+!vuvNF%uEE(MaP4_xA*I!fuDf!P>kEAPg7HQ zsPc*akdQeZI>R&p=ySt$NbS3`lZiC3oC^YOUG9z=!7rS(4w+F&4@i{}yok37I`BJQ z_{$O*ZEf7}e(m4iz@i7`6cq_sjfd_|7M+}&=;-J!T2B~%2>&*p&TDOL9UB|lsG6tVhE53G6@OE-rio4 zQ*CW6B9Wl?=AS8u`0<%PN`b+f6p?1tHu8F)AM*~H8!9@@zD1WY84mR6)2EZgY9&QQMQQ1!CcEsysh@*8T76IF>upUotEN6> zH8s=Y7@X>CH zwJYx+8?+hFKQlxxR%q2(&eMXvc6hpIXe0>}+dJ9Zc?yKjvt`R<=Bk!Hdi&Zff?q(< zBf|?)q5J7M$XLuM-M|#j9<3U4jR`ZxQSxskuf20tFz#BQtI7t_+a`bTL4s6~9Fpmr zc)KE0<4miv$u5_5Ea;~j$B?KOy1_n~xo`&u{DAVyFM*Ybv+KA^Ql@@At($ajFFH*D z0|TR=pdgn)g%pW1wy-Ge>gw8~K@92pYY*z4`4O#Ljdz5?K0^kR)^%QSNwfgxf(#|; z)Zxh9unJ1T2?CI?dxd&wt-= zv_acOUOqyae5K8eNha>);o{)R{pu>k1|pa9>ZoEpAbBE2JRE0Dy3ze6=gI9>|7RM8 zud9JW9Aqb1;E$;lMYksRoyA+QU&MSueP{^MLLaYnXDPg(HDIs7VKG)zROoj3`Zzc^ z*xO&CDe)WH^ypN6tsxZbf){YJKf20WP*Z zJRynk!KUX;pJux0H+A#jm+C`kuit9?>+BhtRTMX0jLEZMwr;0OZbIna+D7Pb>kJz; z$98_?m$Z#=lKt>**fV058-hX)Qv?#S)9t3E6=DUj%rLW;fk2LpY^_&_)@ zR9n@?RmtCvqwiADRjuoajwPaL=UKPwstF^RXl%vA!@EFGNQ`2Y-`uy{%vara7>P zKKrYQk-RbzE47YS9a2%$>Y+c<4RkgE;&c)mS`AA6yR&mPSGo_P5%UF#5SU3ZO~Hf)vi-wpoS@ zrF>J<5)-XsToBB6FK;$;FtAELIIS&$CKBs`*0LJ_Ya&MGa&ScoiaS!cN$<4YkZ~h^ zE*V=NSFPaco11M7zb;~l6{1rZ9IWf}@HvOWJVplqajsxbwAeyTC-e;@vlmz;CO4H3 z{mx{f;8t%_$!z?N(h+Nd!uaf9FHU+KFIO~E!cHo$_uWzO_snJP5i;qqtwyKow;7V? zkjPK|K(l+HD6XC32zcuJfW_H-FXweGC%=xLVQZvN6KHFm&X}LZjpt~E5DpD~&6|4k zYv%6E?gL25FuCqih$OIn7ss$2~_2hY<|a;-B%PffXhI7_+=ye%uFhP*GnF3!#90rOjpj^9~T z_W9tK0bJ&--xbLNeMekp8Dxv+YUCw%1*G|X? ziAb+;NPqHUJju3-*ai-7)C21k`{;$~-vp=sVoG=SiCI4&gxytZd09;6EGz-G{JZQ& z!aWnIscLbL9KP&xGlWY^(xL60(|m&)S&@NCO8m#PmaHI?zf>Piwu@sf*fHO~y5+3) z(s0}gtdQ!-Rkb11nmv4!ZEF?T{50{nJACB&hH_1+t7kD{IucwdNGc+*dM0fp`NXsKt^bm3!5ZQBBuspMUp6$Lf}Jhz>&TyIB!(_kh$qt@Y#{lupA5g!47@tUD5V^85JW zQaO;L50p0+PgmmA{CPGB`RyKMH#?3%PtnbHDJdA2)$|(I&7IA#vy<{HSIs3Gi0o=o zrsdOs8K0=sT{D?H0wtiGFfmNVmhVMSdsn1!lWnhG zc$AN}XX8K)l)oMaj$84^ex7AsCmg_|5$x&2a9F%oh%hL@x2lAnn;G|Pov3;Z$C~Er zEiL2!&i^Fivz!6@1`w3OkIRE=#0*t*C-VqspO81M@3iArq973RaH6$R^GoU4+kfna z&-=K2!Er9(822-Sz|;5yM}q6#!4WFz5TEUZ}F`o6=z z_>1mkbK}OgqDAl7hJy)jA(32nUW0FWM=HN;C{y@mDNzC6XLd(9=cW~v_>D}^#S+*z zQir!y(Bfj(D4BD7%+b)UUww2T?#2Y?1Yfa%uh!-&hozp%)jgY8^5VRn7tXKQf zNBp|J7+0=Jc%xUQsH0Iz(6@Fhn?Y&JMH0w#8AnZpA{&`VeFRRhlcr<5vo5&IoFIE~ z8woei)=WzDr>J@c4_fmIH6eexddz6PMF~G`l~?_%;c8k&nh0%B$_dBN{W7|turi*} zrFnNZCcmgp@1Td|>e0DSQp$pOiqvff&)Cz`<|^UByk63%8butUW1H(|uuDt$oq6ow z9{4d%TmM-0QTQ?q{pB&?w312JjbarxBaaO)%i3n=eL%f{E4*6oDvHl*juY>UK11z% z+HjcYdX4POx5Ich@_0qmasIv}b`hvl&SvRb(*7CLb85-}i&XLDWe! zqaH@ds?1tVhaZ4i6+``|Q{$c3d}nygII28ac2@@687p!{$+jnN+AdN2O)uGs;qR;# zt(siZApQ%K)gm+Ob6WSb6}Xh!hiaw-cuns~mC~JG60R)hn|k-JMKLO#rxjMcfPdXK zR`F^x&u9}~`_ku>z@UF@F)eb!x&(kU|BZzO+%gbl#sepz`8@ z;Mwv}JbA8IGetVZLBs7UCFEDAK;PdnPlk|_PyLZcmX?e@R!X37NjtMI;0Vlss&tH& z75e>E-;i~!(?Aqc=h9F=eI#6FOKJ7{T$*Bv7# zj3(ZoemofNrHjT$0p4suV*J_!c1;V~4AKFX$WU0rX!N*wxJoDBVDC4#!tp@Ag}}kj zTI;`&l}YtHBG%DF+nBujt2K`J)uCs*?&DZ2PQ~G5(W7u3DeZe30c4LGdL?Yf7l1A^ zCt5^CmAz0*lkO?ih2QJVJy!Wac7dMh-t-u_chz`|r|vmlll#zC2d?ez?0W_^l*6$sg|p0{vVf z%$6KK4sEbEjcd=LuVWaVo}-P>R=Me{*RFH$Ja#LMR8Q(7sJ(R>jy9(8uI5O|fBbX( zEm%(VO7mnWqzd=`OB!ek(eHUbSDuOM-G=M|_^Qg`;dgVoq@@VE=yqH_F#G0~dy))= z$`@gGYm_su()U?_*7~3R12E6o{@C?)%6KR-z1HFM`7aKCzBq_0=`K(AwCc(Mi(6H% zFVjM&PD%i0{Lb;LZ3>1oV#gx=aUq%Fw_drctco!p^6Stt`4F-_=-cllrzegB6Xp6P z1)F_|Gh?s!B)=1?%>vmHWvFoA`ddg`Rt_89!R8~y{#xtjj+sX9U)@Y849D+xi;3?q zE>0SYqLr^bV|sUz3J*+tpwsfvq6GY^$&*m7XQd&?)xP4N151d|UrtJ8yvhh>ADyE& z;M?fVI_U|^S<;!c&isP`B~6A$Z3E^sG>t>?kT5Cf*j+9!IxvaO-5c{87;yg%uZx}-vTLQ5HqYLTB^kDQ1Lby z7}?L|yvq4Sg#wRU_8+Xs-%2AYukw%=HFD;=j81cimi{g0@9kJ;z2f&p;6|B*lpeE$ zaBj0gL$DzYhC+ku9?^DjFeAOFhGwJyuiE9S%NRwsO4JMm+Es6eQ#xX}Fju z=*a^;-(M$5zQPlwS=}JzbwU9k&o$UCxtz(`|t@#1U5j9CUh%I&;6}XP=?Ri z6)y5XE(8t&_+3eEQZTcP2=tor(~Y!9U@QByH(bZK#H1PvUqMq-%8}eISV0E!8BeC} z2fKrXqK_I6BUAnO2_k6oi|z`tfLDanr5&tWmxevLoF3Z@+2PI*&X11zPon^l$CTZv z=G1_y5rDe!@!DqS#2+!9-a1f?50n_YE3Cvj-DdJAsqO(5?8$p2mr#~vGdUNuLuhh7 zPV~L8)w{^YE->YlAvC@I=!X7q)qWxDzH+B$M2Q(mICDGVBt()M0}gt5O#sAB0+@PY z@Bnn3D=>XjaC$8v)`gu8rpM6|+B~3wa$_&cy7M^7cgi*}P&|KM7fyXn--Xy2ydzT_ zC4C%a^Y2Ez{YlhkIc-k!#neda(>=ipgphH>q4{JNcuGj`&MLDWXesTw;>|wB#M}n;gPSnJ&ISh5BAFpKI z_!ZXVeJzLiTi>+y4R8i#OH!3M9@y8;2_DS5hg>HvB(#pxS{D5p`5EU%E@Up%BvRr_;U))ocbzL+C7=WJt$-i+zGHL&M`~3LiT5Bteq^XPA@W>Q{|O|9!0`JhJoBJx%yDK`-D z56>F{Ib=sDz=+6WO)>Opp$U|thA-%aQRTd{Cf}Lx7sT3g$+0~3hh1;#0xaiGQxTw^@7nIiheHy)ni#EQf;TNQ2 z8d{k1#bKLN=QtH4gS{|y|7k&Dj|iavR=^x2kUC@ZBPJfGM8?J9Vw@6g=CZeUDp?L? z^>&4)w#>L^Z={LW)G6s@lY+>k|O+_F>HFhn!>qrxGC1lkxwB*p!&5QsVQUcrT zm-)fnPlV3*;1}GhfycTb9D3fKlN(Kp?44Xm%Wo0sqfEZ2JhOXs;BEAp5=j;^{@Bca zK)KLy>cc%+7bW5U4dRO!!3Dho^^pr!qDg{@(M3X*B{i?L$E($A9%FsF+XyQ@+FUw5 z)J_+5*QL1=9CyNwhxg zY*@h`Be&MUeuURwKZGd(YE%vXQ8)=&FMj8nbG*>%zP~Y;aEy+tm@ot?l=~Rmea8P~ z0Rm6|z?Ehf_X)hLQB@ed$3v-&ayrY+G)=~cdvV%H92fZE$4P!%Pvc8$11D45vh7pnyRcOz2qJr+y8 zvo%N+dkoWu@6h$Ys#edn4|Sa(to|CPw%PEwJGI*2pzZ;3(>Q2{-z#HLOpwBCU zZps&uBZko`DJxT$r9I;V4^9YY#*cY^4VRye2<6Tm^QL3>UOYf=*qbNZnz9^9X~Z23 zbI@Xamyk-{q+uYmsthPC{JYsRL5C;QVRTPcm#m{Z0WK|Us(!x(UDC;EgBOn+Z2gih zFJmw+FtdkL7b&lO^gp-shY#mx?2PYL!s2)2o*GyU)8(S^wL8Xjb2ZeoZ3?y0XsSuk zgzkH~(E_TFd5ATe(Msl~eu0{GDZhG^W)w1%ATD!nL+BpLG4gv)F4#$?^-ehs)aXtF z&p^J>GK%f;+WK^D#HOFkhMcL>Q@>xZ;MU6cwr#vPf%MmViTOg_eA76yrJJ6ewgoW4 z;Y4o%bCH*WitsF+6|zHnpDgHrn;gGdwwJ693{IDxNP~)y3#p9};?V9cd}i+~H)|cL1B+u+)vn+C?}fB3N;V6*1uq%H%^@-6$i`-> z8YH{s{b3ju78b>dnT|IvxRH`j`Qvsa9G)<|mW>Qrr%0O!4nDfmN6yx+UI;xWWydI` z2Fv#W)%BSDg%{R47j))p?$YYx1z7KjiTfrqYo)7d7T-$J103bHYc*MBQ+o0t(eXseZ?N9pB*phOC=JzD^S?)-y`66R;WrBkYlZ$6H&nND18(VaL&q@>YH zGJ~x$xW7$!t1#1rr~<7Ec?eXN4Lm!w!n3?hVPH@AfgGR9GEsRI!{lS%wYyq>(0IUp z^{vv8^?JohE8fo1-<|d~uCmj|CYC4yect_+O=B*0${lzaXE)9^yb(nF&p!yVG%S@> zWk<%3^+R17-NcH>h}tce)GWaLJ$!GgLs$!~PrqRQ2JDj`G&8wef@R6i2Rj6;*;KsK zl{R!@GC-!lPu&p8fA#HXld3N8{-e3gidEC>L%qxn`gU5!1sCl~ z)%{@d!#cV+V4(HvEco-Q>%8$&QedrKyLl%ZVdnz+I@mY2LW_BhC6-z{3I|cfxrcpd zvfa;M_}f?ZZOo6_@)zEjk$WCOCUtSNadaLu#-hbl_7D9<0AS*ylblRzHAMvRR%$1q_9F+WhW~$8(NQ=U0E4*FmCfe7= zl`Wztr^1#&`lT#*E1nDAg7q+5F#zqDHD#5T;LZ!kCB3QJtUry62!N3By+fK7sRz+G z$yth}Ee0*evgF-~15pM}8mfkr@=Pagq68|b?~PzFU*IvFDSudn2Dfi~d%*F|S%I9Y zW&cPki@OGdR8cCX3G%~)yW3b@nc}jL71Dybcz404)+Co3O*}f+A=YzO-r>pcqu`HG zixKx5Q~H}okux9Nk5%PbQYW({z}F{4z-|%rOxlr`9K`We8-ZJG+hjd27zyJwLkm%zgXU?|DQRFl((-?zLu*#*y|LeaXA#meC6bUd-He6fBu~7OrZgY$|FW zzPg?R!yvz$6@Wm2E=`LJ^RR5<+)jL|04*=;cC%8(U64tLXawbLFgO2~NOv6Zb9Es@ ziG-z&&*$ql&iWuOUrN zA|1R_IZOc=Q8$c?c>tU#hN0-ctD(q5;zDhtyK-<}~_XQiFei zhS1+gvDXSkW#E+;yyD`Ux3H$+-?j49F#S6c=ze~W8_FH@NFO>({LL;A2ekh@vw(2! zq=g#`2jIrH=-~>r(oR6RN`y>Bn^EogMFTp9H#BR?Ix}N$cF#E=zt=`@qq4#& z_c#10V=2E$EA!(4Oje!`&LOKrWsMyq!+83L8~n080H(3_py(!7{gvJ{^THp4$h8! z0SDec;tymQu&&=XQkx6Pg_c1Nvfa(&^T{@Hc^U7lGl#)xz?a zMww_8T4e}x%LCFIJ06Ttg~;p1$Uz|22_$#yEtL)Us|`R7QN0L1li^xD}*rF_`ATwT#(hXF}ww=~do ziWh&4Z6S-;Szh+OTRzs79ZnnwQ`GxgwB5h^MrGXlfstLG)Q-YAJiNGpA?(*<%4tF! z-Q3qT?s6jI-38gHlvcK)9XIrlX}^azx+7%8%2Y<{8`d`aOdouo4mpu0^)_>vpmd5D zFJy5d52vJbd|&$gN*Sb_=G?CxWaClPIv~w?7nO8WBA0qYz?yZB1$d#<6bTZ#=s=D@ zNqzA>rm)A?Pf`u5h*A?QuDt=6s{!8^mBT2I`BK@3 zF?+(Zn~6sPdun-P4tq|Vs`xp70+$h9UUT`3GNU`6Qdbm$5X#*dEmm5U9Mv+danDz5 z=W&Lh))`l1jY0vR^s>&!HE8qq-`;MYhUH>(34k+K>}_i3`c5%W@c#<>FB;&v*d7Y7d#ko-OT2hY2r zA7&$s*Pph(vy&VN+I~ku{p-W|JAqIC@Lb@xKxX^E-{Ys-q2Afzos)^q$JVtcWo5o7 zTa%m#OOkH?NbZfjaJt+PKA)qQZi11E$$j=e!VfSMy1Mt*(IQQp7G;o*yUnAK)ZQn@ zd{=fRVqJeZ96L#X(K?3hKvkpY%2dx4)ZxnW%7)J5{z;0N@Fg|BeV$2D*fcmbwq4i2 zk)G{bIZZM`1#EIW>3EYTjqE%QyiFS3_w-XJ5HLO76wai@t2!+os)?<+r@9>~Y}0I~ zeuip3U%fTw>IJNEjf%)|0r7B5z&jpr0b|q%k?`;2)XO-WUW_L%X)?#;lk-b`cs?%Y z2f~n}4(Ldlnr+fHu%o}p4m&#-zc4+KJMJ_8_~=}*2FrBm^1FsqF@Go*fe;w9H%0!VzgR; zxFh_)sa*gb=POIyd)u?@y3wWfrT1 zd;R(o03ZvyrwsEPpzc1fJ|YC{<##!A$eLcerO#c4j1^FsIpbGh%c>sz+N_ga$m1*m zt#YZ-H$W}|abfTJa18n_F7rv%gmU<-7O#<_OMUYz5l1vUmxXkJt_7e2Fo6ok0oL5TiU=sCfadk1LMu)aN zw-`hCzULd4w=7>BvMz-L_BVt}K$n=)l`ES;*97l{P;o`DNoP)OZqun_pW6kT>d|DKF9tM<>$c0+cT7fJcPkvU|@vzpXjgdKZ?v%Y_)Rj#` zXB{V?tAw7fkow*P7Snyu(L!M~8#kgg84mHHYSf@V+&(0oa?ZVfU=S6k(Y29kBUdrf`u@$gFndG7};I4>#1v7kK zvsd%MHdx$rETp_TUdfnJyj{X=WNN2A%0+J4)FPQaN4gFcWT*OPw$~f?GETA;oYqqv{B9ue)6GgNxQ89K38-MD!VArFi*! zD%7OTg+SP)=B#VQ>5J`w2cnKxnNH?1AW84DcFm8gSNS&29$t<^~V-zI%t1D zDOUE;e;(p+;4fuUUni0CV|B}>sGwY?!Ulm(G~)?ThZ7-x2Q?b{8cX#dTZJpK3y`LB zQm$}4>Ki2G@XeRZsIWmv{{GqO^l#Eqp(a`X z%2E*4q_n}X-20aYT0UNB3Xg*DU$9=&@af}xI<1~BO@cN^G8n7Zg7zyA1fmpCMyj_o z+Y4BqUe(jp=h|Jnd!IS-d;sR(TVJUVX^N_fN0**uUbRcGp(nF-%nv29iY_qdi49Ob zbdLPDWb~snznOgl#ZblRg<(Zpx?JBeM64ZXCP!%No_t?6O*b9Zl9@S!@Gj zkH7d0q|E>dgR?!AY|Heh zgnOzBbbBG^^|X-!*Mn!C+D!*EJ(wzv^s3E&&a54hR_S}361WsR+y@c?~e8^2m)!A#~~ z43^Nj@mEi7JG0hdHYxn?xxsA`zhg;|k5q?>Q$vkv?^aRN*Eda@q_vXFZ5)(7Cxu{5 zaAGZSh-3XWm^*qPD!X}e)zUv$T+GS9uoxF&Y)T2%^fcA}b*^y{Kz`A1O7pR;4um91 zpCTP5eF?h;n9@{md{k9-M^P(2W81FB3dGU1q+CnaXaH93oArJW;O#pNm-|+S$;%pflr{6Zb z-Fs>sudopI@Ybmq&Pmw!PeMj^D4?2@D zDvsy274OyMqWZHQ-R%dIidfFsd`6nl5QFDlPi_f(KxGtMUD7JE0?NxFg^35V&h7W1 zK*IIZqPMo#;!+*^on*W+OVFOv@~1>UyXlQY$$UqeSsL=dNVs zzjKo~7?Oruh(q}#%9^y`b&Mi>(3IHq4rjnL98J$9 z>G8_4@9vaBt(tKqyjgj<*9(5sjyIOk#```uTy&N;dpFcL0%A=woq>Ud>O;O$dZLz} z_P-QYxiQkxsr_adaF`>Z#Z*XLFFzx`C{BelNkBQ-$mdn^ugYq%J`;Bt3*Lx}>?%;P zE-Xm90EA1#y=5oB{D709!KDYi1OTW z+EF&dGBjj6em(mgqqm@|TBW9e_k~5by3y7Y0KUf!7ZoS)i&B%?XxuBG5^YT>hh;RI zURU{Bu7S4N0yN)Ksu%pctpAL^gJJT5d$cUFC&=-lZWfQW?tQh+1z`l!2B?Pc@Uc&E5obR&5t<;h*pQZm}ptWt^_}GC7Yx|^57GR7Kn#O_(nm+-!kD=C_Na1d}9X} za5y?U9y6i$be{+j>Q^Jo+Oh7O94i8C$;U_8-eLG(dVYsz_h%V=gwS`)hj;1PFL8!< zqw&0C=o%ju7=^w1;hols@Ta{c!&OH=a{wWShA7GIx>#40%S7xpjTO0EG-|pj4b!tK ztEiJGmRhOVT2*XmG>iDVeZdzDPdV?nm29&EAU1~6&K@|+e&&^W5d(;+S)+W9K+MEr z(a)FM3kfs@^WAJaPGSbqj*{sooi9+_2d%fap<|nt^)F9E;8Gy<{%m=puq|o>9i}2O z1<{7=E{Dg;e64!X#5qr{y$-;3KxX~m=U^l<6p%^2AZU+ZUHxW4ZRGH6H0FgWbj+Qk zCiircC_RKh);WxCwo&64kATT{Jy)l*a;{&`slD@;YFt^F^_{#kS}$<;YvnfEe1I6N zrmpu7@izx#qt>}|xSE)WtWzA@7Z1IhN+Hro19AnBKX%q)(IHQ{Q(BsuoKL()t4ZwF z8jTuSuZJJ4_)L^`p_5xkWOhcg*mfaG7;Md}CS1~}=P?6aQ|+}?1WxTx>y)7*vvV&s zkWBkTwFGN#wXeOiB1TYG?GVd^T@5u=J}KQ@j;C-yDoUNQ4_>C;B|9Cc*_2+A_?qZp zI2l@TDXzh=W3;vBMv*mTG(zxh@M`r5>!EnlI9c$Bdw8J?ykK33W*sPUnB~Jggn>dK zApiWkPYJW{Hq=1WRf-1wAdCh@;OEZB`weqdiYn>hU&!tfqJL(l7v|$E)?*Wop|**w zUBz=vcWk&f>dcpU5o;AUPD{1)txW5_cUra(#D|b6qR%Gvv(NeoooC)+G@v=$IlR#c zpezH?L^jxGz|hc#Pn{}#FhO-5HGZMz;K0%^YBg1EySW7GPNpz-*?GdwN@hD5RhL5e zhfUJzpf(^W*$NhU35-68SLEyscrll3a^karfx4}7(H`bab&wVzqZ+O8w`ju)t|oWS z)v$FapQ>vo!y{}>firE&iwbrV*hUgK=&P;l16m z<$&~5Y#rWZrFSd8s39h8cA=zgJ05fiL=?>epnY4ZcFBQ*GEJ3^l6KU0q{Z7iLiQ2fr^_pEWNy+v>k zw|atFb@n6$0pU7L_Q2!!jsiq8K#66Kn@&h~mM*#j0X;_kV6UfEs*Lg{?C1pOo-DTso;vKv`F}$1H`R&2=4&DgwSfE7r0UDN8v+F;+~+d zV~#UDLA1ui@GP7uK$|H&$ksrwW_oE_$jKu9>;q(yU%VQoAt66B#%jWpu>di}RutKp zkm+lst;|Tz-$!QbURV8}^pc?#7HZs!cw@S}FJJ5af(w&tZey5v!)@yQ+<4g7vZ})o`u;&1jitwGRkqHEzNpi&h0OxbF%& z)F?T%ya!3>$kfr08ykv0`gG{!r~gVN_lsZu&G6K~dlz4VBaTP5nuS>2+RusC&znXX zMUDG*Ix%trPwAATDPLX=OM5$a`i9|Yg8JyH>lLVc08H1pcwi7CES%oV>U=W}j7lVgb&+5hP=2%N6}1TfqsS@?Xlbf57`R7&USOxSdiE zQX40H1?evC0?sou64NdFU-&l%HW*!&hHZpbwBj8GBMlg$apPub_&bYub}ci9K3i>@8}qqsz=okGM+SEaN@L+dAiv}3rH4y^yBx3 zGYJdJWAR?Ld%X60xJ^xcz3GghLt#C|G}(Ktv5bvM)MI4dPhurl?eR9rO1^48YUEGC z3Tg>*(dxfuJrHMcF)BLY5rr7S2qoocTFww;CuP+Lytco#pLNOtpb%&pOhf7_eI8k2 zu(;TwJXtp#MmBN_kWuHABhFeueYOwtQ0nDod7Th|Xrcf>&eaV%6=@scLB51rf=J3Y z6BCKTJ}G|3877DDjnCPv(`?pRZl~`BUNl$wMx47A$3TvtGWp>XSfGxK(;G4a9tg&PL}9+vFl zRVs?~#BQlk)JiF(1_uHXg8#l`q6pX>0ru8(x3ieKkKg`8_y{Y=o%`EkaLIC`VP{Q^ z@Nx>(^{>6FpR9AWK^8g;dwaZlVp?rLfA{nx{R)}g%p2O#vG%1pWLR|tW-{wcu6&Nm zSIwbRb(32I-LZ*%`UwWW8cl$F_*nZY8piz1L<(*@HvV0K+S~sBvH)e{z^QBy^(@C) z`ju2IF>w~t*}8TE?N2&If|}=oJZU4=2&^F4m2uC&XBhZPa}aCnzJ!Gi+dM~7-}oMu zPb&CHr{w`t#l*zZ*fqDsC7x9OTu19i*|=+;yqywd4QqYdhd;1`p3rh* zakY?$S$yM)UI;>D9w{BFa3<4OK%wc$k$M39i9FV^V z?}^^6r?^Me40GiGo2}ooNEn$ApIs>I%t!3HIh6e&Ur!jHOys}A00xLHCU!QiSw$0$ zkK$8@UkUGY6!}P7;xPW7lCvXWBVGU?IG_3|Ujd!o%O*-gxlaM3gHv z%9W|TeY}h($Jf@@Mn*>3&RfG3iuuEYjO}MlN4k94(_=ld=Td0Jc_59&(dr%l}aKl|gj|O_!IDK!5od3-0dj7kAs?{dViC{kOHXe>Rn>gsS^oo|)F#sRj6L*<Pjw@)NecIyfb6XAP^l3>cMhI5FVtB>*Z{AJiOO-&un(A9O zz?Vy*HU!G1GG)T|8;h`7&*%K74c;n23lK8CA+ zjCdf1x*y^jx-%!6vi|avGqYW_SnWHBof61~rqBvgv9Qk~W^jaIM`$P@{QWJ4&QgM?g8&^ua*I+yD!rh^J`LFXL|eN(MeW zCq=oy=Dv|pMJ9=idribw=B^QX30-X4SpsycD_9-xhl{ge!B(e3b%<)+H$6$ozDlEh zYj8zgbxj{TR|c*k7)Ci%GaDyK*zty6 zMpiKZCTWVpB=qiKuT731)1*39eaIhlNxa)3%c#F%W5Y=Vm)zbToQ2Il}jM5|w}cOe`8wRxTS!53G%ja`8LP-1e zioL9CtS*=4ECo_s%Z^6Kg_7Ci9t%J4$C*=){)8~Mht`;2N_8G!u-F*P*0XcF{|5|D z7ah(?(PdV!pAd|z3Y4!bIM57XUh!(x<5!fJkhw_a?%=GtzP<)CKNIHx^yjp(=9_)7 z{0~zsEG(o^rbkQ7%)3b@tJ)g(|TT`8&PyEp~I zZ@HmX@=qin@6sl&=R{0wb7N;F6V|NU`QDsux8Cj*;fEUo@pqNUFgT$`KtKR!!4o-c zh=tzz`tmoL-c73LXtjDhOqFQ(`T0GYsqfshbNccKXd(lxD?qieFGw--fc+w?k^>@76j3T(0H+VDCg{>r@o{jm9W`jd=MYzK*7jw5nK{0?lhaDP8`A>+~?TyPOV+dUY-sFJQM#301iB! zAUfN$+!zC4yOq1=PztxGs3_Iflz+XwyIp&~oj?Vxe2sipI#w#<74@OQLZwj}-E)#M z+yheuy=ULWAiC#;m;g4{*vBOL8#e+1qzJ<1$y3Fw!sGKqBM-0qNC%I`>77u*D>9OW z&jBss0xVjRyyO;U)q?0#R06jEIRyQc7W!6QATV*r+!W%CVIe^!#A-+L)^NSatkkq( z?L2PMMyY?r_J&la~+0Zfy{;KYGORy-^NIi@H+1@f;tC1RW zXI@3pyJRqH!w|6T$h<4ildI?a_G1$!&uY#Hf^qbLaW^_j_=(hg=CHvQt@LdM2l}{E z5P3mWrSAa-?3h+LKw`!9MwTz?`S8!2%rtrX+xc;iy-y}e=5Jr%3(=nuRTjH@cf77f zG#R~uwP}5DGB(b=_|_eUm-n^WGMF;HpGmuEhTy`kHd0E47yD5@b}rQ-Ny1L)(t6*z z5a3%Tc2__uez;@oP>asOr3I9fD@V?BIpox)URUN53L9{zewyn^iXF9Glm-L^`0F=g zK$yWt$lUZ`$n<*g2VlN=Wl1hePRWFKG*x}=ot}!H8=kyv6sXMzuUCillf`9sT_g5= z_X1L<`7}z#d3XEe;83zU^Ro>lLhrbGC+q&y^+2k#FsOXr1RTi=)AD zF*>Bt1Ve||J=G?R)B6k)TsG&&dr@Cii7wXL>0sk>Q89muXdh`abZVx`$g`ql-YigG zyAfpH5)%9KUQ_=Qx_z3C4xW%$KGQRQgp)&LFk(Z}Qi}Lo#%oF-)Wif~_aOF>=GR~J z)V1W0{>A!Yi>QyF*(qI0OylhBFrAQ*e_i_kFLpRbWP3Z%Z0@*EFr%@-QFD5RZSn7B z`+QT~@*mj*%QH$x7O))))aeqUQFGa-+mhc+J#2^_WzHFAFxm2k@^3!HS!<}y@zE~t z*C;K!a2$P1EQNt^d>+;&;wr4Qn85N@N=j?cJ2suU3#&1+xascx?siiRFyIlh17)4) z6(QJf38=3jki7kY&==)sk+SgMoS$0^;#AjU@;xWBds*Lf_^gYz5w$Php>-P5;(9-& z7_FtOSW|4M2NkEewg7i2K)r_Rp|)~M?FGQC`6-#cxpuj!M}(xfe@)LLrNZ^9WQgxC zdlpLWD}mxzg1E%{<4Lk#!bqt38W@r>-w81&0|?dv$_xCyd}B>CUm+S-??9ScPsmpRu^V~uAd4DY1I5%>0} za`@HbZa&{WdI#mTeV9eq>V!gTk>#_r=dBXw{n!ZyK| z_{uxw-2~P8__OAy$dh)yoSTtQ~Cz6M8t=PwO3W`UU&=8ph z*aV~(Ed9Sh zK1g!I<|>n!vKhq_iz{)3g`Z_5Y&Hs8?u%Q%F;(KNjP92d(YS|5UN<%6jk3DIxvqA< zYX+(%PbB@{8g__$a3s-8{Ya-Usd45)nzY-+h#LF#c!kpC8#^Bj7wPHyy&e8ASi%{h z2+O7+*L$|d#dV%nKE3Z&8hsPlOllg!sn=k=e==lim=jnflip)XPC)bYt(XNX`>M<8JR zscC7=EBP20ta_svy;BE*;){ zZy-M@EnWSzizOwZpYw>kr#PD5DO*Otj*F_A3>7)|L=hZH^`6+at_u-KKEvm0ZQ+i5 zqSx%hZ-if53{jg#b)JOzfCRIQTvxZV9F#3zAnSa z@|B0Bx4LXrLXE?8WU>fF{gWy!)b~hulxTP0nj|xl9g%BVm8fV%qu0^7eazmkG^S^X zMKWqPU4yC<98=|fHpsbYS6{F3a_}^s_m-3G=AeK2$}7%YzUtm~D0m$RjwCa_*2}%DjW0ThRge27}3I5(&{%m7YVtD*k5Qqpeg1Zx>5x zF=6f5iv+?KExa_0jM_DpvjNBinORw&o3PaAY-3;hI=_;2b8M46HWqK_Ym}bn^3VRo z`O`vlrErc#_N8H-rrKq`j`{ad;^~_7OaHL?`*Ce_x|b5zHa$jEZaZ%pQB&Rf67P9k zk8B3{phey%cY?5njt$UvI_Z7biX$pe>Z9kr5oIDX&4q?#<< zB-q&1o{`nqDCBm`>itBVC%?$rV*VL_TM{>cm1DDHQwjDbD^+++YItV&mmZwoK)oUw zicQ4pbkIwce!r6ynUb2S;f@boEP1Kb7WrW@)T#@f6pGv(px_+AQ+u8Esb1oc)f9 z;D4eXERRu@wm)2_W|eswrijY>3blsQE7G%wcETY$zrC&E&KiLf?dvMc z7X)DaojpCtjR+%uGTL6v&NkX?9E}wR1UAo}9?(pWKicn|k0%+41(uJZ5``S&ng5E@ zY+x{^zG-p#!oGHnr=o2OV3C9rQT!h814Rp9&6kYSzE|3nEH=KsYk&cej z;7wBq?`CKH|CCqAs})K+lhV@3G`N^`{cP89EJr3Cy+7+avVTcRfp#+!yYrRhM0hXF zKTXapa>bd$A|m&4#fzqncVX}i(;GH;U2_+nYWMt-lEoI!J6~A%4@J|ZS_Fb#P3h@6 zmX?^HpJ=x~1kC(R>!p9aubmd>|S^r$xiSWd@ z9)|4dcyOuUty_1|Bm64f3+3H~`GRb6yx4X)Un>@dYr8v^v)LaXNzC6+T57#eXA92W z0yVs#{no(9?@uzRJXmOGdQf9wI?SmhH;O5a7Ap^{)Q|hD6FniXIO(?PA*JaOR52>Jt}Neqk3dYFH;;>b*|A-U|WNz@&Q9V zzG{7X*cwbmKtOo7yQ0cW<#jeTHnv`F@w`3XmCUi*_!m{ATmq`rnEGUdlJY9#)3fBn z)Mjaov0CTxVUZoQVB>B&@8A$tOqkrR)rEk3$ zOqo6VTgN5@m$(JJ1_JL$wNllz1pjFMM6NRWmtUtJPb zh-|FfQ<=tFRlns3j}Q^(`Po@?GOUt)3;ptt`0LlNn3%JXPpD>3Ny*9kM@KffxxO?XT7DGACp}ILYe-$Ml8YF48QC3Kju#&Jy zHsTq`G4tP?QXmA`y#KWhq-12RcTiqA%wW^OBzF0N4?H~TXH-IOL02z=_kcb*KIMjf z4XU++c6ksoQuFwMNg-HH%sjmz!{e&Ze2iw(VEb1|YqzY;5Aon2=*xYD$CSp{(HD>7 z9~|wyZ=K=FR4PgH+r3oIqZ2kIVSHSlGZ+`JC1qu01-`*s+up7<=!uxEGU4UnK_4B> z5(6&ie!9`?d3TxE7(P<3{pMGg^Y+&`L~B<3^=^sz`+g5cp7i2zod*TRCrg=CnE0G5HE#@j^<`QuOH;y9GMLN{03dy?$oSGrVg@0M1z ze}JhDKqc{7Y4cSoQl_A!eBQCsy>4mHPWVWOhz{4*D#3=qVnA<>Yi}x_&wyb*56zG) z9cg7uQyf);kr9zY!92_Xr-;h0gep#ID?1StaQ{sUrn9`2=}1lHN@;N#kmU0~z2bQ3 zarKty`Hz;iwzZATF!LKUTSDiX)6JC?-Cz;ByGtu~cX#_*w1!Mwf`_lCvKlek3GQ_3 zD}q%KZ{=j_*HwNibo0Pl^m)^5=t#>`s01}z0lmr?4Zr%$VI{ptWl@HZ&C6hsH{p&Z zI*5N;4It8O?AOrF(a{s&?Q@gm<;-++Mc{)RT~Cd|6&rnl4xW4+f1#F}A6yDb-j znA#KByl6&Kar_>;cQ1@6(6mZ0sZ!+4$8ODYxGw&j>bqvGy5ZYJvu^8e2rg0Gk!!l? z|41Np5JPxqcnBqAToB&5-va73$@bJ5J z+hRy?WX-J%cDfeXXYR_#8;3Qm^YBBOucLI_+G*_L3}22ayhv|zKJFZiNXquBxlL?C zgIgkBs7%4Ae+R2Yjvic6Qer&Y-TnEu?9QVj@X@oaK{m0*4EJx*tYvV?+sTXu7i_9* zhv5yQ$oA$Hv+g@Q9T&7G`t>VCx^TR!=OpylAU_NW3%g$pBnjF9=@B?o(%H$0!#UKa zu&}Z$??J49-u4?VA^vH+yM5_d@myut+?cGtg+1rUpcB$l%R8Y){CCdyt1B`h>x;9S zy~s5O|H7exp+CsFzK4cwx!Dg@PCbb=c}qWBD#aSReuuBMFE2inp@2A$y}pKSZ1l!# zS-*IT78_4>6oE8e8uyD3k7t8`t)_=QO(t9;*;&2nKGG*}={(Z9X;377#Kv9b?%n>s zi==4W9-rawJ-m_|A`{EL4<`b%m4-^z;X4#2kF#Ptog-|!oMrg};sxF!k5BTG-U~KZ zGdnH9TJhFMa}HFQ{Qmb1UoJv@ujAj+zZIB*96E9D!Y)qkn>`^QX;_;O7|I&0UFL6YX;Bc=6a5>z&$oTxeXMzoQ7!Hn5*p7r{lD_L*%i2}j|k z1$q5jjpWnC(p{{_^DgF-YR#rE>h-Zn)aVIlXjCuo-h7nIlH0lXkmfO5bmol;lkkd> zALdV}%f^mFPNibm#OV9t-V%*iyNBh5qJrt^GY<^1(%Kcn;PNZVvS#>qd7tl#Z{)O) zbCp$cb8MRIE_6h@@`C?~>X+2|CJ%J)@LDM;$lTOMPodV^y4CJ8o%gt+s8V`V!p!~7 zWNoh7DAopS1w;!Ak`7u$+WvD%#X`G?7|wdz82rf9xxe|P0R^Q)^Uk`4Mn( zcGludhv@gBu*9RD>YUa^weI4-)HUBwKeoaCfo|;Pjg7TT(o2y~nLAcr$}BC7Bj+FQ zoXpa`6z;GgiNi*eWolDfd z%)C8sb*#YpufODw)Xd$X~&Cbrdw5XRY3^C4_-a&kZe8DVe@{b-j(UDs`=!yGM9QDW<(xc({S8 zDkK(Y3#4ram}*IR#pO6%MfEOCtsPsPFnnMO2ZxuE((GI`F>%(L(vmYxDYc?_C@9w5 zZUx82y-VwpUP7z_ec;zuTpxBn@g%={ojYq5NxV)(bQd2xDVACyJ?xWqR^5m#TJbRW z^9|nl;O=!EJKhnLgO&8Y8HHHNq=_IWC)kaGpRfD+Mu7G;soeM->&_yxK#V7cdVsTE z5En|VSOW43;tVW8Dw2nl)n5}#eSPSM2j7K-(`=5yq2aDBd|Y}9o2RED!4pgEEs=6_ zW)4nHx1X*uOo%fGgxdUU6CRy;hR-PHX?g(6qdK~gerlBkE(`dtI|6V6Sc>roO}3!| zO$LVzMQlsq+RbUh1NSzfMoGq#9R|N@r&R;Y%$VR>3A&B?hCd@6Tl=`aUxCRmv!km$ zSs%*I_EOSHJ>2;4j{2KW|1Jtd3-JXpB#9!1J20^Nj{75I2N6u{qK1;v)Xk4+o5fp& z-#eqV!xoQTRXjF2d^!q>4wB@flScX3quaD`%D5d|gk4=((UerS33&xH zfRLi!!o%dCsQBPCDyt$%>a?Z?W|Zu4djoS8kM{*6tIg65Vl3+{p>--MebTo#Kfm__ zWdK=0(c^OrRDBn3*}2Y9n%C3#_hmq1Utd^EUiw}(5sZ)A${XUgi9Phmoc;anA4;2u zdxY(-1>fH!z5ATguxK7E_xk&u@~FgObaeEYxg$Hz9!vv$N;_#7vM&Vx#9ZgzD1maIOjr<{0(`5Y(e0hcRV_D<~*>oty-~SLXdm2nzb!u_XVGzpBz3TjKmI6%YOX z%l07>ga-u%RoA=*BfF4L+clhubSSDK*{X|rPsU$qR(Q}XHlMVJ`781Jf`zwGU5|g!hKg(0Y1_2>%+fs^xJc>&>jJn0$}ghb+E)0VWU^ zZ@o$6_YlqxbGf}i*3(;uGN~=8=}FT#i$}%Y@7z`?DkMq;NG}h~Jy+3UJNVu(z(b@z zwZSF?b}F=Lw48G0Knt}~=oHSWUat2ed$*uK=!vZ>VRvY+*De>On2_3bc_Es@s6PV)9bxTOe3+dCU4Get=iREE^uz?MJ z5mSr;oeNs80()(FLCrAmQP++JMmYvriK*n6x~eI%Y>z~7^C){gcH1FtmK2PZ8psIG zy%dZtk4My_l2c2$5Q0SqbpXeX%Qhii7!@o8u8rLVGQO&L-fEiy-{J=up*fC3^4Vo( ztqiqdCJbNP7$QoAgFw}u7oR41l+{e8lrhnyM4Xty%;PI6L>Cj3#|km8>??Ko{-Quq zkxWp*-5=PmVNfAjp^{3BuluHI!K?ocC5AMFRGwzXb)LYTjor=UHkT6W_?_)5v+ALARI9Pyh-$A!l(QNd*E3}rdUb41lhiiKQW+FpM z7w>^CfZlJ`0rCcfIv>XNDUN@$Wb`_HIREEq+yEl(Q|~2hj39BwtDx8J zRW|7=1B=u?)^D6gVLz(qS&Z8&ej$tsx^Vtr1nS8eh69xezfav;y<|;%QL-cVi zr&giNy90@x@oQ8^peG4Bb>?Jh8F?){2 ztNA-R;R~{m9YQWY_;L}xvZYFi7-%-aUGpI^R)mVmZY(BFI-Br3q>UVeFl_NAHR`z7 zy|~xA1&1Y_{TAP~gR84m0+U`rD1Z2X=fmCB@%$a#_i^9Wj}39i)@G~xvnMjgf+V~x zZHHBT*F74Hd`On9IT}~)7g$@19uXsxl<*4-qdUA=zCcTMB!>TC8@DNoYh~^H4No2HIbT2q;HFn# zAQ1YuApSzyUVs?=-#@HU^7=qC8q^==8Q*UrN*FDy=q&`vb?Saqf|w$J&4obr;g6hn zeW99i&mlRf^@g9Z6&l3B5!m9+US}VoRfEOx_E16*3uHv=IY2ix@I0U!WuZfS0-l@V zlPp7wVabiqKTu2EAh$ai;V}yI;6n_`L_R;Rp)iJ*K8(OjosA3)i*;HB`1u!md(8ky z3$T9?2awq_wOo_3v$IoEn}S9zzuP&pGusjW8?sbhor`tnwGv@cefNv^+Fj`->GiRK z&Yu+vOs5QttwfD7k( zKRuFoUH`66c8%0;@-Sp#if^tFzTCPSdlmX)0&}qyF`n`5FoB5--!O?_@!WCjUQf8N zy5#;mFj{{$m;Cr&zsO^H^$iSyO+gh2x+*eXz8I?2WMt@G9?TN3c9FLrhN!b zsjnw+m(f@2o(vBXe+y>rp*7^YoKxo9tA zA7@Cuq#s{SPQ7}}TWCxN>;>I!V`kj)c8|BmvNFGAsWA~r`~Lj{r`BJz`NDSm{R;+| zMKe)eQ^Ux_G)+%MPJXaZ9}@(UtCvEcoyKnK=bDD|ay_NS=?Az_V5nl5(PSu1pO#jH zM9}slW(9+`0D)kv9BraSuL$`qyu5NluIj*`viDui^@?g?{yPm`7W3D$Gc}dVd*+w> zO!8sGTiXuGWX;{=&L-rw~0_BOP_e)&|O z*k{O!ar6fee|WqO^d%}zbx2I(5|K_8E-c2V(#*_?dHlbpX^KcvMEy(WE@;6xzF;Su zqe5p9Iq-McUCRl}Qb20l8cvbrjDd=D-n>$+-rfm2wRT9M@Z{hr4Q(ROb$fm7K9|5^ z0HEhAHEhunfD%?!RcX{(r&d>2=Z^IE(@{~0VTuOmiO3BM4qlv}f6#Gf!1g}>2`&7# zS@|<&@b;$mly$Im&Rl7|)zk|=$SCK&LQp*oOPihn>&UW9Cpa0NQ%{o43gT0W2yAF= zef{k8Q~;P!4rn9O28%Ps2L=T2aB+2ZbxDKCsa^J}s;Pm_*Ot|5nEQ5)=|5zS>6^2! z1P28n?@G5GTGwo?Wya|Yxw!4;G#WxN-ttEG*W|{u2_eX)D zl~sy!RtNoF)u^7<#v)|A1CQ?`PDXiLbNLtX2J$6FlY6(yN0^IE+F0ub3^eaG@fa8x z!X7Sej3~o7%Nm{RgjCT>6wOu`^4OXd=Kwtrt@g%CDT}VUP6AOUYH1&{Rh4Kw*Aks3 zA&^wCTqEq_R1d*Az5&O}WG+>7l?O;r z%9ywZPI7`fOIY&^1dSkVGvDA)bw7xT=ABDQN@2L2yNH*`);ahJdI}ep7=3b+_#93_ zSERhBM4gZ!douRQ3TAy{fUB{l)>XKJ>SPb8s!IH=Iv!rF#MIQ-EAN~=bGa2fjYg+d zLI@8YNKZ{S5F07=&t@xDwmg=kpL6<$2W>p@6{`Fb-FIe&_!xoG8dn-M622!) zz=Od^T1zV`(A{BKpp1ifQ>)n8fk0h}q8j^HM1;Qo_ToVNY^F_jH|uQT?kYr-6VJlp z^fc-XL2tm7g*&poQmjjrkFCQPpFKzbpNE;iw~)oZkfkx>bBNc8v*h_b!q&mu@q-$f zK3SGwlw3e_oS^HMX8R)JM1l{Btm|^07%?C|1uKkhkeKMO^kSlX@cHP0giq0oSG*d< zb%Q!wbmS=*M|_u*OSBWYyl5vUdDm69&X_Mg#*b}28o`u*L$mNZm zEf0N6UTME|gq|(pYjh8Gxfj3xfJ5_O=lT8z(}Z3Pc!(9)P9ZS{xZVB9$giQ_cfX1> z$aIGqmYlhkK;9nLZeGhf;L) zDS6vyYCmN(#m1iRn%q3N|5zaG?hPhjk2^W%PyanO zms2D~@Q{XA3x@C`6wKDpTMFnc>~c-$?TCOhXql*L=gys%EaCFrpL8TSl&NUvs`wes z(P#61yaHXK9rU{2s5_KA^F^oxV~u23A$VrD6t3LJ$^=Va#6-f1<`*wJ!#FJQ)gU{h z&-ohrKdefMvXkwvp*a-A@sViIOq&lK^acj=y47;&zJ^l<*@_{XM#Yg#(BH5-P>_vk z1$^m7CeSPHt82ePif1xYQG0^q2CDcWe-1-uq%ckQFt|fCbce&YID+Up0axkoyxb#8 zZT%@|t5{s93;Vr(bp1Tn->BHikg26RJ#u~7Z3~~;6yRhr)Fl$OaGp(3pPV`!-N9tYQ! zgM}qlD{U|&&SNbuCvdfr8QB-T{@hR^#E1iK6=`SbbOS{r%x^yx|$%KLsqbIpz=e?|Bufx<3nwU<_PNKp;E9 zk%T_=G_l$8HJi5)%iuAv@clv0M?xZWoU zDlHe2#TGJzuSP!p2H3HFBq1i!+5D+6WXBTNXB8Tqby3ShrFB=4qfK++E!3j_40S(KKvIf*x6F#)O2kk5?yRC_C0| zZthZPn<}NKdM&(*NdkcCQVA?u? zWf*5FBdNqVB6a>zME`NCG5g9lQjj7$hZ)hr`ro(ielce$j;3_W*?HkTC4KH18!ogH zoMAKg3O&Nqna3*@5RwxkYbGE8dY|^vlMLM95Q7nromNTS#bF|W`lrm;{lW?g<7Ry= z{@6L%7`U=OeEG(Fd=>U1)pM%`q2q&`U7l?7h1lag-XN>@UY)~esO3k$6+=x;?)XNG zc9t_7Rxy;2S2tme@SNu`@42IXIa-PzeKuJ95KbT<|F7>Yqt-~Vr11b+f4}0>W7FgC z-KBW$@M^#to3(eEi$-N7E0HAF{r#$~Y1L73E>kEOpfHP%_4Vn?qOY*_# z@Bgz~+D;;nfpdJTxsYwYg%*|I{i%9&S>F{8ZPccbLc#dkm00Z(Zd|ND%|{QHOqa%# zlVg2LOT~Qws}Ubh+l7qZ(gB?7dz8VcO08ox5uOlcnENR>W`f;wG2r^R76jdM0R((s zSX~2hHJt+zZlgIO-PCV)$jcZ@VI7!2lVT^N?tRB>#@qMn zJXz&n!6*t86&N-7hM!y&L8jyK0-hd|DM7-8(+pf_7*QA;6?{ zKV*2n+LSL};n|_~SGVd}-dLQkXYc~xyWi`ZOYJvRbzwm#?T0PULrL{DqTA{>dgyt9(H6jo>` zzD;*s0}Druo4@d0wbPLdrvD$s_p2$Y9z}~~uORl%8FuY^Wfe|FGY6RTpd^ofEvc3{*^!}#1Dw9cf~tS?@AA|Uau+~i&$H=wF?&h;=NOeJUAGPP+L@3?&PYasDCaYq~P zkh&c>OWLf#u)~+;nm5(PgY5Kytx?ywaBvw3Vf#b>{phDk6CFzb%w6e{;%uaJ92=|< zc6Litrs!Vv{5XQQUC2QVymg+u>?|Z61SUc7KBX|ArL{$Fm}>!`m(FDW```|S)*rTK zx({yV<62ExLnQZFVe>Sa4IeY}TdRMgmf3fRapY6J3%b}hQ&ocKVuPVFQ=Q~Kw%H5o z!AxJq<1EX2owpdPIqq@cuq(1!l*-|EySVjgyZH%vse%OU_G066*x!$wkVT{y#9<#X zMU_HvB68$O(zjN4_5fyuw9T&x!u2G>TUdU_gOXsH$cq?5Bg{uvel32w#|NHF7q|Od$3PCV z@oy`UWKQL$!PmPbdqk9)(qqM-{WFG^mB68rPfIg)_zNevu2R0{foyoXwW(70;xPU~ zVbRb?R=x22Mg>=+v1WQ?)VV{Pexpi{{6F>9b9}+-5Kngrkl~`*G6u=xLWbVplHT-2 z5kDUd*&(zrcLSwjC-*_ej``8~axwUza}53cDk0ce=I3D{TJT^8T2PH6;0l66 zF*hTqmh{vu`$pr7tAB_5lkc2aB3q=B|GNAegIaRm!asOC6C6@fA=!uXRHsVUUf}!h zuWIMsR%8l$*9Ll-e7a+X5+4dsLzp>V@_ppYSZekId12K6$($HFd-RN&NGBK9zqpnm zou;<{NTbkZf0o4;5`M!PJ(P_lXxel}Vq+=(2bOIyc) zozagW`kqCoHlrQG*6tOjAy-$}D0mQo=i%~#Vis=#zs6a|dgk>*>b9|hm6cQp9UT_y zc-LN`@;*F70klCs#`m0o($U&iRY~IeN6o6?ah55LTMDbjH%!5)6y%gavB-CO$&I2? zn3JuR>oUYe-iN>NF!3hinjt<2pf{S)A0z&UY{IbRB>AK$Fc3I{Zt z=)*ZQM10}r>foVNoy%9iiOgQAPNf;JS=WYSRIP%i34RVF6@g?lAz4}^EHd4&J0-5x z#N$3YRC@!JfW+^UAF zvHI;;4C)eCN^A@-HBLPpOTZW_Wf8|Sq@Vxu^~K=WlkUK?|Qf< zINh^347;Ti*jq)lHp*6-!(bUDb8Iy_kuASCHc51~&*=STh{Gy684As?i;HBsXRzRTqpJLX%Z+&VSJ~eE;gzDo z%5#p=!afIkqN#io$PPV7G(x+cT+fF{KZyu`PWll{)X6}(pMK;JbBF>tf6l$*2P7{S`i0dCfp=Y;need6@If3npI^P3+47s|elm&MMn+KOl|@s? zQ2^sv3&Gj;aD1=f*4!O`1e)mRf|U=HfriGcGYBmwCuhq#2#<@4tFEz8r`3ySnT%AP z8WV`FW@l#|9UZr5$qx} zS7)2m-0W#(RZ>qdMv=m0`*&&SaV$q_%UV4C+u4@1yZarWc_uWzHx6*%BzwsRf%v=v z@HOsN%9z>t`Q%0{tyev^mzS4>J&BF)wO({Ega6AHOe`S#y5oROKLn!s4w%mKKmYw~ zep6FZUERz=i4P+@$(tS00YU7SA33Yd#wi5_TYF=uER=y*@dhZbvU79cUcF*atIQUQ zB;K-03tn6gEJJ#J{gT?t!}&aoI=jt2z-ROV94pY1emd?z9h~H_ukS(C zfd!wJ2g`J5Y+%4C@J-FHu2(Hq{a~I^-nQ3${ry;o z{!Wu~a}7;R3t@*W74G-P8a~c&1Ftz}Vg6V@Jw7aZUJ;>%GfcM%P*SPbU%agdnz1{4RjY-7%W#dH)CUB$U;avm@}!jwzk~d+>(l2 zjh!P&ypWEEeDI$AkGl6J9qK~ID}TCljB?z%z{1nmNf+8@IKw+RKmz;GlGaWXlG|M3zh$T1hk+5 z+s%NNx3NE-$@_BF1RjNu%W?0QCgZeanIbI?leWjTk3OL`xFZc$LPSXMcolo^PgT`? zxt^c49uQ?Zs<@^-%`ZP<6A|$n^w$|6jqq<>zh=JEm*gH8XQ)AlIFLZSH=_L#c z+*xi7BmxPiqpE5`YwHtGPu~E|Fj0{nb1vOrW40heQ4P0a;BpMUY<#WNokAHT416Y$t80DJ`)<`m@QA4>Cj zlMeu0lec0Q0#YxZtz*7n+mx&<13*@`v^>~O_ih2NOqK3o2Z+Y*mj|Qs*UL|j&cNFQ z0l5)iV0#Y*o5=@|jF=1n2Pgdm_*Im61TlXhgPxibSRlYfZuJ0Kn?tY~&6cy3K)E2u zz%ck@@THG2u=EUs_V#v0Mn;S2QmmIk8u^N}!ztWsx@|s`I;UI7Hg2x2AU<^}TD|m% zd;WfCv}8^}LBaM=YA9gbf!V;JSN$0i!)Cwr#m43+Gc!{VPUFNYu*J9 z0{MapgNob)w9mj_t1BwhT0CwFm5RQ9|BlV5c@6GNPj1vY?A|%Py!6^mb>`7FQCClj ziBag;XGw^O83)>X2dRUDgRd!EdZm}RpJ`*$c%6rWu%0=&Z#oDCy%vHT@wA+rd?Ou?%K`%r9#IUxK8 zUQy|GvDeutqEI73Plpw19rey3I~w>)Y-}tRCT6i#<7Fs-oNu<%!zcMV6qSrr6g6?W zI2;3U7rR1nzy@n(V?%8@Le za#^3vT4%7Zuz<7<836$Ve<2~Er|TZUu!W#K^T}z8UnDJA_pMj4=_QzFHn^HG0LcUb z^1whb;QPQWO0}EKJB@3kw6sPa{ZOITT~G0g?`>N}<6@~2?T*Z=8?v*(HSd%h92`_s zCKr2?U}AWHFS_s3C@M!Z9jB+|Jz{y>R>5pfX_YYUg-z8=gDe6Qu?rj$QtNr=G&+(_ zbW^<+WZ=kuH4R6S-+UylWv&$e+BM6==Z3Z7IwncuNO9S%w&6OAz?S zsksaEYW2l#B##k1047In-`H;t4W{vHlr2n6T>{xdq`+;yu_M4?fl6NOkLf7bk@UjzI%D$M8)N$rBHBM!^z3XdQar^FU$EF22#?$b8|e@ z)Z*@pjrv`PGBPqCSu0S;i;IuvtWDHg8*Wxry$&?42Q0B*40~RAjTm$c43GnY00Yvg zW|LuJQgGG?A_BrJ&_Be-PXlQ_7GhUFQ|rOX3NrxO0WJOMq=)2iu`7C_&R|n5X;UiJ z-@AV7H=D7RgoFfuI_H#RWQIXt+}zx}xxE!Q8(>30LGktV1s9SJ^IxSjHoD8oj(~)& zn!skU!4bq-u){Ob)AM=W{?S8rxs2Wuk?=gF_=OaiuHdxs&B1YF)ofZxEO5*OFYX5P*6Izu&!;4M0j@OOmU zJ~f}8p9A9r$3w(%8sKh?%LsaI#;Q=tq&1mO76t_c0aiF}1>T&)^jjpP&Pw@?!jP~q zL)_1d@jacLZ%73ASXrZkB&DQ41P8Mk0yqcHi*mBo_5Iz!Vx#lJ?L{C8QG?rsxsXsh z;5sBN46OLk(sN}us;fH{31KV3$0#Em6RmOvo z($W-}AVh$>+}XgOpbPbL3YUOH04xNVn6Iw6Q9wSepwX>#?Q=!pTzQsh*201&*g61U zE}hEbIF>E3y1J^SrsfBSd<%qE9|)*p`+y??&b{xOxu2b#nonm6e3eI`NU+{yq_vW&Dw5Wl#bA(G zI|<`Iw)dp9twgh$3JJVlYSAH3jI&cxszW(rGc$k7Q6zmdm_N03c2-ce($!dFfuYCVhkE@hZy70|CqM zFRa-W=%x^{4+tpr-r6hTc5LH@T~E!5$@~Ks;dtu$7KX58DU*Li?bl}EKsdOFLvt|C zgN6eAB;@TFn~id=lgZQCG4-Tat`b`(djG%IoeQ2^U6`5@0r-Ut>~1_R)y@Oj zU~g|Phm8|(oWjxb5DqZDu^=Ek3JQgVSrJNda(OSh_re&wEqSPyeBBA}=jvQrTlaIgk%~B_R9GY7ARGkDdiuK6&jMly2??PSAkCnH^mcaY0hQkx8P&yjRyPw_x^^Py9AcNC4WHq*h!KGl2-pb4o5Z%BGs>iINkbYg-@ zr(-kUL?5=guiM|+3Nw+)R0@9IvQ4j;avIwy%wB$%BQCP>(DH*|cUxn!-kn&p0*BPJ z+J)RWI^{AnNhKqPC}zNY1*ue2RJ6+F@g^Mz3G1W;sseTH1&_&4r~D%ph-@&#c2BVMDf?()?M2K=d1Vc-qEcyvBrMASEf8GKa$`No)$ zYj=J(((+q&hsvR-sF+RRhg(})dka1}T%SShB#rSsn;C={FDu!NmoR+K(cOlk-RXhX z0hN?csS*(SfYYG+Kc3hGdoRV*z`FK881jog94D@c_0R|$t1k0kNc72wTP}S{%8yGc zj8CITA#2W&m)dYxv=+1E0_x?dpfC@rxL1Q!5maG;PZkut0s41+m}_!dD?Px- z$f&?!0YqG)EaoZH&5Vo;HiM*~pgTq${9G?`U0sob4;|JjOsnos3VnFlt!UDiw57fE7 zi3uJk!A*b=91h2J_E_5}zo>~YFv`>+B_t$-f`88W^AbS+An1QS)yE_F`xnK>cTYWw zAumnxCdjWKaG1PRcJ5Iq;IM(%s(W0GE%01MF7%#gG02uCS9mNTXpsG1R0Utwrdc~h TuiOVMkWl6(Hpb#vNtH-Z?gP_JPr`eg>tm)hB>EZm< z={}C=K2Adw5l0zE3XZeY)xLOgM%cSLcUyn=W^`08BMKh0;y+)?K1jT20QQRUr&`ks zivOt}ZtmwjTo0FdD&gj*?m95#&*{kL)niFfj6vGM)a1osuRTjaFnc7oYEUqC=SvaX zEQMth#6!XZtR=}(BvY-vPo6;G6|`de_MQqo*D+|P z!rOburGDH+#s^#9q@<~Ixg)`^lr*6X8VXl7X6?HSx^LLUG=y+Jr7<$$oEzuJGYsLU zJ`LTvL{%!_?NKgDPY`&~rm08o{l*iZmHP2lKfV3)&7*^IS`zGLGzS&}cGx#MrMe4& zeoy5(vRo8x;4ja}&EN+_E@YwstS^Ig$S@$#R$7@{_53gYL3Z}39NBa}>0{L$w=i|j)XU2*oEgwCcjZ5su z;S8-wrWwTO#G-xgafxHL>Aw)=5Jr;?$m@scPjLP~V(E(~w$s0AoS1e7Cy~ow3vCJA zcjWJVHPTO9uO0jIBZCcPer$fsY%p%lQj62wQaQ9)L@A?r*6!ffS0ijwnqU2k(`mM2 zZ(Z7ZbCueAY-%50VLTu`kCv3`S&o>8mEhf*tkio%uXv>NdGlx#&2?*XvQ=4>9w7*Z zz}y?1nqiHg)t|TT1_04!19#B`q@G)=+q@g2b{V!AHfvt}n(MT-+P2y@1a=vsrqj-6 z%x0$*IaTnxCJD0383JnaG~DF+{ybgXUHanE`xpU!aJqCZ4s0c8;aHl@(0!Fw`X%nA zURXtT$Cjlvvl{>fk$7k_xBRU$CP*pEEk6=5z!zeFi)I(Ulbd`84{@Hw3h!RK3v=!d zKi#z5n0e6wUDm!|)G`Fj8WE-08?9KWf@< z#+}GVs!K550jqRnWbd*Pdws!La?Ufb%YbHoCgZwO19Bj*mqLy|84s~~8Ev(mftB*+ zJKf4Tk@fssgJ7TW?e0{T#vUsnIJ!}Hvi!CRHt*J|_4f4Q;(i4=y$05h`3Cv+%?aU; z-s}(vAlMC5#0(`R!6-qWVZp!yO~9Z)pTI#cY|!f+OCbL94Mb)poe1zaJd?eHCVO+W@V?PndKsZ_%|A1nn9^r( zwSUz$PLhI#X2oLCW3Oc=U)3UpRV?Nj*MsP;?JjLhGI=lk?qde=ryy7eA1^{e*#CK> z73i1~-s-3Szu)?J3Gl%dx}iXU^YfvgK>hos5#og+lh8%u3-^B)0goH|KWqAUiKC)G z9LhBq(EsnBLxB@zUVizX)&4GOO#vamrwL#GaaRg9mB$rRuQ#kSUoz!5IbNy&vVB=` z+1WBoRZA242^N7CB_hweDOU8Zx90axPb93YnDPZu!r|B~smwSB zO8-?8rH_{}AC*sXZ4o2XY^kd6O0y$KtY7Xo0tv?Jt+d@P{$QE%F4bH0X?wo-SF}CC z*BFin#E?qTTP)U6rj&f7{;ze+g7j#Lhecs855*p^#&fsqJ3cPM(v8pKqI0!7LdiT5 zfyo_#`6#pMltSdn2Bdivk|JaKV@nT8uW%PV? zt2LPtK^>hckj}B&8x0tOgM*_qc64#!%+ASC(=tFdk$SUob9E)?k2tM7A)3uv$)b_DB0cE*;xGK=m=yPDIzjkM~_*#YnrJ zJFxVgh7qJ>o<~+&|525t6vTLYQAYoVCAghO@28EU}uHn5<)&X$Bw@LEyW?wx zo;_U99FUyRs=R-y@47o`D18Olk%YXN(bXpK7QZuSU5rI1EIw9P47J%wBCr zJfPZmn^OA=Du^?d)gp=QUk6v$F0=wuPR?Z1{yjH4-n;Jxsz6(_K;S~gY7@^udfPdF z5#qfe4V}Tj*i<-mj$!0L{l~Gb37~qQr`=EehlN1SMd`)2w=V*FS?3ntRx1(;e@!a+ zA6WDT?Mpe6TJQZPQz)M?*YFeOPO~483Ax6t+XbBTb*rB$P?q^!L$f|*Xpa!`U*MU4hnA(P=wuLHtoOoRN17pe z1pj-Y1^`6$hqKqa?}p_6bz2`V<#!V;u`Hk#`7bU&f!~ROQ2l9*Bq{5^{sar5ner=s* zq8RA+-37zqO3?N6J1?AP4eZHmeg$yOySjh&d1(}Smmx@C9dWSzm@QNj@m22^5Z=N@ zj+?=Ffc3goPeSzsBbyb}4@n<{_gTnrOddL%U3NZ!@62_V*x^mIUK9OuKpirOZ16fX z`XXA;b%fx09#8wm6^Xb^5V198P9zdt$1HyZ5ik3ojjxO}m6TEE7#r4OmyTfjBk}s$ zRzAlzBG%5oF|DHrHVAt99hN{_m%)Z;rc3RqB?-lN*yj8o>~cQ|{gAU{6g!(Mu=AKL zu-vwzw;vj0lMELlgZi(a=H7$NP2x}x==XfEUk%AfC<%L@5N7@G`?>YxlorrPo1%yY z&f(a9XkvV}FX#?Tfc}y;^dI4uyoUzLTmxLtYV`b>9^a{d`TLU^@aBStBYk9{C^;7M zsvvkaab06ORKJHhg>kC}UsHe*9_dw-grHn%t;PDsObfvvenP5&kLL!1l&XO5eJguo zqxZ6U&uCM0IK0-Ez&+)DA%6!$wbm$$TtjM;KU%M5W+gaKwRDpbDidt3ZR@j zL8)9VSU9kb?xJsS|H+{ve9N6~A?615a&#W7e5vf4-QK)f`4HlFM6NJ>dgb3>9}G3( zxaUf0hXxY$6G&aA1X^xj2=nRH5a7`5Tt!z01aVTn0-vZs`f0Uo;%Z<)nh z>mXJI{dKbcpjI_Be+L2zY?g(CnaxItUgbRsRenWSxYT_CmfNHO9B8v0Ai5DZ_8#gQ zK0q8>PiF-XK!m?ien3TaEit-5zyy@?{-I%MrZPucVxD9GRvKy!{X;frMLV9YQisU? z1&mCh^Px%|jZb^x_~(3OC?z-B!!Q1L<8-ZWkw7Ut zmG(Eki;5K@ee2WV0{hVM2as<pYMI|GZd)SRjDueB(w|5Re{i*h2X!gFU#+} zXH!lHx$#y>aIcj=J@D9J{ z15LozqygQ}uHLb@Bmw(w;aMsWtffbSAbG4kuo{9tQv%8%|4!kpZ> zYAotn#~6pvp4-j}y@$ru+(w$7^#)+!7X{#)V?HgGW<0lVHZj5dJsQWAc!2iETqfY| zE56!?kEKV_Rl;~|R-$EV@g7>nc8KYw&i*0bE<*v*QL(n2xvI1#fT`jvXCF9NTVjwN z@dH76jBGYw)D`O^EU6K@2I4EjSP0r= zg#2opp467wj9zcg2hH6kQ#ecg_HSIe=O2_>8WAYYcP0>w7&w7~7vw!;L&;RiE{0>& zw$+#XS<+R8<9!9c`;GD41m-%F*}w+AGzJxPoC1RwJb=@Vig;QJ9f`9lDK01A8{+0W8zap$>XfP{k^zwEOJOV;DcIsO@r&SZ zwcjRkOp*!Ve&^T$oTOOd9AXm&-i46|iWv}-*oG6BtOkl9up*Us*fJI#`FKh%3z{R) zTW8xRDj6Q1QC~a9qXO<%dj;tmMun@j{>bb5bbVzeBn0y$#aypqaXtiPLO)p}5ry$^ zhIvyPp-40N`T5VUN|psNpReW_>?ud)aH4Zg3v}T=W9gYb;V2ACZ+V|uGQ-{on105JbLFm8 z;wsIgan&0kq*{hYNZvdf5MF3{1B9&zkB~(yb`pv2J|kS( z;EKoSqnRncec{2u=?fqt?Pry&ot0XB$7U{6>+`W-N1v}HpP;zEcn2=RWGlB2%x27x zBzrtpm>pIe!wsp)w{yPkf7&a+{ax!4i}wkDj5r~Mcj=)jKt_Ff#jLe_m2!F7R^(x& zpC;QGKPKkBq`#q^Fi92>+uEq?8K1Xh@{ z%B5+i;+ye%0x?31A*FiezC~q4JT+SJQltouA9uvy`7BW!sL@|fMBZA30*F_Q~jN)GJdyet#2_wb`IY4m+-aXQ! zqzVWj7$D5MGD&TumuZ*K%YuT>YzDwj8kw#-&$+JL&L9R%;!vh#248TDj%A?Fs&oH0 zrK3RcESoSU9c;rFh)ecELpGs&5?FS4@LN7s%vFeyua^%)M0l1Ks%>~$BK$}uZ-$hU z7$OdF0DI4lU2~z{EtkWK>TMoM1XLsZNx!Y=R~u83)0oUN?5}xkfSGUK7hLmqF|u?U z=(=z}1Ax=~J3j9L{v*g!d3Kcsgg$`SOh0+$^shq-3b_bGY#F>id*)T=Hun$r#X9HQ zwr4wZl!00CsC6ePL4mVKSIF6f&*p6E0({OCvfx?xO~iB3Ttw4Ya1aSc-U+B5z>)d* zfa^T#qyy+5yh8}-%Yy+Q-dHV?1Rb1wDX3(e8Mp3D^Ir7AGf3T@yV4gHi{{$3)$3vM z2oZ@snLZj_z97{*y(}7d|AlpS9Pp|3(ouZL$9IC8KxA!{!uPR4`}hH0P#2KXk9k%= z)M<>b`8t<=Rbgl8U?)}~LP6mB3{lzicD0YY0$b(1VJybLws)5v#!1AmTiM_Emz?-` zrNPElz*p4>{!JWCeLJrCiRP1vMH!tt>w_w;Qw&1bMq{pw zATUHkq-D#I{}xzR^bl2AGsquG@&SFKy^q|sHG8$M0}3S#*RfhV^%;|O$EmlY>5kyS z2futkz1?t)OEm?avTAC;?l}G}8FLjZR|LJNxPy%Ie5-jlXLpDea zBf`>oyV(UUoH>p?b1-O^}pxx@jI$g(b0diN~4X!v{$di z%58Z{8P6l9;vK#~zL8t(O&kX;5=~HAaWA>qisYR&uZAvmPN>!6zj=58SIbO1 zU;1|r-??1PXuaz*wgLFNIJiLu!ilVYpbDaixPD-Jr~n&r_G*f7^0VH+d-a8wdYjUz zMibKQn3N05OVL0~LO16= ztv7P?e`^!_p}F`CRt{=;Or! zD&bf~1f{;G5=%rKYT^#K)xdCzGyNp<(bEfhPHGSM)SZEZQB`@41UXCFHw0IyUOiV2 zA!rLa?ey^v(kK(Qe%pr#=yf}|SI$D*B>jPu-PFnT^@Qu-u$9V>km~J!qPJHD zrD|v_jK)rG*dg3#>OD?Wr8H!|Mnv56EjV1V+7|2wKu=D8t;Kw8yB2e8qN<@S*ln@j zGMabT_{{!m;z}QfGpkca&DWsj3Vn!|bDXKa;Nmzi#u3nd?E=rIX#B-zu%Y~)BD=OHtm%e4uPq zF_Tsg9t3=ZDG<5RJoLz-HDg(t`tIC|=6>qiLKQvHrK~&Df}+*Yh}$t#Re_Ju+nW8^ zCl~Z@IwdE|Mb>{BTVV^Fv0X#=qA+85PL*%Zf)$k?br;Ls_P?7riHCw+2UVmR*4Ne@ zF@;$F{7K48nwq2#w7kMO{X`AH8y7?_v*;xEUdQs`bAGosWTHk|*alRH)VzWNA2Hb6 zalQv(P6JoAlYZi3JkFU)|6`GO#;kv4X7or9yRwTyQ`rxVqy^53h7+bQ9i!uxDdssPJ0VlXwFS%Y_^0b z0YfbPKT^Rqpo0&!htc9`LBAI~Tv66f)Jd5^Y=#}hi6|#t0e?3PSyNQH{wvfY8-lx&Q84V#N-Ws5WW}{qUFRgT{^YSq`-E}^&7mlePayw zbPl;tG=SKc%JqAhgUad|N2Dqh+K#Y$y4=;ygW0y7ZRiB8rl2v~;xXgeS+-H)y2Gx2 zdCF|ku|Sx1a)HmeQA{*f;O>^_81`L7^+(IICe?xO@6bjGReV|zS)xR~1@dt}zJkI4 z6(({-_R z#wOtKQkY$VXpB*tOpgJCQ1wMk8D4lr{^;uju@uEnh)9Ar889EV=#m<7-#cfmunH^M z1g=JuH=xi1cE|c9Y%GF0pqx;Ahjwo|%7Q}Xv7w2l7%EMe>{p_rLg4qyWshum!mfdc zv8d=DJuxgTxCK)&dg6>xyKWbX-;PhT&aPnf%kpY7utHGgdyx4@(zed^EyA7AA?+P| z#W0SwT~$I5FJ<}fM~*__3OR^vXaa&?A}s$EUaG~=&gjvHouVPK$Jmq z^O>QcoZywCT=`3ulUmD%wA@3MHCc4EBc0pbzHjR|#2JnL zA9OAU7g|)HL^$ifntT>j7sA)E! z`GbwbWL{qGkdx~BV_J#%>n}bO*Qlb%4W3K&?DWTYJ0JC3=@hkNru?gK$5q_m5LPE0 zj4leC)tmL6!HD0(=nM|{gqPCU)7eCcw6t{J!xd-@*-Jijbnh15fLd0?)ialJJ6Kwsy~GX- zCsQ!c#cK7wh&Vl|HhfG?&_Ult|LLxGrC4vYocXB7b3V#rc{91rhbQ(^?0^NafoU}< z3{wof{hPMaU58uhaMg2|nwh+kY6bSlhMC9?V?SoCs*{`QNb$4UQ{kgAj_TM?{Ac$g|ayT8!q;|>#2v@WV9s2`Q4H?t~q8BF+VyP^2|_ZgRi=^w?7aFX1U{Mmrbh? z{TZuG9SOjbc;(IC3j+LbgFwnD{7v~7Z+vnYgkG)ub|2s_xoaz$15OD%CJ!Hn;>~p z2vlAFeo_{briD{8LyD#TvAQPsnB;H;U?c;$F6q*lgcCc7g6hM%9z?f7A>~!$mq5Em zpYKzHvF@abw?=8;?MkS!X^w^nySE<8*6yQ4h#~Yi@cTN0>Dm+C%+@(zF7Nl;Lwx}-p{ZR+SBKGn~roiz5Yr}qo&9P6G7Bq72^mH}Q%k@>w zg4+~3xQ5&IFVt0VTw6zA_aP?RL6pvk^Ya)eupSKHu6^UcSsG1R zJm9cih&wdxIb_2Cr=JzzX?2Y!>UfeH{Ie1%N9^$W4Pk8D1(&F^mahG+*P6PK8{JMc zK#r^i-i>@2VztRQPqJ6DE;{+iu}p4%J=h>SI! zrB&UbGS91C6H}x`mF4xJp1gVItoc-LmVw>vm?Kc-%k<~m<@|fANahAsMOjnfr9~gw zhp!0M?dhaGM5kQ4eKmLVV5(rE(auOvRX_k@9zWJXSe0ZjIw>jm>5Pt)uqAwKM}v%Q z?)KXA!-qes3oE;azok?)!o*hU5bP>VYYBEJ>vvsr6O;dRCg%#I=1}|!yW#J)ep*a+ z>^)+@k^(n5RUAbkCZkL3&X>@ZP?0Umq#Ay^Vv?L zjN7Xjso)#RR13KH`79V`@y*px9gP+c7x%M}Kx!9Ef;}|s5C((gs(Oo&s> zN(rfiz=Fd}`dHH}u=GxTVNbHQRU;wz^|e;s81r*r064>a=}K9H(Vk-vX^S&H+qhdr z$kFC`V=RkwTmIC9rLY#h+X%kjpxIvW(QI3DIrdV#&9zI&f@$B{5B10GKyjtdK?(p+ zI;zy}dU`=cdlIQ=YD(GF)%EcR0geLcEjlVnmoW3WkCwZIJ&oiI7UPrZI-_K_p|M6U z_?$tRDW=7@lqpOlApRg2Ct6gkVlUm4uAnU{JER2Xg+H?Et^Itp)~Io9-4nw1+X1EYeK*SzQ2&?e zr(VRv@f6O*&!H0W6GPh?+4Te#=i-H(dopJjxBcFvyP+FZvjxhQh>a_TqJ!_lT+Jiv zQKJ$3r7J1lrR2l7tm4`yTyXK{A6j)Az_J_gzS}vk>`IT*G{Gf8EnPWJasC(`%5=C+ zVoD|_C>Q6FPz{iZDx+~H9au0`Z&xO_QwZyXRx}$UMYs_(RWLR$LpD3JH!j_3EMj&U z=$Y3IJ1YZ@qF&%tQS5%hC7cRK_C__vRI(qHpKT+UomIpzIOS$TL_SG3-HUT~oD1|G zEEiu)0QI8AFBzh-@qPI8^}klvh~rAtZY8srVJme&-GIhTWcNfPaKX*wAt4}+Js^xA zu<DGenr$Ph;HQuW-^I6#Bin;jL2C1pc#d*$smSy099epQPvK^9l?w8%) zlBIw2_OjFK)IK+v;VZyUJxO=Q#V!O|;HZD%c*&iD>iIntO*+TC9~?hnKd@oOkpzRT zJ3H`J$+DF=`RR0+-J3wFywiK*Obtb-%-!Tnm$yl7Nq;|-r9>j=Y>5L8;NS_y@Z`w^ zb+LDH2WHFnm^oF30TiUM&?0cak31DG7&jWiI=1Z2B3P>tTDnZQs+Ujey$L|>5x=92!O3TA+zc> z>*{OyQ*I(qXDiy;zCs0iSK7~Hu4&gk$9f~W)&KMIVIu28Ea!!`fosB##a^=H$gbSo zgrtveMnA={1x^GAS+s4`v~?khZ}gs5X{&jGh#rXAxT?iLQ;POYS$YbPig{KR0BX)G zG9QIWpWwP?gIp5{sC2RC-C7c8O?8w%2q!p8#rm5V?3>r=$vLQ8NbWY)4Ami*14V@t zkF&MM&AP^t=0wy(pL(BGkl41`Xx0j8JVuCu2LMa9qwGNJ`ef(Vgc$;Dy@F!YI?i=E z_|0_b+@)mex1%uv0jkSHqfcdUR<0GtT>hz@KaO?l%;MZD2tI|r2(I;tyY3OP0MNQO z7q^^V}cwEk;E+y zO^)`$J4Nk&>sIN{f%iPcPMy1FV%W%rQ(M;HnKt8?nUb(&Hg@@AsTkLHqQvKZ z4S@=L^04Ng)ndNb!%+9wOHY@O6H6yn%;l!G!}zZVF%HpFps8$2jsRX{CEiq0njcd0 z*E*CpBdk8=vwvy#f2#?n46wBpOG}g_}GV~G@ zuqMS~V92F)={$SbhQfinH@cz(4397v6L4g@(q04}r8J(F4Cu2R%+e1RB&IE(D;0a< z0eYHE*eOVbQ(#()fBMaSTk2Ms)M~1^COJ9YtrZencTcA>6I>8%C+>oJ7;>mD8e^-^ zsC9?lO>4UOU*3>L*BEmthIS z&TdI~#HH(0S>u_wtcHk|J&t(e3@GiEDXv6jxAGa@OQ#(1;5}8v&uTb#2Wd6r0SBIg zUji-o?>?rPvK&X%0TpF$QS!c|IlHlpZs&Dpux-KZ;ZVTw0jSiUFp>zYuE>7Zj9KNj zek>roiBZ>(N;wy%q>inE;dVW>OO-RL-gwrX(Q58hzcUwqoR3IKB=X*5QQ6jfuc3y4 zdcrV}lq-rn5awUCX96yfnep<2L_L%WeqO>YCbt{wEx1at-f9p8?1!o^k7T=5nV1LP zdCZXPr!ys1KPf+d2fq#vp7|bP)zq?Pw_^xZT#QlGYrB=H{9U|}pM#?=r#7}#Pdqgl zm!V>SMg;8w*J5&}QtjkoFKJ}ZBzP+mWKOxeB$9{5WPR0RMJS56lt0jb-*_aDe!UYR zP~8~;)KnW4Po_d2vO?DAav&#+{F+~G`}E5XBL3{%AI zRs|?ai*e~c;4_r;{(D|~nn8T3F>vThG4;_b8)Z)~Nd*^oNfv5ROKopb5yBbr=`KJ! z15km&c0_&fp}1CTjn70ZT##;O!Uc=$tP6Opm&d{o+rD_KCd_VCI)~%PhV6%_&)Q)k zBmB36V~zRVG5`sv0yKjbW`gULn@Y@G!%INa!+|3^pRX$Di@NJaFTRR&?>iE(@zr4Y z;dK6owdn+_zVv_;V~eJ_B>P(vi&*>j{ZdUkrG@y~ocr|MkzY;>QFU@fRR*JvnpSKzTWrj?}4`K|Q)=^vG0ysPZPAfrf~ z$a*=ecSD{q*yX?wkIyi_=E=sX|b+JQrsN<8$1F8cc6pCvx9hVo$fe zXo~nxY#e2~#|u!m_H+9IQ#U&xiex4s*5CBk32gx5733;(Jvu?ilxdo|-O4G0WK}G4 zx(i7eU4goVRjq~R-EKwY_OfLhu6Kp|+Ktx7qM1=!a*BU;HUJy@IyXE3DSqeUMMm;l z?1J%3Bi9nh12 zN?^$ zN?sZ_^D_^8WgFbV2aX?t^NiWRA<|@FAuCc79gdIDHv8o1U@3^XF)yYj3jyp>`vqy1 z-90pK@{2#x?;I1Ba}JGmRHeJW2xD(-k?{7UPT@oe_S6HMU+flTB-yEB9=LsiOKG|4 zVbHoZYfUfz7QDU0-^U+6B^sbu39JWp`^U;Rv+G3xX-9K-4FvHQ90QDnmDbKw;zRvo z9n)&?s)hmi-8p7ncXakvfsy`Xzf>F!H*-x^KjfYpe0uEa<;GywrsywN;OLt<(Y04a^@z`4 zaF~SuW>LhlAT=spBW)=|0kE=S2E(1<|3?9$L^8mpUfG=Q03RIRjWR^QLsnFFc{%$>O@lNp&p(;b(i1e{H57dpdwBEe zc2pvX3w$=FEv0D9FE5*#%KeVkEa?&E1phKr@h6&ewmm9cCB&C%}M8h zEr0j6(_fxP_ug8Bgc5>0gl6NV8PHT=gIxSD(USLRbGqJbeaoq+o0O%0;&=#A_FaW+^gXJ$=AikZglLtt#zX zK@W30VYToH{#2Mx*B##-wq!V+;-k|{qkH1_3^>wa^R)#w;5U!ci{E1H$8Ie3b6X9% zFMSGHxjuKE(-%r;a)XHMKRWPI-U=2k;n^K|hBOs`)oUBUt!grW~$Gd8c&%_jox zx++-N*x?}0bUIMU4e~^i2|r0XLf*9h4#cpN~oTMYgpx{+>z z9gM?D79Lbk>1`uN5TP>nY>L%{bx8e9_E92C{VhwZZieFNf+4(E&8nt!fXkltmw549?8XMuk`I3EzGg7>P_aWd0LG8&CY5_Xa8pz>LLGBP2Lkmnv)Ga+aXxx{{3&T<6-Ooz^j)R{zutYTtQJ=|y6r zA**h|ekB&zt>pWyQ&w9=UVb_m@UT+cr;P}cn5PDwK8JiyG|7M z(Z2*LB|g}Zxjj3h*j|m6n9^YJM&QLd#9ip7s5@{r8x1M%YW^MM05!)z(Jm*2NdAHv zDp~l!NBj0W`-e<`tJ&wC!-&j`@fu=##aelguyq4rdA1hRuJsv1=X zCfllD$3;*habRD+5gQ$qI>ePbOgZN-cdVMcbf7`F2 zOyvXa@k672>|mzD@@c`_e9xQ{`v$9}`eG!&&vU`C)bz+E{in3F8g_+vXJ|4c6Z_M7 zY4Yj4&%3WfsUG`WE?LB-ZklMUo+>t$bVx#e(z3#QhYjgP z6SI@(CsXbp;Rzg`)Ws+5@9zZ)D9 zS8wordDK;hB9J4xe8k_7-IZE$TM9XPx1aDVMM{D=4Or~v>p%kppZQlOdKsN&j#Pw4 zDgF-5x$ZEmHJi}> zvV`(0D?M%>dHzAbRbcGE;J1lz2D{$7e%2HTA`>1n|DH_kk$4p$lOI=frb!DMW}v)% z!XtU(TY--k*ZU(DX{Q0he~wUfnp?%=dCjUvg$KA46O#sL=-4RePI670THx777wKnz zRdxH9Y=eeI#)Ei;;D2zp+%QMJ&$BYc64z9BMR4Ja5{R%Ha5XUlg$Z0Bk`CqcSHP`P|f(xW#m99o#=*%GP>J!8-bf2 zTvv2Ft&ncbPJ&d@0~Ibt4j8VDEY{Ylp=`wGJ36$u{$jj#i*LSs34M)K*Pc11>%kAb zY3k66#ll5FmK%P(pi6C8v?gkjUZTJGcfx7j50tH>=tTeU@zO(45haRsYL2a0|2z~K zOR%g2F?f>r>pq61u*Co5IBb9{a_ly2)~9TVlkHZ=5OE_Nfvl3~B#3zW7;YqeJ7u7E z!bR(sx~ro`Yh4jcsVPxA$=Pu=Ecuw%z%(5Xes5&#m*6SuQI0y<1;w_uH)(U+d-%g> z%nEAVzRYIw=~*mv9Qh?R!%q+9LsS?WlqF>jCu8y{=M?@-o342r^oZ&&0o5du=U#+Y zE6u#&rKK_RjeFwvvNA7zYAf_E+qiXh9oPmy*|O49BE&bAS}vPd=7HtCCp@c8MSJS4 zTqOrw6FN{eT|a=75Y+DRx_aie|iWgj}q(`m7R9H@(Rx}i8(R57&8giTzHQ-8oJ;4B4=p*l1kspr^PQQfURvAXrH9x<4av3cwtZpl(i*}LsJGU=RqS9mWzDb{qb7TSCP2w6UYsP%xn*vQhCJW6nua&| ziNb3A5ynny^BUEszs$d(Epsv8p^>F_&FEp0(9=)qUTp@JjG|k=SvypRKy+kuJ^?*K zGo+vQDj9M~K%t+UpN~27n@WEa;kpb|;x8@HTc5t~DP7(J6{RZ}1opVdvxZeP8JLFw zC+uV_&83riHFh6i3bkWw`AjG{%tu$Vo_5ho)>-Jn7J*To* zM}i38hqugZ0Z&Y0^V8{6E6eM08W>B#KXpXrmqkiG@9RD6wFQw^vdERy+4MPjF7jIk zfaq}2jAh2k4MKU@+|(fp1?agX?+_B52X^g?w%j}rfNBV3diCo({do&q`9cPIif408 z+Nvio@bwR1TXR?_!1JC%VH9mdRM)M$Ev~oxXmYP|{TOKnw|hIr-`B1Nb2h3=t^S@+ zegw_Tn&Wn}Y1-ET(cbTS(klEzZ3!Bg@~-Q{;VQs-XVGzBl}Rf~di8a8t{eUHOFXo@ zc{0C%OzfbRfxH2kg3E88$&{FJ^T*V%qLn{zIf`vV-07O*kzK`4gL8)~6TCM_^`~fNugrUq!0K;Zm;@bg0P)kZXz`c7_i2>d@Wmzo< zKd0QBGZj=viN2)vX}U7))CL!Zj+g{1;h95_-)@7r zIuk+f&K@2XAP=8-9xkYUSao+oP-tsBIaY0k84NT;aP(GlHJ=s^y|LnZrTF1=C~}s) z{%&g)hrOZJQ^U;dJNCUR(4(y1ZmQDBO>_dw+{VZDTw(C!6vVNi%iQ9sEe@t3(U&Bw z2%b4NhwR^-Nl+c35VoxR=z4sx-5d{C}2RDi*#Hn_w44&$%0NfDA1wSOYAT| z(IY#`QcCfYjMS`alzW!(Ql-R9`itwA8p!Y}da-@})s@@+nr)7^ktz(z-yRH|TQs@^ z(?}7r9H%fSCdEG`X`Uac0|3FMYD6l!4MUoIrn(I@x?; z1k}6g+H8|nt;+%yg35b)YMTC5|*`w$qPrIJByZv6K#@mCT;Fm_09 zTJ(B))=Ksa;H_`(txr8`;j>cngByo6n-xqAuwR2cRaS2h%}SDeSr*$QnSC~=HTm1< zKr7o-?B%YZB;8Wo>kqBf+W^0xh?~Jt1Vt@7rJW#Fjjk+L>FyX6`}|ROodsg>>L*P0 zB+$$v>29ZXXQZMy`tlStMK+9N3h_ku-~{r@+Ur;WKzLF_^)-$+=2?>=vb4i_HHJJ# z!Gg^Bn2DC`pyvLIf6<~a>K8S6^OdIo^S?PxsxJuZ_tq&}mF%EYnwcx^(2V)yPiJULpTuJvsciL^-$>yv^dv2p zt~rznj+Gq>k1bw7PoIsq=esY8tm1pN&CF2dBEw|ujmu!50{z_^7J@>U?Okv@evji5 z)^@TZQCiKplxVcS>Onqivt0U)JTs}=IBs;1~5Mwd9?W7b6IShD&p7Ue1bY-~t zoCBgWnsj|_`rXs*i1xa>tQf?hB0MSSYY}tR|i*F&b8_H zN;AXVQR9M`NOmsY=Q~URU+8Fv5ZB(5l7b!3uaxYu%$Zqw>=I^{8;lu+Bc#2%h3*|& zdvoDj-WbYU>DusUWK~7ZJJmaFfc`7gDtzXUv2O~F4cw2!-|E*nS+QMo-Yst8}eK_?`!v5XXz*BoUbMd^9to+MgqWWdMnMaaf1h~OP zjn(_tc}k@h&vE|jK}gRG zc2wM|)rS%Ut0bwza6428P+%@X0O-!Sj*+5J&rcY}_!d17)JPu@fM*{Xj++=>nc%b< zi>ql5VJ}IRwK}h^Dc5jcn{a|1rGxw9O_Ug)LZ0y__=a=)iuwD171w1la}FTv-x?Ds z3kfHkR*rc#ZL64|6!km~kS+3BT=jW2Mnjl?G4C-Z*keg8WB;dn7KuupF2I2oP;f&6 z(?kH!3D(Xthr$6O*{z^K!k~-Do>`od1M(e2iuefs(C%*t8Gr{_9})+P22GBovUvEd zS1mlb$QG1I2d#e2M-;~L#RImUa_>*D1+uDe>M@W>1@+o*;kOKDEH%-a7c z6?6adagY;-bUnU~l-ALIeH5h5ewv}F=<-7^7*f6@n^=+C;4@4!(wxHew>%xpbU#^Z z2OVexl1tHAFa1O~9w*2z_b#%O08vJmsNI#O$Hrb8;lKwVs2C14NkwJ^b%pPgn#HXS z_E@|W?pRy`6j($&RrsNa`*gp9+JJ*uXI9F%Fnn~Lu#B@C_n8Sl7O?q9o$C$gI;$+% zVyRmCcuVu|sG>^8vj1sdu2BFv-~NW68b1bcS89)P9YQLhoc@Ua(UIGvuJG2)Hwg@H63mRd~LAlm+c`~sH+?LehAVUF;ggmSW33>F+K zKKBMF)i*KVPCCf{`M}lp6NPvD$=(kd8p~zqL4sEnmRvHt&Gigu&YyeduuG|-pTlQ! zRYjz^doGRu$oIo0W6>&kTi7Mzt;S^0amBy_`u?%DqrzkZ)Gd=oH^%;6hX@C`)x1By4dr2I60=k$@XznzZv4V`ngWyZ0cXlSsgl1Cz5;9 z^02odSA%Wkv+tqD2~#)xThKb|8S;+|WVyrD6kXY!iTqJx+H>EJQbY6ljm`K+;Q(nP zTO6$tpV#+89ck*RVTr5A#>B)s(dlU(fs|~a4p9?xI$Y0{-~;IP{nKR)Dp| z(oR)QPJcfoBgsGsKDoTMaw3P`s;XvzanXLOX!-6;Bkzxv14Cy1eR$+?Fv-%e7~x=^HvQj`vI&PxD|OHXt;PCylQPPSMA~3e1VKp< zn!#1#FF+*r3TR37`J*Vhx?e`o8mi|G9Y4Qdf1d4%$~f;w&?uma9W+zfuy8;-dKASv zieE4>TVSU>4W6?}bXK!^y$@w+-{9hvDbuaNsQj*|akqy@59V^a?^8WGI_g(h39^1; zzp6EfY$O@axLo@OLiuK@(ZnuV#{UF(1Ni&2OteR*D58MB4AQZ&E$&URYrwq^*{4bF zX!LqFntdi*=h;tRxw{$mV}-BqGp3)fk6@8K(-#H}W-gk3`a`Ix4^!T|Qaa_EV=8$m zG#Z!LO*4r`Gg4~YG!EId{)mO$de9|*ZGdVb#ZxZLJ2^oBvY%LVJWtuAhy9tk;j?^d z+cXa{qiqB^#sP2i08_wghOX}&$Qu=C>$jpni zdK2znjpl$|#9&uRzmNzfP{{ds2V>qn@+xKRxLrLe#gD$sH7qQz25~Cxc5N)o9Tyk$ zK)M6Hav8zJuYf{jJ{f5pe6>)O;j@_9-Non8?t|AtJgYp~>zKa%=7%CuJ6y#gRUcz~HxFCAR{$ts(1!Qe$%aUY3$i0w(^bm_PFkjrsIF46>1^)_z%We-ToyyeR=5}qnWR#?) zNmuSu|0(seVrj4cv8^&HTSPXEMzK1lN!xXUv68v`B7N!G1`<&+lcBoqRkc&=PF`eV z$-jcaLK5nd8@8O4;WOKt)JB9k#GXEQMm)%UENo2J@3W!y}W z8N(WTG?Z3HKn;l_n=@-LPit&sL_|!SJIfK-V#~14)k5nzpWEt9>xqh&hpig#;LD6q zG#9F*m<+IsqN9-;=X^M>YWKeck3OGq7)Tw?fIed0{kn!)3OtG~4U$D*NvcPS?eHJO z+n&sgE@L?C$KBBDaZ9DgeMu`J%;Y`?wxWHP36^NtiV4}FlP<>dv9CP0lzPy$Yl7=N zb51RKFv85PmAy2otee7)A=dtTdY7(6hqiv7*Veu&vyu+{WSv(Je1_VIi$s$k%Q|Cv zhuGy}1-O-}LhJv7ellT#5sEJ|xT|H(iBV@mK zrLc621NVwzjCaUZno~CjWBg_(1QqRDU=-DeZ}r&mtN&&33Vvf)SybQF`40F}QjK$G zjTw(twOpj{(` z07L>tI~j=8Ux2ty2dQn&__Z@*S$7C!BDLrVT|bxvB3Y8bErj4NPhrDSy#>c~VvQAP zXRQMw!Nh?x@3x<0BhK8iy^f0fCr|R6bh|<~Rd6eB7bVD}g3n3jbGz;6kR2~9nQe>k zLy3$?g&xX!6CLNa`&QyGh@n(}0zeoJn%eWz*lFHXn7o`l+)G#X_o-!LBFII1!1S$r zkKmJ92jQkEq&`Hio$CY0)z^|;cDEo`)>3kH#gxvOCgN*%V!fM(pg2})+ zojr?#DbVB+iHWT{&{6bmmkWQoc9|q1tXBD3DJ{*cYc75f_^4`EKZeR@PP~SIJAevd z*Ot$^rMI6RjU|Np^T34C$gfDk=w>pc*1)z9K$2uCIIaP3K*(t*XJm>N<4(rresFb9 zt|vmwdkM?qjyZleOsv=C3E*+H0NA_*bKf*tN}Zi*9LA&X6ijNY$@4H7B9r5ruVI7u zK>J-DM$c+5X1_!EF3bv7R^65vSoyQniFF@~RB800g+D|$j3}E{mqx=N+P%~X1wk!w zqm$b=2&+oySY?JjRymX*o@$z^vMi&AtgF32&#HS*vz|k`1r%{7|Mbz(PZkc>L&nn@ zq!q>#aI%IKW_SE+%L%f_!{jJsInE6iY$5Rpk|bGN+Q?>hYNNCttmv}<;M}YodktAa zf>jFXYAnl-cv~O!kKbiI4>5LF8FG_GK77J;nT~=n1UD1@PMm~lSB{43H}+douD~gb z_GO5^1To-iNm-jDc0&{*jhy!U$wAF;DX7$y;_~tn-1Mmq@x0NgrYTBXuAA>DZaNRo zLBu}^Q2|s;VQY(x{A4$SR}XOsvX%s!ld=5pz0KaT#J13g$-{Fa>+_01IW{M;r@;Mj zin5Bi@PD&9YoCwj-6S7EhXk_`?MnR|TCa4Xn-4pfQAYW=%i~c@hiDVew-mI9IH`&` zvKtpGw7qu6YSycCkip30DP>5W)L1}geG4cBLkEq`8KCucCkZ|PIpPe3$@6I!+ZCFG z6|YXu8O(>ykWK{?$0L4eRf0Tr*^wu`Arq0fRN4HT`h8dIZ;x_{eT^6reCkoizA47Q(i(I zqA$X*@QclVRRd?uO+2UvKL$>pKL*`?X@m+u*M{dS{+CWcy@(DiiFjy`KyYUT=a&PA z!>MfDx6{e9a<|D^1&lPr;AGABcfvO!zsuk&JiM{qxP7OCyOj`Z?L$aJao;S%8< zS=e34yx7}w6Au$bh+ohkJm~`LX;DWy&ktA<;=`eZ@8_TI{9S1%x?8TdMtPOp; zOoP97{H{jhuEibLimeVsshCYe8eM@?h$3J+X2be2Ol1jBl8F6|zsT_O7=G)9ym>+( z*bxB4#niX1cIP$^HP=Gn6>CemQK9G_i$QB zs7J*O3$7i;r?1Q~Q2vgLC4|j3Hsv}^-M&;oIu^S?yK1RNg2u7^XWrm)w<2rEg7;JU zt(i#Uvtp`5ZHc`EOq(D}V=JSK{(V3kb-#I9a7$?0xfHMUHs#&H-T4$%3lZB(B1yi3 zBguv2f1v~OBXodl42^&LXb^Vg*DhRPO6@UZG{|ZME_9zpJf+2}1jStW*To!M9XRC~Q_Kwc(AYUbDbcq(#e~1s$If{yL%rHy>TikNhagX~4;7 ziEWMjJnfTH?T&f63|35*aeM8Tnz;>SP4Ed&0g=p~IFpl(HHYliU>{_n zESB}$RDP7twGnI_ESOniQjTxNhztZx&}v8>civa;X`@Ixy3!7$*79>i4hqCjNLIzTyGT@KT> zuw@)q(jA{;{(6py+z}NEX=s>DNrSK?%kA5vP$+fu-{8*`^TP~E3sA?Az^DpudWVcE zYD&%juDNh7;)N1yvAop?CY8pA_N9|s@E96k#3`jxbwwNL9%sllw(x&|{BlG@ zUCB${*rciDGWgCm#9eq-hJpSsa;9|N;Rtn2HDJWua!@M&pUGBnUcMI6A{_cRqXg<7 zLhF^a$XAnjbJ*Y2+6XuQ0{7x}ul2hH8YC^TEiEquF3hSbo5m!Hgodd!n-jT78Ejs; zOM`=^kh8}rCU*!Q0dM{3n3~Zd(cqdt_pQyw3lvK_Z!Qe8O@a;f4cx<;LV#bX>>95u zlpTQ>5`=+y6T#V?{%AvHZ3}Nv>c7G<{tmA=BTO~5M5A9H5mx&H$*OEls6pn>c7$A( zZyD9STAl~*PSUP@fU}Tjj8PCfU)(Dp1ZF=JqF!IdwfnGw*fv{90u)#}TF#Nic$)e9 zXFbBWPM}o?U0pjd=ym{SFhRmAE;#IoC0DPLHy@J1LcKWN3C*gkGmqBKtO->fzf9rH#TV9~u&$d%zWG7IgNfObD40!*|reB_}@k zxEg?=69R%yS#Lk98!UwzFa@Rp#R!{{~B|5R{ZZqy2}gOaNNu)zm0$CK@fEE<`@nFmjoW&Q)^?GD_{D5&#gP-gmaDnO6`|tU&!8fjZ!0UxmjF6nS6N z3zNqDMrVN4X@?DPC6L|cO$$Onv><#cx0KlmQY7}3>57BQnJ1cUcuY~GmNI#`B6l3%Yw_B3bl_iAERs|arj}r z1PbuwfInc25xD!SMS0McH|@5}*f9%uS^_f_pt0XxR60&93)rGjvxtq0%L^405Gd11 zWMJjJkFyokpC_ZjF~f(+IGx(PF9=>7r#j;O$}Pwt)mxc} zW6SKU(bQDF*BrKMM37TYw!0b4%S08=VYQp1uk5Ajxa_jW4ddm%8d_D7tCV>HL~iNo zpEN_H*U%Lc`soEXEH#~4tM_K*&4L@1n$P$~Y8*LFW7(G*rXX(XKcxRzgKc8LsD8e` z4tE>>%U7R&| z>>ia_?FlR?uP?dkCd9~!_(Qb3FJJ3H$;5lZfR{zfH|3%9zqJUko8}@lFh43fUeM7c3$X9E#$UfP-C>Htjjw++t<*^OAUDXOf6*| zi*THjao&|iQ(52G3OBdGUw|^O8^@`~sX@z{v{QGBZy-GC5sZ(WPGobMRmxN=#r4>K zb#j(9T$i65{n0Ked?f5JpMN@PgLic8ZYbdJn6!$0HF~{)uG=9L(dp^oUawDEJ5juM zxk~PXzt)!$gR0@}>8(`2)``H?y+ywMvM-O5b5XSmyMR2w;=nkUi@u8D{L0&AN*dkh zh!Zfdb=0yZRWOq8KAo!R_{t3L_dYgoSQcAu(*Q*?p*@w)m=|YZ?$R&DqC^-%Dli6l z6&VQeqeu1f_7XvY$r_l+6cZ!Zvcs=L-vyh6ieRkL?lTpJJ#$51u4wwna!7X}63>qK z=Qe=~-wF0G4e3P+Xl1Rc({zgXciEEa`u6n85STlaQ?9+uj@P(yA$Xh0q`7scPw9f- ze(H%M;;UtZ!9SioKeDFO0k#x#kYG!{E6G`xQAS^0t|#a{9&CXhyd|wkI$l^4yzgB2 z9vA#VLPEjwGbn_d*-@T{!mb9AuvkMB+Iyn&s7Mtf{YZkV3qO9JGKrEo{(|`ub?$?C z_fjB0eOqw4*NTnAz#k~hm--@S$*7*~YJ$S?8XJM35}0e`_%ExplQ5_-V)yU3_U%dZ zT;dp{tF=lcNN1_k-nB49NFoKDVjmrC<2emcX?flSX)K6f$tJRN1y4a;%ZR}SB!$h=Jq~Vy-gnVP7XO=fJgzHU5Q0?!TdJ&w6!D zN65(uOGIP`0~b0^t8&yXLg+S{2Ajq!^pv#tv|i5z?SOWRj*;_l&3o;G_+1qI@7n!$ z-3DTI49GSdAil4AdgHaU&0Mk z#3G+wnJTvbfWF#>iKJE!;1`xHY|7Qa-tgN}2;%Y+%2g9Q=yI)XyA!tAjp`fA1E|hY z`^l50-k}!0vab27pK^zJRkKmesB@3hlNw9roWVFs3l(Mn@4IF7Tc610J&Jm98_*5% zDG|%LDe)_fYY#Y6fjb?|cE^%Q{uuDMol~)Uy552#)NJ*H9GZx*uV!UPAOY1iUG}K-LcXgHureoKS$*^X|zIJB) zgGD2W!)}=9k4)OIHvR9m9?WbNB{VglbH@^6EGmPEbsH-)>t818Q{Z(^^k_~6Cb^em zQt4#1K^*afxz`l2OrKnp3YO7jHup{24Paf=N?T=PRHR9^c1S&NYh9Uf za`x~p>SIBnNATI8Cl2TSmiMJ&|E(5ie(hVC;1!XohI__SIq3h#4c!3aD2F8M!DeHl zcGQvDTrw-_c{!oz#qS`GKxD#j1jvLqBHg z0LmP;99C0(h>+c%u!y(!9-l`JMbiTNOXWmUzsB!m+vooNi34j0_`U0`L`DsXq$lU` z52=;4d%B%uY1kN!NxfcpELNZ0lW>IFs6Fk2>%$_J+s+ctg*JhKeeIS0WmP|3}-QKLGILPUrQ;zr4Jx_%?1eu&KL= z3r$})L~!bd)BLwBojqor-fL4uX($QeH~mQ^?uq30d?`_YiBdnlP7GA=!HMt$DyecZ z=#%leV77Y{8e|+T>;u}(xV6UjLVSE|;1GE~^@qL)39~fR!z86uru&TwMEE)ZjkPI2gN~_ahww$>eL=>Ba0K+QflwJ-Zm9C{t?XP} zt8y%6)1()PFB&%OMwAY7U>3S26Pe`$Q4taSv&9PXc_IiZ2s%bPCj~FN3+3;@0^;3DC%oxl{JrwLB0^Cm7Z^u-n%mmpr3B1(3c%;nBt`Dni(A@XeXm=<>1#25(=O{ z%9@y~E+*t~R3el%!_P{Dl<$9OUaE_ zpABkvQ>k(b_g|m!)o{%ZHzb~HrWoRJexK`n-lkj5I-MJD)5ZsS&5k?i(qhI8#uf{Z zQIvzhRWs<^MYZmR_N8%4Sop_i8baLor_f7vl&fLSjm30SusUk;G*K0A&O95T~UuIl?JAPLLn1K7i;q>#5GH>n7&MMwY$jUZu zljh7hPTVWRpPC$s<1Nw)#wAdJXmCXqd7lf>Eb6JR&U7I~Dm`&JGu5Mh)Y#0%7>sv> zD>RuLFCgOgzqUNz-h-(&T=AbQ-O~VsBls*2l+c&oV-nI#QTl<>Yq3GkDtp`4S_P>x z<-EXgFC z@~4=Jh+>-PZW)a0Rf=nB;?~sEDB_iuwYea+O~fXdoM_5xmyYOUd4szehtU}=flXg| z+A6&YNS&%fYFYDmNU$~N5oQq+w9Xru9_&J#X0o{@!?{e{H*7* zNUs|oR2VP1$q-4xbss{KgMxy}cVh~p-<^~%b8$ZD^GN5Z9k8vA?qPU*g4A6KrI^e+ z#wkhPAEeW<;8#bWkwjb!ukAngieIk{)-QhAOcE4+uvEcMMEsr~)En#Wf!tk+CiR1Jx*nffMMA8p&G`-QbUbUd?c%% zuXC@jO?01GVEUM)L7N$Q@X^9Tin7aWU&p^(v-FG9nP^q0!vhxUjFpwBNn3#QdT9RN z&eIe3rQ;|nj-kmIJ1cAB80c6dI?s|v?b+-Hl#oC#6`56h0#nSuEw#f~UmQU)+iiKN za8h#q3ENVpLR?QSxS=r~)2i(MywRuIXX+bX-j)lvYUpU>cH<_(D6LJYsrcVHa6;2G z7U!WGYn2!n8L7xjVNxIzBX-o?u78}@s%V2ubQuW?H_M95fJ z;_QWCR)o!}oE2)d1v$#Px`ZMT*nhNfnL2++C*{Q8;QrvMC?qhS38|XCP7-v#>be_@ z?T{rQqLe`SaG!dp+Ht)pn2pJ#1xD_IMjPy@o`}Qo3NNE1l9wkHIwg*3=?KLxmhia} zWUT&CY)PKsXu~E6w5gw?f=$Kx{@&z_4h|B~Ptknms)slXpjK(MgI?;hiPE%f4_t6X z{4b-Ae<&QU=@U^j{XYe1ZCklYKO{G3WXP##cS(oiZ-0Tw$<5(}Gk!5RNS?N;z z$!9A2y}jOTE;Xnf-#Sjd&ovNeJf_5eS_LBTc8#@;ysU3k^zpujX2f|D;zSuA6-&64 z@BcG3ucVP2q#B5Qw!7ujTfe+l`4>&yetu^al;_oc=If=1b^Ex=R)2i1TwiKT zGARA6d#9gnO6aQWC(&X9itMj&-1Bu>m*A8*{QC77NEWnwKIbSPRs1>}EJk$}$M90} zpF>sWWqy;~PT(2-iI?s<(D-2Rh_l%C4`gW6(6_~H!<_i9SCK|x3SrIC)jVXh>dc~P zf=OOP!!XrW8w-uHEdE;=g{;fBh6Aq0&YZ-9&hZJK_6K|Z6p>yDQamtDbl>5UpFe_%4~)@xjK)tcEz_BN=v+I+E9uHeA*oc zN|v@K{%3YKVfe>9GtVkg-8*Zv7np-LYsL+EnIdOAa-hYr<;zoOz#^&hQ2`2;>m?E<%gMcff@xyn8fDYOs|-P8OniEGZjP$W z0}(+bz6v{U=o0=p#3vD#9A=*LfB^g(Kk<>9_ne5>|F0va|8z?C4*B8 zx;Gr&X>1{mm1{Mcl;lZd*w`%wxaBMi!Ti7UrIFqbu(OM@FKYJH@ z^*C);3EYU#(aY`2wRUAm%?;}+*FBZ-U#>HbasJz|O5XRQGT>{^5>%YN^t>3ljjkb_ zeq0MY>N^8!R@`hNWjS+NOMQu-yu|`DTigrm?VAtFYlg#Xy(LXqicr$iMYtrLn6}4 zcKoCQPx{=z@9!%K8NUOWo(xz?1(m0`ThKRx6L*OTxro6~i%`K8`AQ){x95)cXKR6T z*J~~t!tZadIiuI7%fgpQ)lVd1saS@R>9U^v8negmf6=x#Y})qK)V(*X?RR=o9(`Y{ zc9L2y7ic#V&?H++50(u?3%9Qk5KUc)l?0rk3{`;L0(C|woll(`+XEo)=05e)-cFF} zB$on5Ui2s6RzreUzkdy#Le+n_b_!!Rbyo>jk}9vsvAi=n|nf5_Amwnr?pzn zE9^H%^~~f%iQr&?Kj%*Z#7bO@!~n8v4LD+aCZev5)jtMuAlu|#A z_Fs>R1cp-J+0klECRprCEz&1A&zeZ|c|D)+`e_A-3`j8_$ltJX zUJHKG1l7Hs>@57Nb!0UykRv8!|6c(BzUb85e=!r&?OdM-WTSd{wiD@P}Z@3=- z%^oKef;o3Y&}?nmh2w^zCQECVm{)da&F+`3GKHC)DNjYu2U4x_-f9FEjX*=mQjEFw zGAVFU;L{cP3`XP1fqyibPYO0aSsInC<7ZRL!f}Eja=>33w8Gr&=E+yQEM^iUMpG-IvY-&3?9hm`%1sj3_okFih;}5 zK^4R0wj@ZgY;YiSD}U0iS#L3&A~rYzR_ZXUFO+MTxb|8!f6iS{%?1`PNhourv%>ZT zbmi3l^}Uel=X4a`%NzD?wtJ7ctp08OzILQGsm7$Q6kC2orPN#N1bHbjIwvA5a3Ti|LSIBdI7`oNGgSb zZ#3rS;|enDP%T_p2?+s7+U~<_6QkcX$;0^@Eq_Cb5q|M)KrMTJBk2iJoc{M<`^?bG zq_CBXfYUi}KB_&qk=9Xat5I#P`*+#wVY~F2OmUTZ_n*z+5wilRqNX@#G2ukaI$w%k)=();{CVaX3Lb?FpHpCYKdK<{BNH;~rY|l4`29#Oqi!DwTU+_54ulFaAX1BnAqw)`h zt+8FHZJP)y4o*(=OKvPa-o%|``ORzAsB&9~({W*tl;z)+V%2tMI1YS!YcV&Ytdo^a zd;$-TFCN;gtC=41fq2lT4E?czy)D|FlkR1F;G}ZwkWG*}?3xyarIJas{XSq2;0`lg zH=VC{IG+))(J5#Al*`riZja`OjJSw^K*|N~r=ePX*7L=KBy+!0?BbrtUVEuVZ-2r(q_+)v@uk;fds0ovkdF>!{>d9QLGow+L0K=EA-!m+=K5;(_0~MteYNt8v1g zTPA;hMs9DaewBMEeViJGCK_iPuS(6XbQO1ZH%R`g{D??7GH1xL5^ZcFcZAGh^N4co z)v+Ll-s*@QK$}5JQ~%aYYrRqZt+-*C()Nr>dCr6~wZzt)OXj0wttxCt;9&pKs~C42J4!BC)fx#}1drP!?2&Ax5XQ3de7>Z_95CEPAVZ;Brxbp~A>!KY2X| zWFbj@kLhZ^Uk_6%RmPf^M(DmdEX>;Wg~pGL{;q8I$yN_A^7+PM`3-2Df4bisNZ`Vz z$tZ%az~2Q>W^s&rR7Z2aE$rI{V^A;sTQ?%exi4$AJxPC_Ite?@88LOj0GZ>3cNoIg z)T)o7hyJLPS?CB>NM*3H<$JtQQE$*EzB_pw^~Syhy}Acs!4+^2JPIc*Mjf-_munzm z3>Iw#ULAIR9la;mUkhj?cj*gKi0lumG}61zy`(Ve~OApK@q>pK5yzdS#_y z;-HF`v8AM3z-nbUQu=eS9zuDArkB;Svv> zx9H_|(RdKTD}j2$w;z(nOIHw0DLEd_$M(XCRzez&_eN+{5BK{)!I+IOrA$nfa_H2uR>j1 zMuuInk<_j%urzD*@K?iIXmn2)G3?EbwQOS)CLtfLRA<(%NG2olZN|Pm&G36Kl^`$m zLi@jVv*B~PZ_lcJ=fJKF-PZvuwz}TO?tU(E;H(Jxe4YF$r|M`6aN?b^qXoqFV2J8-WwKeYcB19FFom!%Nu zT3qpniG)O88=OObmfgq~JH!&S!$g0Y1*5m^+)KH?df@Arm4gnbgkU~j<-FiVgg-n2 zC&?adyY~pZ9`t_bbl`4yC@@G#HgoJq&xP_iRR6BPe?j+JY)1WBizT{n>QnbKRH8mr z@ylnB_~@IfV&aw)>^j}E&{ler7a|w`SN=vydJt*R6NSdt?Q~<$7bS>usN4-{)n7gl z>^!*ZUBBTu6f^$ZR8=f&4?en#FgV8auTUYf|4qF?3TJ&FJdITcMy83A+8}S81X}d`&3GTfUG?r;CJf&C0xm5B^$b} zlYvBi8&z5^=d)q+=-Y#a`UIoQt zxO=oXqpq@)SMCu{$75eJIq5-XP7FGnMh#HMMxq3PO<&sm%}7Dng!U}!rOaqOOG&mo zaT~5?^A;4wId6*!)w!pI@5Oaobwf~L!xSSXQ_g|B_pbCtjU5QzFk8Q+80;R-=m~?&@nya4gVV)y+ zlV1NEn(iLDffnVE#*7x7G)R&Ly9+JB5Tfq*y6wOre=)oBHq+JWaK%}5#{*6dD=!M< zXi5MniO=%4N15c#j^8ECmh4q_kO&4ZA^pw05f>-*Xk4ybD;tIH7m(|7X2(8B(+Y(x z9{r>{MT2C}C+XE;!v5ZA2{-!(pFqd3#?)^YzcLly-b}3E(!uV3L3R((OD<>;Vs3bV1C2k!rohPyQ8_cocTF zi2_SX2d2&!cfaJYCoZ*_^}D@hw{>0)|9Rp38*_-Z)ADANZtk9!v zJ^ajkv;2Z}k7v7r{P+4N8YRwEnSB3YEFD%Ff+Xkse~eQ+E{S_I(U+@|ww}DuJZiCx z_*2k(0}*Ie$+$?citIq2qx1%BNI(sy^UWgV*%#*Rgp6Q4yuqOTqqFoR6n^TVtO!y3 z9V_a$Af2$211@z`YDUn+0?05^KNz+BdaZL+)m528-AJi2Agkk+!@mzv$9-*VIJoQ99wW=`RU?4Bc9YYdf zCHaP*&hG6IVy&&iile-w>8cT=N3`JhzU4kBW5-d$2QfA%(6;>#&&;FRRA=SEC{ajGsu;R%^h+MzkDs*0yKjK&9)NYdUM=T=!^@R;YX!MRwvqa=eMX z&}la2uIHnedgpE=KAfv#YJ z*xb3m2EM`a6_G~cOQ>UM4wus11F^IANWfRD+bOBC$>wc&t%RMK**J>@Sxk%M(M?sZ zs8;pi5_^w7gkQK;ga~xZ9EwIPE+0BI60Qw4F3IGaYh^tK``3ZXMeW9-GXsPXNh`%}(TkwlWh>uDbhsvTCP9pybVS5w8 zi<@aiI&WLRs5RCJu-VrPTUfXB*J@QEJ+ft|{lK)z0bIhD05M1eyqY}wYdF^HSu|5r z&^PHcp-V;KT9eaxRok9d-?Ja&)o?+VZO-mwlg`XBy{$!mSQKHMIPSB};=JYzKZmf6 zg`7L{$()Ixv$^yhu3CJ#h%*x;JvP+dMo1(9;2tqkaLwPc2ZO!cF?=VmMf#7veV2+R ziM)5OR;t`ce=YTQ$?osxd1_Hwj9CX?)=K-s+T;!uCyous3}-Zs_j5zqSw6EK?Nw$* zpL;%Y`B<&&8O$WIi%FLo>>lwP-=tK9{Ap|%;jL-B^)5Ahul^gdRjx2eO47jsS?}|- z>wxydTDC)#KPgYoPy2sG6`}7h0A`@UK%$G~`%9J`dZ1UYE|R{vOHwKPettGs@Upg@ z9RFL{?Dq0?oR{8Z5RL@FgswW(YyEyc_+I4}DsJq2Y^JmOjN3c3-kSGl?vz-=tYi}3{IvDk!ubr2Z-ar-Gotg6a?Vr7i*QQ7*v!Lo3yjeju9}hvpGzq-_ zY8M(%JfR|kU%oy{?ElD-sm&@=yq z{>X|=`M1?%71e|dkXJ^SLMBoZ4>Ny}SgB6gxg%*d_@9-Ou+gn+ z3j<3^3w9eV%ZW@d%PS#`w4{3X`xkYV564Yf??E!C??Q!j{7@Ju;b65mbRu6~GLrAF zRomX>H=0DhE?#ScF@+=nQv-_4<&*xmlsbRqx560iXg*7zWsE=&Z4dxwPVF)(kBX}j zabA=P2qXWx)Sg$&b$;q-9FgggD>Y7weehr)kksL1d4Jo0<#x8iKAwdc(c1=fFL3YW z-Y#>p*bJHFzl^r_IW85P1ZxQOBCsdZA1b{G5uUO|ohl(dObOb{OCc^6X7uU5cfT;!f3EX)0cVViC z?fqz_3fL=h;6{J)y?AehNOA*^1U~Qp$X}#_(`ak7q>CW;5(7ltisa ziBwky(&y1!2`#T5Wv)E|S-qOEm}eLW4qPhFVx@$BMLYCS%z^Go6DJ&pGzE)bv~?B* zW*q5|&Sy_}8jUo3sqH+=4eaHLFpsF};ya!t`>n>65~NtRtD}o`W-PdFE4uZ@5?>~l z*+362sF}lXQH3v{pPo>9J>nq&GwpNm7I|_3DsIU?$Y=57of0>N+{tm_VS&9m00h0G zu#*g6uO%41WSyP<=iV&{Egq-N`y;6C7U2&I1oqnY6WeLu)4#P&!Zv<;ySW|gWRTm? z_9Ao4nlW*mG*KVj5cz2tcJkcr*oSS$qfQNH;;YJog!Zp?TXKU6;jitUzdC0-s+suc zN7cj}_37PYq0M9j>jP3n_C4kF>UY_YJW`OK*Q8zAp`3!Sw|@)dxJFO1d2`-6gOVXx zFH~@(R~n2=JK~G{9`022@V9?_F4Vo7)$QO-kCsDfJmH4~qP%IIO`&S7?+ozTvB2I8 zay-oQ5Ui!?EIGwwD?ItB%cLJns6S;ulgjzQTzESpxF@Frs5IX;%3|Fbo`K~5c>(-` z&Q}#k3Y~NCIDMLs{Bjo~T)~$}^4<@w7WTe(u8(r?iYe*FyG;_bx{vZt2`DFB-e~dn z7QDR)%|ZUp1r-hkFQ^ne>I(EhxiEi|)GaN{_(zA;hB(yjoHBKV^PZ>W_XRjLYalyc z)u7+7lHdnl9->NT`LBtAXK9ADh3!~9a3%Rb%W>0v_QYAm7fE|HIEz}&plE3Ehc6T~ zXHAQr`SW7Dui6%AK-7LVGdpxFO)(?|b4c^9Ra!?kMK;~h5IO0A(k`1w^1rT`x>{#F zor~c&GQ7H|v84AgiY$taL|!dI)H| z3V?s5!pQm>d>rg*NW@cHFb2ldZhb^V3d5dgUz?=lYqB77+flhCI+0G_zqz#-2h`5y z!>4~JkqL4t2-s}jd%(Gx7X!kK_jXFy-I8CD;Njmcv77gtmUJ*CnV;K|n{v%*BGU$U zgCCVY=lO9Ef_S3Kzod8Eq_b9{5!{0UtTdV`TxY zS1IKFa7D?^RyWQle6cx~Ynj(uTaQZJLE5h-N-5T@zo69Y zV-azVKsLiuuix&fY5_P_A)o_f5xOue7Mm;R%XAZYggeneyNw#5&EM#mWb}Wq1a6EQ zC(jQVsWmO}jfIgK5&aHxP18dr7#;L3e!)<);a9VYwwo#T^Lk&OQ6*=BVTYykUM(k^ z1#9F=<=v(nPRJ?_!v+S>TRRXg>D=8NpBJnKWU^6?X7P5-szo2EmLahc$Bx5j%;V|s zXR`cfE77XmcE|NN&tG)f?k~8~EgY~VN8QoqaXCAG!x&sz^UY3XFUhY~Za(_5t8jcI z`QV=EbQvhvbid8R!R||wHYd7ByQjDAEjq!s8}$TUnb#}xOML+mqSzmeN%m4$SE&SB zh;O75ODqF;%}P>H?ixt@lyQ{#7xZd|U_6jU;ljjOF{H<2kQGEKy}DjC|9**A6E@fu z`=N-VB_9@>D9PIn`y+9;7Aw~1XB4iL1lqZpkD^?}o0T$RU1 zPnj&$HL0kQ-%VOSfRQOs*8GY^^6W9KI_LDFo5zg545QE}84}#R5@7IeRP`tkL=K$qF#s>AKo$}&z^*1<^qyD(OdRm5fqh_f{yWyfI6pFvP z*0=lZlELO37%h^k4oY>kZy#q#Eko-vC64|sL2@MbjrkaHA_1-njXz*7N+*eqA85em zKh9$78(D@;D}9@~eM@xSeWYZZt}$UCRB-AGhGYd%85|?tq`=xI_9}z1UH%x2WYhMI z*E|P?POE0#2elHROsy!kz_md7ZXy(=tG<9vA1jx-5@vlGBc-N>ytu^-_MUr-76W7N z1y$Ny$;ejwUj1}@4&qM;$Nw5~Qa$Hs1j{6^9_Hua<=O!(?5k4)zD-b2voBkiqC$=QX}u24~=Q7i+SW5`Tq_ik%zgW+b*nq5#DdkaG+71NI}7#l2M64tD#fLTkf%l0Hi zNBS$m>aU6r@DdLJFPF2HhG54}MR*?A@H{BNEmSNj5PV(I2Df1M&RFUN=$0n!u$I?8 z+O937k;^wH&|Q3;IzEk_u*}ZB;Yr9I(0Nt3u>R(|k8zx|lSkQiBq@{K5#d!WT3x@w z;!qq4c!H^_W5x=&Gf$^;0a`36nj|*P&GgR|&|sBLp{B!D?aWjf1Nq^K>$b53WDg^S zE;@}s=SDuO!K=L_;Q!e~ zeO@b2tlB11&&MKL>VE2GHw#tFZ1S5cZRBUY)uI>i#k+XH7oT#Iz{N;N$y8W+GVpV6 zhkUVb=E-|q%|8qB-gmr3!0MGL#`zC^3nIWGY;|Gx)D>rkK7;Qy^Tgs8(rAM1rE+TN;U)r5V;AYID zsA&-R8qH%l_~M~bkg8*J(!pnc=>YaA6>iFPrLX)+y@%fb*Q?Malg|P z6||F+Q{8b7-tiFovhUz7_}i6eoEk`5+JpwYX`J@^nUv+H zf>9*eCo@dzv|{Qktv5qlg%UrlKOi*oqU-qx#mEgEtaqk1d#u)yuXiqDO*7fCIj>)J z@P5O|w5jQ5(L2~SHHqlqC$e&TxfcRs_6o|~XR-_~32EXQBwtv8I97wj20N084;6;+ zAe@02_>!SOP&dGlpM!yWlREo_oH%hD3=7?ufEAY+FEw28uWG?H?E)5zjXfx$x6UTMS9Vqyvv5P(M} zj|#Rbtzh`2D!f;@LGRkxgj}zJ7y;(^V=||WWd}UvE2+c${CtkbyHmzbKk48l2^xqP zeo=rK;)FN(m`TcSuX`-ZVBIaWKvIgHyAjK|m~B6=4PCVBE*X%|r}g|?o+**80=vqT zQw;ldeh&?af5I%POmg+IqNhcy2Dstnqk&yp{6ntRfB5rSSKuo?SI59+tM@hL@78-l zpH}`fSVSps5xLLYil&fZ(oS=~p&lPcI5od512VjKxTQzo3PM#n&j@x>u`h>(p8w>8YM0yAxzM zF9h4U26D0aDcp&@TYw_S?i9b%o_ULo&Nd|CHSGsX@v#x-Xqa!)Ilo^Ar_aq@Zf=LC zR=BZEZq{EZuUuoQn%g}1Yjf6iZmRnZhG6}kxK-eoEDFjbk~bT2sMqp8P0d|Zn3n^j;dQd5mfABFh|b`mA1oz>6<{TMO{(KarxfrhVxprB zik$PtqrajZRK|<1OP@V926hD*aB_H6ct{a8(f=g&NsHm)g_REE<=}JWv*E>)izQEGBy)uZrds`tM)k%Ao9tXx;blIQz!SA9gqQm~ z0E~dsWlbdgZaL-{m*iGL6WVNJd$!Uzaf{!u@8yEiRtm@UujtU`^oD7hHcu#{mNZNW zVl*%1N|lqufH#FM-3WYnMtpC~)ll$kSOy~DhsZle##0F4g%3qYf80!zO3b$E#|OjR zf7QrvOXjb9QYp)t^}hKCt8rWB9`Vz(40<8pH$uPb0{7ZlMI>HCq;?fH*LbozH~;|7 zmhhAnSCL3_>x~fr9?ZAqGjBt1S^JMXr#EV7OX^;KcPlIZMfSGH3I(2yr~$uaBqcyr zLnideX*0R%cbYUg`ZsOVI=@zH(h%Ni>AR+0R`;CIeQUbUJ-9@|+&}J|A|I&!`F+Ty z+b`9{nYD>>3?$D6VrBwJ&XF{+CRol+O1`nc;_CB7k;;ckT{S$LV@x4jekD0?HA@%+11o(?B^N5WLbE|?`Y!gx5t;>V=1RPr+egS|b8bFT* z-WYO}Sfk4`T#KikY*@swQ?No6QYG=@J20qjnfn|(nx~CX312I7EC*I-XnENNvt7?R zhf}4)^*X!@z-TJ(z>GRkbV$*5Ho4+Wul`gWUnp{`SPl2Ve`MG!D*%A|Kl~r6`+Lf> z1Wt}WP!bJ#p9wD`i>?vwJ>UJ)d?V&|ZNrzWLFb4yEsmA(B3u&o8R7mIJvl>IDV2eH z)c1SYELDRDkF1Mz3PiR%hQjHl!Q?7*ncEzuM;=d&ct8upUc%%8h$fkQIAOuyJl906 ztIEP0xj*og3W+kiR<2gsj}AXW#lB|hhr~d+2tPY9n$P{vlA=VPLtEN=NfeGXB-iDS ztRwNe*!lOAK}d#gTsgNYDddZ3K=4*o|7fKF_&-UQSV-Ug!Cv;+o7C9w>f2_MB)yI+ zgT1_1%?31$WG|YO{BFAZ?p>I)+D|rIXCi;_;11-BwsY3Rr~NbO;?b_#L`br!XC+Qf z+!4Dobd2J7B)rWEg8Xt!viE^d+1CL+~62$)`ip3-GhfEo*E}Vw>AzVn$AZurE&#dC8b-L}?0UI;_S=mZK8A zgcBpVk33zk^CgDfy}LrZW%*Ipe{f6`ZdHK-W~_@GP~28&$YP@4aO{L@4V+@%yQ zugp;JSwb~_m`G)P8#p0n^@Cx?Z*UN+JD7H(>C@Jj=;-ZekK6CX-LTQukN`MHz@V}K zsiz)@2nJRon^%J!*V>Hx$g9Qd?Ceg8eAZ7!we6$tqC4$*PvYaP?t^|Ls5iD+EgGx8 zMx1a>wc1fDo2}?r!rtvDDvINHOimNgsCi9J{!}B8-fH-$zQ?8LR^J7PjWzm7N`%>_ z%|;Q>n+5P*AV5YW%RgZKaL6XYtk6%0JDKRC6P}~nVr@eGJ&J)U=Ozo!lq*@o)`MU0 zd;Cyzz>LmSb9dSG*qIRpeJbrk-kw-L_DzOZDV{K|fxj0w5NQD5MsZ?Un4M{Eq#GKU zmYD{QU)C+0n241qLajIVj6B2r#(e^ge`a-q7(~5W3#`*aX7%M4XuHpeZ?R8#Mc@F6x?X#L!&OE_=$2YnDH z)&?K#31+$dvo{c4nj~ry@e@5h;WA03O(sXcnchBy6d(ko81S>r|d%P2O51A%U0KO60 z){7yXhtMj-9&31(k7rNG2r(j}pWY_SM_8+077!@2{$7lahdca9|JJB~Y3&(uVf$Ck zt|U>gZDm|ClTrStN_eQP!7nQh_8MA(3JUEjFVyA2p(LAGWqb2gZPW%G<8#N$J<+9^ zMo+g}qzxs+#bq}{V@8qGI`Q-hco2m(>pRN_X&i)_y%a}|cF}$fn^5F8n?W<4|3+b} z^_-%K_R*J`S0?V_OF+GBN)Sup%S&hXTTJolr?A%~>sB7@cs1zHd}EG%VQ8YC(5J^r z#D9h$HXs^YuSuKXr*v_d7p&4M@1PWKFu&8#H@sYo9N85)P{~?JRkE7y*MT2rX}uaQT*JA7o({hGw%H(`gP6Dz>wc*r76|b zmB&$$20^*DijFvECW>^8zN;{`OtYn-vJmanVPl_%1rHBDgXisSeP8o~nF$Lt0(?xY zz!|?&{~XgUWS>HWMUGx(%K?*EDi>nP(4rMUmA00yB<*^8iA_t*bH1@BcF_7IZYaiL zeItnrHec<-)7`ON-(sCuKZ-_z?QkAd4((j@vRsn$H7Pw189dmjc<3~ZJrTTf>)K=0 zKEObH-!2x^?<5SJ0||Ubz}E&2F31_j2Oan3gD3SPE#q;_l2{DY1az<4<&*1*+!N2& z-;H1^JSMHh#S(U>CMJB*ls;lH>9{v97@Qo;!HVO(?B-SvIaz@wj257Vg#Z0tUuwUv z$9<{ehb|`vH$JYry#QMiEeDS%6u;~fE0+~T_o*=FEn#My#$nk0k&|}~lJM`DEz4If zYy_7}MtjR=`Isz{jBEb>+XIFu>lj!@^F^sV!0?qxH6BU?{1=c{Or+<2wqBVnH_{R^ zUdWy#^@m20rU~UjHY9SEI)9k%ON&{gaH`A(_Uel4mDcFho6S#FJ!mdb>UtBstxs(B z=kyv+e_(kn6pCSUS>!|4TRpWdZAQZx;XzRn6I1NS2<@dv5o(e87FA z$>jj4m;xbD2|sF*c9~3d@+>#aCm%m`Gb7YL71Q;CT8mla+BOh#Ld9{&YHPpG(TqnL z*DODQBZrUf#CVz1MMdR>I^&d8Ki`^uRv#_3%;`Z>CkI=>-Xdb}{-fwkUGGyPXI<_C zM|E6wf0xyfitx!7^XVkgKDdHkDd9+gBJ@FBv-{I85Y*x4DN^LSy`Co4A1Q_-buOx+ za$sw!T@=5p6{O3Fu8@-<<6MO@qDAL z+{#k-Zf9Fti!Q((-NkR-%TF8R_bKo@J{?xrpjjf2S7|m*^ zxDB?u-JG-2ZM|?-4?u$Tj;joHH`yPE9B)frq@_e0WHkV_-}i zg2^UQgL~Co%P-9%SDtW#pDC>*PV5iS#t^^XUkw%JIlbE>rUa*Za?5+X{CM7eTAKa3 zRoB5bluYsShnui$;Q{L=$%m_4$pakvUi=~-;aPgZQ|084*ZZ6@oE0c^0he#~BoyOz z#_L5cYBa<7Nk$uU;vgv$$>js!$X+5sFFeIX3^MnDXm{~+Etn<8M%I&) zNBH_n0|oI%yNi*x--7XV1Zl{QBqVc(-ww1Wls?Ovu1iPlYIH(p@i(kV;=te^jSx(3%1t8_x|tFc!Qwe%>Ht1JnmQi{iNMhz6ar}n$JG@ z79X;04^hW!WNuFB5>O78@sJNa>UhgOSnBB|%g>@nl6a{@PDtM)IXUiX%x+SjipNlpaN0 z;ll)f^q>gaj4UU;^k<1Db{F+!F9;DX!}-P8wN2z*mF(?j8Xh`ghV_Rg)m||s4vBl1 z;4esF4J=K$WjfaQ)tgqnWz`Ud#)N=S{X0hoWa5<=nY(LT;f9d4sEs_~IANkRv1G!` zRe~=+0|!TFZ*LdONP^c+apl~(_!c|!N9yQKwsanm-w$nAe>JFO-#k^ehXr@lW04nD zbdzNSpP>|~VQ?NwjRfosu@Km?Bv%+KQ@mnAn!d4niy2N$v&^2fHow`+*_v~SemZswMCF??HC?TQ$x$~qS*Yt{r0CdJz%GPNqTyU;eaN{D zI5aBF!ubj1qYI-N-cZf7M11>(_k8E|<3>E0a@1bVo(J9D8Y`jfh!hhlJ*tSK!>g2mm3p#lrF~2nTEHRquy%5*T`53U3N~3 zyoX}yw*+{uweE0jUf* zy~Lq)%qSFwqJrTEvgEe%q6=adu}B%zNe=fTQkPy8Ya+GhN!9d4nQyzi%7R+M zGGcz*rd*k?f{$>FhuToW<18CtdhFg>EzB-v4Rblf=vKp!Jom)zmJ`7g{35?6lO_K! zMt)q?ctFn+dzJ<*(lo-2hfvWfd+eZOpU|8=o17_*l?+4l1upwR+2eaM*~?N&XA9qk(p} zZm(P%&pZ?>Dl~)88t&5F;%WsSY(`#5_2n!c4q%Iss0fgn6UftkY*#LyEV)7aeiP+y zJ-SjxxVL(9w2uv2;;2qh-sH@FPrzpMU4t$J2Yrd=Oi->|lH&X3Y7%nHEJG`_6ChK@ zYeabF=|9iG?5H~vL7g{T8uKx|`RX?@uCeAV`mz(1#zbQ|k3zC)wRyQAZ~u91Wdh6# zN#dI?!9Hw15dOka)>r|r-hkZ}h7jZJG=o&ff~M+mKLvsz6B_?UGs>NOLWye(5&Fx` zT}1i>uJWnE2=+(HnPE~s-v7X%?^ zsm`qjL((2=rWj4fT&_&vF)jDHcsyj;rt{mKtC2B@4RocdD%D-zwXJdJ=r#Q(5jn@2 zEBeXBrJY_R>`fg*!O3_BfB+2ylMWt)7k_LBv@}l%f0O8;_wKv79$op0HFByTpaiPg zcKg`~1AqJiW&Ts_PZ`fX$ThAHe=TP|)p0Emzdn;wT}n~nWAd&GP{QyjXm{^c>2vx0 zkokI>Ip>fOuG$=Hk@%Ui#+wnBU+>D3f-secJk<>+h}@tzdt^e)c7$W?8y!2uUfLx~ zdmN$GdFYsB!?Fs}N)TR-cTudSB(EuaQTMOTtXf6yo_3A6mHZSvEl!*OaKwLC2vw}7 z3dT^0-H>|KdfUyd*PM&+wRv>ToPvJNcvW}{T0Q>=J9IT3j(gXQaickgD=w9GjNEQ{ zZ|4Ht2~+K5+9>fg6h~%+6M5BGJBGZS1ruG&7dZ?m6F$W-RKy$@?{LwR9$uuwIaV*; zZ0FMT_S?wgtLV2mfg+V5QLi<^`)SzVZw;f|@`h1Zl;fy|?r%sv=7 zFM9PQPybmZ@pSL^UCYx%RV(R8%?6mqeba4msmSE59mW&^{ivK@gSAV3x3waD%gt~X z2aA!4Y90JP6zw#+7OJRuDs(D+`%=er#nRBGeGrfkHxlN(B{R9tN_6ltU2z?xMxE@+ zybl=9oztmVhN?*!cHu66M>ZE-m$sTYc6`HQ^L{owt$W$s?JVu_dw}73(D#>E`{gSD zb#b45h2#POuUeph4+}G!c8nJTTf-`<&~Nx5Mfnj68k;9K1-h~0S=f_V?~9$szTU45 zba^)rpJ6Fnt_01o1>cs_Z>pl3C?TWupg0>`8=&C)SK`SOFv!C*2tk7;%xcT<_)U+ zK)PF3w`WTx#^u`bO451g9=nX!e#mNBl{uyn;#xX`tkh19&e7(sKXb&JS{G$K+s4kC zoY_d0G?zL$FR_R0Z%?9OZim)dczR@jM;awrshy@DxpTT+h|^ zAT4SRM~aC(Z*%U79E}fpHpGr!_?jvm*Kw)Qf}TZ7$x4E=fgu?;jGCh-S4!Vovg!!} zd{;DZ=dDY8bNjod$Y7yVpnqwh@ zP|dUQS(})V4Pv$*d};CjbYpy^<-yu?dlBbEmt?`LR6(4Bgs%^C1Tq?K$qPZ=Ht};gxCE_+&k&TzKj%_Mvj1roZeIUM;c9eLfzmxa;b(sr0 z0wH?0WO0Ohq>*vB;q#NP`nXbKS6Qa)q15JzyfY%4zA-uc6suu|P79TKPqotIXe+dK z#%rlU$(tqz-csF)VB@9U;4m~PCQMQH%PW;=Fb6XcntEjVI@g+ei(LjOil;|C2eC3y zZ50}S7K~RH350%l<)U^4C9yC#E{N^dy1kMUXTKl$a8_wKl4k6yFuvjLQRcYJKTpQc zNH@mq-8625v)Je~(T?{*DNB%%N97%s2#+vJhCo@CVxI_bMs-65#vxSmhc+RLXoGQu zz3vOncHOBnO8c%6S4k^07-c6x;1LwugE569O7a>@Udee@>68D$doT3!5C;$L!am%> z&p#g2ZGz)4O=4@K1hye|EfPOT07t~_s^kzDh*gwWy=UNY`XoA=J8b48L*?jC|J){g&V0gEa6)}k# z|8+ufw}V?4ijDmX)Q4dP`Yc6^p-LKfUkE9zPDe-fXLsd=!MMs&;yWzrIXdE{u11+L zoo{-GA5h3c0 zaF;U6){iZNYR!8h8G|0z-Bja7fD(iEcCkvB-d0G;xV3I8qz8p;)oR@n|J znfO5gS#>xhLCLK*N2bz)Z>2`#ECSl6s;CETT9|ppKj$X<$GrJa==$OsecAIimk43q zA*dsHxt3^8P5Z;9l@nW0{61`AMK~+fW8>g5sj313JQ)+jS#W2|!S=VUG8mSGrk>NY z0Ob?9JDi%x_%<>ZUOOBPAu44E~<;ggc@YvF! z<*1WY8%kv_Ix$EOB?U9fkgCfOg;hNYe|^-b@T-f?uvd(b1++(c3Of;(3J}ttNOz|}>pes+Yf2P#{Q>rTK zW~!qPH5DS^&#WNdtBtHx`fgXn6qz*NI1SNFK|H>4P}2!q`GWu9OVnDOXySe zkF-3O${qGUA14b_1PmG0&%l0pan=;$WW&=qBF2r0_N$e3gQMP)K&zeDMKW|q(#E!_ zO$lV?_cN!!=a_x_F(~W$xGbZ_Px{g>J7WIr-_=P(82j&*f{a;Fg zZ@N#q3~NdEYaU<8Yz|a3Y79@E6x??lN|OiWo=;BbNmln(?0)_Hd5#Az&DB2Yl@a2E zjm7Pj@!mo;%wppb-Z7yzv6l%@U!ifYcK=eHWH3;RLWwj3GnlA{+8Xu@C9XGkF?YY0 zWIS$1)-FnPWgG zVU)l%_-=ZB?j;Ebqf9101h1}H>*rFrM~+-OSweWWHmHoLkH_-rrT~HQTd}tg^c-AZ zcQTE;0=KuMqc||*+j!G4*LxfPqKN`VugPFhEWr2}_{?<;X!GnBQz94kRMIYw;{7}% zXZPpQ*}&ez*xe%8_!Qv~DewyD6@Rae*MB$QFXD8Ux6Dhfy)!o3=nT$jA2Fi#(>Ez( zbO~65@h5~Z%MH`5L0;p@ zZ@bS!Gj0?YE#L=liDKf1TH#edyb@PN%k6N0G+(VG7;ipL@$TE7APi!druVgN*PFf_ zS4nHLFXDd%vA>VtKMqYewsJp*JvnHd{z{~IG&j&!@66(Q!mFa7Ai^1eBM~Eq3Dh*+ z&(WZop<9q^3?blS&t@GaVJ2~pW(>mh9`3Hof;Tc{Q@H9jlRk}t>NZ)$pt>G9k=t41 z-UrEdAeH~JOMG3#p z*RjLi&>YJiDEZi7dGbUDBCQx3jwn^Xd;qu--(Dh>?|Ay(AVInxy|@hgLkF6G{|JBa)kI0*!0>LV)ZvGGGy|Y z0G+DB+FfW^KxlJPw*3>>k`9X7MM-jEf)ql&k3&i1 zP_f-Pv5-W}yq-$|mA1Qx@(9hIap`5`TT{opM_K

-^TS#& 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 F{{TO&z!v}j From 2d2b5081f1b8b075016576cedf7395ee6bb211d2 Mon Sep 17 00:00:00 2001 From: chilampoon Date: Mon, 12 Feb 2024 00:13:15 -0500 Subject: [PATCH 29/30] replace one_of in functions.R --- R/functions.R | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/R/functions.R b/R/functions.R index 7736ba6e..4df15455 100755 --- a/R/functions.R +++ b/R/functions.R @@ -120,7 +120,7 @@ create_tt_from_bam_sam_bulk <- function(file_names, genome = "hg38", ...) { genes %>% select( suppressWarnings( - one_of("GeneID", "symbol") + any_of("GeneID", "symbol") ) ) %>% as_tibble() %>% @@ -434,7 +434,7 @@ get_differential_transcript_abundance_bulk <- function(data, select(!!.transcript, !!.sample, !!.abundance, - one_of(parse_formula(.formula))) %>% + any_of(parse_formula(.formula))) %>% distinct() %>% # drop factors as it can affect design matrix @@ -454,14 +454,14 @@ get_differential_transcript_abundance_bulk <- function(data, # if ( # # If I have some discrete covariates # df_for_edgeR %>% - # select(one_of(parse_formula(.formula))) %>% + # select(any_of(parse_formula(.formula))) %>% # select_if(function(col) # is.character(col) | is.factor(col) | is.logical(col)) %>% # ncol %>% gt(0) & # # # If I have at least 2 samples per group # df_for_edgeR %>% - # select(!!.sample, one_of(parse_formula(.formula))) %>% + # select(!!.sample, any_of(parse_formula(.formula))) %>% # select_if(function(col) !is.numeric(col) & !is.integer(col) & !is.double(col) ) %>% # distinct %>% # group_by_at(vars(-!!.sample)) %>% @@ -479,7 +479,7 @@ get_differential_transcript_abundance_bulk <- function(data, model.matrix( object = .formula, data = df_for_edgeR %>% - select(!!.sample, one_of(parse_formula(.formula))) %>% + select(!!.sample, any_of(parse_formula(.formula))) %>% distinct %>% arrange(!!.sample) ) @@ -950,7 +950,7 @@ get_differential_transcript_abundance_bulk_voom <- function(.data, select(!!.transcript, !!.sample, !!.abundance, - one_of(parse_formula(.formula))) %>% + any_of(parse_formula(.formula))) %>% distinct() %>% # drop factors as it can affect design matrix @@ -962,7 +962,7 @@ get_differential_transcript_abundance_bulk_voom <- function(.data, model.matrix( object = .formula, data = df_for_voom %>% - select(!!.sample, one_of(parse_formula(.formula))) %>% + select(!!.sample, any_of(parse_formula(.formula))) %>% distinct %>% arrange(!!.sample) ) @@ -1215,7 +1215,7 @@ get_differential_transcript_abundance_deseq2 <- function(.data, select(!!.transcript, !!.sample, !!.abundance, - one_of(parse_formula(.formula))) %>% + any_of(parse_formula(.formula))) %>% distinct() %>% # drop factors as it can affect design matrix @@ -1639,7 +1639,7 @@ test_gene_enrichment_bulk_EGSEA <- function(.data, # Prepare the data frame select(!!.entrez, !!.sample, !!.abundance, - one_of(parse_formula(.formula))) %>% + any_of(parse_formula(.formula))) %>% distinct() %>% # Add entrez from symbol @@ -1647,7 +1647,7 @@ test_gene_enrichment_bulk_EGSEA <- function(.data, # Check if at least two samples for each group if (df_for_edgeR %>% - select(!!.sample, one_of(parse_formula(.formula))) %>% + select(!!.sample, any_of(parse_formula(.formula))) %>% distinct %>% count(!!as.symbol(parse_formula(.formula))) %>% distinct(n) %>% @@ -1663,7 +1663,7 @@ test_gene_enrichment_bulk_EGSEA <- function(.data, model.matrix( object = .formula, data = df_for_edgeR %>% - select(!!.sample, one_of(parse_formula(.formula))) %>% + select(!!.sample, any_of(parse_formula(.formula))) %>% distinct %>% arrange(!!.sample) ) From 6ba29546cf14aaf8bbf938a41db1480a50494614 Mon Sep 17 00:00:00 2001 From: William Hutchison Date: Tue, 3 Sep 2024 13:53:05 +1000 Subject: [PATCH 30/30] Remove merge resolution comment --- R/methods_SE.R | 7 ------- 1 file changed, 7 deletions(-) diff --git a/R/methods_SE.R b/R/methods_SE.R index dac8a85a..9eaf4c8c 100755 --- a/R/methods_SE.R +++ b/R/methods_SE.R @@ -2910,7 +2910,6 @@ setMethod("describe_transcript", "SummarizedExperiment", #' @docType methods #' @rdname describe_transcript-methods #' -<<<<<<< HEAD #' @return A consistent object (to the input) including additional columns for transcript symbol setMethod("describe_transcript", "RangedSummarizedExperiment", .describe_transcript_SE) @@ -2966,9 +2965,3 @@ setMethod("resolve_complete_confounders_of_non_interest", setMethod("resolve_complete_confounders_of_non_interest", "RangedSummarizedExperiment", .resolve_complete_confounders_of_non_interest) -======= -#' @return A consistent object (to the input) including additional columns -#' for transcript symbol -setMethod("describe_transcript", "RangedSummarizedExperiment", - .describe_transcript_SE) ->>>>>>> chilampoon-improve-documentation