Skip to content
Snippets Groups Projects
scDD-estimate.R 4.33 KiB
Newer Older
Luke Zappia's avatar
Luke Zappia committed
#' Estimate scDD simulation parameters
#'
#' Estimate simulation parameters for the scDD simulation from a real dataset.
#'
#' @param counts either a counts matrix or an SCESet object containing count
#'        data to estimate parameters from.
#' @param conditions Vector giving the condition that each cell belongs to.
#'        Conditions can be 1 or 2.
#' @param params SCDDParams object to store estimated values in.
#' @param verbose logical. Whether to show progress messages.
Luke Zappia's avatar
Luke Zappia committed
#' @param BPPARAM A \code{\link[BiocParallel]{BiocParallelParam}} instance
#'        giving the parallel back-end to be used. Default is
#'        \code{\link[BiocParallel]{SerialParam}} which uses a single core.
Luke Zappia's avatar
Luke Zappia committed
#'
#' @details
Luke Zappia's avatar
Luke Zappia committed
#' This function applies \code{\link[scDD]{preprocess}} to the counts then uses
#' \code{\link[scDD]{scDD}} to estimate the numbers of each gene type to
#' simulate. The output is then converted to a SCDDParams object. See
#' \code{\link[scDD]{preprocess}} and \code{\link[scDD]{scDD}} for details.
Luke Zappia's avatar
Luke Zappia committed
#'
#' @return SCDDParams object containing the estimated parameters.
#'
#' @examples
Luke Zappia's avatar
Luke Zappia committed
#' \dontrun{
Luke Zappia's avatar
Luke Zappia committed
#' data("sc_example_counts")
Luke Zappia's avatar
Luke Zappia committed
#' conditions <- sample(1:2, ncol(sc_example_counts), replace = TRUE)
#' params <- scDDEstimate(sc_example_counts, conditions)
Luke Zappia's avatar
Luke Zappia committed
#' params
Luke Zappia's avatar
Luke Zappia committed
#' }
Luke Zappia's avatar
Luke Zappia committed
#' @importFrom BiocParallel SerialParam
Luke Zappia's avatar
Luke Zappia committed
#' @export
Luke Zappia's avatar
Luke Zappia committed
scDDEstimate <- function(counts, conditions, params = newSCDDParams(),
                         verbose = TRUE, BPPARAM = SerialParam()) {
Luke Zappia's avatar
Luke Zappia committed
    UseMethod("scDDEstimate")
}

#' @rdname scDDEstimate
#' @export
Luke Zappia's avatar
Luke Zappia committed
scDDEstimate.SCESet <- function(counts, conditions, params = newSCDDParams(),
                                verbose = TRUE, BPPARAM = SerialParam()) {
Luke Zappia's avatar
Luke Zappia committed
    counts <- scater::counts(counts)
    scDDEstimate(counts, conditions, params, verbose, BPPARAM)
Luke Zappia's avatar
Luke Zappia committed
}

#' @rdname scDDEstimate
#' @importFrom methods as
Luke Zappia's avatar
Luke Zappia committed
#' @export
Luke Zappia's avatar
Luke Zappia committed
scDDEstimate.matrix <- function(counts, conditions, params = newSCDDParams(),
                                verbose = TRUE, BPPARAM = SerialParam()) {
Luke Zappia's avatar
Luke Zappia committed

Luke Zappia's avatar
Luke Zappia committed
    if (!requireNamespace("scDD", quietly = TRUE)) {
Luke Zappia's avatar
Luke Zappia committed
        stop("The scDD simulation requires the 'scDD' package.")
Luke Zappia's avatar
Luke Zappia committed
    }

Luke Zappia's avatar
Luke Zappia committed
    checkmate::assertClass(params, "SCDDParams")
    checkmate::assertMatrix(counts, mode = "numeric", any.missing = FALSE,
                            min.rows = 1, min.cols = 1, row.names = "unique",
                            col.names = "unique")
Luke Zappia's avatar
Luke Zappia committed
    checkmate::assertIntegerish(conditions, len = ncol(counts), lower = 1,
                                upper = 2)

    counts.list <- list(Cond1 = counts[, conditions == 1],
                        Cond2 = counts[, conditions == 2])

    if (verbose) {
        processed <- scDD::preprocess(counts.list, c("Cond1", "Cond2"),
                                      median_norm = TRUE)
    } else {
        suppressMessages(
        processed <- scDD::preprocess(counts.list, c("Cond1", "Cond2"),
                                      median_norm = TRUE)
        )
    }
Luke Zappia's avatar
Luke Zappia committed

Luke Zappia's avatar
Luke Zappia committed
    assays <- S4Vectors::SimpleList(NormCounts = processed)
Luke Zappia's avatar
Luke Zappia committed

Luke Zappia's avatar
Luke Zappia committed
    colData <- S4Vectors::DataFrame(condition = conditions,
                                    row.names = colnames(processed))

    SCdat <- SummarizedExperiment::SummarizedExperiment(assays = assays,
                                                        colData = colData)
Luke Zappia's avatar
Luke Zappia committed

    if (verbose) {
        SCdat <- scDD::scDD(SCdat, testZeroes = FALSE, param = BPPARAM)
    } else {
Luke Zappia's avatar
Luke Zappia committed
        dummy <- utils::capture.output(suppressMessages(
        SCdat <- scDD::scDD(SCdat, testZeroes = FALSE, param = BPPARAM)
        ))
    }
Luke Zappia's avatar
Luke Zappia committed

    res <- scDD::results(SCdat)
    res <- res[!is.na(res$DDcategory), ]
    dd.cats <- table(res$DDcategory)

Luke Zappia's avatar
Luke Zappia committed
    not.dd <- res$DDcategory == "NS"
Luke Zappia's avatar
Luke Zappia committed
    nDE <- ifelse("DE" %in% names(dd.cats), dd.cats["DE"], 0)
    nDP <- ifelse("DP" %in% names(dd.cats), dd.cats["DP"], 0)
    nDM <- ifelse("DM" %in% names(dd.cats), dd.cats["DM"], 0)
    nDB <- ifelse("DB" %in% names(dd.cats), dd.cats["DB"], 0)
Luke Zappia's avatar
Luke Zappia committed
    nEP <- sum(res$Clusters.c1[not.dd] > 1 & res$Clusters.c2[not.dd] > 1)
Luke Zappia's avatar
Luke Zappia committed
    nEE <- nrow(counts) - nDE - nDP - nDM - nDB - nEP

    params <- setParams(params,
                        nCells = round(dim(SCdat)[2] / 2),
                        SCdat = SCdat,
                        nDE = nDE,
                        nDP = nDP,
                        nDM = nDM,
                        nDB = nDB,
                        nEE = nEE,
                        nEP = nEP)
Luke Zappia's avatar
Luke Zappia committed

    return(params)
Luke Zappia's avatar
Luke Zappia committed
}