About Install Get Started Frequently Asked Questions Frequently Requested Vignettes Contact
Integration and Label Transfer

In this example workflow, we demonstrate two new methods we recently introduced in our preprint, Comprehensive Integration of Single Cell Data:

  • Assembly of multiple distinct scRNA-seq datasets into an integrated reference
  • Transfer of cell type labels from a reference dataset onto a new query dataset

For the purposes of this example, we’ve chosen human pancreatic islet cell datasets produced across four technologies, CelSeq (GSE81076) CelSeq2 (GSE85241), Fluidigm C1 (GSE86469), and SMART-Seq2 (E-MTAB-5061). We provide a combined raw data matrix and associated metadata file here to get started.

The code for the new methodology is implemented in Seurat v3. You can download a beta pre-release at github and easily install using the devtools package.

devtools::install_github(repo = "satijalab/seurat", ref = "release/3.0")

In addition to new methods, Seurat v3 includes a number of improvements aiming to improve the Seurat object and user interaction. To help users familiarize themselves with these changes, we put together a command cheat sheet for common tasks. We are preparing a full release with updated vignettes, tutorials, and documentation in the near future.

Dataset preprocessing

Load in expression matrix and metadata. The metadata file contains the technology (tech column) and cell type annotations (cell type column) for each cell in the four datasets.

pancreas.data <- readRDS(file = "~/Downloads/pancreas_expression_matrix.rds")
metadata <- readRDS(file = "~/Downloads/pancreas_metadata.rds")

To construct a reference, we will identify ‘anchors’ between the individual datasets. First, we split the combined object into a list, with each dataset as an element.

pancreas <- CreateSeuratObject(counts = pancreas.data, meta.data = metadata)
pancreas.list <- SplitObject(object = pancreas, split.by = "tech")

Prior to finding anchors, we perform standard preprocessing (log-normalization), and identify variable features individually for each. Note that Seurat v3 implements an improved method for variable feature selection based on a variance stabilizing transformation ("vst")

for (i in 1:length(x = pancreas.list)) {
    pancreas.list[[i]] <- NormalizeData(object = pancreas.list[[i]], verbose = FALSE)
    pancreas.list[[i]] <- FindVariableFeatures(object = pancreas.list[[i]], 
        selection.method = "vst", nfeatures = 2000, verbose = FALSE)

Integration of 3 pancreatic islet cell datasets

Next, we identify anchors using the FindIntegrationAnchors function, which takes a list of Seurat objects as input. Here, we integrate three of the objects into a reference (we will use the fourth later in this vignette)

  • We use all default parameters here for identifying anchors, including the ‘dimensionality’ of the dataset (30; feel free to try varying this parameter over a broad range, for example between 10 and 50).
reference.list <- pancreas.list[c("celseq", "celseq2", "smartseq2")]
pancreas.anchors <- FindIntegrationAnchors(object.list = reference.list, dims = 1:30)

We then pass these anchors to the IntegrateData function, which returns a Seurat object.

  • The returned object will contain a new Assay, which holds an integrated (or ‘batch-corrected’) expression matrix for all cells, enabling them to be jointly analyzed.
pancreas.integrated <- IntegrateData(anchorset = pancreas.anchors, dims = 1:30)

After running IntegrateData, the Seurat object will contain a new Assay with the integrated expression matrix. Note that the original (uncorrected values) are still stored in the object in the “RNA” assay, so you can switch back and forth.

We can then use this new integrated matrix for downstream analysis and visualization. Here we scale the integrated data, run PCA, and visualize the results with UMAP. The integrated datasets cluster by cell type, instead of by technology.

# switch to integrated assay. The variable features of this assay are
# automatically set during IntegrateData
DefaultAssay(object = pancreas.integrated) <- "integrated"

# Run the standard workflow for visualization and clustering
pancreas.integrated <- ScaleData(object = pancreas.integrated, verbose = FALSE)
pancreas.integrated <- RunPCA(object = pancreas.integrated, npcs = 30, verbose = FALSE)
pancreas.integrated <- RunUMAP(object = pancreas.integrated, reduction = "pca", 
    dims = 1:30)
p1 <- DimPlot(object = pancreas.integrated, reduction = "umap", group.by = "tech")
p2 <- DimPlot(object = pancreas.integrated, reduction = "umap", group.by = "celltype", 
    label = TRUE, repel = TRUE) + NoLegend()
plot_grid(p1, p2)