The function AddModuleScore_UCell()
allows operating
directly on Seurat objects. UCell scores are calculated from raw counts
or normalized data, and returned as metadata columns. The example below
defines some simple signatures, and applies them on single-cell data
stored in a Seurat object.
To see how this function differs from Seurat’s own
AddModuleScore()
(not based on per-cell ranks) see this
vignette.
For this demo, we will download a single-cell dataset of lung cancer (Zilionis et al. (2019) Immunity) through the scRNA-seq package. This dataset contains >170,000 single cells; for the sake of simplicity, in this demo will we focus on immune cells, according to the annotations by the authors, and downsample to 5000 cells.
Here we define some simple gene sets based on the “Human Cell Landscape” signatures Han et al. (2020) Nature. You may edit existing signatures, or add new one as elements in a list.
library(UCell)
library(Seurat)
seurat.object <- CreateSeuratObject(counts = exp.mat,
project = "Zilionis_immune")
seurat.object <- AddModuleScore_UCell(seurat.object,
features=signatures, name=NULL)
head(seurat.object[[]])
## orig.ident nCount_RNA nFeature_RNA Tcell Myeloid NK Plasma_cell
## bcHTNA1 Zilionis_immune 7516 2613 0 0.5227121 0 0.00000000
## bcHNVA2 Zilionis_immune 5684 1981 0 0.5112892 0 0.00000000
## bcALZN3 Zilionis_immune 4558 1867 0 0.3584502 0 0.07540874
## bcFWBP4 Zilionis_immune 2915 1308 0 0.1546426 0 0.00000000
## bcBJYE5 Zilionis_immune 3576 1548 0 0.4629927 0 0.00000000
## bcGSBJ6 Zilionis_immune 2796 1270 0 0.5452238 0 0.00000000
Generate PCA and UMAP embeddings
seurat.object <- NormalizeData(seurat.object)
seurat.object <- FindVariableFeatures(seurat.object,
selection.method = "vst", nfeatures = 500)
seurat.object <- ScaleData(seurat.object)
seurat.object <- RunPCA(seurat.object, npcs = 20,
features=VariableFeatures(seurat.object))
seurat.object <- RunUMAP(seurat.object, reduction = "pca",
dims = 1:20, seed.use=123)
Visualize UCell scores on low-dimensional representation (UMAP)
Single-cell data are sparse. It can be useful to ‘impute’ scores by
neighboring cells and partially correct this sparsity. The function
SmoothKNN
performs smoothing of single-cell scores by
weighted average of the k-nearest neighbors in a given dimensionality
reduction. It can be applied directly on Seurat objects to smooth UCell
scores:
Smoothing (or imputation) has been designed for UCell scores, but it can be applied to any other data or metadata. For instance, we can perform knn-smoothing directly on gene expression measurements:
genes <- c("CD2","CSF1R")
seurat.object <- SmoothKNN(seurat.object, signature.names=genes,
assay="RNA", reduction="pca", k=20, suffix = "_smooth")
DefaultAssay(seurat.object) <- "RNA"
a <- FeaturePlot(seurat.object, reduction = "umap", features = genes)
DefaultAssay(seurat.object) <- "RNA_smooth"
b <- FeaturePlot(seurat.object, reduction = "umap", features = genes)
a / b
Please report any issues at the UCell GitHub repository.
More demos available on the Bioc landing page and at the UCell demo repository.
If you find UCell useful, you may also check out the scGate package, which relies on UCell scores to automatically purify populations of interest based on gene signatures.
See also SignatuR for easy storing and retrieval of gene signatures.
## R version 4.4.2 (2024-10-31)
## Platform: x86_64-pc-linux-gnu
## Running under: Ubuntu 24.04.1 LTS
##
## Matrix products: default
## BLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so; LAPACK version 3.12.0
##
## locale:
## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=en_US.UTF-8 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: Etc/UTC
## tzcode source: system (glibc)
##
## attached base packages:
## [1] stats4 stats graphics grDevices utils datasets methods
## [8] base
##
## other attached packages:
## [1] patchwork_1.3.0 ggplot2_3.5.1
## [3] Seurat_5.1.0 SeuratObject_5.0.2
## [5] sp_2.1-4 UCell_2.11.1
## [7] scRNAseq_2.20.0 SingleCellExperiment_1.29.1
## [9] SummarizedExperiment_1.37.0 Biobase_2.67.0
## [11] GenomicRanges_1.59.1 GenomeInfoDb_1.43.2
## [13] IRanges_2.41.1 S4Vectors_0.45.2
## [15] BiocGenerics_0.53.3 generics_0.1.3
## [17] MatrixGenerics_1.19.0 matrixStats_1.4.1
## [19] BiocStyle_2.35.0
##
## loaded via a namespace (and not attached):
## [1] RcppAnnoy_0.0.22 later_1.4.1 splines_4.4.2
## [4] BiocIO_1.17.1 bitops_1.0-9 filelock_1.0.3
## [7] tibble_3.2.1 polyclip_1.10-7 XML_3.99-0.17
## [10] fastDummies_1.7.4 lifecycle_1.0.4 httr2_1.0.7
## [13] globals_0.16.3 lattice_0.22-6 ensembldb_2.31.0
## [16] MASS_7.3-61 alabaster.base_1.7.2 magrittr_2.0.3
## [19] plotly_4.10.4 sass_0.4.9 rmarkdown_2.29
## [22] jquerylib_0.1.4 yaml_2.3.10 httpuv_1.6.15
## [25] sctransform_0.4.1 spam_2.11-0 spatstat.sparse_3.1-0
## [28] reticulate_1.40.0 pbapply_1.7-2 cowplot_1.1.3
## [31] DBI_1.2.3 buildtools_1.0.0 RColorBrewer_1.1-3
## [34] abind_1.4-8 zlibbioc_1.52.0 Rtsne_0.17
## [37] purrr_1.0.2 AnnotationFilter_1.31.0 RCurl_1.98-1.16
## [40] rappdirs_0.3.3 GenomeInfoDbData_1.2.13 ggrepel_0.9.6
## [43] irlba_2.3.5.1 spatstat.utils_3.1-1 listenv_0.9.1
## [46] alabaster.sce_1.7.0 maketools_1.3.1 goftest_1.2-3
## [49] RSpectra_0.16-2 spatstat.random_3.3-2 fitdistrplus_1.2-1
## [52] parallelly_1.39.0 leiden_0.4.3.1 codetools_0.2-20
## [55] DelayedArray_0.33.2 tidyselect_1.2.1 farver_2.1.2
## [58] UCSC.utils_1.3.0 spatstat.explore_3.3-3 BiocFileCache_2.15.0
## [61] GenomicAlignments_1.43.0 jsonlite_1.8.9 BiocNeighbors_2.1.1
## [64] progressr_0.15.1 ggridges_0.5.6 survival_3.7-0
## [67] tools_4.4.2 ica_1.0-3 Rcpp_1.0.13-1
## [70] glue_1.8.0 gridExtra_2.3 SparseArray_1.7.2
## [73] xfun_0.49 dplyr_1.1.4 HDF5Array_1.35.2
## [76] gypsum_1.3.0 withr_3.0.2 BiocManager_1.30.25
## [79] fastmap_1.2.0 rhdf5filters_1.19.0 fansi_1.0.6
## [82] digest_0.6.37 mime_0.12 R6_2.5.1
## [85] colorspace_2.1-1 scattermore_1.2 tensor_1.5
## [88] spatstat.data_3.1-4 RSQLite_2.3.8 tidyr_1.3.1
## [91] utf8_1.2.4 data.table_1.16.2 rtracklayer_1.67.0
## [94] htmlwidgets_1.6.4 httr_1.4.7 S4Arrays_1.7.1
## [97] uwot_0.2.2 pkgconfig_2.0.3 gtable_0.3.6
## [100] blob_1.2.4 lmtest_0.9-40 XVector_0.47.0
## [103] sys_3.4.3 htmltools_0.5.8.1 dotCall64_1.2
## [106] ProtGenerics_1.39.0 scales_1.3.0 alabaster.matrix_1.7.3
## [109] png_0.1-8 spatstat.univar_3.1-1 knitr_1.49
## [112] reshape2_1.4.4 rjson_0.2.23 nlme_3.1-166
## [115] curl_6.0.1 cachem_1.1.0 zoo_1.8-12
## [118] rhdf5_2.51.0 stringr_1.5.1 BiocVersion_3.21.1
## [121] KernSmooth_2.23-24 parallel_4.4.2 miniUI_0.1.1.1
## [124] AnnotationDbi_1.69.0 restfulr_0.0.15 pillar_1.9.0
## [127] grid_4.4.2 alabaster.schemas_1.7.0 vctrs_0.6.5
## [130] RANN_2.6.2 promises_1.3.2 dbplyr_2.5.0
## [133] xtable_1.8-4 cluster_2.1.6 evaluate_1.0.1
## [136] GenomicFeatures_1.59.1 cli_3.6.3 compiler_4.4.2
## [139] Rsamtools_2.23.1 rlang_1.1.4 crayon_1.5.3
## [142] future.apply_1.11.3 labeling_0.4.3 plyr_1.8.9
## [145] stringi_1.8.4 deldir_2.0-4 viridisLite_0.4.2
## [148] alabaster.se_1.7.0 BiocParallel_1.41.0 munsell_0.5.1
## [151] Biostrings_2.75.1 lazyeval_0.2.2 spatstat.geom_3.3-4
## [154] Matrix_1.7-1 ExperimentHub_2.15.0 RcppHNSW_0.6.0
## [157] bit64_4.5.2 future_1.34.0 Rhdf5lib_1.29.0
## [160] KEGGREST_1.47.0 shiny_1.9.1 alabaster.ranges_1.7.0
## [163] AnnotationHub_3.15.0 ROCR_1.0-11 igraph_2.1.1
## [166] memoise_2.0.1 bslib_0.8.0 bit_4.5.0