scATAC-seq: Doublet detection:

Single cell
ATAC-seq
Biology
analysis
A short evaluation of doublet detection methods
Author

Rishi Das Roy

Published

January 9, 2025

1 Motivation

Here’s a revised version tailored for motivating the evaluation of scATAC-seq doublet detection methods:


Chapter 23 of sc-best-practices.org (Heumos et al. 2023) highlights and compares several methods for analyzing scATAC-seq data, identifying Signac (Stuart et al. 2021) as one of the leading tools for this purpose. However, Signac does not natively include a dedicated method for doublet detection. Instead, it recommends using the “total number of fragments in peaks” as a heuristic approach to flag potential doublets.

In contrast, the R package scDblFinder (Germain et al. 2022) provides a more systematic method for doublet detection, but its input requirements differ from the data format used by Signac. While sc-best-practices.org demonstrates combining these tools with additional Python packages, this approach introduces complexity to the workflow, making it less accessible for R-focused pipelines.

To address this gap, it is worth investigating the impact of doublets on classical PBMC datasets analyzed with Signac, while staying entirely within the R environment. Such an evaluation would not only streamline the workflow but also provide insights into the effectiveness of these tools in detecting and mitigating doublets in scATAC-seq data.

The sc-best-practices.org demonstrates scATAC-seq analysis using both python and R packages. The use of python packages for reading the data and visualization is unnecessarily increase complexity of the workflow. In my opinion, the scATAC-seq analysis should be done solely through R packages.

2 Workflow

This is based primarily on Signac :: Analyzing PBMC scATAC-seq vignette where scDblFinder methods are fused after computing QC metrics. If you are only interested into the doublet identification then jump to Section 2.4.3

2.1 Data

The data used here from 10x Genomics same as in the original vignette.

Download command
Code
# -nc if file does not exist
  # wget -nc https://cf.10xgenomics.com/samples/cell-atac/2.1.0/10k_pbmc_ATACv2_nextgem_Chromium_Controller/10k_pbmc_ATACv2_nextgem_Chromium_Controller_filtered_peak_bc_matrix.h5
  
  # wget -nc https://cf.10xgenomics.com/samples/cell-atac/2.1.0/10k_pbmc_ATACv2_nextgem_Chromium_Controller/10k_pbmc_ATACv2_nextgem_Chromium_Controller_singlecell.csv
  
  # wget -nc https://cf.10xgenomics.com/samples/cell-atac/2.1.0/10k_pbmc_ATACv2_nextgem_Chromium_Controller/10k_pbmc_ATACv2_nextgem_Chromium_Controller_fragments.tsv.gz
  
  # wget -nc https://cf.10xgenomics.com/samples/cell-atac/2.1.0/10k_pbmc_ATACv2_nextgem_Chromium_Controller/10k_pbmc_ATACv2_nextgem_Chromium_Controller_fragments.tsv.gz.tbi

2.2 Required R packages

Code
if (!requireNamespace("Signac", quietly = TRUE)){
  setRepositories(ind=1:3) # needed to automatically install Bioconductor dependencies
  install.packages("Signac")
}

library(Signac)
library(Seurat)
library(scDblFinder)
library(GenomicRanges)
library(dplyr)
library(ggpubr)
library(ggvenn)

2.3 Read data as Seurat Object

Code
counts <- Read10X_h5(filename = "10k_pbmc_ATACv2_nextgem_Chromium_Controller_filtered_peak_bc_matrix.h5")
metadata <- read.csv(
  file = "10k_pbmc_ATACv2_nextgem_Chromium_Controller_singlecell.csv",
  header = TRUE,
  row.names = 1
)

chrom_assay <- CreateChromatinAssay(
  counts = counts,
  sep = c(":", "-"),
  fragments = "10k_pbmc_ATACv2_nextgem_Chromium_Controller_fragments.tsv.gz",
  min.cells = 10,
  min.features = 200
)

pbmc <- CreateSeuratObject(
  counts = chrom_assay,
  assay = "peaks",
  meta.data = metadata,
  project = "PBMC"
)

# Use the features that correspond to standard chromosomes. 
peaks.keep <- seqnames(granges(pbmc)) %in% standardChromosomes(granges(pbmc))
pbmc <- pbmc[as.vector(peaks.keep), ]

2.4 QC Metrics

2.4.1 Computing

Code
# compute nucleosome signal score per cell
pbmc <- NucleosomeSignal(object = pbmc)

# compute TSS enrichment score per cell
pbmc <- TSSEnrichment(object = pbmc)

# add fraction of reads in peaks
pbmc$pct_reads_in_peaks <- pbmc$peak_region_fragments / pbmc$passed_filters * 100

# add blacklist ratio
pbmc$blacklist_ratio <- FractionCountsInRegion(
  object = pbmc, 
  assay = 'peaks',
  regions = blacklist_hg38_unified
)

2.4.2 Visualization

Basic QC metrics
Code
DensityScatter(pbmc, x = 'nCount_peaks', y = 'TSS.enrichment', log_x = TRUE, quantiles = TRUE)
Figure 1: Relationship between Peaks and TSS enrichment.
Code
pbmc$nucleosome_group <- ifelse(pbmc$nucleosome_signal > 4, 'NS > 4', 'NS < 4')
FragmentHistogram(object = pbmc, group.by = 'nucleosome_group')
Code
VlnPlot(
  object = pbmc,
  features = c('nCount_peaks', 'TSS.enrichment', 'blacklist_ratio', 
              'nucleosome_signal', 'pct_reads_in_peaks'),
  pt.size = 0.1,
  ncol = 5
)
Figure 2

2.4.3 Doublet Identification

The scDblFinder package (Germain et al. 2022) offers two distinct methods for doublet detection: scDblFinder and amulet (Thibodeau et al. 2021). However, these methods require different input formats—scDblFinder uses a SingleCellExperiment object (Amezquita et al. 2020), while amulet operates on raw data files. In this analysis, the results from both methods are seamlessly integrated back into the original Seurat data object, allowing for continued analysis within a unified Seurat framework.

2.4.3.1 with scDblFinder

sce <- scDblFinder(
  as.SingleCellExperiment(pbmc),
  artificialDoublets = 1,
  aggregateFeatures = TRUE,
  nfeatures = 25,
  processing = "normFeatures"
)

2.4.3.2 with Amulet

“As in the original implementation, we recommend excluding the mitochondrial and sex chromosomes, as well as repetitive regions. This can be specified with the ?regionsToExclude argument (see the underlying ?getFragmentOverlaps). It can be used as follows:” ~ scDblFinder Vignet

Note

The ‘amulet’ function is very slow and has very large memory foot print. Use arguments fullInMemory and BPPARAM in the presence of large memory and multiple cpus.

fragfile <- "10k_pbmc_ATACv2_nextgem_Chromium_Controller_fragments.tsv.gz"

repeats <- GRanges("chr6", IRanges(1000,2000))
# it's better to combine these with mitochondrial and sex chromosomes
otherChroms <- GRanges(c("M","chrM","MT","X","Y","chrX","chrY"),IRanges(1L,width=10^8))
# here since I don't know what chromosome notation you'll be using I've just put them all,
# although this will trigger a warning when combining them:
toExclude <- suppressWarnings(c(repeats, otherChroms))
# we then launch the method
# Use fullInMemory=TRUE iff large memory available
res_amulet <- amulet(fragfile, regionsToExclude=toExclude, 
                     fullInMemory=TRUE, 
                     BPPARAM= BiocParallel::MulticoreParam(workers=12))

The results are as a data frame where the q-values column is useful to filter out doublet cells.

                   nFrags uniqFrags nAbove2 total.nAbove2    p.value   q.value
AAACGAAAGAGAGGTA-1  22250     22250      14            59 0.51612176 0.9999996
AAACGAAAGCAGGAGG-1   8879      8879       0             5 0.99999963 0.9999996
AAACGAAAGGAAGAAC-1  27740     27740      17            50 0.23633091 0.9848211
AAACGAAAGTCGACCC-1  28689     28689      23            81 0.01722372 0.1135366
AAACGAACAAGCACTT-1  12973     12973       3            24 0.99975592 0.9999996
AAACGAACAAGCGGTA-1  33812     33812      14            50 0.51612176 0.9999996

2.4.3.3 Integrate doublet information

Code
##### Evaluate Amulet with scDblFinder
meta_scdblfinder <- sce@colData@listData %>% as.data.frame() %>% 
  dplyr::select(starts_with('scDblFinder')) # 'scDblFinder.class')
rownames(meta_scdblfinder) <- sce@colData@rownames

renamed_amulet <- res_amulet %>% setNames(paste0('amulet.', names(.)))

combo_scdblfinder_amulet <- merge(meta_scdblfinder, renamed_amulet, by=0, all.x=TRUE)
rownames(combo_scdblfinder_amulet) <- combo_scdblfinder_amulet$Row.names


# Explore results and add to seurat object

pbmc <- AddMetaData(
  object = pbmc,
  metadata = combo_scdblfinder_amulet %>% dplyr::select('scDblFinder.class', 'amulet.q.value')
)

pbmc$amulet_class <- data.table::fifelse(pbmc$amulet.q.value > 0.05, 'singlet', 'doublet',na="singlet")
pbmc$amulet_class <- factor(pbmc$amulet_class, levels = c('singlet', 'doublet'))

2.4.4 Compare scDblFinder and amulet

Code
p_scdbl_amu <- ggvenn(list(
  scDblFinder = rownames(meta_scdblfinder[meta_scdblfinder$scDblFinder.class ==
                                            "doublet", ]),
  amulet = rownames(res_amulet[res_amulet$q.value < 0.05, ]),
  TotalCells = colnames(pbmc)
),  text_size = 3, set_name_size = 3)

p_amu_cor <- pbmc@meta.data %>% 
  ggscatter(x="nCount_peaks", y = "amulet.q.value", 
            size = 0.1, rug = TRUE)+
  yscale("log10", .format = TRUE) +
  labs(x="Total number of fragments in peak", y=expression("log"[10]*"q-value"), title="amulet")

p_scDbl <- pbmc@meta.data %>% 
    ggviolin( y="nCount_peaks",  fill="scDblFinder.class") +xlab("scDblFinder")+
ylab("Total number of\nfragments in peak")
p_amu <- pbmc@meta.data %>% 
    ggviolin( y="nCount_peaks",  fill="amulet_class")+xlab("amulet")

ggarrange(p_scdbl_amu, 
          ggarrange(p_amu_cor, 
                    ggarrange(p_scDbl+rremove("y.text")+rremove("legend.title")+rremove("x.text"), 
                              p_amu+rremove("y.text")+rremove("y.title")+rremove("x.text"),
                              common.legend = TRUE, legend = "bottom"),
                    nrow=2)
          )
Figure 3: Amulet more correlats with ‘Total number of fragments in peaks’

The amulet method identifies more doublets than scDblFinder. Around 13% cells are doublet and amulet score correlates with “Total number of fragments in peak”. The cells < 0.05 amulet q-values are marked as doublet which shows a sharp cut off compare scDblFinder. Overall, it looks amulet has better performance than the other one.

2.5 Removing bad cells

Using the same threshold as used in Signac.

Code
pbmc_signac <- subset(
  x = pbmc,
  subset = nCount_peaks > 9000 &
    nCount_peaks < 100000 &
    pct_reads_in_peaks > 40 &
    blacklist_ratio < 0.01 &
    nucleosome_signal < 4 &
    TSS.enrichment > 4 
    # amulet_group == "Singlet"
)
pbmc_signac

2.6 Normalization and linear dimensional reduction

Code
pbmc_signac <- RunTFIDF(pbmc_signac)
pbmc_signac <- FindTopFeatures(pbmc_signac, min.cutoff = 'q0')
pbmc_signac <- RunSVD(pbmc_signac)

2.7 Clustering

Code
# The first dimension will be removed from the downstream analysis due to high correlation with sequencing depth.

pbmc_signac <- RunUMAP(object = pbmc_signac, reduction = 'lsi', dims = 2:30, verbose = FALSE)
pbmc_signac <- FindNeighbors(object = pbmc_signac, reduction = 'lsi', dims = 2:30, verbose = FALSE)
pbmc_signac <- FindClusters(object = pbmc_signac, verbose = FALSE, algorithm = 3)

2.8 Result

2.8.1 Doublet cells in the clusters??

Code
p_signac_filter <- pbmc@meta.data %>% 
    ggplot( aes(y=nCount_peaks, x=TSS.enrichment, color=amulet_group))+
  geom_hline(yintercept = c(9000,100000),color="darkblue")+
  annotate("text", y=92000, x=10, label="Signac cut-off", angle=0, size=3, color="darkblue")+
  geom_point(size=0.1)+guides(color = guide_legend(title = "amulet"))+
  theme_bw()+theme(legend.position="top")

p_cluster <- DimPlot(object = pbmc_signac, label = TRUE) + NoLegend() + NoAxes()
p_cluster_amulet <- DimPlot(object = pbmc_signac,
                            group.by =  "amulet_class",
                            cols = c("grey", "red")) + NoLegend() + NoAxes()
p_cluster_scDblFinder <- DimPlot(object = pbmc_signac,
                                 group.by =  "scDblFinder.class",
                                 cols = c("grey", "red")) + NoLegend() + NoAxes()

ggarrange(plotlist = list(
  p_signac_filter+labs(y="Total number of\nfragments in peak"),
  p_cluster+labs(title="Signac clustering") ,
  p_cluster_scDblFinder+labs(title="scDblFinder"),
  p_cluster_amulet+labs(title="amulet")
), labels=c("A","B","C","D"))
Figure 4: Doublet cells are not clustered

Figure 4 A illustrates the cutoff values (blue lines) used in the Signac vignette to filter out low-quality cells. Despite this, many doublets identified by amulet remain in the original clustering solution, as shown in Figure Figure 4 B. However, Figures Figure 4 C and D reveal that doublet cells identified by both scDblFinder and amulet are dispersed throughout the UMAP and do not appear to influence the clustering structure.

While it is challenging to determine whether the presence of doublets significantly impacts downstream analyses without testing on additional datasets, doublet detection methods provide users with greater confidence in quality control, offering a robust approach to identify and account for potential artifacts..

2.8.2 References

Aboyoun, Patrick, Hervé Pagès, and Michael Lawrence. 2024. GenomicRanges: Representation and Manipulation of Genomic Intervals. https://doi.org/10.18129/B9.bioc.GenomicRanges.
Ahlmann-Eltze, Constantin, Peter Hickey, and Hervé Pagès. 2024. MatrixGenerics: S4 Generic Summary Statistic Functions That Operate on Matrix-Like Objects. https://doi.org/10.18129/B9.bioc.MatrixGenerics.
Amezquita, Robert, Aaron Lun, Etienne Becht, Vince Carey, Lindsay Carpp, Ludwig Geistlinger, Federico Marini, et al. 2020. “Orchestrating Single-Cell Analysis with Bioconductor.” Nature Methods 17: 137–45. https://www.nature.com/articles/s41592-019-0654-x.
Arora, Sonali, Martin Morgan, Marc Carlson, and Hervé Pagès. 2024. GenomeInfoDb: Utilities for Manipulating Chromosome Names, Including Modifying Them to Follow a Particular Naming Style. https://doi.org/10.18129/B9.bioc.GenomeInfoDb.
Bengtsson, Henrik. 2024. matrixStats: Functions That Apply to Rows and Columns of Matrices (and to Vectors). https://github.com/HenrikBengtsson/matrixStats.
Bivand, Roger S., Edzer Pebesma, and Virgilio Gomez-Rubio. 2013. Applied Spatial Data Analysis with R, Second Edition. Springer, NY. https://asdar-book.org/.
Butler, Andrew, Paul Hoffman, Peter Smibert, Efthymia Papalexi, and Rahul Satija. 2018. “Integrating Single-Cell Transcriptomic Data Across Different Conditions, Technologies, and Species.” Nature Biotechnology 36: 411–20. https://doi.org/10.1038/nbt.4096.
Gentleman, R., V. Carey, M. Morgan, and S. Falcon. 2024. Biobase: Base Functions for Bioconductor. https://doi.org/10.18129/B9.bioc.Biobase.
Germain, Pierre-Luc. 2024. scDblFinder: scDblFinder. https://doi.org/10.18129/B9.bioc.scDblFinder.
Germain, Pierre-Luc, Aaron Lun, Carlos Garcia Meixide, Will Macnair, and Mark D. Robinson. 2022. “Doublet Identification in Single-Cell Sequencing Data Using scDblFinder.” F1000research. https://doi.org/10.12688/f1000research.73600.2.
Hao, Yuhan, Stephanie Hao, Erica Andersen-Nissen, William M. Mauck III, Shiwei Zheng, Andrew Butler, Maddie J. Lee, et al. 2021. “Integrated Analysis of Multimodal Single-Cell Data.” Cell. https://doi.org/10.1016/j.cell.2021.04.048.
Hao, Yuhan, Tim Stuart, Madeline H Kowalski, Saket Choudhary, Paul Hoffman, Austin Hartman, Avi Srivastava, et al. 2023. “Dictionary Learning for Integrative, Multimodal and Scalable Single-Cell Analysis.” Nature Biotechnology. https://doi.org/10.1038/s41587-023-01767-y.
Heumos, Lukas, Anna C Schaar, Christopher Lance, Anastasia Litinetskaya, Felix Drost, Luke Zappia, Malte D Lücken, et al. 2023. “Best Practices for Single-Cell Analysis Across Modalities.” Nature Reviews Genetics 24 (8): 550–72.
Hoffman, Paul, Rahul Satija, David Collins, Yuhan Hao, Austin Hartman, Gesmira Molla, Andrew Butler, and Tim Stuart. 2024. SeuratObject: Data Structures for Single Cell Data. https://satijalab.github.io/seurat-object/.
Huber, W., V. J. Carey, R. Gentleman, S. Anders, M. Carlson, B. S. Carvalho, H. C. Bravo, et al. 2015a. Orchestrating High-Throughput Genomic Analysis with Bioconductor.” Nature Methods 12 (2): 115–21. http://www.nature.com/nmeth/journal/v12/n2/full/nmeth.3252.html.
Huber, W., Carey, V. J., Gentleman, R., Anders, et al. 2015b. Orchestrating High-Throughput Genomic Analysis with Bioconductor.” Nature Methods 12 (2): 115–21. http://www.nature.com/nmeth/journal/v12/n2/full/nmeth.3252.html.
Kassambara, Alboukadel. 2023. Ggpubr: Ggplot2 Based Publication Ready Plots. https://rpkgs.datanovia.com/ggpubr/.
Lawrence, Michael, Wolfgang Huber, Hervé Pagès, Patrick Aboyoun, Marc Carlson, Robert Gentleman, Martin Morgan, and Vincent Carey. 2013a. “Software for Computing and Annotating Genomic Ranges.” PLoS Computational Biology 9. https://doi.org/10.1371/journal.pcbi.1003118.
———. 2013b. “Software for Computing and Annotating Genomic Ranges.” PLoS Computational Biology 9. https://doi.org/10.1371/journal.pcbi.1003118.
Lun, Aaron, and Davide Risso. 2024. SingleCellExperiment: S4 Classes for Single Cell Data.
Morgan, Martin, Valerie Obenchain, Jim Hester, and Hervé Pagès. 2024. SummarizedExperiment: SummarizedExperiment Container. https://doi.org/10.18129/B9.bioc.SummarizedExperiment.
Pagès, Hervé, Patrick Aboyoun, and Michael Lawrence. 2024. IRanges: Foundation of Integer Range Manipulation in Bioconductor. https://doi.org/10.18129/B9.bioc.IRanges.
Pagès, Hervé, Michael Lawrence, and Patrick Aboyoun. 2024. S4Vectors: Foundation of Vector-Like and List-Like Containers in Bioconductor. https://doi.org/10.18129/B9.bioc.S4Vectors.
Pebesma, Edzer J., and Roger Bivand. 2005. “Classes and Methods for Spatial Data in R.” R News 5 (2): 9–13. https://CRAN.R-project.org/doc/Rnews/.
Pebesma, Edzer, and Roger Bivand. 2024. Sp: Classes and Methods for Spatial Data. https://github.com/edzer/sp/.
R Core Team. 2024. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Satija, Rahul. 2024. Seurat: Tools for Single Cell Genomics. https://satijalab.org/seurat.
Satija, Rahul, Jeffrey A Farrell, David Gennert, Alexander F Schier, and Aviv Regev. 2015. “Spatial Reconstruction of Single-Cell Gene Expression Data.” Nature Biotechnology 33: 495–502. https://doi.org/10.1038/nbt.3192.
Stuart, Tim, Andrew Butler, Paul Hoffman, Christoph Hafemeister, Efthymia Papalexi, William M Mauck III, Yuhan Hao, Marlon Stoeckius, Peter Smibert, and Rahul Satija. 2019. “Comprehensive Integration of Single-Cell Data.” Cell 177: 1888–1902. https://doi.org/10.1016/j.cell.2019.05.031.
Stuart, Tim, and Avi Srivastava. 2024. Signac: Analysis of Single-Cell Chromatin Data. https://github.com/stuart-lab/signac.
Stuart, Tim, Avi Srivastava, Shaista Madad, Caleb Lareau, and Rahul Satija. 2021. “Single-Cell Chromatin State Analysis with Signac.” Nature Methods. https://doi.org/10.1038/s41592-021-01282-5.
Team, The Bioconductor Dev. 2024. BiocGenerics: S4 Generic Functions Used in Bioconductor. https://doi.org/10.18129/B9.bioc.BiocGenerics.
Thibodeau, Asa, Alper Eroglu, Christopher S McGinnis, Nathan Lawlor, Djamel Nehar-Belaid, Romy Kursawe, Radu Marches, et al. 2021. “AMULET: A Novel Read Count-Based Method for Effective Multiplet Detection from Single Nucleus ATAC-Seq Data.” Genome Biology 22: 1–19.
Wickham, Hadley. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.
Wickham, Hadley, Winston Chang, Lionel Henry, Thomas Lin Pedersen, Kohske Takahashi, Claus Wilke, Kara Woo, Hiroaki Yutani, Dewey Dunnington, and Teun van den Brand. 2024. Ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics. https://ggplot2.tidyverse.org.
Wickham, Hadley, Romain François, Lionel Henry, Kirill Müller, and Davis Vaughan. 2023. Dplyr: A Grammar of Data Manipulation. https://dplyr.tidyverse.org.
Yan, Linlin. 2023. Ggvenn: Draw Venn Diagram by Ggplot2.
session Info
Code
sessionInfo()
R version 4.4.0 (2024-04-24)
Platform: x86_64-pc-linux-gnu
Running under: Rocky Linux 8.9 (Green Obsidian)

Matrix products: default
BLAS/LAPACK: /opt/intel/oneapi/mkl/2024.1/lib/libmkl_gf_lp64.so.2;  LAPACK version 3.11.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

time zone: Europe/Helsinki
tzcode source: system (glibc)

attached base packages:
[1] grid      stats4    stats     graphics  grDevices utils     datasets 
[8] methods   base     

other attached packages:
 [1] ggvenn_0.1.10               ggpubr_0.6.0               
 [3] ggplot2_3.5.1               dplyr_1.1.4                
 [5] scDblFinder_1.18.0          SingleCellExperiment_1.26.0
 [7] SummarizedExperiment_1.34.0 Biobase_2.64.0             
 [9] GenomicRanges_1.56.0        GenomeInfoDb_1.40.0        
[11] IRanges_2.38.0              S4Vectors_0.42.0           
[13] BiocGenerics_0.50.0         MatrixGenerics_1.16.0      
[15] matrixStats_1.3.0           Seurat_5.1.0               
[17] SeuratObject_5.0.2          sp_2.1-4                   
[19] Signac_1.13.0              

loaded via a namespace (and not attached):
  [1] RcppAnnoy_0.0.22          splines_4.4.0            
  [3] later_1.3.2               BiocIO_1.14.0            
  [5] bitops_1.0-7              tibble_3.2.1             
  [7] polyclip_1.10-6           XML_3.99-0.16.1          
  [9] fastDummies_1.7.3         lifecycle_1.0.4          
 [11] rstatix_0.7.2             edgeR_4.2.0              
 [13] globals_0.16.3            lattice_0.22-6           
 [15] MASS_7.3-60.2             backports_1.4.1          
 [17] magrittr_2.0.3            limma_3.60.2             
 [19] plotly_4.10.4             rmarkdown_2.27           
 [21] yaml_2.3.8                metapod_1.12.0           
 [23] httpuv_1.6.15             sctransform_0.4.1        
 [25] spam_2.10-0               spatstat.sparse_3.0-3    
 [27] reticulate_1.36.1         cowplot_1.1.3            
 [29] pbapply_1.7-2             RColorBrewer_1.1-3       
 [31] abind_1.4-5               zlibbioc_1.50.0          
 [33] Rtsne_0.17                purrr_1.0.2              
 [35] RCurl_1.98-1.14           GenomeInfoDbData_1.2.12  
 [37] ggrepel_0.9.5             irlba_2.3.5.1            
 [39] listenv_0.9.1             spatstat.utils_3.0-4     
 [41] goftest_1.2-3             RSpectra_0.16-1          
 [43] dqrng_0.3.2               spatstat.random_3.2-3    
 [45] fitdistrplus_1.1-11       parallelly_1.37.1        
 [47] DelayedMatrixStats_1.26.0 leiden_0.4.3.1           
 [49] codetools_0.2-20          DelayedArray_0.30.1      
 [51] RcppRoll_0.3.0            scuttle_1.14.0           
 [53] tidyselect_1.2.1          farver_2.1.2             
 [55] UCSC.utils_1.0.0          viridis_0.6.5            
 [57] ScaledMatrix_1.12.0       spatstat.explore_3.2-7   
 [59] GenomicAlignments_1.40.0  jsonlite_1.8.8           
 [61] BiocNeighbors_1.22.0      progressr_0.14.0         
 [63] ggridges_0.5.6            survival_3.5-8           
 [65] scater_1.32.0             tools_4.4.0              
 [67] ica_1.0-3                 Rcpp_1.0.12              
 [69] glue_1.7.0                gridExtra_2.3            
 [71] SparseArray_1.4.3         xfun_0.44                
 [73] withr_3.0.0               fastmap_1.2.0            
 [75] bluster_1.14.0            fansi_1.0.6              
 [77] digest_0.6.35             rsvd_1.0.5               
 [79] R6_2.5.1                  mime_0.12                
 [81] colorspace_2.1-0          scattermore_1.2          
 [83] tensor_1.5                spatstat.data_3.0-4      
 [85] utf8_1.2.4                tidyr_1.3.1              
 [87] generics_0.1.3            data.table_1.15.4        
 [89] rtracklayer_1.64.0        httr_1.4.7               
 [91] htmlwidgets_1.6.4         S4Arrays_1.4.0           
 [93] uwot_0.2.2                pkgconfig_2.0.3          
 [95] gtable_0.3.5              lmtest_0.9-40            
 [97] XVector_0.44.0            htmltools_0.5.8.1        
 [99] carData_3.0-5             dotCall64_1.1-1          
[101] scales_1.3.0              png_0.1-8                
[103] scran_1.32.0              knitr_1.46               
[105] rstudioapi_0.16.0         reshape2_1.4.4           
[107] rjson_0.2.21              nlme_3.1-164             
[109] curl_5.2.1                zoo_1.8-12               
[111] stringr_1.5.1             KernSmooth_2.23-22       
[113] vipor_0.4.7               parallel_4.4.0           
[115] miniUI_0.1.1.1            ggrastr_1.0.2            
[117] restfulr_0.0.15           pillar_1.9.0             
[119] vctrs_0.6.5               RANN_2.6.1               
[121] promises_1.3.0            car_3.1-2                
[123] BiocSingular_1.20.0       beachmat_2.20.0          
[125] xtable_1.8-4              cluster_2.1.6            
[127] beeswarm_0.4.0            evaluate_0.23            
[129] locfit_1.5-9.9            cli_3.6.2                
[131] compiler_4.4.0            Rsamtools_2.20.0         
[133] rlang_1.1.3               crayon_1.5.2             
[135] ggsignif_0.6.4            future.apply_1.11.2      
[137] labeling_0.4.3            ggbeeswarm_0.7.2         
[139] plyr_1.8.9                stringi_1.8.4            
[141] viridisLite_0.4.2         deldir_2.0-4             
[143] BiocParallel_1.38.0       unixtools_0.1-1          
[145] munsell_0.5.1             Biostrings_2.72.0        
[147] lazyeval_0.2.2            spatstat.geom_3.2-9      
[149] Matrix_1.7-0              RcppHNSW_0.6.0           
[151] patchwork_1.2.0           sparseMatrixStats_1.16.0 
[153] future_1.33.2             statmod_1.5.0            
[155] shiny_1.8.1.1             ROCR_1.0-11              
[157] broom_1.0.5               igraph_2.0.3             
[159] fastmatch_1.1-4           xgboost_1.7.7.1          
Back to top