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

教程背景

这个例子演示了允许用户使用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")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,230评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,261评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,089评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,542评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,542评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,544评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,922评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,578评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,816评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,576评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,658评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,359评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,920评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,859评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,381评论 2 342