Author: Marcin Malec, Parichit Sharma, Hasan Kurban, Mehmet Dalkilic
Date: 2026-04-28

# ccImpute Package Manual

Marcin Malec, Parichit Sharma, Hasan Kurban, Mehmet Dalkilic

#### 2026-04-28

# Contents

# 1 Introduction

Single-cell RNA sequencing (scRNA-seq) is a powerful technique, but its analysis is hampered by dropout events. These events occur when expressed genes are missed and recorded as zero. This makes distinguishing true zero expression from low expression difficult, affecting downstream analyses like cell type classification. To address this challenge, we introduce ccImpute (Malec, Kurban, and Dalkilic 2022), an R package that leverages consensus clustering. This approach measures cell similarity effectively, allowing ccImpute to identify and impute the most probable dropout events. Compared to existing methods, ccImpute excels in two ways: it delivers superior performance and introduces minimal additional noise, as evidenced by improved clustering on datasets with known cell identities.

## 1.1 Installation

    To install this package, start R (version "4.2") and enter:
    if (!require("BiocManager", quietly = TRUE))
        install.packages("BiocManager")

    BiocManager::install("ccImpute")

# 2 Data Pre-Processing

`ccImpute` is an imputation tool that does not provide functions for pre-processing the data. This tool expects the user to pre-process the data before using it. The input data is expected to be in a log-normalized format and accessible through the SingleCellExperiment object logcounts method. This manual includes sample minimal pre-processing of a dataset from scRNAseq database using the scater tool.

# 3 Sample Usage

## 3.1 Required libraries

    library(scRNAseq)
    library(scater)
    library(ccImpute)
    library(SingleCellExperiment)
    library(stats)
    library(mclust)

## 3.2 Input Data

The code below loads the raw mouse neuron dataset from (Usoskin et al. 2015) and performs preprocessing steps to facilitate meaningful analysis, including the computation of log-transformed normalized counts.

    sce <- UsoskinBrainData()
    X <- cpm(sce)
    labels <- colData(sce)$"Level 1"

    #Filter bad cells
    filt <- !grepl("Empty well", labels) &
            !grepl("NF outlier", labels) &
            !grepl("TH outlier", labels) &
            !grepl("NoN outlier", labels) &
            !grepl("NoN", labels) &
            !grepl("Central, unsolved", labels) &
            !grepl(">1 cell", labels) &
            !grepl("Medium", labels)

    labels <-labels[filt]
    X <- as.matrix(X[,filt])

    #Remove genes that are not expressed in any cells:
    X <- X[rowSums(X)>0,]

    #Recreate the SingleCellExperiment and add log-transformed data:
    ann <- data.frame(cell_id = labels)
    sce <- SingleCellExperiment(assays = list(normcounts = as.matrix(X)),
                                colData = ann)
    logcounts(sce) <- log(normcounts(sce) + 1)

## 3.3 Pre-processing data

A user may consider performing feature selection before running the imputation. ccImpute only imputes the most probable dropout events and is unlikely to benefit from the presence of scarcely expressed genes nor make any corrections to their expression.

## 3.4 Adjusted Rand Index (ARI)

Adjusted Rand Index measures the similarity between two data clusterings adjusted for the chance grouping of elements. This measure allows us to evaluate the performance of the clustering algorithm as a similarity to the optimal clustering assignments derived from cell labels.

## 3.5 Compute Adjusted Rand Index (ARI) without imputation.

    # Set seed for reproducibility purposes.
    set.seed(0)
    # Compute PCA reduction of the dataset
    reducedDims(sce) <- list(PCA=prcomp(t(logcounts(sce)))$x)

    # Get an actual number of cell types
    k <- length(unique(colData(sce)$cell_id))

    # Cluster the PCA reduced dataset and store the assignments
    set.seed(0)
    assgmts <- kmeans(reducedDim(sce, "PCA"), centers = k, iter.max = 1e+09,
                        nstart = 1000)$cluster

    # Use ARI to compare the k-means assignments to label assignments
    adjustedRandIndex(assgmts, colData(sce)$cell_id)
    #> [1] 0.2319002

## 3.6 Perform the imputation with 2 CPU cores and fill in the ‘imputed’ assay.

    library(BiocParallel)
    BPPARAM = MulticoreParam(2)
    sce <- ccImpute(sce, BPPARAM = BPPARAM)
    #> Running ccImpute on dataset (622 cells) with 2
    #>                             cores.
    #> [Elapsed time: 9.59s] Distance matrix has been computed.
    #> [Elapsed time: 9.75s] SVD completed.
    #> Warning in runKM(logX, v, maxSets, k, consMin, kmNStart, kmMax, BPPARAM): For potentially better imputation results, please specify the
    #>                 number of clusters (k). Currently estimating k using the
    #>                 Tracy-Widom bound.
    #> [Elapsed time: 21.89s] Clustering completed.
    #> [Elapsed time: 24.80s] Dropouts identified.
    #> [Elapsed time: 25.08s] Dropouts imputed.

## 3.7 Re-compute Adjusted Rand Index (ARI) with imputation.

    # Recompute PCA reduction of the dataset
    reducedDim(sce, "PCA_imputed") <- prcomp(t(assay(sce, "imputed")))$x

    # Cluster the PCA reduced dataset and store the assignments
    assgmts <- kmeans(reducedDim(sce, "PCA_imputed"), centers = k,
                        iter.max = 1e+09, nstart = 1000)$cluster

    # Use ARI to compare the k-means assignments to label assignments
    adjustedRandIndex(assgmts, colData(sce)$cell_id)
    #> [1] 0.8965964

# 4 ccImpute Algorithm Overview

ccImpute’s takes the following steps:

(1) Input: ccImpute starts with a log-normalized expression matrix.

(2) Distance calculation: Next, ccImpute first computes the weighted Spearman distance between all the cells in the data.

(3) Dimensionality reduction: This is followed by a single value decomposition (SVD) to reduce the distance matrix to the top \(l\) most informative singular vectors (typically \(l = 0.08 \times min(n,2000)\)).

(4) Clustering: The algorithm then runs multiple instances of the k-means clustering algorithm in parallel (default: eight runs) on different subsets of these singular vectors with the results form to create a consensus matrix.

(5) Dropout identification: Using the consensus matrix and modified expression matrix, ccImpute identifies the most likely dropout events that need imputed.

(6) Imputation: Finally, ccImpute imputes the dropouts using a weighted mean approach. It considers the influence of surrounding values, assigning them weights from the consensus matrix. There are two options for handling dropout values: either they are included in the weighting calculation (Method I-II), or their influence is deliberately skipped (Method III).

# 5 Key Analytical Choices

In the preceding section, we utilized the ccImpute method by providing only one argument: the SingleCellExperiment object containing the scRNA-seq data. Nevertheless, numerous parameters can be explicitly specified instead of relying on default values. Here, we present the invocation of the ccImpute method, including all the parameters with default values assigned:

    ccImpute(sce, dist, nCeil = 2000, svdMaxRatio = 0.08,
                maxSets = 8, k, consMin=0.75, kmNStart, kmMax=1000,
                fastSolver = TRUE, BPPARAM=bpparam(), verbose = TRUE)

This function can be decomposed into a series of steps, providing finer control over the execution of the ccImpute algorithm:

    cores <- 2
    BPPARAM = MulticoreParam(cores)

    w <- rowVars_fast(logcounts(sce), cores)
    corMat <- getCorM("spearman", logcounts(sce), w, cores)

    v <- doSVD(corMat, svdMaxRatio=.08, nCeil=2000, nCores=cores)

    consMtx <- runKM(logX, v, maxSets = 8, k, consMin=0.75, kmNStart, kmMax=1000,
                        BPPARAM=bpparam())

    dropIds <- findDropouts(logX, consMtx)

    iLogX <- computeDropouts(consMtx, logX, dropIds,
                                fastSolver=TRUE, nCores=cores)
    assay(sce, "imputed") <- iLogX

In the following sections, we will examine these parameters in more detail and clarify their influence on the imputation performance. For a detailed description of each input argument, please consult the reference manual.

## 5.1 Distance/Similarity Measures

By default, if the dist parameter is not specified in the ccImpute function, the ccImpute algorithm employs a weighted Spearman correlation measure between cells, with weights corresponding to gene variances. However, any distance or correlation matrix can be utilized for this parameter. Furthermore, the package provides the getCorM function, which can efficiently compute correlations and weighted correlations. Here is an example of using this method to compute Pearson correlation in parallel using 2 cores:

    corMat <- getCorM("pearson", logcounts(sce), nCores=2)

## 5.2 Singular Value Decomposition (SVD)

In the singular value decomposition step that follows the computing of the distance matrix, the \(nCeil\) parameter specifies the maximum number of cells used to compute the range of top singular vectors. The number of singular vectors used in clustering runs is in \([.5N \times svdMaxRatio, N \times svdMaxRatio]\). However, with high enough N, the imputation performance drops due to increased noise that is introduced. Experimental data suggest that parameters \(NCeil = 2000\), and \(svdMaxRatio = 0.08\) results in optimal performance. However, different values may work better depending on the distance measure used and how other parameters are modified.

## 5.3 Clustering: k, kmMaxIter, kmNStart

The clustering step employs the k-means algorithm, which requires choosing the number of clusters (k), the maximum number of iterations (kmMaxIter), and the number of times the algorithm is repeated (kmNStart). Ideally, k should match the actual number of cell types in the dataset. However, overestimating k can still result in good imputation quality. If k is not specified, it is estimated using the Tracy-Widom bound but should be reviewed for correctness.

kmMaxIter sets the maximum iterations for each k-means run and defaults to 1000. kmNStart determines how many times the k-means algorithm is repeated. Repetition allows for different initial cluster selections, which can improve clustering quality. K-means is sensitive to initial centroid choices, typically random data points, and repetition mitigates the risk of suboptimal results. If kmNStart is not set, k-means runs \(1000\) times for \(N <= 2000\) and \(50\) times otherwise.

The bpparam parameter controls parallel execution within this package, leveraging the BiocParallel package’s capabilities. BiocParallel manages parallel execution for k-means clustering and determines the number of cores available for subsequent computations using the openMP library (if ccImpute function is used) or a user-specified value. It’s recommended to set the number of cores parameters to match the number of physical cores on your system for optimal performance. This is an example of threaded parallel computation with 4 cores:

    BPPARAM = MulticoreParam(4)
    sce <- ccImpute(sce, BPPARAM = BPPARAM)

Additionally, using parallel and fast BLAS libraries linked to R can significantly speed up the imputation. The RhpcBLASctl library allows you to control the number of threads used by the BLAS library. For example, to use 4 cores:

    library(RhpcBLASctl)
    blas_set_num_threads(4)

# 6 Runtime Performance

The latest release of ccImpute demonstrates substantial performance improvements over its initial version, particularly when handling larger datasets. To quantify these enhancements, we measured runtime (RT) in minutes across various combinations of processing cores and dataset sizes (denoted by n).

A heatmap visualization reveals that runtime is indicated by red shades, with lighter shades signifying faster performance. The benchmark was conducted on a system equipped with an Intel Xeon Platinum 8268 24-core CPU, 1.5 TB of RAM, and utilized R 4.3.3 with OpenBlas v0.3.20 (pthread variant).

The results unequivocally demonstrate that the current release of ccImpute significantly outperforms its predecessor, especially with larger datasets. This performance gain is consistent across all tested core configurations, underscoring the effectiveness of the enhancements in optimizing ccImpute for practical, real-world applications.

# 7 R session information.

    #> ─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────
    #>  setting  value
    #>  version  R version 4.6.0 Patched (2026-04-24 r89963)
    #>  os       macOS Tahoe 26.3.1
    #>  system   aarch64, darwin23
    #>  ui       X11
    #>  language (EN)
    #>  collate  C
    #>  ctype    en_US.UTF-8
    #>  tz       America/New_York
    #>  date     2026-04-28
    #>  pandoc   3.1.12.3 @ /opt/homebrew/bin/ (via rmarkdown)
    #>  quarto   1.7.32 @ /usr/local/bin/quarto
    #>
    #> ─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
    #>  package              * version   date (UTC) lib source
    #>  abind                  1.4-8     2024-09-12 [2] CRAN (R 4.6.0)
    #>  alabaster.base         1.12.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  alabaster.matrix       1.12.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  alabaster.ranges       1.12.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  alabaster.sce          1.12.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  alabaster.schemas      1.12.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  alabaster.se           1.12.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  AnnotationDbi          1.74.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  AnnotationFilter       1.36.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  AnnotationHub          4.2.0     2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  beachmat               2.28.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  beeswarm               0.4.0     2021-06-01 [2] CRAN (R 4.6.0)
    #>  Biobase              * 2.72.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  BiocFileCache          3.2.0     2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  BiocGenerics         * 0.58.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  BiocIO                 1.22.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  BiocManager            1.30.27   2025-11-14 [2] CRAN (R 4.6.0)
    #>  BiocNeighbors          2.6.0     2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  BiocParallel         * 1.46.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  BiocSingular           1.28.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  BiocStyle            * 2.40.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  BiocVersion            3.23.1    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  Biostrings             2.80.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  bit                    4.6.0     2025-03-06 [2] CRAN (R 4.6.0)
    #>  bit64                  4.8.0     2026-04-21 [2] CRAN (R 4.6.0)
    #>  bitops                 1.0-9     2024-10-03 [2] CRAN (R 4.6.0)
    #>  blob                   1.3.0     2026-01-14 [2] CRAN (R 4.6.0)
    #>  bookdown               0.46      2025-12-05 [2] CRAN (R 4.6.0)
    #>  bslib                  0.10.0    2026-01-26 [2] CRAN (R 4.6.0)
    #>  cachem                 1.1.0     2024-05-16 [2] CRAN (R 4.6.0)
    #>  ccImpute             * 1.14.0    2026-04-28 [1] Bioconductor 3.23 (R 4.6.0)
    #>  cigarillo              1.2.0     2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  cli                    3.6.6     2026-04-09 [2] CRAN (R 4.6.0)
    #>  codetools              0.2-20    2024-03-31 [2] CRAN (R 4.6.0)
    #>  crayon                 1.5.3     2024-06-20 [2] CRAN (R 4.6.0)
    #>  curl                   7.1.0     2026-04-22 [2] CRAN (R 4.6.0)
    #>  DBI                    1.3.0     2026-02-25 [2] CRAN (R 4.6.0)
    #>  dbplyr                 2.5.2     2026-02-13 [2] CRAN (R 4.6.0)
    #>  DelayedArray           0.38.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  dichromat              2.0-0.1   2022-05-02 [2] CRAN (R 4.6.0)
    #>  digest                 0.6.39    2025-11-19 [2] CRAN (R 4.6.0)
    #>  dplyr                  1.2.1     2026-04-03 [2] CRAN (R 4.6.0)
    #>  ensembldb              2.36.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  evaluate               1.0.5     2025-08-27 [2] CRAN (R 4.6.0)
    #>  ExperimentHub          3.2.0     2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  farver                 2.1.2     2024-05-13 [2] CRAN (R 4.6.0)
    #>  fastmap                1.2.0     2024-05-15 [2] CRAN (R 4.6.0)
    #>  filelock               1.0.3     2023-12-11 [2] CRAN (R 4.6.0)
    #>  generics             * 0.1.4     2025-05-09 [2] CRAN (R 4.6.0)
    #>  GenomeInfoDb           1.48.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  GenomicAlignments      1.48.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  GenomicFeatures        1.64.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  GenomicRanges        * 1.64.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  ggbeeswarm             0.7.3     2025-11-29 [2] CRAN (R 4.6.0)
    #>  ggplot2              * 4.0.3     2026-04-22 [2] CRAN (R 4.6.0)
    #>  ggrepel                0.9.8     2026-03-17 [2] CRAN (R 4.6.0)
    #>  glue                   1.8.1     2026-04-17 [2] CRAN (R 4.6.0)
    #>  gridExtra              2.3       2017-09-09 [2] CRAN (R 4.6.0)
    #>  gtable                 0.3.6     2024-10-25 [2] CRAN (R 4.6.0)
    #>  gypsum                 1.8.0     2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  h5mread                1.4.0     2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  HDF5Array              1.40.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  htmltools              0.5.9     2025-12-04 [2] CRAN (R 4.6.0)
    #>  httr                   1.4.8     2026-02-13 [2] CRAN (R 4.6.0)
    #>  httr2                  1.2.2     2025-12-08 [2] CRAN (R 4.6.0)
    #>  IRanges              * 2.46.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  irlba                  2.3.7     2026-01-30 [2] CRAN (R 4.6.0)
    #>  jquerylib              0.1.4     2021-04-26 [2] CRAN (R 4.6.0)
    #>  jsonlite               2.0.0     2025-03-27 [2] CRAN (R 4.6.0)
    #>  KEGGREST               1.52.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  knitr                  1.51      2025-12-20 [2] CRAN (R 4.6.0)
    #>  lattice                0.22-9    2026-02-09 [2] CRAN (R 4.6.0)
    #>  lazyeval               0.2.3     2026-04-04 [2] CRAN (R 4.6.0)
    #>  lifecycle              1.0.5     2026-01-08 [2] CRAN (R 4.6.0)
    #>  magrittr               2.0.5     2026-04-04 [2] CRAN (R 4.6.0)
    #>  Matrix                 1.7-5     2026-03-21 [2] CRAN (R 4.6.0)
    #>  MatrixGenerics       * 1.24.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  matrixStats          * 1.5.0     2025-01-07 [2] CRAN (R 4.6.0)
    #>  mclust               * 6.1.2     2025-10-31 [2] CRAN (R 4.6.0)
    #>  memoise                2.0.1     2021-11-26 [2] CRAN (R 4.6.0)
    #>  otel                   0.2.0     2025-08-29 [2] CRAN (R 4.6.0)
    #>  pillar                 1.11.1    2025-09-17 [2] CRAN (R 4.6.0)
    #>  pkgconfig              2.0.3     2019-09-22 [2] CRAN (R 4.6.0)
    #>  png                    0.1-9     2026-03-15 [2] CRAN (R 4.6.0)
    #>  ProtGenerics           1.44.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  R6                     2.6.1     2025-02-15 [2] CRAN (R 4.6.0)
    #>  rappdirs               0.3.4     2026-01-17 [2] CRAN (R 4.6.0)
    #>  RColorBrewer           1.1-3     2022-04-03 [2] CRAN (R 4.6.0)
    #>  Rcpp                   1.1.1-1.1 2026-04-24 [2] CRAN (R 4.6.0)
    #>  RCurl                  1.98-1.18 2026-03-21 [2] CRAN (R 4.6.0)
    #>  restfulr               0.0.16    2025-06-27 [2] CRAN (R 4.6.0)
    #>  rhdf5                  2.56.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  rhdf5filters           1.24.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  Rhdf5lib               2.0.0     2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  rjson                  0.2.23    2024-09-16 [2] CRAN (R 4.6.0)
    #>  rlang                  1.2.0     2026-04-06 [2] CRAN (R 4.6.0)
    #>  rmarkdown              2.31      2026-03-26 [2] CRAN (R 4.6.0)
    #>  Rsamtools              2.28.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  RSQLite                2.4.6     2026-02-06 [2] CRAN (R 4.6.0)
    #>  rsvd                   1.0.5     2021-04-16 [2] CRAN (R 4.6.0)
    #>  rtracklayer            1.72.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  S4Arrays               1.12.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  S4Vectors            * 0.50.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  S7                     0.2.2     2026-04-22 [2] CRAN (R 4.6.0)
    #>  sass                   0.4.10    2025-04-11 [2] CRAN (R 4.6.0)
    #>  ScaledMatrix           1.20.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  scales                 1.4.0     2025-04-24 [2] CRAN (R 4.6.0)
    #>  scater               * 1.40.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  scRNAseq             * 2.25.0    2025-11-06 [2] Bioconductor 3.23 (R 4.6.0)
    #>  scuttle              * 1.22.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  Seqinfo              * 1.2.0     2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  sessioninfo          * 1.2.3     2025-02-05 [2] CRAN (R 4.6.0)
    #>  SingleCellExperiment * 1.34.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  SparseArray            1.12.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  sparseMatrixStats      1.24.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  SummarizedExperiment * 1.42.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  tibble                 3.3.1     2026-01-11 [2] CRAN (R 4.6.0)
    #>  tidyselect             1.2.1     2024-03-11 [2] CRAN (R 4.6.0)
    #>  UCSC.utils             1.8.0     2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  vctrs                  0.7.3     2026-04-11 [2] CRAN (R 4.6.0)
    #>  vipor                  0.4.7     2023-12-18 [2] CRAN (R 4.6.0)
    #>  viridis                0.6.5     2024-01-29 [2] CRAN (R 4.6.0)
    #>  viridisLite            0.4.3     2026-02-04 [2] CRAN (R 4.6.0)
    #>  withr                  3.0.2     2024-10-28 [2] CRAN (R 4.6.0)
    #>  xfun                   0.57      2026-03-20 [2] CRAN (R 4.6.0)
    #>  XML                    3.99-0.23 2026-03-20 [2] CRAN (R 4.6.0)
    #>  XVector                0.52.0    2026-04-28 [2] Bioconductor 3.23 (R 4.6.0)
    #>  yaml                   2.3.12    2025-12-10 [2] CRAN (R 4.6.0)
    #>
    #>  [1] /private/var/folders/r0/l4fjk6cj5xj0j3brt4bplpl40000gt/T/RtmpMkWQju/Rinstffbb56e582d9
    #>  [2] /Library/Frameworks/R.framework/Versions/4.6/Resources/library
    #>  * ── Packages attached to the search path.
    #>
    #> ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

# References

Malec, Marcin, Hasan Kurban, and Mehmet Dalkilic. 2022. “ccImpute: An Accurate and Scalable Consensus Clustering Based Algorithm to Impute Dropout Events in the Single-Cell RNA-Seq Data.” BMC Bioinformatics 23 (1): 1–17.
Usoskin, Dmitry, Alessandro Furlan, Saiful Islam, Hind Abdo, Peter Lönnerberg, Daohua Lou, Jens Hjerling-Leffler, et al. 2015. “Unbiased Classification of Sensory Neuron Types by Large-Scale Single-Cell RNA Sequencing.” Nature Neuroscience 18 (1): 145–53.