• 本教程已更新,更新时间:
  • 2019/12/27

摘要

一文介绍单细胞测序生物信息分析完整流程,这可能是最新也是最全的流程

基础流程(cellranger)

单细胞测序分析流程 - 图1

cellranger 数据拆分

cellranger mkfastq可用于将单细胞测序获得的 BCL 文件拆分为可以识别的 fastq 测序数据

  1. cellranger makefastq --run=[ ] --samplesheet=[sample.csv] --jobmode=local --localcores=20 --localmem=80

-–run :是下机数据 BCL 所在的路径;
-–samplesheet :样品信息列表—共三列(lane id ,sample name ,index name)
注意要控制好核心数和内存数

运行产出结果存在于 out 目录中

cellranger 数据统计

cellranger count是 cellranger 最主要也是最重要的功能:完成细胞和基因的定量,也就是产生了我们用来做各种分析的基因表达矩阵。

  1. cellranger count \
  2. -–id=sample345 \
  3. -–transcriptome=/opt/refdata-cellranger-GRCh38-1.2.0/GRCh38 \
  4. -–fastqs=/home/jdoe/runs/HAWT7ADXX/outs/fastq_path \
  5. -–indices=SI-3A-A1 \
  6. –-cells=1000

id :产生的结果都在这个文件中,可以取几号样品(如 sample345);

fastqs :由 cellranger mkfastq 产生的 fastqs 文件夹所在的路径;fastqs :由 cellranger mkfastq 产生的 fastqs 文件夹所在的路径;

indices:sample index:SI-3A-A1;

transcriptome:参考转录组文件路径;

cells:预期回复的细胞数;

下游分析

cellranger count 计算的结果只能作为初步观测的结果,如果需要进一步分析聚类细胞,还需要进行下游分析,这里使用官方推荐 R 包(Seurat 3.1)

流程参考官方(外周血分析标准流程

软件安装

  1. install.packages('Seurat')
  2. library(Seurat)

生成 Seruat 对象

  1. library(dplyr)
  2. library(Seurat)
  3. # Load the PBMC dataset
  4. pbmc.data <- Read10X(data.dir = "../data/pbmc3k/filtered_gene_bc_matrices/hg19/")
  5. # Initialize the Seurat object with the raw (non-normalized data).
  6. pbmc <- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200)
  7. pbmc
  1. ## An object of class Seurat
  2. ## 13714 features across 2700 samples within 1 assay
  3. ## Active assay: RNA (13714 features)

这里读取的是单细胞 count 结果中的矩阵目录;
在对象生成的过程中,做了初步的过滤;
留下所有在>=3 个细胞中表达的基因 min.cells = 3;
为了除去一些质量差的细胞,留下所有检测到>=200 个基因的细胞 min.genes = 200。

标准预处理流程

  1. # The [[ operator can add columns to object metadata. This is a great place to stash QC stats
  2. pbmc[["percent.mt"]] <- PercentageFeatureSet(object = pbmc, pattern = "^MT-")

这一步 mit-开头的为线粒体基因,这里将其进行标记并统计其分布频率

  1. # Visualize QC metrics as a violin plot
  2. VlnPlot(object = pbmc, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)

对 pbmc 对象做小提琴图,分别为基因数,细胞数和线粒体占比

单细胞测序分析流程 - 图2

  1. pbmc <- subset(x = pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)

接下来,根据图片中基因数和线粒体数,分别设置过滤参数,这里基因数 200-2500,线粒体百分比为小于 5%

数据标准化

  1. pbmc <- NormalizeData(object = pbmc, normalization.method = "LogNormalize", scale.factor = 10000)
  2. pbmc <- NormalizeData(object = pbmc)

鉴定高度变化基因

  1. pbmc <- FindVariableFeatures(object = pbmc, selection.method = "vst", nfeatures = 2000)
  2. # Identify the 10 most highly variable genes
  3. top10 <- head(x = VariableFeatures(object = pbmc), 10)
  4. # plot variable features with and without labels
  5. plot1 <- VariableFeaturePlot(object = pbmc)
  6. plot2 <- LabelPoints(plot = plot1, points = top10, repel = TRUE)
  7. CombinePlots(plots = list(plot1, plot2))

单细胞测序分析流程 - 图3

数据归一化

  1. all.genes <- rownames(x = pbmc)
  2. pbmc <- ScaleData(object = pbmc, features = all.genes)

这里设置对所有的基因都做了scale,但是需要知道的是,其实后续的分析都是基于高变基因的,因此,使用默认参数就可以了,而且提升效率。

  1. pbmc <- ScaleData(object = pbmc)

线形降维

  1. pbmc <- RunPCA(object = pbmc, features = VariableFeatures(object = pbmc))

这里有多种方法展示 pca 结果,本文采用最简单的方法

  1. DimPlot(object = pbmc, reduction = "pca")

鉴定数据集的可用维度

  1. pbmc <- JackStraw(object = pbmc, num.replicate = 100)
  2. pbmc <- ScoreJackStraw(object = pbmc, dims = 1:20)
  3. JackStrawPlot(object = pbmc, dims = 1:15)

单细胞测序分析流程 - 图4

虚线以上的为可用维度,你也可以调整 dims 参数,画出所有 pca 查看

另外一种鉴定手段是绘制所有PC的分布点图

  1. ElbowPlot(pbmc)

单细胞测序分析流程 - 图5

大多数软件都是通过拾取拐点处的pc作为选定数目

细胞聚类

  1. pbmc <- FindNeighbors(object = pbmc, dims = 1:10)
  2. pbmc <- FindClusters(object = pbmc, resolution = 0.5)

这里的 dims 为上一步计算所用的维度数,而 resolution 参数控制聚类的数目,针对3K的细胞数目,最好的范围是0.4-1.2

  1. head(Idents(pbmc), 5)
  1. ## AAACATACAACCAC AAACATTGAGCTAC AAACATTGATCAGC AAACCGTGCTTCCG AAACCGTGTATGCG
  2. ## 1 3 1 2 6
  3. ## Levels: 0 1 2 3 4 5 6 7 8

执行非线性降维

这里注意,这一步聚类有两种聚类方法(umap/tSNE),两种方法都可以使用,但不要混用,这样,后面的结算结果会将先前的聚类覆盖掉,只能保留一个
本文采用基于umap的聚类方法

  1. pbmc <- RunUMAP(object = pbmc, dims = 1:10)
  2. DimPlot(object = pbmc, reduction = "umap")

单细胞测序分析流程 - 图6
完成聚类后,一定要记住保存数据,不然重新计算可要头疼了

  1. saveRDS(pbmc, file = "../output/pbmc_tutorial.rds")

寻找每个聚类中显著表达的基因

  1. cluster1.markers <- FindMarkers(object = pbmc, ident.1 = 1, min.pct = 0.25)
  2. head(x = cluster1.markers, n = 5)

这样是寻找单个聚类中的显著基因

  1. cluster5.markers <- FindMarkers(object = pbmc, ident.1 = 5, ident.2 = c(0, 3), min.pct = 0.25)
  2. head(x = cluster5.markers, n = 5)

这样寻找所有聚类中显著基因,计算速度很慢,需要等待

另外,我们有多种方法统计基因的显著性

  1. FeaturePlot(object = pbmc, features = c("MS4A1", "GNLY", "CD3E", "CD14", "FCER1A", "FCGR3A", "LYZ",
  2. "PPBP", "CD8A"))

单细胞测序分析流程 - 图7

  1. top10 <- pbmc.markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_logFC)
  2. DoHeatmap(object = pbmc, features = top10$gene) + NoLegend()

单细胞测序分析流程 - 图8

剩下的便是寻找基因 marker 并对细胞类型进行注释

你可能想要知道如何对多样本进行整合分析,请参考教程:整合刺激性和对照性PBMC数据集,以学习细胞类型特异性反应

你可能想了解如何灵活操作Seurat的S4对象,以便轻松的提取表达矩阵;亦或者想要做一些不一样的可视化效果,例如采用平均表达量做热图展示等,请参考Seurat3.1的灵活操作指南

你可能想对单细胞数据做进一步分析,例如功能分析,请参考10X单细胞数据针对细胞及其亚型的基因集功能分析和转录调控分析

全自动细胞类型注释

众所周知,细胞类型的注释是最困难的一步,除非你有很强的对细胞基因的敏感度,不然很难识别细胞类型。

通常识别细胞类型的方法主要有三种

这里简单介绍下SingleR

SingleR:一个全自动细胞注释的 R 包,用法很简单

软件安装

  1. BiocManager::install("SingleR")
  2. browseVignettes("SingleR")

创建 SingleR 对象

从头预测的方法请参考官方教程

因为我们刚刚从Seurat过来的,所以我们应该很想知道Seurat cluster 的细胞注释结果,因此,对Seurat的结果进行注释

我们这里采用两个人类的参考集去做细胞注释

  1. library(Seurat)
  2. library(SingleR)
  3. library(dplyr)
  4. library(tibble)
  5. hpca.se <- HumanPrimaryCellAtlasData()
  6. bpe.se <- BlueprintEncodeData()

读入Seurat对象转换为SingleCell支持的对象

  1. seurat.obj <- readRDS("../output/pbmc_tutorial.rds")
  2. seurat.obj@meta.data$cell.type <- Idents(seurat.obj)
  3. test <- as.SingleCellExperiment(seurat.obj)

采用两个参考集一起进行注释,

  1. Anno <- SingleR(test = test,
  2. ref = list(HP = hpca.se , BP = bpe.se),
  3. labels = list(hpca.se$label.main , bpe.se$label.main),
  4. method = "cluster",
  5. cluster = test$cell.type)

提取需要的细胞分类信息

  1. Anno$cluster <- rownames(Anno)
  2. fin <- Anno %>% dplyr::tbl_df() %>% dplyr::select(cluster,labels)

你也可以将细胞注释信息重新添加到Seurat对象中去

  1. new.cluster.ids <- fin$labels
  2. names(new.cluster.ids) <- levels(seurat.obj)
  3. seurat.obj <- RenameIdents(seurat.obj, new.cluster.ids)

伪时间分析

伪时间分析建议采用 monocle3.0 软件

软件安装

  1. ##安装依赖
  2. BiocManager::install(c('BiocGenerics', 'DelayedArray', 'DelayedMatrixStats',
  3. 'limma', 'S4Vectors', 'SingleCellExperiment',
  4. 'SummarizedExperiment', 'batchelor'))
  5. ##安装monocle3
  6. devtools::install_github('cole-trapnell-lab/leidenbase')
  7. devtools::install_github('cole-trapnell-lab/monocle3')
  8. library(monocle3)

标准分析流

  1. library(Seurat)
  2. library(monocle3)
  3. endo<-readRDS("../output/pbmc_tutorial.rds")
  4. data <- endo@assays$RNA@counts
  5. pd <- endo@meta.data

不要直接把meta.data放入pd中去,太多没用的信息了,先清理下

  1. new_pd<-select(pd,nCount_RNA,nFeature_RNA,percent.mt)
  2. new_pd$Cell.type<-Idents(endo)
  3. head(new_pd)
  4. nCount_RNA nFeature_RNA percent.mt
  5. AAACCTGGTATCAGTC-1_1 4835 1383 3.536711
  6. AACCGCGCATTCCTGC-1_1 4029 1230 2.655746
  7. AACGTTGAGCCCAATT-1_1 2576 918 3.377329
  8. AAGACCTGTGGTTTCA-1_1 2841 1044 5.455825
  9. AAGTCTGCATGAAGTA-1_1 3731 1213 3.886358
  10. ACAGCCGCATCGGACC-1_1 5915 1918 3.043111
  11. Cell.type
  12. AAACCTGGTATCAGTC-1_1 DC2
  13. AACCGCGCATTCCTGC-1_1 MDSC
  14. AACGTTGAGCCCAATT-1_1 MDSC
  15. AAGACCTGTGGTTTCA-1_1 Dendritic.cells.activated
  16. AAGTCTGCATGAAGTA-1_1 MDSC
  17. ACAGCCGCATCGGACC-1_1 Dendritic.cells.activated
  18. fData <- data.frame(gene_short_name = row.names(data), row.names = row.names(data))

生成monoclecds对象

  1. cds <- new_cell_data_set(data,cell_metadata = new_pd,gene_metadata = fData)

运行下游标准流程,无论如何都得跑,是必须的默认流程

  1. cds <- preprocess_cds(cds, num_dim = 30)
  2. #umap
  3. cds <- reduce_dimension(cds,umap.n_neighbors = 20L)
  4. #color by seurat cluster
  5. plot_cells(cds,label_groups_by_cluster=FALSE,color_cells_by = "Cell.type")

单细胞测序分析流程 - 图9

  1. #cluster
  2. cds <- cluster_cells(cds,resolution = 0.5)
  3. #color by monocle cluster
  4. plot_cells(cds, color_cells_by = "partition",label_groups_by_cluster=FALSE)

单细胞测序分析流程 - 图10

  1. cds <- learn_graph(cds)
  2. plot_cells(cds,color_cells_by = "Cell.type",label_groups_by_cluster=FALSE,label_leaves=TRUE,label_branch_points=TRUE)

单细胞测序分析流程 - 图11

定义时间开始节点&&伪时间分析

  1. ##一个有用的寻找起源节点的函数
  2. get_earliest_principal_node <- function(cds, time_bin="Dendritic.cells.activated"){
  3. cell_ids <- which(colData(cds)[, "Cell.type"] == time_bin)
  4. closest_vertex <-
  5. cds@principal_graph_aux[["UMAP"]]$pr_graph_cell_proj_closest_vertex
  6. closest_vertex <- as.matrix(closest_vertex[colnames(cds), ])
  7. root_pr_nodes <-
  8. igraph::V(principal_graph(cds)[["UMAP"]])$name[as.numeric(names
  9. (which.max(table(closest_vertex[cell_ids,]))))]
  10. root_pr_nodes
  11. }
  12. #order cell
  13. cds <- order_cells(cds, root_pr_nodes=get_earliest_principal_node(cds))
  14. #pseudotime analysis
  15. plot_cells(cds,color_cells_by = "pseudotime",label_cell_groups=FALSE,label_leaves=FALSE,label_branch_points=FALSE,graph_label_size=1.5)

单细胞测序分析流程 - 图12

PS:对多样本进行伪时间分析,请参考使用Monocle3对多样本单细胞数据进行伪时间分析

本文纯属原创,部分数据采用官方教程,转载需标明出处

教程链接: