From 71193c0fecab562f8495f6c0eb2873e5f75dccce Mon Sep 17 00:00:00 2001 From: Paul Hoffman Date: Fri, 2 Sep 2022 13:06:34 -0400 Subject: [PATCH 1/4] Tweaks for pseudocount.use and normalization methods for FindMarkers and FoldChange --- R/differential_expression.R | 45 +++++++++++++++++++++++-------------- man/FindMarkers.Rd | 5 ++++- man/FoldChange.Rd | 4 ++++ 3 files changed, 36 insertions(+), 18 deletions(-) diff --git a/R/differential_expression.R b/R/differential_expression.R index a84940545..67e3a9856 100644 --- a/R/differential_expression.R +++ b/R/differential_expression.R @@ -604,6 +604,9 @@ FindMarkers.default <- function( return(de.results) } +#' @param norm.method Normalization method for fold change calculation when +#' \code{slot} is \dQuote{\code{data}} +#' #' @rdname FindMarkers #' @concept differential_expression #' @export @@ -631,6 +634,7 @@ FindMarkers.Assay <- function( fc.name = NULL, base = 2, densify = FALSE, + norm.method = NULL, ... ) { pseudocount.use <- pseudocount.use %||% 1 @@ -654,7 +658,8 @@ FindMarkers.Assay <- function( pseudocount.use = pseudocount.use, mean.fxn = mean.fxn, fc.name = fc.name, - base = base + base = base, + norm.method = norm.method ) de.results <- FindMarkers( object = data.use, @@ -931,7 +936,7 @@ FindMarkers.Seurat <- function( latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, - pseudocount.use = NULL, + # pseudocount.use = NULL, mean.fxn = NULL, fc.name = NULL, base = 2, @@ -975,17 +980,14 @@ FindMarkers.Seurat <- function( } # check normalization method norm.command <- paste0("NormalizeData.", assay) - if (norm.command %in% Command(object = object) && is.null(x = reduction)) { - norm.method <- Command( + norm.method <- if (norm.command %in% Command(object = object) && is.null(x = reduction)) { + Command( object = object, command = norm.command, value = "normalization.method" ) - if (norm.method != "LogNormalize") { - mean.fxn <- function(x) { - return(log(x = rowMeans(x = x) + pseudocount.use, base = base)) - } - } + } else { + NULL } de.results <- FindMarkers( object = data.use, @@ -1004,11 +1006,12 @@ FindMarkers.Seurat <- function( latent.vars = latent.vars, min.cells.feature = min.cells.feature, min.cells.group = min.cells.group, - pseudocount.use = pseudocount.use, + # pseudocount.use = pseudocount.use, mean.fxn = mean.fxn, base = base, fc.name = fc.name, densify = densify, + norm.method = norm.method, ... ) return(de.results) @@ -1054,7 +1057,9 @@ FoldChange.default <- function( return(fc.results) } - +#' @param norm.method Normalization method for mean function selection +#' when \code{slot} is \dQuote{\code{data}} +#' #' @importFrom Matrix rowMeans #' @rdname FoldChange #' @concept differential_expression @@ -1070,19 +1075,25 @@ FoldChange.Assay <- function( fc.name = NULL, mean.fxn = NULL, base = 2, + norm.method = NULL, ... ) { pseudocount.use <- pseudocount.use %||% 1 data <- GetAssayData(object = object, slot = slot) + default.mean.fxn <- function(x) { + return(log(x = rowMeans(x = x) + pseudocount.use, base = base)) + } mean.fxn <- mean.fxn %||% switch( EXPR = slot, - 'data' = function(x) { - return(log(x = rowMeans(x = expm1(x = x)) + pseudocount.use, base = base)) - }, + 'data' = switch( + EXPR = norm.method %||% '', + 'LogNormalize' = function(x) { + return(log(x = rowMeans(x = expm1(x = x)) + pseudocount.use, base = base)) + }, + default.mean.fxn + ), 'scale.data' = rowMeans, - function(x) { - return(log(x = rowMeans(x = x) + pseudocount.use, base = base)) - } + default.mean.fxn ) # Omit the decimal value of e from the column name if base == exp(1) base.text <- ifelse( diff --git a/man/FindMarkers.Rd b/man/FindMarkers.Rd index b5a864484..160c69c0d 100644 --- a/man/FindMarkers.Rd +++ b/man/FindMarkers.Rd @@ -58,6 +58,7 @@ FindMarkers(object, ...) fc.name = NULL, base = 2, densify = FALSE, + norm.method = NULL, ... ) @@ -131,7 +132,6 @@ FindMarkers(object, ...) latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, - pseudocount.use = NULL, mean.fxn = NULL, fc.name = NULL, base = 2, @@ -243,6 +243,9 @@ slot "avg_diff".} \item{base}{The base with respect to which logarithms are computed.} +\item{norm.method}{Normalization method for fold change calculation when +\code{slot} is \dQuote{\code{data}}} + \item{recorrect_umi}{Recalculate corrected UMI counts using minimum of the median UMIs when performing DE using multiple SCT objects; default is TRUE} \item{ident.1}{Identity class to define markers for; pass an object of class diff --git a/man/FoldChange.Rd b/man/FoldChange.Rd index 0f2538f0f..edda396b5 100644 --- a/man/FoldChange.Rd +++ b/man/FoldChange.Rd @@ -22,6 +22,7 @@ FoldChange(object, ...) fc.name = NULL, mean.fxn = NULL, base = 2, + norm.method = NULL, ... ) @@ -78,6 +79,9 @@ calculating logFC.} \item{base}{The base with respect to which logarithms are computed.} +\item{norm.method}{Normalization method for mean function selection +when \code{slot} is \dQuote{\code{data}}} + \item{ident.1}{Identity class to calculate fold change for; pass an object of class \code{phylo} or 'clustertree' to calculate fold change for a node in a cluster tree; passing 'clustertree' requires \code{\link{BuildClusterTree}} to have been run} From 1bf7bba2af57c260369e28db6d3514d6b93afc16 Mon Sep 17 00:00:00 2001 From: timoast <4591688+timoast@users.noreply.github.com> Date: Fri, 2 Sep 2022 14:11:18 -0400 Subject: [PATCH 2/4] Remove pseudocount.use from Seurat method: --- R/differential_expression.R | 4 ---- 1 file changed, 4 deletions(-) diff --git a/R/differential_expression.R b/R/differential_expression.R index 67e3a9856..36aec77c6 100644 --- a/R/differential_expression.R +++ b/R/differential_expression.R @@ -59,7 +59,6 @@ FindAllMarkers <- function( latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, - pseudocount.use = NULL, mean.fxn = NULL, fc.name = NULL, base = 2, @@ -136,7 +135,6 @@ FindAllMarkers <- function( latent.vars = latent.vars, min.cells.feature = min.cells.feature, min.cells.group = min.cells.group, - pseudocount.use = pseudocount.use, mean.fxn = mean.fxn, fc.name = fc.name, base = base, @@ -936,7 +934,6 @@ FindMarkers.Seurat <- function( latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, - # pseudocount.use = NULL, mean.fxn = NULL, fc.name = NULL, base = 2, @@ -1006,7 +1003,6 @@ FindMarkers.Seurat <- function( latent.vars = latent.vars, min.cells.feature = min.cells.feature, min.cells.group = min.cells.group, - # pseudocount.use = pseudocount.use, mean.fxn = mean.fxn, base = base, fc.name = fc.name, From 015844d01d7c51bdd91d570f201ac421f384040b Mon Sep 17 00:00:00 2001 From: timoast <4591688+timoast@users.noreply.github.com> Date: Fri, 2 Sep 2022 14:11:35 -0400 Subject: [PATCH 3/4] Add more tests for FindMarkers --- tests/testthat/test_differential_expression.R | 92 ++++++++++++++++++- 1 file changed, 91 insertions(+), 1 deletion(-) diff --git a/tests/testthat/test_differential_expression.R b/tests/testthat/test_differential_expression.R index 81e231f76..bf2e92448 100644 --- a/tests/testthat/test_differential_expression.R +++ b/tests/testthat/test_differential_expression.R @@ -2,12 +2,17 @@ suppressWarnings(RNGversion(vstr = "3.5.3")) set.seed(seed = 42) -# Tests for FindMarkers default parameters +# Tests for FindMarkers # -------------------------------------------------------------------------------- context("FindMarkers") +clr.obj <- suppressWarnings(NormalizeData(pbmc_small, normalization.method = "CLR")) +sct.obj <- suppressWarnings(suppressMessages(SCTransform(pbmc_small))) + markers.0 <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, verbose = FALSE, base = exp(1))) markers.01 <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1))) +results.clr <- suppressWarnings(FindMarkers(object = clr.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1))) +results.sct <- suppressWarnings(FindMarkers(object = sct.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1))) test_that("Default settings work as expected", { expect_error(FindMarkers(object = pbmc_small)) @@ -29,6 +34,24 @@ test_that("Default settings work as expected", { expect_equal(markers.01[1, "p_val_adj"], 3.916481e-09) expect_equal(nrow(x = markers.01), 201) expect_equal(rownames(x = markers.01)[1], "TYMP") + + # CLR normalization + expect_equal(results.clr[1, "p_val"], 1.209462e-11) + expect_equal(results.clr[1, "avg_logFC"], -0.8290693, tolerance = 1e-6) + expect_equal(results.clr[1, "pct.1"], 0.111) + expect_equal(results.clr[1, "pct.2"], 0.96) + expect_equal(results.clr[1, "p_val_adj"], 2.781762e-09) + expect_equal(nrow(x = results.clr), 85) + expect_equal(rownames(x = results.clr)[1], "S100A8") + + # SCT normalization + expect_equal(results.sct[1, "p_val"], 6.225491e-11) + expect_equal(results.sct[1, "avg_logFC"], -0.6768721, tolerance = 1e-6) + expect_equal(results.sct[1, "pct.1"], 0.111) + expect_equal(results.sct[1, "pct.2"], 0.96) + expect_equal(results.sct[1, "p_val_adj"], 1.369608e-08) + expect_equal(nrow(x = results.sct), 92) + expect_equal(rownames(x = results.sct)[1], "TYMP") }) @@ -65,6 +88,28 @@ test_that("passing cell names works", { expect_equal(rownames(x = results)[1], "IFI30") }) +results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 0.1)) +results.clr <- suppressWarnings(FindMarkers(object = clr.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 0.1)) +results.sct <- suppressWarnings(FindMarkers(object = sct.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 0.1)) +test_that("setting pseudocount.use works", { + expect_equal(nrow(x = results), 202) + expect_equal(results[1, "avg_logFC"], -2.630395, tolerance = 1e-6) + expect_equal(nrow(x = results.clr), 182) + expect_equal(results.clr[1, "avg_logFC"], -2.317338, tolerance = 1e-6) + expect_equal(nrow(results.sct), 185) + expect_equal(results.sct[1, "avg_logFC"], -1.845681, tolerance = 1e-6) +}) + +results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), mean.fxn = rowMeans)) +results.clr <- suppressWarnings(FindMarkers(object = clr.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), mean.fxn = rowMeans)) +results.sct <- suppressWarnings(FindMarkers(object = sct.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), mean.fxn = rowMeans)) +test_that("setting mean.fxn works", { + expect_equal(nrow(x = results), 191) + expect_equal(results[1, "avg_logFC"], -4.204346, tolerance = 1e-6) + expect_equal(results.clr[1, "avg_logFC"], -1.353025, tolerance = 1e-6) + expect_equal(results.sct[1, "avg_logFC"], -1.064042, tolerance = 1e-6) +}) + results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, logfc.threshold = 2, verbose = FALSE, base = exp(1))) test_that("logfc.threshold works", { expect_equal(nrow(x = results), 112) @@ -236,6 +281,51 @@ test_that("LR test works", { expect_equal(rownames(x = results)[1], "LYZ") }) +# Tests for FindAllMarkers +# ------------------------------------------------------------------------------- +results <- suppressMessages(suppressWarnings(FindAllMarkers(object = pbmc_small))) +results.clr <- suppressMessages(suppressWarnings(FindAllMarkers(object = clr.obj))) +results.sct <- suppressMessages(suppressWarnings(FindAllMarkers(object = sct.obj))) +results.pseudo <- suppressMessages(suppressWarnings(FindAllMarkers(object = pbmc_small, pseudocount.use = 0.1))) + +test_that("FindAllMarkers works as expected", { + expect_equal(colnames(x = results), c("p_val", "avg_log2FC", "pct.1", "pct.2", "p_val_adj", "cluster", "gene")) + expect_equal(results[1, "p_val"], 9.572778e-13) + expect_equal(results[1, "avg_log2FC"], -5.820829, tolerance = 1e-6) + expect_equal(results[1, "pct.1"], 0.083) + expect_equal(results[1, "pct.2"], 0.909) + expect_equal(results[1, "p_val_adj"], 2.201739e-10) + expect_equal(nrow(x = results), 222) + expect_equal(rownames(results)[1], "HLA-DPB1") + + # CLR normalization + expect_equal(results.clr[1, "p_val"], 1.209462e-11) + expect_equal(results.clr[1, "avg_log2FC"], -1.079924, tolerance = 1e-6) + expect_equal(results.clr[1, "pct.1"], 0.083) + expect_equal(results.clr[1, "pct.2"], 0.909) + expect_equal(results.clr[1, "p_val_adj"], 3.079373e-10) + expect_equal(nrow(x = results.clr), 200) + expect_equal(rownames(x = results.clr)[1], "HLA-DPB1") + + # SCT normalization + expect_equal(results.sct[1, "p_val"], 6.225491e-11) + expect_equal(results.sct[1, "avg_log2FC"], -1.265307, tolerance = 1e-6) + expect_equal(results.sct[1, "pct.1"], 0.167) + expect_equal(results.sct[1, "pct.2"], 0.909) + expect_equal(results.sct[1, "p_val_adj"], 1.369608e-08) + expect_equal(nrow(x = results.sct), 201) + expect_equal(rownames(x = results.sct)[1], "HLA-DPB1") + + # pseudocount.use = 0.1 + expect_equal(results.pseudo[1, "p_val"], 9.572778e-13) + expect_equal(results.pseudo[1, "avg_log2FC"], -6.013818, tolerance = 1e-6) + expect_equal(results.pseudo[1, "pct.1"], 0.083) + expect_equal(results.pseudo[1, "pct.2"], 0.909) + expect_equal(results.pseudo[1, "p_val_adj"], 2.201739e-10) + expect_equal(nrow(x = results.pseudo), 222) + expect_equal(rownames(results.pseudo)[1], "HLA-DPB1") +}) + # Tests for FindConservedMarkers # ------------------------------------------------------------------------------- From 731ec7c1ef010441144473e13e1729523a2e7ae2 Mon Sep 17 00:00:00 2001 From: timoast <4591688+timoast@users.noreply.github.com> Date: Fri, 2 Sep 2022 14:25:07 -0400 Subject: [PATCH 4/4] Update docs --- DESCRIPTION | 2 +- man/FeaturePlot.Rd | 8 ++++++-- man/FindAllMarkers.Rd | 4 ---- man/IntegrateData.Rd | 6 ++++-- man/IntegrateEmbeddings.Rd | 6 ++++-- man/PolyFeaturePlot.Rd | 5 +---- man/Seurat-package.Rd | 2 +- man/reexports.Rd | 2 +- 8 files changed, 18 insertions(+), 17 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 999c4610b..e85853fd4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -95,7 +95,7 @@ Collate: 'tree.R' 'utilities.R' 'zzz.R' -RoxygenNote: 7.1.2 +RoxygenNote: 7.2.1 Encoding: UTF-8 Suggests: ape, diff --git a/man/FeaturePlot.Rd b/man/FeaturePlot.Rd index 239c0a8c2..b06367ba3 100644 --- a/man/FeaturePlot.Rd +++ b/man/FeaturePlot.Rd @@ -10,8 +10,12 @@ FeaturePlot( features, dims = c(1, 2), cells = NULL, - cols = if (blend) { c("lightgrey", "#ff0000", "#00ff00") } else { - c("lightgrey", "blue") }, + cols = if (blend) { + c("lightgrey", "#ff0000", "#00ff00") + } else { + + c("lightgrey", "blue") + }, pt.size = NULL, order = FALSE, min.cutoff = NA, diff --git a/man/FindAllMarkers.Rd b/man/FindAllMarkers.Rd index 1c8c8897d..622474624 100644 --- a/man/FindAllMarkers.Rd +++ b/man/FindAllMarkers.Rd @@ -22,7 +22,6 @@ FindAllMarkers( latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, - pseudocount.use = NULL, mean.fxn = NULL, fc.name = NULL, base = 2, @@ -113,9 +112,6 @@ of the two groups, currently only used for poisson and negative binomial tests} \item{min.cells.group}{Minimum number of cells in one of the groups} -\item{pseudocount.use}{Pseudocount to add to averaged expression values when -calculating logFC. 1 by default.} - \item{mean.fxn}{Function to use for fold change or average difference calculation. If NULL, the appropriate function will be chose according to the slot used} diff --git a/man/IntegrateData.Rd b/man/IntegrateData.Rd index c02543005..e08bd682e 100644 --- a/man/IntegrateData.Rd +++ b/man/IntegrateData.Rd @@ -64,10 +64,12 @@ should be encoded in a matrix, where each row represents one of the pairwise integration steps. Negative numbers specify a dataset, positive numbers specify the integration results from a given row (the format of the merge matrix included in the \code{\link{hclust}} function output). For example: -\code{matrix(c(-2, 1, -3, -1), ncol = 2)} gives:\preformatted{ [,1] [,2] +\code{matrix(c(-2, 1, -3, -1), ncol = 2)} gives: + +\if{html}{\out{
}}\preformatted{ [,1] [,2] [1,] -2 -3 [2,] 1 -1 -} +}\if{html}{\out{
}} Which would cause dataset 2 and 3 to be integrated first, then the resulting object integrated with dataset 1. diff --git a/man/IntegrateEmbeddings.Rd b/man/IntegrateEmbeddings.Rd index c3f96ffa5..dc0469132 100644 --- a/man/IntegrateEmbeddings.Rd +++ b/man/IntegrateEmbeddings.Rd @@ -75,10 +75,12 @@ should be encoded in a matrix, where each row represents one of the pairwise integration steps. Negative numbers specify a dataset, positive numbers specify the integration results from a given row (the format of the merge matrix included in the \code{\link{hclust}} function output). For example: -\code{matrix(c(-2, 1, -3, -1), ncol = 2)} gives:\preformatted{ [,1] [,2] +\code{matrix(c(-2, 1, -3, -1), ncol = 2)} gives: + +\if{html}{\out{
}}\preformatted{ [,1] [,2] [1,] -2 -3 [2,] 1 -1 -} +}\if{html}{\out{
}} Which would cause dataset 2 and 3 to be integrated first, then the resulting object integrated with dataset 1. diff --git a/man/PolyFeaturePlot.Rd b/man/PolyFeaturePlot.Rd index 1eacd0ecd..a2b2fc588 100644 --- a/man/PolyFeaturePlot.Rd +++ b/man/PolyFeaturePlot.Rd @@ -33,10 +33,7 @@ PolyFeaturePlot( \item{ncol}{Number of columns to split the plot into} -\item{min.cutoff}{Vector of minimum and maximum cutoff values for each feature, -may specify quantile in the form of 'q##' where '##' is the quantile (eg, 'q1', 'q10')} - -\item{max.cutoff}{Vector of minimum and maximum cutoff values for each feature, +\item{min.cutoff, max.cutoff}{Vector of minimum and maximum cutoff values for each feature, may specify quantile in the form of 'q##' where '##' is the quantile (eg, 'q1', 'q10')} \item{common.scale}{...} diff --git a/man/Seurat-package.Rd b/man/Seurat-package.Rd index 9b3fc3749..351af75c9 100644 --- a/man/Seurat-package.Rd +++ b/man/Seurat-package.Rd @@ -6,7 +6,7 @@ \alias{Seurat-package} \title{Seurat: Tools for Single Cell Genomics} \description{ -A toolkit for quality control, analysis, and exploration of single cell RNA sequencing data. 'Seurat' aims to enable users to identify and interpret sources of heterogeneity from single cell transcriptomic measurements, and to integrate diverse types of single cell data. See Satija R, Farrell J, Gennert D, et al (2015) , Macosko E, Basu A, Satija R, et al (2015) , Stuart T, Butler A, et al (2019) , and Hao, Hao, et al (2020) for more details. +A toolkit for quality control, analysis, and exploration of single cell RNA sequencing data. 'Seurat' aims to enable users to identify and interpret sources of heterogeneity from single cell transcriptomic measurements, and to integrate diverse types of single cell data. See Satija R, Farrell J, Gennert D, et al (2015) \doi{10.1038/nbt.3192}, Macosko E, Basu A, Satija R, et al (2015) \doi{10.1016/j.cell.2015.05.002}, Stuart T, Butler A, et al (2019) \doi{10.1016/j.cell.2019.05.031}, and Hao, Hao, et al (2020) \doi{10.1101/2020.10.12.335331} for more details. } \section{Package options}{ diff --git a/man/reexports.Rd b/man/reexports.Rd index 2c9dbf1e5..4e5b1716e 100644 --- a/man/reexports.Rd +++ b/man/reexports.Rd @@ -68,6 +68,6 @@ These objects are imported from other packages. Follow the links below to see their documentation. \describe{ - \item{SeuratObject}{\code{\link[SeuratObject]{AddMetaData}}, \code{\link[SeuratObject:ObjectAccess]{Assays}}, \code{\link[SeuratObject]{Cells}}, \code{\link[SeuratObject]{CellsByIdentities}}, \code{\link[SeuratObject]{Command}}, \code{\link[SeuratObject]{CreateAssayObject}}, \code{\link[SeuratObject]{CreateDimReducObject}}, \code{\link[SeuratObject]{CreateSeuratObject}}, \code{\link[SeuratObject]{DefaultAssay}}, \code{\link[SeuratObject:DefaultAssay]{DefaultAssay<-}}, \code{\link[SeuratObject]{Distances}}, \code{\link[SeuratObject]{Embeddings}}, \code{\link[SeuratObject]{FetchData}}, \code{\link[SeuratObject:AssayData]{GetAssayData}}, \code{\link[SeuratObject]{GetImage}}, \code{\link[SeuratObject]{GetTissueCoordinates}}, \code{\link[SeuratObject:VariableFeatures]{HVFInfo}}, \code{\link[SeuratObject]{Idents}}, \code{\link[SeuratObject:Idents]{Idents<-}}, \code{\link[SeuratObject]{Images}}, \code{\link[SeuratObject]{Index}}, \code{\link[SeuratObject:Index]{Index<-}}, \code{\link[SeuratObject]{Indices}}, \code{\link[SeuratObject]{IsGlobal}}, \code{\link[SeuratObject]{JS}}, \code{\link[SeuratObject:JS]{JS<-}}, \code{\link[SeuratObject]{Key}}, \code{\link[SeuratObject:Key]{Key<-}}, \code{\link[SeuratObject]{Loadings}}, \code{\link[SeuratObject:Loadings]{Loadings<-}}, \code{\link[SeuratObject]{LogSeuratCommand}}, \code{\link[SeuratObject]{Misc}}, \code{\link[SeuratObject:Misc]{Misc<-}}, \code{\link[SeuratObject:ObjectAccess]{Neighbors}}, \code{\link[SeuratObject]{Project}}, \code{\link[SeuratObject:Project]{Project<-}}, \code{\link[SeuratObject]{Radius}}, \code{\link[SeuratObject:ObjectAccess]{Reductions}}, \code{\link[SeuratObject]{RenameCells}}, \code{\link[SeuratObject:Idents]{RenameIdents}}, \code{\link[SeuratObject:Idents]{ReorderIdent}}, \code{\link[SeuratObject]{RowMergeSparseMatrices}}, \code{\link[SeuratObject:VariableFeatures]{SVFInfo}}, \code{\link[SeuratObject:AssayData]{SetAssayData}}, \code{\link[SeuratObject:Idents]{SetIdent}}, \code{\link[SeuratObject:VariableFeatures]{SpatiallyVariableFeatures}}, \code{\link[SeuratObject:Idents]{StashIdent}}, \code{\link[SeuratObject]{Stdev}}, \code{\link[SeuratObject]{Tool}}, \code{\link[SeuratObject:Tool]{Tool<-}}, \code{\link[SeuratObject]{UpdateSeuratObject}}, \code{\link[SeuratObject]{VariableFeatures}}, \code{\link[SeuratObject:VariableFeatures]{VariableFeatures<-}}, \code{\link[SeuratObject]{WhichCells}}, \code{\link[SeuratObject]{as.Graph}}, \code{\link[SeuratObject]{as.Neighbor}}, \code{\link[SeuratObject]{as.Seurat}}, \code{\link[SeuratObject]{as.sparse}}} + \item{SeuratObject}{\code{\link[SeuratObject]{AddMetaData}}, \code{\link[SeuratObject]{as.Graph}}, \code{\link[SeuratObject]{as.Neighbor}}, \code{\link[SeuratObject]{as.Seurat}}, \code{\link[SeuratObject]{as.sparse}}, \code{\link[SeuratObject:ObjectAccess]{Assays}}, \code{\link[SeuratObject]{Cells}}, \code{\link[SeuratObject]{CellsByIdentities}}, \code{\link[SeuratObject]{Command}}, \code{\link[SeuratObject]{CreateAssayObject}}, \code{\link[SeuratObject]{CreateDimReducObject}}, \code{\link[SeuratObject]{CreateSeuratObject}}, \code{\link[SeuratObject]{DefaultAssay}}, \code{\link[SeuratObject:DefaultAssay]{DefaultAssay<-}}, \code{\link[SeuratObject]{Distances}}, \code{\link[SeuratObject]{Embeddings}}, \code{\link[SeuratObject]{FetchData}}, \code{\link[SeuratObject:AssayData]{GetAssayData}}, \code{\link[SeuratObject]{GetImage}}, \code{\link[SeuratObject]{GetTissueCoordinates}}, \code{\link[SeuratObject:VariableFeatures]{HVFInfo}}, \code{\link[SeuratObject]{Idents}}, \code{\link[SeuratObject:Idents]{Idents<-}}, \code{\link[SeuratObject]{Images}}, \code{\link[SeuratObject]{Index}}, \code{\link[SeuratObject:Index]{Index<-}}, \code{\link[SeuratObject]{Indices}}, \code{\link[SeuratObject]{IsGlobal}}, \code{\link[SeuratObject]{JS}}, \code{\link[SeuratObject:JS]{JS<-}}, \code{\link[SeuratObject]{Key}}, \code{\link[SeuratObject:Key]{Key<-}}, \code{\link[SeuratObject]{Loadings}}, \code{\link[SeuratObject:Loadings]{Loadings<-}}, \code{\link[SeuratObject]{LogSeuratCommand}}, \code{\link[SeuratObject]{Misc}}, \code{\link[SeuratObject:Misc]{Misc<-}}, \code{\link[SeuratObject:ObjectAccess]{Neighbors}}, \code{\link[SeuratObject]{Project}}, \code{\link[SeuratObject:Project]{Project<-}}, \code{\link[SeuratObject]{Radius}}, \code{\link[SeuratObject:ObjectAccess]{Reductions}}, \code{\link[SeuratObject]{RenameCells}}, \code{\link[SeuratObject:Idents]{RenameIdents}}, \code{\link[SeuratObject:Idents]{ReorderIdent}}, \code{\link[SeuratObject]{RowMergeSparseMatrices}}, \code{\link[SeuratObject:AssayData]{SetAssayData}}, \code{\link[SeuratObject:Idents]{SetIdent}}, \code{\link[SeuratObject:VariableFeatures]{SpatiallyVariableFeatures}}, \code{\link[SeuratObject:Idents]{StashIdent}}, \code{\link[SeuratObject]{Stdev}}, \code{\link[SeuratObject:VariableFeatures]{SVFInfo}}, \code{\link[SeuratObject]{Tool}}, \code{\link[SeuratObject:Tool]{Tool<-}}, \code{\link[SeuratObject]{UpdateSeuratObject}}, \code{\link[SeuratObject]{VariableFeatures}}, \code{\link[SeuratObject:VariableFeatures]{VariableFeatures<-}}, \code{\link[SeuratObject]{WhichCells}}} }}