image
Monocle2使用反向圖嵌入(Reversed Graph Embedding)的機(jī)器學(xué)習(xí)算法,來(lái)對(duì)單細(xì)胞RNA-seq數(shù)據(jù)進(jìn)行單細(xì)胞發(fā)育軌跡推斷分析。Monocle2不是通過(guò)實(shí)驗(yàn)方法將細(xì)胞純化成不同的離散狀態(tài),而是使用一種算法來(lái)學(xué)習(xí)每個(gè)細(xì)胞在動(dòng)態(tài)生物學(xué)過(guò)程中經(jīng)歷的基因表達(dá)變化的順序。一旦它了解了基因表達(dá)變化的整體“軌跡”,Monocle2就可以將每個(gè)細(xì)胞分配到發(fā)育軌跡中的適當(dāng)位置中。并且,我們還可以使用Monocle2的差異分析工具來(lái)查找在發(fā)育軌跡過(guò)程中受到調(diào)控的基因。如果這個(gè)發(fā)育過(guò)程中存在多個(gè)分支結(jié)果,Monocle2將重建一個(gè)“分支”軌跡。這些不同的分支與細(xì)胞的“決策”相對(duì)應(yīng),Monocle2提供了強(qiáng)大的分析工具來(lái)識(shí)別受它們影響的基因,并參與這些基因的形成。
在整個(gè)生命的發(fā)育過(guò)程中,細(xì)胞會(huì)對(duì)不同的刺激做出相應(yīng)的響應(yīng),從一種功能“狀態(tài)”轉(zhuǎn)變到另一種功能“狀態(tài)”。不同狀態(tài)下的細(xì)胞會(huì)表達(dá)不同的基因,產(chǎn)生不同的蛋白質(zhì)及其代謝產(chǎn)物,從而實(shí)現(xiàn)不同功能狀態(tài)下的工作。當(dāng)細(xì)胞在不同功能狀態(tài)之間轉(zhuǎn)變時(shí),它們會(huì)經(jīng)歷一個(gè)轉(zhuǎn)錄重新配置的過(guò)程,其中一些基因的表達(dá)被沉默,而另一些基因則被激活。這些細(xì)胞的瞬時(shí)狀態(tài)通常很難被表征,因?yàn)樵诟€(wěn)定的端點(diǎn)狀態(tài)之間純化細(xì)胞可能是非常困難的或不可能的。單細(xì)胞RNA-Seq技術(shù)可以使我們?cè)诓恍枰兓?xì)胞的情況下,通過(guò)擬時(shí)序分析推斷出這些瞬時(shí)狀態(tài)下的細(xì)胞狀態(tài)。然而,要做到這一點(diǎn),我們必須確定每個(gè)細(xì)胞在可能的狀態(tài)范圍內(nèi)的位置。
細(xì)胞排序的工作流程
Trajectory step 1: choose genes that define a cell's progress(選擇用于定義細(xì)胞進(jìn)程的基因)
首先,我們必須選擇用哪些基因去用于后續(xù)的細(xì)胞排序過(guò)程,這個(gè)過(guò)程稱為特征選擇(feature selection),篩選出的這些基因?qū)罄m(xù)細(xì)胞軌跡的形狀有著最重要的影響。因此,我們應(yīng)該盡可能的選擇那些最能反映細(xì)胞狀態(tài)的基因。
這里,我們需要選擇用哪些基因來(lái)定義細(xì)胞肌發(fā)生的進(jìn)程。我們最終希望能獲得一組基因集,這些基因的表達(dá)隨著研究的發(fā)育過(guò)程的進(jìn)展而增加(或減少)。篩選用于細(xì)胞排序的基因的一種有效方法是,將發(fā)育過(guò)程開(kāi)始時(shí)收集的細(xì)胞與結(jié)束時(shí)收集的細(xì)胞簡(jiǎn)單地進(jìn)行比較,并找到差異表達(dá)的基因。
# 使用differentialGeneTest函數(shù)進(jìn)行差異分析
diff_test_res <- differentialGeneTest(HSMM_myo[expressed_genes,],
fullModelFormulaStr = "~Media")
# 提取顯著的差異表達(dá)基因
ordering_genes <- row.names (subset(diff_test_res, qval < 0.01))
# 細(xì)胞篩選過(guò)濾
HSMM_myo <- setOrderingFilter(HSMM_myo, ordering_genes)
# 篩選結(jié)果可視化
plot_ordering_genes(HSMM_myo)
上圖中,那些黑色的點(diǎn)對(duì)應(yīng)的基因,即為篩選出的用于后續(xù)對(duì)細(xì)胞進(jìn)行排序的基因。
Trajectory step 2: reduce data dimensionality(降低數(shù)據(jù)的維度)
接下來(lái),我們使用reduceDimension函數(shù)對(duì)篩選出的基因進(jìn)行數(shù)據(jù)降維處理,
# 使用reduceDimension函數(shù)進(jìn)行數(shù)據(jù)降維,并指定method = 'DDRTree'參數(shù)使用DDRTree方法
HSMM_myo <- reduceDimension(HSMM_myo, max_components = 2,
method = 'DDRTree')
Trajectory step 3: order cells along the trajectory(根據(jù)發(fā)育軌跡對(duì)細(xì)胞進(jìn)行排序)
最后,對(duì)于降維后的數(shù)據(jù),我們將使用orderCells函數(shù)對(duì)細(xì)胞按發(fā)育軌跡進(jìn)行排序。
# 使用orderCells函數(shù)進(jìn)行細(xì)胞排序
HSMM_myo <- orderCells(HSMM_myo)
# 使用plot_cell_trajectory函數(shù)對(duì)排序的細(xì)胞進(jìn)行可視化
plot_cell_trajectory(HSMM_myo, color_by = "Hours")
從上圖可以看出,該細(xì)胞發(fā)育軌跡呈樹(shù)狀結(jié)構(gòu)。其中,在0時(shí)收集的細(xì)胞大多位于樹(shù)的頂端之一附近,而其他的則分布在兩個(gè)“分支”之間。Monocle2不知道先驗(yàn)樹(shù)的哪個(gè)軌跡作為“beginning”,因此我們經(jīng)常不得不使用
root_state參數(shù)再次調(diào)用orderCells函數(shù)來(lái)指定起點(diǎn)。
plot_cell_trajectory(HSMM_myo, color_by = "State")
這里我們使用細(xì)胞所處的狀態(tài)對(duì)細(xì)胞進(jìn)行著色。
GM_state <- function(cds){
if (length(unique(pData(cds)$State)) > 1){
T0_counts <- table(pData(cds)$State, pData(cds)$Hours)[,"0"]
return(as.numeric(names(T0_counts)[which
(T0_counts == max(T0_counts))]))
} else {
return (1)
}
}
# 使用root_state參數(shù)指定起點(diǎn)
HSMM_myo <- orderCells(HSMM_myo, root_state = GM_state(HSMM_myo))
# 根據(jù)偽時(shí)間對(duì)細(xì)胞進(jìn)行著色
plot_cell_trajectory(HSMM_myo, color_by = "Pseudotime")
# 根據(jù)細(xì)胞的狀態(tài)進(jìn)行分面展示
plot_cell_trajectory(HSMM_myo, color_by = "State") +
facet_wrap(~State, nrow = 1)
如果我們沒(méi)有時(shí)間序列數(shù)據(jù),則可能需要根據(jù)已有的生物學(xué)知識(shí),利用某些marker標(biāo)記基因的表達(dá)來(lái)設(shè)置root。例如,在該實(shí)驗(yàn)中,高度增殖的祖細(xì)胞群正在產(chǎn)生兩種類(lèi)型的有絲分裂后細(xì)胞。因此,根部應(yīng)具有表達(dá)高水平增殖marker基因的細(xì)胞。我們可以使用抖動(dòng)圖來(lái)可視化marker基因的表達(dá),找出marker基因的哪個(gè)狀態(tài)對(duì)應(yīng)于快速增殖的細(xì)胞:
# 選擇marker基因
blast_genes <- row.names(subset(fData(HSMM_myo),
gene_short_name %in% c("CCNB2", "MYOD1", "MYOG")))
# 使用plot_genes_jitter函數(shù)可視化marker基因的表達(dá)
plot_genes_jitter(HSMM_myo[blast_genes,],
grouping = "State",
min_expr = 0.1)
為了確認(rèn)細(xì)胞排序的準(zhǔn)確性,我們可以選擇成肌過(guò)程的幾個(gè)marker基因,繪制它們的表達(dá)在偽時(shí)間過(guò)程中的變化。
HSMM_expressed_genes <- row.names(subset(fData(HSMM_myo),
num_cells_expressed >= 10))
HSMM_filtered <- HSMM_myo[HSMM_expressed_genes,]
# 篩選marker基因
my_genes <- row.names(subset(fData(HSMM_filtered),
gene_short_name %in% c("CDK1", "MEF2C", "MYH3")))
cds_subset <- HSMM_filtered[my_genes,]
# 使用plot_genes_in_pseudotime函數(shù)可視化marker基因的表達(dá)
plot_genes_in_pseudotime(cds_subset, color_by = "Hours")
Alternative choices for ordering genes
Ordering based on genes that differ between clusters
我們建議用戶使用通過(guò)無(wú)監(jiān)督程序“dpFeature”選擇的基因用于后續(xù)的細(xì)胞排序。
要使用dpFeature,我們首先篩選出至少在5%的所有細(xì)胞中都表達(dá)的基因。
HSMM_myo <- detectGenes(HSMM_myo, min_expr = 0.1)
fData(HSMM_myo)$use_for_ordering <- fData(HSMM_myo)$num_cells_expressed > 0.05 * ncol(HSMM_myo)
接下來(lái),我們執(zhí)行PCA分析,以識(shí)別每個(gè)PC所能解釋的方差,可以通過(guò)繪制碎石圖來(lái)查看選擇需要的PC。
plot_pc_variance_explained(HSMM_myo, return_all = F)
然后,我們將那些主要的PC使用t-SNE降維的方法進(jìn)行降維處理,并將其投影到二維層面進(jìn)行可視化展示。
# 使用reduceDimension函數(shù)進(jìn)行數(shù)據(jù)降維
HSMM_myo <- reduceDimension(HSMM_myo,
max_components = 2,
norm_method = 'log',
num_dim = 3,
reduction_method = 'tSNE',
verbose = T)
# 使用clusterCells函數(shù)對(duì)細(xì)胞進(jìn)行聚類(lèi)分群
HSMM_myo <- clusterCells(HSMM_myo, verbose = F)
# 使用plot_cell_clusters函數(shù)對(duì)聚類(lèi)后的結(jié)果進(jìn)行可視化
plot_cell_clusters(HSMM_myo, color_by = 'as.factor(Cluster)')
plot_cell_clusters(HSMM_myo, color_by = 'as.factor(Hours)')
After we confirm the clustering makes sense, we can then perform differential gene expression test as a way to extract the genes that distinguish them.
# 使用differentialGeneTest函數(shù)進(jìn)行差異表達(dá)分析
clustering_DEG_genes <- differentialGeneTest(HSMM_myo[HSMM_expressed_genes,],
fullModelFormulaStr = '~Cluster',
cores = 1)
We will then select the top 1000 significant genes as the ordering genes.
# 選擇top 1000的基因
HSMM_ordering_genes <- row.names(clustering_DEG_genes)[order(clustering_DEG_genes$qval)][1:1000]
HSMM_myo <- setOrderingFilter(HSMM_myo, ordering_genes = HSMM_ordering_genes)
# 數(shù)據(jù)降維
HSMM_myo <- reduceDimension(HSMM_myo, method = 'DDRTree')
# 細(xì)胞排序
HSMM_myo <- orderCells(HSMM_myo)
# 設(shè)置root狀態(tài)
HSMM_myo <- orderCells(HSMM_myo, root_state = GM_state(HSMM_myo))
# 排序結(jié)果可視化
plot_cell_trajectory(HSMM_myo, color_by = "Hours")
Selecting genes with high dispersion across cells
變化很大的基因通常對(duì)于識(shí)別細(xì)胞亞群或沿著軌跡排序細(xì)胞很有幫助。在單細(xì)胞RNA-Seq中,基因的變異通常取決于其均值,因此我們必須謹(jǐn)慎選擇如何根據(jù)它們的變化來(lái)選擇基因。
disp_table <- dispersionTable(HSMM_myo)
ordering_genes <- subset(disp_table,
mean_expression >= 0.5 &
dispersion_empirical >= 1 * dispersion_fit)$gene_id
Ordering cells using known marker genes
無(wú)監(jiān)督聚類(lèi)對(duì)細(xì)胞進(jìn)行排序是可取的,因?yàn)樗苊饬嗽诜治鲋幸肫?。但是,無(wú)監(jiān)督的機(jī)器學(xué)習(xí)方法也會(huì)存在一定的問(wèn)題。例如,當(dāng)我們使用無(wú)監(jiān)督學(xué)習(xí)時(shí),處于不同細(xì)胞周期的細(xì)胞會(huì)對(duì)發(fā)育軌跡的形狀產(chǎn)生重大的影響。但是,如果我們希望專注于生物學(xué)過(guò)程中與細(xì)胞周期無(wú)關(guān)的影響,該怎么辦?Monocle2的“半監(jiān)督”聚類(lèi)排序方法可以幫助我們實(shí)現(xiàn)相應(yīng)的處理。
以半監(jiān)督聚類(lèi)方式對(duì)細(xì)胞進(jìn)行排序非常簡(jiǎn)單。首先使用CellTypeHierchy系統(tǒng)定義標(biāo)記細(xì)胞進(jìn)展的基因,這與我們將其用于細(xì)胞類(lèi)型分類(lèi)的方式非常相似。然后,使用它來(lái)選擇與這些標(biāo)記共同變化的有序基因。最后,就像我們?cè)跓o(wú)監(jiān)督的排序中一樣,根據(jù)這些基因?qū)?xì)胞進(jìn)行排序。因此,無(wú)監(jiān)督排序和半監(jiān)督排序之間的唯一區(qū)別是我們使用哪些基因進(jìn)行排序。
# 選擇marker基因
CCNB2_id <- row.names(subset(fData(HSMM_myo), gene_short_name == "CCNB2"))
MYH3_id <- row.names(subset(fData(HSMM_myo), gene_short_name == "MYH3"))
# 初始化CellTypeHierarchy對(duì)象
cth <- newCellTypeHierarchy()
# 根據(jù)marker基因的表達(dá)標(biāo)記不同類(lèi)型的細(xì)胞
cth <- addCellType(cth,
"Cycling myoblast",
classify_func = function(x) { x[CCNB2_id,] >= 1 })
cth <- addCellType(cth,
"Myotube",
classify_func = function(x) { x[MYH3_id,] >= 1 })
cth <- addCellType(cth,
"Reserve cell",
classify_func = function(x) { x[MYH3_id,] == 0 & x[CCNB2_id,] == 0 })
# 使用classifyCells函數(shù)對(duì)細(xì)胞進(jìn)行分類(lèi)
HSMM_myo <- classifyCells(HSMM_myo, cth)
Now we select the set of genes that co-vary (in either direction) with these two "bellweather" genes:
marker_diff <- markerDiffTable(HSMM_myo[HSMM_expressed_genes,],
cth,
cores = 1)
#semisup_clustering_genes <- row.names(subset(marker_diff, qval < 0.05))
# 選擇top 1000的基因
semisup_clustering_genes <-
row.names(marker_diff)[order(marker_diff$qval)][1:1000]
Using the top 1000 genes for ordering produces a trajectory that's highly similar to the one we obtained with unsupervised methods, but it's a little "cleaner".
HSMM_myo <- setOrderingFilter(HSMM_myo, semisup_clustering_genes)
#plot_ordering_genes(HSMM_myo)
# 數(shù)據(jù)降維
HSMM_myo <- reduceDimension(HSMM_myo, max_components = 2,
method = 'DDRTree', norm_method = 'log')
# 對(duì)細(xì)胞進(jìn)行排序
HSMM_myo <- orderCells(HSMM_myo)
HSMM_myo <- orderCells(HSMM_myo, root_state = GM_state(HSMM_myo))
# 細(xì)胞排序結(jié)果可視化
plot_cell_trajectory(HSMM_myo, color_by = "CellType") +
theme(legend.position = "right")
參考來(lái)源:http://cole-trapnell-lab.github.io/monocle-release/docs/