Cell type classification with SignacX: PBMCs from 10X Genomics

all_times <- list()  # store the time for each chunk
knitr::knit_hooks$set(time_it = local({
  now <- NULL
  function(before, options) {
    if (before) {
      now <<- Sys.time()
    } else {
      res <- difftime(Sys.time(), now, units = "secs")
      all_times[[options$label]] <<- res
    }
  }
}))
knitr::opts_chunk$set(
  tidy = TRUE,
  tidy.opts = list(width.cutoff = 95),
  message = FALSE,
  warning = FALSE,
  time_it = TRUE
)
celltypes_fast = readRDS("./fls/celltypes_fast.rds")
celltypes = readRDS("./fls/celltypes.rds")
# pbmc = readRDS("fls/pbmcs_signac.rds")

This vignette shows how to use Signac with Seurat. There are three parts: Seurat, Signac and then visualization. We use an example PBMCs scRNA-seq data set from 10X Genomics. First, we set up a folder for holding the Signac reference data:

Seurat

Start with the standard pre-processing steps for a Seurat object.

library(Seurat)

Download data from 10X Genomics.

dir.create("fls")
download.file("https://cf.10xgenomics.com/samples/cell-exp/3.0.0/pbmc_1k_v3/pbmc_1k_v3_filtered_feature_bc_matrix.h5", destfile = "fls/pbmc_1k_v3_filtered_feature_bc_matrix.h5")

Create a Seurat object, and then perform SCTransform normalization. Note:

# load data
E = Read10X_h5(filename = "fls/pbmc_1k_v3_filtered_feature_bc_matrix.h5")
pbmc <- CreateSeuratObject(counts = E, project = "pbmc")

# run sctransform
pbmc <- SCTransform(pbmc, verbose = FALSE)

Perform dimensionality reduction by PCA and UMAP embedding. Note:

# These are now standard steps in the Seurat workflow for visualization and clustering
pbmc <- RunPCA(pbmc, verbose = FALSE)
pbmc <- RunUMAP(pbmc, dims = 1:30, verbose = FALSE)
pbmc <- FindNeighbors(pbmc, dims = 1:30, verbose = FALSE)

SignacX

First, make sure you have the Signac package installed.

install.packages("SignacX")

Load the library

# load library
library(SignacX)

Generate SignacX labels for the Seurat object. Note:

# Run Signac
labels <- Signac(pbmc, num.cores = 4)
celltypes = GenerateLabels(labels, E = pbmc)

Sometimes, training the neural networks takes a lot of time. To make Signac faster, we implemented SignacFast which uses an ensemble of pre-trained neural network models. Note:

# Run Signac
labels_fast <- SignacFast(pbmc)
celltypes_fast = GenerateLabels(labels_fast, E = pbmc)

SignacFast took only ~30 seconds. Relative to Signac, the main difference is that SignacFast tends to leave a few more cells "Unclassified."

How does SignacFast compare to Signac?

knitr::kable(table(Signac = celltypes$CellTypes, SignacFast = celltypes_fast$CellTypes), format = "html")

Visualizations

Now we can visualize the cell type classifications at many different levels: Immune and nonimmune

pbmc <- AddMetaData(pbmc, metadata=celltypes$Immune, col.name = "immmune")
pbmc <- SetIdent(pbmc, value='immmune')
png(filename="fls/plot1.png")
DimPlot(pbmc)
dev.off()

Immune, Nonimmune (if any) and unclassified cells

pbmc <- AddMetaData(pbmc, metadata=celltypes$L2, col.name = "L2")
pbmc <- SetIdent(pbmc, value='L2')
png(filename="fls/plot2.png")
DimPlot(pbmc)
dev.off()

Myeloid and lymphocytes

lbls = factor(celltypes$CellTypes)
levels(lbls) <- sort(unique(lbls))
pbmc <- AddMetaData(pbmc, metadata=lbls, col.name = "celltypes")
pbmc <- SetIdent(pbmc, value='celltypes')
png(filename="./fls/plot3.png")
DimPlot(pbmc)
dev.off()

Cell types

pbmc <- AddMetaData(pbmc, metadata=celltypes$CellTypes_novel, col.name = "celltypes_novel")
pbmc <- SetIdent(pbmc, value='celltypes_novel')
png(filename="./fls/plot4.png")
DimPlot(pbmc)
dev.off()

Cell types with novel populations

pbmc <- AddMetaData(pbmc, metadata=celltypes$CellStates, col.name = "cellstates")
pbmc <- SetIdent(pbmc, value='cellstates')
png(filename="./fls/plot5.png")
DimPlot(pbmc)
dev.off()

Cell states

Identify differentially expressed genes between cell types. Here, we see that Signac identified two novel cell populations that are positive for platelet and plasma cell markers, respectively.

pbmc <- SetIdent(pbmc, value='celltypes_novel')

# Find protein markers for all clusters, and draw a heatmap
markers <- FindAllMarkers(pbmc, only.pos = TRUE, verbose = F, logfc.threshold = 1)
library(dplyr)
top5 <- markers %>%  group_by(cluster) %>% top_n(n = 5, wt = avg_logFC)
png(filename="./fls/plot6.png")
DoHeatmap(pbmc, features = unique(top5$gene), angle = 90)
dev.off()

Immune marker genes

Save results

saveRDS(pbmc, file = "fls/pbmcs_signac.rds")
saveRDS(celltypes, file = "fls/celltypes.rds")
saveRDS(celltypes_fast, file = "fls/celltypes_fast.rds")
write.csv(x = t(as.data.frame(all_times)), file = "fls/tutorial_times_signac-Seurat_pbmcs.csv")

Session Info

sessionInfo()



Try the SignacX package in your browser

Any scripts or data that you put into this service are public.

SignacX documentation built on Nov. 18, 2021, 5:07 p.m.