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.
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)
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")
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()
pbmc <- AddMetaData(pbmc, metadata=celltypes$L2, col.name = "L2") pbmc <- SetIdent(pbmc, value='L2') png(filename="fls/plot2.png") DimPlot(pbmc) dev.off()
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()
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()
pbmc <- AddMetaData(pbmc, metadata=celltypes$CellStates, col.name = "cellstates") pbmc <- SetIdent(pbmc, value='cellstates') png(filename="./fls/plot5.png") DimPlot(pbmc) dev.off()
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()
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()
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.