Skip to content
4 changes: 2 additions & 2 deletions DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Package: immunedeconv
Title: Methods for immune cell deconvolution
Description: Collection of methods for immune cell deconvolution from bulk RNA-seq samples.
Version: 2.1.0
Version: 2.1.4
Authors@R: c(
person("Lorenzo", "Merotto", role=c("aut", "cre"), email="lorenzo.merotto@uibk.ac.at"),
person("Gregor", "Sturm", role=c("aut"), email="mail@gregor-sturm.de")
Expand Down Expand Up @@ -66,4 +66,4 @@ Roxygen: list(markdown = TRUE)
LazyData: true
URL: https:/omnideconv.org/immunedeconv, https://github.com/omnideconv/immunedeconv
BugReports: https://github.com/omnideconv/immunedeconv/issues
RoxygenNote: 7.3.3
Config/roxygen2/version: 8.0.0
2 changes: 1 addition & 1 deletion R/cell_type_mapping.R
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ summarise_children <- function(df) {
df[set_to_zero] <- 0

# finally, sum up the children.
df_sum <- summarise_all(df, funs(sum))
df_sum <- summarise(df, across(everything(), sum))
df_sum
}

Expand Down
33 changes: 32 additions & 1 deletion R/immune_deconvolution_methods.R
Original file line number Diff line number Diff line change
Expand Up @@ -159,12 +159,43 @@ deconvolute_xcell <- function(gene_expression_matrix, arrays, expected_cell_type
#' @param gene_expression_matrix a m x n matrix with m genes and n samples
#' @param feature_types type of identifiers used for expression features. May be
#' one of `"affy133P2_probesets","HUGO_symbols","ENTREZ_ID"`
#' @param log_transform Controls whether the expression matrix is log2-transformed before
#' running MCP-counter. MCP-counter expects log-transformed data. One of `NULL` (default),
#' `TRUE`, or `FALSE`.
#' \itemize{
#' \item `NULL` – auto-detect: if `max(gene_expression_matrix) > 50` the data are assumed
#' to be in linear (TPM) scale and will be log2(x + 1)-transformed.
#' \item `TRUE` – always apply log2(x + 1) transformation.
#' \item `FALSE` – assume data are already log-transformed; no transformation is applied.
#' }
#' @param ... passed through to original MCP-counter function. A native argument takes precedence
#' over an immunedeconv argument (e.g. `featureType` takes precedence over `feature_types`)
#' See [MCPcounter.estimate](https://github.com/ebecht/MCPcounter/blob/master/Source/R/MCPcounter.R#L19).
#'
#' @export
deconvolute_mcp_counter <- function(gene_expression_matrix, feature_types = "HUGO_symbols", ...) {
deconvolute_mcp_counter <- function(gene_expression_matrix, feature_types = "HUGO_symbols",
log_transform = NULL, ...) {
if (is.null(log_transform)) {
if (max(gene_expression_matrix, na.rm = TRUE) > 50) {
message(
"MCP-counter expects log-transformed expression data. ",
"The input data appears to be in linear (TPM) scale (max value > 50) and will be ",
"log2(x + 1)-transformed automatically. Set `log_transform = TRUE` or ",
"`log_transform = FALSE` to force or disable this behaviour."
)
gene_expression_matrix <- log2(as.matrix(gene_expression_matrix) + 1)
} else {
message(
"MCP-counter expects log-transformed expression data. ",
"The input data appears to be already log-transformed (max value <= 50). ",
"No transformation applied. Set `log_transform = TRUE` or ",
"`log_transform = FALSE` to override this automatic detection."
)
}
} else if (isTRUE(log_transform)) {
gene_expression_matrix <- log2(as.matrix(gene_expression_matrix) + 1)
}

arguments <- dots_list(gene_expression_matrix, featuresType = feature_types, ..., .homonyms = "last")
call <- rlang::call2(MCPcounter::MCPcounter.estimate, !!!arguments)
eval(call)
Expand Down
5 changes: 0 additions & 5 deletions man/available_datasets.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 0 additions & 5 deletions man/cell_type_list.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 0 additions & 5 deletions man/cell_type_map.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 0 additions & 5 deletions man/cell_type_tree.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 0 additions & 5 deletions man/custom_deconvolution_methods.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions man/deconvolute_mcp_counter.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 0 additions & 5 deletions man/deconvolution_methods.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 0 additions & 5 deletions man/deconvolution_methods_mouse.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion man/immunedeconv.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 0 additions & 5 deletions man/node_by_name.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 0 additions & 5 deletions man/timer_available_cancers.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 0 additions & 5 deletions man/xCell.data.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

39 changes: 39 additions & 0 deletions tests/testthat/test_deconvolution.R
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,45 @@ test_that("mcp_counter works", {
assert("matrix dimensions consistent", ncol(res) == ncol(test_mat))
})

test_that("mcp_counter log_transform auto-detects raw TPM data", {
# test_mat has max value > 50, so auto-detection should log-transform
expect_message(
res <- deconvolute_mcp_counter(test_mat),
"log2\\(x \\+ 1\\)-transformed automatically"
)
assert("matrix dimensions consistent", ncol(res) == ncol(test_mat))
})

test_that("mcp_counter log_transform auto-detects already log-transformed data", {
log_mat <- log2(test_mat + 1)
# max value should be <= 50, so auto-detection should not transform
expect_message(
res <- deconvolute_mcp_counter(log_mat),
"appears to be already log-transformed"
)
assert("matrix dimensions consistent", ncol(res) == ncol(log_mat))
})

test_that("mcp_counter log_transform NULL and TRUE give same result for raw TPM", {
# test_mat is raw TPM (max > 50), so NULL should auto-transform just like TRUE
suppressMessages(res_null <- deconvolute_mcp_counter(test_mat, log_transform = NULL))
res_true <- deconvolute_mcp_counter(test_mat, log_transform = TRUE)
expect_equal(res_null, res_true)
})

test_that("mcp_counter log_transform NULL and FALSE give same result for log-transformed data", {
log_mat <- log2(test_mat + 1)
# log_mat is already log-transformed (max <= 50), so NULL should skip like FALSE
suppressMessages(res_null <- deconvolute_mcp_counter(log_mat, log_transform = NULL))
res_false <- deconvolute_mcp_counter(log_mat, log_transform = FALSE)
expect_equal(res_null, res_false)
})

test_that("mcp_counter log_transform can be passed via deconvolute", {
res <- deconvolute(test_mat, "mcp_counter", log_transform = FALSE)
assert("matrix dimensions consistent", ncol(res) == ncol(test_mat) + 1)
})

test_that("epic works", {
res <- deconvolute_epic(test_mat, tumor = TRUE, scale_mrna = TRUE)
assert("matrix dimensions consistent", ncol(res) == ncol(test_mat))
Expand Down
Loading