美文网首页单细胞单细胞转录组分析
Seurat官方教程2 | 多模式数据分析

Seurat官方教程2 | 多模式数据分析

作者: 信你个鬼 | 来源:发表于2020-09-23 22:22 被阅读0次

    教程背景

    这个例子演示了允许用户使用Seurat分析和探索多模式数据的新特性。虽然这只是一个初始版本,但我们很高兴在未来为多模态数据集发布重要的新功能。

    在这里,我们分析了由CITE-seq产生的8,617个脐带血单核细胞(CBMCs)的数据集,我们同时测量了单细胞转录组和11个表面蛋白的表达,其水平通过DNA-barcode抗体来量化。首先,我们加载两个计数矩阵:一个用于RNA测量,另一个用于抗体衍生标签ADT。你可以在这里下载ADT文件和RNA文件

    1.加载RNA UMI矩阵

    注意,这个数据集还包含了大约5%的小鼠细胞,我们可以将其作为蛋白质测量的阴性对照。因此,基因表达矩阵在每个基因的开头都附加了HUMAN_或MOUSE_。

    cbmc.rna <- as.sparse(read.csv(file = "Analysis/data/GSE100866_CBMC_8K_13AB_10X-RNA_umi.csv.gz", sep = ",", header = TRUE, row.names = 1))
    

    为了让生活更容易继续下去,我们将抛弃除前100个高度表达的老鼠基因外的所有基因,并从CITE-seq前缀中去除“HUMAN_”

    # 这个函数有几个默认参数,ncontrols = 100,prefix = "HUMAN_",controls = "MOUSE_"
    cbmc.rna <- CollapseSpeciesExpressionMatrix(cbmc.rna)
    

    2.加载ADT UMI矩阵

    cbmc.adt <- as.sparse(read.csv(file = "Analysis/data/GSE100866_CBMC_8K_13AB_10X-ADT_umi.csv.gz", sep = ",", header = TRUE, row.names = 1))
    

    在向Seurat添加多模态数据时,可以使用重复的特性名称。每一组模态数据(例如。RNA、ADT等)储存在自己的Assay对象中。其中一个Assay对象被称为“default assay”,意思是它用于所有的分析和可视化。若要从非默认Assay中提取数据,可以指定一个与Assay链接的键,用于提取特征。要查看所有对象的所有键,请使用Key function。
    最后,我们观察到CCR5、CCR7和CD10的低富集,因此将它们从矩阵中去除(可选)。(关键是这三个蛋白得低富集怎么看出来的?)

    cbmc.adt <- cbmc.adt[setdiff(rownames(x = cbmc.adt), c("CCR5", "CCR7", "CD10")), ]
    

    3.设置一个Seurat对象,并基于RNA表达对细胞进行聚类

    下面的步骤表示基于scRNA-seq数据对pbmc进行快速聚类。有关单个步骤或更高级选项的详细信息,请参见这里的PBMC集群指导教程。

    cbmc <- CreateSeuratObject(counts = cbmc.rna) # 创建seurat对象
    cbmc <- NormalizeData(cbmc) # 标准化
    cbmc <- FindVariableFeatures(cbmc) # 选择高变基因
    cbmc <- ScaleData(cbmc) # 归一化
    cbmc <- RunPCA(cbmc, verbose = FALSE) # 运行PCA降维
    ElbowPlot(cbmc, ndims = 50) # 确定取多少个PCs
    
    Snipaste_2020-09-23_15-09-57.png

    这里教程说选择13个PCs,但是看代码选的是25个,蜜汁迷惑。

    cbmc <- FindNeighbors(cbmc, dims = 1:25)
    cbmc <- FindClusters(cbmc, resolution = 0.8)
    cbmc <- RunTSNE(cbmc, dims = 1:25, method = "FIt-SNE")
    
    # 找到定义每个cluster的标记,并使用它们对cluster进行注释,我们使用max.cells.per加快进程
    cbmc.rna.markers <- FindAllMarkers(cbmc, max.cells.per.ident = 100, min.diff.pct = 0.3, only.pos = TRUE)
    head(cbmc.rna.markers)
                 p_val avg_logFC pct.1 pct.2    p_val_adj cluster  gene
    IL7R  4.280959e-21 1.1368139 0.872 0.274 8.776395e-17       0  IL7R
    LTB   3.149773e-20 1.0246049 0.985 0.525 6.457351e-16       0   LTB
    LDHB  8.557593e-20 0.9786093 0.964 0.527 1.754392e-15       0  LDHB
    TRBC2 9.896619e-18 0.7739586 0.868 0.425 2.028906e-13       0 TRBC2
    IL32  9.951232e-18 0.9599525 0.896 0.327 2.040102e-13       0  IL32
    ITM2A 2.335897e-17 0.8866571 0.786 0.298 4.788822e-13       0 ITM2A
    

    注意,为了简单起见,我们将两个CD14+单核细胞簇(HLA-DR基因表达不同)和NK细胞簇(细胞周期阶段不同)合并。
    这里直接进行了细胞类型注释,注释得过程?

    new.cluster.ids <- c("Memory CD4 T", "CD14+ Mono", "Naive CD4 T", "NK", "CD14+ Mono", "Mouse", "B", 
        "CD8 T", "CD16+ Mono", "T/Mono doublets", "NK", "CD34+", "Multiplets", "Mouse", "Eryth", "Mk", 
        "Mouse", "DC", "pDCs")
    names(new.cluster.ids) <- levels(cbmc)
    cbmc <- RenameIdents(cbmc, new.cluster.ids)
    DimPlot(cbmc, label = TRUE) + NoLegend()
    
    Snipaste_2020-09-23_15-19-12.png

    4.将蛋白质表达水平添加到Seurat对象

    Seurat v3.0允许您将来自多个分析的信息存储在同一个对象中,只要数据是多模态的(在同一组细胞中收集)。您可以使用SetAssayData和GetAssayData访问器函数来添加和从其他分析中获取数据。
    我们将定义一个ADT试验,并为它存储原始计数。
    如果你对这些数据内部如何存储感兴趣,您可以查看Assay类,它在object . R中定义。注意,所有的单细胞表达数据,包括RNA数据,仍然存储在Assay对象中,也可以使用GetAssayData访问。

    cbmc[["ADT"]] <- CreateAssayObject(counts = cbmc.adt)
    

    现在我们可以重复我们通常在RNA上运行的预处理(标准化和缩放)步骤,但是需要修改‘assay’的参数对于CITE-seq数据,我们不建议使用典型的对数标准化。相反,我们使用中心对数比(CLR)归一化,独立计算每个特性。与原始版本相比,这是一个略微改进的过程,我们将很快发布更高级的CITE-seq规范化版本。

    # 这里的标准化方法是CLR
    cbmc <- NormalizeData(cbmc, assay = "ADT", normalization.method = "CLR")
    cbmc <- ScaleData(cbmc, assay = "ADT")
    

    5.观察RNA簇上的蛋白水平

    您可以使用任何ADT标记的名称。“adt_CD4”),在FetchData、FeaturePlot、RidgePlot、FeatureScatter、DoHeatmap或任何其他可视化特性中。
    Q1:这里得ADTfeatures为什么突然多了三个字母adt_
    Q2:这里得蛋白和RNA对应得表达水平,从下图可以看出来什么?

    # in this plot, protein (ADT) levels are on top, and RNA levels are on the bottom
    FeaturePlot(cbmc, features = c("adt_CD3", "adt_CD11c", "adt_CD8", "adt_CD16", "CD3E", "ITGAX", "CD8A", 
        "FCGR3A"), min.cutoff = "q05", max.cutoff = "q95", ncol = 4)
    

    在这个图中,蛋白质(ADT)水平在上面,RNA水平在下面。

    Snipaste_2020-09-23_15-31-28.png

    山脊图绘制

    RidgePlot(cbmc, features = c("adt_CD3", "adt_CD11c", "adt_CD8", "adt_CD16"), ncol = 2)
    
    Snipaste_2020-09-23_15-32-53.png

    绘制ADT散点图(如FACS的双轴图)。注意,如果需要的话,你甚至可以使用HoverLocator和FeatureLocator来“gate”细胞。

    FeatureScatter(cbmc, feature1 = "adt_CD19", feature2 = "adt_CD3")
    
    Snipaste_2020-09-23_15-35-09.png

    查看蛋白质和RNA之间的关系

    FeatureScatter(cbmc, feature1 = "adt_CD3", feature2 = "CD3E")
    
    image.png

    查看T细胞中CD4和CD8的水平

    tcells <- subset(cbmc, idents = c("Naive CD4 T", "Memory CD4 T", "CD8 T"))
    FeatureScatter(tcells, feature1 = "adt_CD4", feature2 = "adt_CD8")
    
    Snipaste_2020-09-23_15-39-57.png

    让我们看看原始的(非标准化的)ADT的count值。你可以看到这些值相当高,特别是与RNA值相比。这是由于细胞中蛋白质拷贝数显著增加,这大大减少了ADT数据中的“drop-out”。
    对于drop-out如何理解?

    FeatureScatter(tcells, feature1 = "adt_CD4", feature2 = "adt_CD8", slot = "counts")
    
    image.png

    如果你仔细观察,你会发现我们的CD8 T细胞群富含CD8 T细胞,但仍然包含许多CD4+ CD8- T细胞。这是因为初始CD4和CD8 T细胞在转录上非常相似,CD4和CD8的RNA丢失水平相当高。这说明了单独从scRNA-seq数据中定义细微的免疫细胞差异的挑战。

    saveRDS(cbmc, file = "Analysis/cbmc.rds")
    

    6.识别簇间差异表达的蛋白

    对cluster进行采样,每个cluster最多300个细胞(使小cluster的热图更容易看到)。

    cbmc.small <- subset(cbmc, downsample = 300)
    

    找到所有cluster的蛋白质标记,并绘制一个热图。

    adt.markers <- FindAllMarkers(cbmc.small, assay = "ADT", only.pos = TRUE)
    DoHeatmap(cbmc.small, features = unique(adt.markers$gene), assay = "ADT", angle = 90) + NoLegend()
    
    image.png

    你可以看到我们的未知细胞同时表达骨髓和淋巴标记(在RNA水平上也是如此)。它们可能是应该被丢弃的细胞团块(多胞胎)。我们现在也要移除老鼠细胞。

    cbmc <- subset(cbmc, idents = c("Multiplets", "Mouse"), invert = TRUE)
    

    7.直接在蛋白质水平上聚类

    还可以直接在CITE-seq数据上运行降维和基于图的聚类。

    #因为我们将广泛地使用ADT数据,所以我们将把默认assay改为“ADT”assay。这将导致所有函数默认使用ADT数据,而不是要求我们每次都指定它
    DefaultAssay(cbmc) <- "ADT"
    cbmc <- RunPCA(cbmc, features = rownames(cbmc), reduction.name = "pca_adt", reduction.key = "pca_adt_", 
        verbose = FALSE)
    DimPlot(cbmc, reduction = "pca_adt")
    
    image.png

    在我们在ADT级别上重新聚类数据之前,我们将稍后隐藏RNA集群id。

    cbmc[["rnaClusterID"]] <- Idents(cbmc)
    

    现在,我们仅在ADT(蛋白质)水平上使用PCA重新计算tSNE。

    cbmc <- RunTSNE(cbmc, dims = 1:10, reduction = "pca_adt", reduction.key = "adtTSNE_", reduction.name = "tsne_adt")
    cbmc <- FindNeighbors(cbmc, features = rownames(cbmc), dims = NULL)
    cbmc <- FindClusters(cbmc, resolution = 0.2, graph.name = "ADT_snn")
    

    我们可以比较RNA和蛋白质的聚类,并使用它来注释蛋白质聚类。
    (当然,我们也可以使用findmarker)

    clustering.table <- table(Idents(cbmc), cbmc$rnaClusterID)
    clustering.table
         Memory CD4 T CD14+ Mono Naive CD4 T   NK    B CD8 T CD16+ Mono T/Mono doublets CD34+ Eryth   Mk   DC
      0          1754          0        1217   29    0    27          0               5     2     4   24    1
      1             0       2189           0    4    0     0         30               1     1     5   25   55
      2             3          0           2  890    3     1          0               0     1     3    7    2
      3             0          4           0    2  319     0          2               0     2     2    3    0
      4            24          0          18    4    1   243          0               0     0     1    2    0
      5             1         27           4  157    2     2         10              56     0     9   16    6
      6             4          5           0    1    0     0          0               1   113    81   16    5
      7             4         59           4    0    0     0          9             117     0     0    2    0
      8             0          9           0    2    0     0        179               0     0     0    1    0
      9             0          0           1    0    0     0          0               0     0     0    0    1
      10            1          0           2    0   25     0          0               2     0     0    0    0
        
         pDCs
      0     2
      1     0
      2     1
      3     0
      4     0
      5     2
      6     0
      7     1
      8     0
      9    43
      10    0
    

    根据上面的结果对蛋白质水平的细胞进行细胞类型鉴定

    new.cluster.ids <- c("CD4 T", "CD14+ Mono", "NK", "B", "CD8 T", "NK", "CD34+", "T/Mono doublets", 
        "CD16+ Mono", "pDCs", "B")
    names(new.cluster.ids) <- levels(cbmc)
    cbmc <- RenameIdents(cbmc, new.cluster.ids)
    
    tsne_rnaClusters <- DimPlot(cbmc, reduction = "tsne_adt", group.by = "rnaClusterID") + NoLegend()
    tsne_rnaClusters <- tsne_rnaClusters + ggtitle("Clustering based on scRNA-seq") + theme(plot.title = element_text(hjust = 0.5))
    tsne_rnaClusters <- LabelClusters(plot = tsne_rnaClusters, id = "rnaClusterID", size = 4)
    
    tsne_adtClusters <- DimPlot(cbmc, reduction = "tsne_adt", pt.size = 0.5) + NoLegend()
    tsne_adtClusters <- tsne_adtClusters + ggtitle("Clustering based on ADT signal") + theme(plot.title = element_text(hjust = 0.5))
    tsne_adtClusters <- LabelClusters(plot = tsne_adtClusters, id = "ident", size = 4)
    

    注意:为了进行比较,RNA和蛋白的聚类都是在使用ADT距离矩阵生成的tSNE上显示的。

    wrap_plots(list(tsne_rnaClusters, tsne_adtClusters), ncol = 2)
    
    image.png

    基于adt的聚类产生了类似的结果,但有一些区别:

    • 基于CD4、CD8、CD14和CD45RA的强大ADT数据,CD4/CD8 T细胞群的聚类得到了改善
    • 然而,一些ADT数据中不包含有很好的区别蛋白标记的簇(如Mk/Ery/DC)会失去分离
    • 也可以在RNA水平上使用findmarker验证这一点
    tcells <- subset(cbmc, idents = c("CD4 T", "CD8 T"))
    FeatureScatter(tcells, feature1 = "CD4", feature2 = "CD8")
    
    image.png
    RidgePlot(cbmc, features = c("adt_CD11c", "adt_CD8", "adt_CD16", "adt_CD4", "adt_CD19", "adt_CD14"), 
        ncol = 2)
    
    image.png

    保存结果

    saveRDS(cbmc, file = "Analysis/cbmc_multimodal.rds")
    

    相关文章

      网友评论

        本文标题:Seurat官方教程2 | 多模式数据分析

        本文链接:https://www.haomeiwen.com/subject/dxkoyktx.html