Date: 2026-05-21

# PBMCs profiled with the Chromium Single Cell Multiome ATAC + Gene Expression from 10x

Marcel Ramos Pérez, Al J Abadi, Ricard Argelaguet and Levi Waldron

#### 21 May 2026

#### Package

SingleCellMultiModal 1.25.3

# 1 Installation

    if (!requireNamespace("BiocManager", quietly = TRUE))
        install.packages("BiocManager")
    BiocManager::install("SingleCellMultiModal")

## 1.1 Load

    library(SingleCellMultiModal)
    library(MultiAssayExperiment)
    library(scran)
    library(scater)

# 2 Description

This data set consists of about 10K Peripheral Blood Mononuclear Cells (PBMCs) derived from a single healthy donor. It is available from the 10x Genomics website.

Provided are the RNA expression counts quantified at the gene level and the chromatin accessibility levels quantified at the peak level. Here we provide the default peaks called by the CellRanger software. If you want to explore other peak definitions or chromatin accessibility quantifications (at the promoter level, etc.), you have download the `fragments.tsv.gz` file from the 10x Genomics website.

# 3 Downloading datasets

The user can see the available dataset by using the default options

    mae <- scMultiome("pbmc_10x", modes = "*", dry.run = FALSE, format = "MTX")

    ## Working on: pbmc_atac_se.rds

    ## Working on: pbmc_atac.mtx.gz

    ## Working on: pbmc_rna_se.rds

    ## Working on: pbmc_rna.mtx.gz

    ## Working on: pbmc_atac,
    ##  pbmc_rna

    ## see ?SingleCellMultiModal and browseVignettes('SingleCellMultiModal') for documentation

    ## loading from cache

    ## see ?SingleCellMultiModal and browseVignettes('SingleCellMultiModal') for documentation

    ## loading from cache

    ## Working on: pbmc_atac,
    ##  pbmc_rna

    ## see ?SingleCellMultiModal and browseVignettes('SingleCellMultiModal') for documentation

    ## loading from cache

    ## see ?SingleCellMultiModal and browseVignettes('SingleCellMultiModal') for documentation

    ## loading from cache

    ## Working on: pbmc_colData

    ## Working on: pbmc_sampleMap

    ## see ?SingleCellMultiModal and browseVignettes('SingleCellMultiModal') for documentation

    ## loading from cache

    ## see ?SingleCellMultiModal and browseVignettes('SingleCellMultiModal') for documentation

    ## loading from cache

# 4 Exploring the data structure

There are two assays: `rna` and `atac`, stored as SingleCellExperiment objects

    mae

    ## A MultiAssayExperiment object of 2 listed
    ##  experiments with user-defined names and respective classes.
    ##  Containing an ExperimentList class object of length 2:
    ##  [1] atac: SingleCellExperiment with 108344 rows and 10032 columns
    ##  [2] rna: SingleCellExperiment with 36549 rows and 10032 columns
    ## Functionality:
    ##  experiments() - obtain the ExperimentList instance
    ##  colData() - the primary/phenotype DataFrame
    ##  sampleMap() - the sample coordination DataFrame
    ##  `$`, `[`, `[[` - extract colData columns, subset, or experiment
    ##  *Format() - convert into a long or wide DataFrame
    ##  assays() - convert ExperimentList to a SimpleList of matrices
    ##  exportClass() - save data to flat files

where the cells are the same in both assays:

    upsetSamples(mae)

    ## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
    ## ℹ Please use tidy evaluation idioms with `aes()`.
    ## ℹ See also `vignette("ggplot2-in-packages")` for more information.
    ## ℹ The deprecated feature was likely used in the UpSetR package.
    ##   Please report the issue to the authors.
    ## This warning is displayed once per session.
    ## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
    ## generated.

    ## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
    ## ℹ Please use `linewidth` instead.
    ## ℹ The deprecated feature was likely used in the UpSetR package.
    ##   Please report the issue to the authors.
    ## This warning is displayed once per session.
    ## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
    ## generated.

    ## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
    ## ℹ Please use the `linewidth` argument instead.
    ## ℹ The deprecated feature was likely used in the UpSetR package.
    ##   Please report the issue to the authors.
    ## This warning is displayed once per session.
    ## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
    ## generated.

## 4.1 Cell metadata

Columns:

- nCount_RNA: number of read counts
- nFeature_RNA: number of genes with at least one read count
- nCount_ATAC: number of ATAC read counts
- nFeature_ATAC: number of ATAC peaks with at least one read count
- celltype: The cell types have been annotated by the 10x Genomics R&D team using gene markers. They provide a rough characterisation of the cell type diversity, but keep in mind that they are not ground truth labels.
- broad_celltype: `Lymphoid` or `Myeloid` origin

The cells have not been QC-ed, choosing a minimum number of genes/peaks per cell depends is left to you! In addition, there are further quality control criteria that you may want to apply, including mitochondrial coverage, fraction of reads overlapping ENCODE Blacklisted regions, Transcription start site enrichment, etc. See suggestions below for software that can perform a semi-automated quality control pipeline

    head(colData(mae))

    ## DataFrame with 6 rows and 6 columns
    ##                  nCount_RNA nFeature_RNA nCount_ATAC nFeature_ATAC
    ##                   <integer>    <integer>   <integer>     <integer>
    ## AAACAGCCAAGGAATC       8380         3308       55582         13878
    ## AAACAGCCAATCCCTT       3771         1896       20495          7253
    ## AAACAGCCAATGCGCT       6876         2904       16674          6528
    ## AAACAGCCAGTAGGTG       7614         3061       39454         11633
    ## AAACAGCCAGTTTACG       3633         1691       20523          7245
    ## AAACAGCCATCCAGGT       7782         3028       22412          8602
    ##                                celltype broad_celltype
    ##                             <character>    <character>
    ## AAACAGCCAAGGAATC      naive CD4 T cells       Lymphoid
    ## AAACAGCCAATCCCTT     memory CD4 T cells       Lymphoid
    ## AAACAGCCAATGCGCT      naive CD4 T cells       Lymphoid
    ## AAACAGCCAGTAGGTG      naive CD4 T cells       Lymphoid
    ## AAACAGCCAGTTTACG     memory CD4 T cells       Lymphoid
    ## AAACAGCCATCCAGGT non-classical monocy..        Myeloid

## 4.2 RNA expression

The RNA expression consists of 36,549 genes and 10,032 cells, stored using the `dgCMatrix` sparse matrix format

    dim(experiments(mae)[["rna"]])

    ## [1] 36549 10032

    names(experiments(mae))

    ## [1] "atac" "rna"

Let’s do some standard dimensionality reduction plot:

    sce.rna <- experiments(mae)[["rna"]]

    # Normalisation
    sce.rna <- logNormCounts(sce.rna)

    ## Warning in .library_size_factors(assay(x, assay.type), ...): 'librarySizeFactors' is deprecated.
    ## Use 'scrapper::centerSizeFactors' instead.
    ## See help("Deprecated")

    ## Warning in .local(x, ...): 'normalizeCounts' is deprecated.
    ## Use 'scrapper::normalizeCounts' instead.
    ## See help("Deprecated")

    # Feature selection
    decomp <- modelGeneVar(sce.rna)

    ## Warning in .model_gene_var(x = assay(x, i = assay.type), ...): 'modelGeneVar' is deprecated.
    ## Use 'scrapper::modelGeneVariances' instead.
    ## See help("Deprecated")

    ## Warning in fitTrendVar(fm, fv, ...): 'fitTrendVar' is deprecated.
    ## Use 'scrapper::fitVarianceTrend' instead.
    ## See help("Deprecated")

    ## Warning in combineBlocks(collected, method = method, equiweight = equiweight, : 'combineBlocks' is deprecated.
    ## See help("Deprecated")

    hvgs <- rownames(decomp)[decomp$mean>0.01 & decomp$p.value <= 0.05]
    sce.rna <- sce.rna[hvgs,]

    # PCA
    sce.rna <- runPCA(sce.rna, ncomponents = 25)

    # UMAP
    set.seed(42)
    sce.rna <- runUMAP(sce.rna, dimred="PCA", n_neighbors = 25, min_dist = 0.3)
    plotUMAP(sce.rna, colour_by="celltype", point_size=0.5, point_alpha=1)

## 4.3 Chromatin Accessibility

The ATAC expression consists of 108,344 peaks and 10,032 cells:

    dim(experiments(mae)[["atac"]])

    ## [1] 108344  10032

Let’s do some standard dimensionality reduction plot. Note that scATAC-seq data is sparser than scRNA-seq, almost binary. The log normalisation + PCA approach that `scater` implements for scRNA-seq is not a good strategy for scATAC-seq data. Topic modelling or TFIDF+SVD are a better strategy. Please see the package recommendations below.

    sce.atac <- experiments(mae)[["atac"]]

    # Normalisation
    sce.atac <- logNormCounts(sce.atac)

    ## Warning in .library_size_factors(assay(x, assay.type), ...): 'librarySizeFactors' is deprecated.
    ## Use 'scrapper::centerSizeFactors' instead.
    ## See help("Deprecated")

    ## Warning in .local(x, ...): 'normalizeCounts' is deprecated.
    ## Use 'scrapper::normalizeCounts' instead.
    ## See help("Deprecated")

    # Feature selection
    decomp <- modelGeneVar(sce.atac)

    ## Warning in .model_gene_var(x = assay(x, i = assay.type), ...): 'modelGeneVar' is deprecated.
    ## Use 'scrapper::modelGeneVariances' instead.
    ## See help("Deprecated")

    ## Warning in fitTrendVar(fm, fv, ...): 'fitTrendVar' is deprecated.
    ## Use 'scrapper::fitVarianceTrend' instead.
    ## See help("Deprecated")

    ## Warning in combineBlocks(collected, method = method, equiweight = equiweight, : 'combineBlocks' is deprecated.
    ## See help("Deprecated")

    hvgs <- rownames(decomp)[decomp$mean>0.25]
    sce.atac <- sce.atac[hvgs,]

    # PCA
    sce.atac <- runPCA(sce.atac, ncomponents = 25)

    # UMAP
    set.seed(42)
    sce.atac <- runUMAP(sce.atac, dimred="PCA", n_neighbors = 25, min_dist = 0.3)
    plotUMAP(sce.atac, colour_by="celltype", point_size=0.5, point_alpha=1)

# 5 Suggested software for the downstream analysis

These are my personal recommendations of R-based analysis software:

- RNA expression: scater, scran
- ATAC accessibility: archR, snapATAC, cisTopic, Signac, chromVar, Cicero
- Integrative analysis: MOFA+, Seurat. Note that both methods have released vignettes in their website where they analysed this same data set.

# 6 sessionInfo

    sessionInfo()

    ## R version 4.6.0 RC (2026-04-17 r89917)
    ## Platform: x86_64-pc-linux-gnu
    ## Running under: Ubuntu 24.04.4 LTS
    ##
    ## Matrix products: default
    ## BLAS:   /home/biocbuild/bbs-3.24-bioc/R/lib/libRblas.so
    ## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0  LAPACK version 3.12.0
    ##
    ## locale:
    ##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
    ##  [3] LC_TIME=en_GB              LC_COLLATE=C
    ##  [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: America/New_York
    ## tzcode source: system (glibc)
    ##
    ## attached base packages:
    ## [1] stats4    stats     graphics  grDevices utils     datasets  methods
    ## [8] base
    ##
    ## other attached packages:
    ##  [1] scater_1.41.1               ggplot2_4.0.3
    ##  [3] scran_1.41.1                scuttle_1.23.1
    ##  [5] rhdf5_2.57.0                RaggedExperiment_1.37.0
    ##  [7] SingleCellExperiment_1.35.1 SingleCellMultiModal_1.25.3
    ##  [9] MultiAssayExperiment_1.39.0 SummarizedExperiment_1.43.0
    ## [11] Biobase_2.73.1              GenomicRanges_1.65.0
    ## [13] Seqinfo_1.3.0               IRanges_2.47.1
    ## [15] S4Vectors_0.51.2            BiocGenerics_0.59.2
    ## [17] generics_0.1.4              MatrixGenerics_1.25.0
    ## [19] matrixStats_1.5.0           BiocStyle_2.41.0
    ##
    ## loaded via a namespace (and not attached):
    ##   [1] DBI_1.3.0                gridExtra_2.3            httr2_1.2.2
    ##   [4] formatR_1.14             rlang_1.2.0              magrittr_2.0.5
    ##   [7] RcppAnnoy_0.0.23         otel_0.2.0               compiler_4.6.0
    ##  [10] RSQLite_3.52.0           png_0.1-9                vctrs_0.7.3
    ##  [13] pkgconfig_2.0.3          SpatialExperiment_1.23.0 crayon_1.5.3
    ##  [16] fastmap_1.2.0            dbplyr_2.5.2             magick_2.9.1
    ##  [19] XVector_0.53.0           labeling_0.4.3           rmarkdown_2.31
    ##  [22] ggbeeswarm_0.7.3         UpSetR_1.4.0             tinytex_0.59
    ##  [25] purrr_1.2.2              bit_4.6.0                xfun_0.57
    ##  [28] bluster_1.23.0           cachem_1.1.0             beachmat_2.29.0
    ##  [31] jsonlite_2.0.0           blob_1.3.0               rhdf5filters_1.25.0
    ##  [34] DelayedArray_0.39.2      Rhdf5lib_2.1.0           BiocParallel_1.47.0
    ##  [37] irlba_2.3.7              parallel_4.6.0           cluster_2.1.8.2
    ##  [40] R6_2.6.1                 RColorBrewer_1.1-3       bslib_0.11.0
    ##  [43] limma_3.69.1             jquerylib_0.1.4          Rcpp_1.1.1-1.1
    ##  [46] bookdown_0.46            knitr_1.51               BiocBaseUtils_1.15.1
    ##  [49] Matrix_1.7-5             igraph_2.3.1             tidyselect_1.2.1
    ##  [52] viridis_0.6.5            dichromat_2.0-0.1        abind_1.4-8
    ##  [55] yaml_2.3.12              codetools_0.2-20         curl_7.1.0
    ##  [58] plyr_1.8.9               lattice_0.22-9           tibble_3.3.1
    ##  [61] S7_0.2.2                 withr_3.0.2              KEGGREST_1.53.0
    ##  [64] evaluate_1.0.5           BiocFileCache_3.3.0      ExperimentHub_3.3.0
    ##  [67] Biostrings_2.81.1        pillar_1.11.1            BiocManager_1.30.27
    ##  [70] filelock_1.0.3           BiocVersion_3.24.0       scales_1.4.0
    ##  [73] glue_1.8.1               metapod_1.21.0           tools_4.6.0
    ##  [76] AnnotationHub_4.3.0      BiocNeighbors_2.7.2      RSpectra_0.16-2
    ##  [79] ScaledMatrix_1.21.0      locfit_1.5-9.12          cowplot_1.2.0
    ##  [82] grid_4.6.0               AnnotationDbi_1.75.0     edgeR_4.11.0
    ##  [85] beeswarm_0.4.0           BiocSingular_1.29.0      HDF5Array_1.41.0
    ##  [88] vipor_0.4.7              cli_3.6.6                rsvd_1.0.5
    ##  [91] rappdirs_0.3.4           viridisLite_0.4.3        S4Arrays_1.13.0
    ##  [94] dplyr_1.2.1              uwot_0.2.4               gtable_0.3.6
    ##  [97] sass_0.4.10              digest_0.6.39            ggrepel_0.9.8
    ## [100] SparseArray_1.13.2       dqrng_0.4.1              farver_2.1.2
    ## [103] rjson_0.2.23             memoise_2.0.1            htmltools_0.5.9
    ## [106] lifecycle_1.0.5          h5mread_1.5.0            httr_1.4.8
    ## [109] statmod_1.5.2            bit64_4.8.2