Monocle2包学习笔记(二):Classifying and Counting Cells

image

在单细胞实验中,我们所取的组织样本通常是混杂有多种细胞类型的复杂混合物。解离的组织样本可能包含有两种,三种甚至许多不同的细胞类型。在这种情况下,最好使用已知的marker标记基因根据基因的表达对细胞进行分类。

Classifying cells by type

Monocle2提供了一个简单的系统,可根据我们选择的marker基因的表达来对不同的细胞类型进行标记。

# 选择marker标记基因
MYF5_id <- row.names(subset(fData(HSMM), gene_short_name == "MYF5"))
ANPEP_id <- row.names(subset(fData(HSMM), gene_short_name == "ANPEP"))

cth <- newCellTypeHierarchy()
# 根据MYF5基因的表达标记Myoblast细胞
cth <- addCellType(cth, "Myoblast", classify_func = function(x)
 { x[MYF5_id,] >= 1 })
# 根据MYF5和ANPEP基因的表达标记Fibroblast细胞
cth <- addCellType(cth, "Fibroblast", classify_func = function(x)
 { x[MYF5_id,] < 1 & x[ANPEP_id,] > 1 })

# 使用classifyCells函数对细胞进行分类
HSMM <- classifyCells(HSMM, cth, 0.1)
# 查看分类的结果
table(pData(HSMM)$CellType)

Fibroblast  Myoblast    Unknown
56  85  121

Monocle2使用一个小型的数据结构CellTypeHierarchy对细胞进行分类。首先,初始化一个新的CellTypeHierarchy对象,然后在其中根据筛选条件添加所需标记的细胞类型,建立好数据结构后,我们就可以使用classifyCells函数对所有的细胞进行分类,分类完成后就会在返回的CellDataSet对象中添加了一个新的CellType列,该列中存储着细胞分类后的结果。

# 对细胞分类后的结果进行可视化
pie <- ggplot(pData(HSMM),
aes(x = factor(1), fill = factor(CellType))) + geom_bar(width = 1)
pie + coord_polar(theta = "y") +
theme(axis.title.x = element_blank(), axis.title.y = element_blank())
image

从上图可以看出,许多细胞被分类标记为“Unknown”类型。这很常见,主要是因为在大多数单细胞RNA-Seq实验中,mRNA的捕获率较低。如果一个细胞表达很少量的MYF5 mRNA,我们有可能无法捕获到它。当细胞不满足分类功能中指定的任何条件时,就会将其标记为“Unknown”类型。如果满足多个筛选条件,则会标记为“Ambiguous”类型。虽然我们可以预先排除此类细胞,但会丢弃很多数据。在这种情况下,我们将可能会损失一半以上的细胞!

Clustering cells without marker genes(不依赖marker基因对细胞进行聚类分群)

Monocle2提供了可用于对未知细胞类型进行聚类分群的算法,它通过clusterCells函数根据全局基因的表达情况实现对细胞的聚类分群。clusterCells函数既可以以无监督聚类的方式使用,也可以以半监督聚类的方式使用。
首先,我们看一下无监督聚类模式分类的方法,即不依赖marker基因的表达对细胞进行聚类分群:

disp_table <- dispersionTable(HSMM)
# 筛选基因
unsup_clustering_genes <- subset(disp_table, mean_expression >= 0.1)
# 过滤基因
HSMM <- setOrderingFilter(HSMM, unsup_clustering_genes$gene_id)
plot_ordering_genes(HSMM)
image

首先,我们决定选用哪些基因用于后续的细胞聚类分群。当然,我们可以选择直接使用所有的基因,但是这些基因中会存在一些表达水平不足以提供有意义的信号,而且也会增加许多系统的噪音。所以,我们可以根据基因的平均表达水平对其进行一定的过滤,还可以选择那些在不同细胞中表达变化较大的基因。这些基因倾向于提供有关细胞状态的有用信息。
plot_ordering_genes函数显示了基因表达的变异性(分散性)相对于整个细胞平均表达的分布。 其中,红线表示Monocle2基于此关系拟合的变异期望值,黑点标记的为用于后续聚类的基因,而其他基因显示为灰点。

# HSMM@auxClusteringData[["tSNE"]]$variance_explained <- NULL
plot_pc_variance_explained(HSMM, return_all = F) # norm_method='log'
image
# 降维可视化
# 使用tSNE方法进行降维
HSMM <- reduceDimension(HSMM, max_components = 2, num_dim = 6,
                reduction_method = 'tSNE', verbose = T)
# 使用clusterCells方法进行聚类
HSMM <- clusterCells(HSMM, num_clusters = 2)
# 使用plot_cell_clusters函数对细胞聚类后的结果进行可视化
plot_cell_clusters(HSMM, 1, 2, color = "CellType",
    markers = c("MYF5", "ANPEP"))
image
plot_cell_clusters(HSMM, 1, 2, color = "Media")
image

Monocle2还允许我们消除那些“uninteresting”变异源的影响,以减少它们对聚类的影响,我们可以使用residualModelFormulaStr参数来执行此操作。

HSMM <- reduceDimension(HSMM, max_components = 2, num_dim = 2,
            reduction_method = 'tSNE',
            residualModelFormulaStr = "~Media + num_genes_expressed",
            verbose = T)
HSMM <- clusterCells(HSMM, num_clusters = 2)
plot_cell_clusters(HSMM, 1, 2, color = "CellType")
image
HSMM <- clusterCells(HSMM, num_clusters = 2)
plot_cell_clusters(HSMM, 1, 2, color = "Cluster") +
    facet_wrap(~CellType)
image

Clustering cells using marker genes(依赖marker基因对细胞进行聚类分群)

接下来,我们看一下半监督聚类模式分类的方法,即依赖marker基因的表达对细胞进行聚类分群:
First, we'll select a different set of genes to use for clustering the cells. Before we just picked genes that were highly expressed and highly variable. Now, we'll pick genes that co-vary with our markers. In a sense, we'll be building a large list of genes to use as markers, so that even if a cell doesn't have MYF5, it might be recognizable as a myoblast based on other genes.

marker_diff <- markerDiffTable(
            HSMM[expressed_genes,],
            cth,
            residualModelFormulaStr = "~Media + num_genes_expressed",
            cores = 1)

markerDiffTable函数接受CellDataSet和CellTypeHierarchy作为输入,并根据提供的函数将所有的细胞进行分类。然后,先删除所有“Unknown”和“Ambiguous”的细胞,并识别不同细胞类型之间差异表达的基因。在该函数返回的结果中,我们可以选择要用于后续细胞聚类的基因。通常,最好选择每种细胞类型最特异的前10个或20个基因,这确保了聚类基因不会被某一种细胞类型的标记所控制。

# 选择用于细胞聚类的基因
candidate_clustering_genes <- row.names(subset(marker_diff, qval < 0.01))
# 使用calculateMarkerSpecificity函数计算不同细胞类型特异的marker基因
marker_spec <- calculateMarkerSpecificity(HSMM[candidate_clustering_genes,], cth)
# 查看top marker基因
head(selectTopMarkers(marker_spec, 3))

这里,我们选择每种细胞类型top 500的marker基因用于后续的细胞聚类:

# 选择marker基因
semisup_clustering_genes <- unique(selectTopMarkers(marker_spec, 500)$gene_id)
# 基因过滤
HSMM <- setOrderingFilter(HSMM, semisup_clustering_genes)
plot_ordering_genes(HSMM)
image
plot_pc_variance_explained(HSMM, return_all = F)
image
# 细胞降维聚类可视化
HSMM <- reduceDimension(HSMM, max_components = 2, num_dim = 3,
  norm_method = 'log',
  reduction_method = 'tSNE',
  residualModelFormulaStr = "~Media + num_genes_expressed",
  verbose = T)
HSMM <- clusterCells(HSMM, num_clusters = 2)
plot_cell_clusters(HSMM, 1, 2, color = "CellType")
image

Imputing cell type 估算填充细胞类型

如果为clusterCells函数提供CellTypeHierarcy,Monocle2将使用它对整个细胞集群进行分类,而不仅仅是单个的细胞。实际上,clusterCells的工作原理与以前完全相同,只是在构建细胞cluster之后,它会计算每个cluster中每种细胞类型占比的频率。
当某个cluster由某种细胞类型的特定百分比(如10%)组成时,该cluster中的所有细胞都将会被标记为该类型。如果某个cluster由多个细胞类型组成,则整个cluster都标记为“Ambiguous”。如果没有超出特定百分比阈值的细胞类型,则将该cluster标记为“Unknown”。因此,即使缺少marker标记基因,Monocle2也可以帮助我们估算填充每个细胞的的类型。

HSMM <- clusterCells(HSMM,
              cell_type_hierarchy = cth,
              num_clusters = 2,
              frequency_thresh = 0.1)
plot_cell_clusters(HSMM, 1, 2, color = "CellType",
    markers = c("MYF5", "ANPEP"))
image
# 分类结果可视化
pie <- ggplot(pData(HSMM), 
              aes(x = factor(1), 
              fill = factor(CellType))) +
       geom_bar(width = 1)

pie + coord_polar(theta = "y") +
      theme(axis.title.x = element_blank(), axis.title.y = element_blank())
image

参考来源:http://cole-trapnell-lab.github.io/monocle-release/docs/

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

推荐阅读更多精彩内容