單細胞之軌跡分析-2:monocle2 原理解讀+實操


軌跡分析系列:


擬時間序列分析(Pseudotime分析)的字面意思是通過構建細胞間的變化軌跡來重塑細胞隨著時間的變化過程。從具體的分類分析和復雜程度來說,可以分為細胞軌跡分析和細胞譜系分析。
其原理此前已經介紹過,參考單細胞測序的軌跡推斷
細胞軌跡分析指的是簡單模型的細胞變化軌跡分析,通常指的是細胞沿著某個過程有特定化的變化終點,軌跡具有簡單樹狀結構,一端是“根”,另一端是“葉”;細胞譜系分析通常指的是某類祖源細胞,在特定條件下,有多個發育軌跡和命運,變化過程類似復雜樹狀分支變化過程。因此,簡單細胞軌跡分析和細胞譜系分析原理上類似,復雜程度有所區別,當然,基于此的分析手法和方式也會有所不同。

偽時間是衡量單個細胞在細胞分化等過程中取得了多大進展的指標。在許多生物學過程中,細胞并不是完全同步的。在細胞分化等過程的單細胞表達研究中,捕獲的細胞在分化方面可能分布廣泛。也就是說,在同一時間捕獲的細胞群中,有些細胞可能已經很長時間了,而有些細胞甚至還沒有開始這個過程。當想要了解在細胞從一種狀態轉換到另一種狀態時所發生的調節更改的順序時,這種異步性會產生主要問題。跟蹤同時捕獲的細胞間的表達可以產生對基因動力學一個大致的認識,該基因表達的明顯變異性將非常高。Monocle根據每個cell在學習軌跡上的進展對其進行排序,從而緩解了由于異步而產生的問題。Monocle不是跟蹤表達式隨時間變化的函數,而是跟蹤沿軌跡變化的函數,我們稱之為偽時間。偽時間是一個抽象的分化單位:它只是一個cell到軌跡起點的距離,沿著最短路徑測量。軌跡的總長度是由細胞從起始狀態移動到結束狀態所經歷的總轉錄變化量來定義的。

生信技能樹此前推送過一篇文章:擬時序分析就是差異分析的細節剖析,指出擬時序分析就是差異分析的細節剖析,所有的大樣本量差異分析都可以轉為擬時序分析,可以加深我們對擬時序分析的理解。

Monocle2是做單細胞擬時分析最有名的R包。
相較還在持續開發中的Monocle3來說,Monocle2更穩定且更傾向于半監督的分析模式,更適合針對感興趣的細胞亞群做個性化分析。

monocle2 文章鏈接:https://www.nature.com/articles/nmeth.4402

文章中的核心理論為:每個細胞都可以表示為高維空間中的一個點,在高維空間中,每個維對應著一個有序基因的表達水平。高維數據首先通過幾種降維方法,如PCA(默認)、擴散映射等,投射到低維空間。Monocle 2然后在自動選擇的一組數據質心上構造一棵生成樹(DDRTree算法)。然后,該算法將細胞移動到它們最近的樹的頂點,更新頂點的位置以適應細胞,學習新的生成樹,并迭代地繼續這個過程,直到樹和細胞的位置已經收斂。在這個過程中,Monocle 2保持了高維空間和低維空間之間的可逆映射,從而既學習了軌跡,又降低了數據的維數。一旦Monocle 2學會了樹,用戶就會選擇一個tip作為根。計算每個單元的偽時間作為其沿樹到根的測地線距離,并根據主圖自動分配其分枝。因為monocle2學習樹結構,與其他方法相比,分支結構自動出現。當它更新細胞位置并細化樹時,monocle2簡化了軌跡的結構,修剪了小的分支,這樣最終的軌跡只保留了描述細胞狀態顯著差異的分支。

monocle2官網:http://cole-trapnell-lab.github.io/monocle-release/docs/

摘要

單細胞水平的研究使人們可以描述復雜生理過程和高度異質性細胞群體的轉錄調控。這些研究有助于發現識別特定細胞亞型的基因、標記生物過程中間狀態的基因,以及在兩種不同的細胞命運之間過渡態的基因。在許多單細胞研究中,單個細胞以不同步的方式執行基因表達過程。實際上,每個細胞都是正在研究的轉錄過程的一個瞬間。Monocle包是分析單細胞測序的工具。
Monocle引入了在偽時間(擬時間)內對單個細胞排序的策略,利用單個細胞的非同步進程,將它們置于與細胞分化等生物學過程相對應的軌跡上。Monocle利用先進的機器學習技術(反向圖嵌入)從單細胞數據中學習顯式的主圖(展現細胞轉錄特征相似性關系的圖,Monocle2使用DDTree降維圖,Monocle3使用UMAP降維圖)來對細胞進行排序,Monocle的機器學習算法可以依據上述降維圖形,學習描述細胞如何從一種狀態過渡到另一種狀態的軌跡。Monocle假設軌跡是樹狀結構,一端是“根”,另一端是“葉”。一個細胞在生物過程的開始,從根開始沿著主干進行,直到它到達第一個分支。然后,該細胞必須選擇一條路徑,并沿著樹移動越來越遠,直到它到達一片葉子。一個細胞的假時間值是它返回根所需的距離。降維方面monocle與seurat的過程大同小異,首先進行數據標準化,其次選擇部分基因代表細胞轉錄特征 ,最后選用適當的算法降維。這可以強大而準確地解決復雜的生物過程。
Monocle也可以進行聚類(即使用t-SNE和密度峰值聚類)和差異基因表達測試,使人們能夠識別在不同狀態下差異表達的基因,沿著生物過程以及不同的細胞命運時基因表達的變化。Monocle是專為單細胞RNA-Seq研究設計的,但也可以用于其他分析。

Introduction

Monocle 2包括新的和改進的算法用于細胞分類和計數,執行細胞亞群之間的差異表達分析,以及細胞軌跡重建。

Monocle主要可以進行以下三種分析:

  • 細胞的聚類、分類和計數。 Single-cell RNA-Seq experiments allow you to discover new (and possibly rare) subtypes of cells. Monocle helps you identify them.
  • 重建單細胞軌跡。 In development, disease, and throughout life, cells transition from one state to another. Monocle helps you discover these transitions.
  • 差異表達分析。 Characterizing new cell types and states begins with comparing them to other, better understood cells. Monocle includes a sophisticated but easy to use system for differential expression.

首先,Monocle 2使用一種簡單的、無偏的和高度可擴展的統計程序來選擇具有軌跡進展特征的基因。然后,它采用了一類流形學習算法,旨在在高維單細胞RNA-seq數據中嵌入一個主圖。以前的方法是通過啟發式分析細胞之間的成對距離來推斷分支結構,而Monocle 2可以使用這張圖來直接識別發育的命運決定。我們已經通過廣泛的基準測試證明,Monocle 2優于其他工具,如Wishbone,而不需要用戶指定軌跡的結構。

Monocle的使用

分析流程示意圖:

1. 安裝

install.packages("devtools")
devtools::install_github("cole-trapnell-lab/monocle-release@develop")

或者

if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")
BiocManager::install("monocle")

2. 創建CellDataSet

2.1 將Seurat object中數據提取來創建??
數據準備:pbmc3k數據下載(軌跡分析的前提是待分析的細胞有緊密的發育關系,PBMC細胞不是很好的的示例數據,在此僅作為演示。)
由于該數據集沒有對細胞類型進行注釋,因此我們參考seurat標準流程對這個數據集進行注釋。

library(dplyr)
library(Seurat)
library(patchwork) #用來做拼圖的包,后面的p1|p1|p3在一張圖上展示三個圖就是這個包的功勞

# Load the PBMC dataset
pbmc.data <- Read10X(data.dir = "../data/pbmc3k/filtered_gene_bc_matrices/hg19/")
# Initialize the Seurat object with the raw (non-normalized data).
pbmc <- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200)
pbmc
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")
pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)
pbmc <- NormalizeData(pbmc)
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
all.genes <- rownames(pbmc)
pbmc <- ScaleData(pbmc, features = all.genes)
pbmc <- RunPCA(pbmc, features = VariableFeatures(object = pbmc))
pbmc <- FindNeighbors(pbmc, dims = 1:10)
pbmc <- FindClusters(pbmc, resolution = 0.5)
pbmc <- RunUMAP(pbmc, dims = 1:10)
new.cluster.ids <- c("Naive CD4 T", "Memory CD4 T", "CD14+ Mono", "B", "CD8 T", "FCGR3A+ Mono", 
    "NK", "DC", "Platelet")
names(new.cluster.ids) <- levels(pbmc)
pbmc <- RenameIdents(pbmc, new.cluster.ids)
pbmc[['cell_type']] <- pbmc@active.ident #將注釋結果添加到metadata
levels(pbmc)
saveRDS(pbmc, file = "pbmc.rds")

運行完上述代碼,得到注釋好的數據集。

從Seurat對象中提取構建CDS對象所需要的3個輸入文件:表達矩陣信息、基因信息和表型信息
??monocle輸入的是count矩陣(不建議使用data矩陣)

library(monocle)
pbmc <- readRDS("pbmc.rds") #導入注釋好的seurat對象(已注釋)

##提取表型信息--細胞信息(建議載入細胞的聚類或者細胞類型鑒定信息、實驗條件等信息)
expr_matrix <- as(as.matrix(pbmc@assays$RNA@counts), 'sparseMatrix')
##提取表型信息到p_data(phenotype_data)里面 
p_data <- pbmc@meta.data 
p_data$celltype <- pbmc@active.ident  ##整合每個細胞的細胞鑒定信息到p_data里面。如果已經添加則不必重復添加
##提取基因信息 如生物類型、gc含量等
f_data <- data.frame(gene_short_name = row.names(pbmc),row.names = row.names(pbmc))
##expr_matrix的行數與f_data的行數相同(gene number), expr_matrix的列數與p_data的行數相同(cell number)

#構建CDS對象
pd <- new('AnnotatedDataFrame', data = p_data) 
fd <- new('AnnotatedDataFrame', data = f_data)
#將p_data和f_data從data.frame轉換AnnotatedDataFrame對象。
cds <- newCellDataSet(expr_matrix,
                      phenoData = pd,
                      featureData = fd,
                      lowerDetectionLimit = 0.5,
                      expressionFamily = negbinomial.size())

FPKM/TPM值通常是對數正態分布的,而UMIs或讀計數使用負二項更好地建模。要處理計數數據,需要將負二項分布指定為newCellDataSet的expressionFamily參數:

negbinomial.size()和negbinomial():輸入的表達矩陣為UMI,一般適用于10x的數據;negbinomial()的結果更準確,但是計算更耗時;一般建議采用negbinomial.size()。
稀疏矩陣用negbinomial.size()
tobit():適用于輸入的表達矩陣為FPKM或者TPM, 構建monocle2的class時會自動進行log化計算
gaussianff():輸入為log化后的FPKM或者TPM。(目前在單細胞數據中,FPKM已不多用,smart-seq2平臺數據一般采用TPM)

2.2 直接讀取表達矩陣來創建

library(data.table)
##讀取數據
data <- fread("fpkm.txt",data.table = F,header = T)
pd <-  fread("metadata.txt",data.table = F,header = T)
fd <- fread("gene_annotations.txt",data.table = F,header = T)
##創建
pd <- new("AnnotatedDataFrame", data = pd)
fd <- new("AnnotatedDataFrame", data = fd)
HSMM <- newCellDataSet(as.matrix(data),
                       phenoData = pd, featureData = fd,
                       expressionFamily = tobit())
###如果數據量大,建議轉化為稀疏矩陣
HSMM <- newCellDataSet(as(as.matrix(data), "sparseMatrix"),
                       phenoData = pd, 
                       featureData = fd,
                       expressionFamily = tobit())

2.3 將Seurat對象直接轉化為CellDataSet對象

importCDS(pbmc)

如果我們想要從Seurat對象或SCESet中導入所有的插槽,我們可以設置參數'import_all'為TRUE。#(默認為FALSE或只保留最小數據集)

3. 估計size factor和離散度

size facotr幫助我們標準化細胞之間的mRNA的差異。
離散度值可以幫助我們進行后續的差異分析。
(類似于seurat的數據歸一化處理)

cds <- estimateSizeFactors(cds)
cds <- estimateDispersions(cds)

與seurat把標準化后的表達矩陣保存在對象中不同,monocle只保存一些中間結果在對象中,需要用時再用這些中間結果轉化。經過上面三個函數的計算,mycds對象中多了SizeFactors、Dipersions、num_cells_expressed和num_genes_expressed等信息。

4. 過濾低質量的細胞

大多數單細胞工作流程至少會包含一些由死細胞或空孔組成的庫。同樣重要的是要刪除doublets:由兩個或多個細胞意外生成的庫。這些細胞可以破壞下游步驟,如偽時間排序或聚類。要知道一個特定的基因有多少個表達,或者一個給定的細胞有多少個基因表達,通常是很方便的。Monocle提供了一個簡單的函數來計算這些統計數據。
因為Seurat已經完成細胞過濾,此步可省略
但由于Seurat是通過基因表達量來對細胞進行過濾。因此,我們可以通過下面的代碼用表達某基因的細胞的數目對基因進行過濾,從而得到后續操作需要的基因。

cds <- detectGenes(cds, min_expr = 0.1) #這一操作會在fData(cds)中添加一列num_cells_expressed
print(head(fData(cds)))#此時有13714個基因
expressed_genes <- row.names(subset(fData(cds),
    num_cells_expressed >= 10)) #過濾掉在小于10個細胞中表達的基因,還剩11095個基因。

5. 細胞分類

Monocle官網教程提供了4個分類方法:
Classifying cells by type
Clustering cells without marker genes
Clustering cells using marker genes
Imputing cell type
建議先將細胞注釋好再進行Monocle分析,不建議使用monocle做細胞分類。

6. 軌跡定義基因選擇及可視化和構建軌跡

The ordering workflow
Step 1: choosing genes that define progress
Step 2: reducing the dimensionality of the data
Step 3: ordering the cells in pseudotime

Step 1: 選擇定義過程的基因
推斷單細胞軌跡是一個機器學習問題。在單細胞RNA-Seq中,低水平表達的基因通常非常嘈雜,但有些基因包含有關細胞狀態的重要信息。因此,軌跡推斷的第一步就是選擇Monocle將用作機器學習方法輸入的基因。這叫做特征選擇它對軌跡的形狀有很大的影響。
Monocle主要基于關鍵基因的表達模式,通過學習每個細胞必須經歷的基因表達變化的序列,根據擬時間值中對單個細胞進行排序,模擬出時間發育過程的動態變化。而這個排序技術表現是一種在低維空間排布高維數據的降維技術。
Monocle提供了多種工具來選擇基因,這些基因將產生一個健壯、準確和具有生物學意義的軌跡。你可以使用這些工具來執行一個完全“無監督”的分析,在這個分析中,Monocle不知道你認為哪個基因是重要的?;蛘?,你可以利用marker gene知識來定義生物學進展,從而形成Monocle的軌跡。我們認為這種模式是“半監督”的分析。

  • Monocle官網教程提供了4個選擇方法:
    選擇發育差異表達基因
    選擇clusters差異表達基因
    選擇離散程度高的基因
    自定義發育marker基因

前三種都是無監督分析方法,細胞發育軌跡生成完全不受人工干預;最后一種是半監督分析方法,可以使用先驗知識輔助分析。

##使用seurat選擇的高變基因??
express_genes <- VariableFeatures(pbmc)
cds <- setOrderingFilter(cds, express_genes)
plot_ordering_genes(cds)
##使用clusters差異表達基因
deg.cluster <- FindAllMarkers(pbmc)
express_genes <- subset(deg.cluster,p_val_adj<0.05)$gene
cds <- setOrderingFilter(cds, express_genes)
plot_ordering_genes(cds)
##使用monocle選擇的高變基因??
disp_table <- dispersionTable(cds)
disp.genes <- subset(disp_table, mean_expression >= 0.1 & dispersion_empirical >= 1 * dispersion_fit)$gene_id
cds <- setOrderingFilter(cds, disp.genes)
plot_ordering_genes(cds)

理想情況下,我們希望盡可能少地使用正在研究的系統生物學的先驗知識。我們希望從數據中發現重要的排序基因,而不是依賴于文獻和教科書,因為這可能會在排序中引入偏見。我們將從一種更簡單的方法開始,但是我們通常推薦一種更復雜的方法,稱為“dpFeature”。

#這一步輸入的expressed_genes來自于步驟4。
#????后續分析使用的是該方法
#也可輸入seurat篩選出的高變基因:expressed_genes <- VariableFeatures(pbmc) 
diff <- differentialGeneTest(cds[expressed_genes,],fullModelFormulaStr="~cell_type",cores=1) 
#~后面是表示對誰做差異分析的變量,理論上可以為p_data的任意列名
head(diff)

##差異表達基因作為軌跡構建的基因,差異基因的選擇標準是qval<0.01,decreasing=F表示按數值增加排序
deg <- subset(diff, qval < 0.01) #選出2829個基因
deg <- deg[order(deg$qval,decreasing=F),]
head(deg)

##差異基因的結果文件保存
write.table(deg,file="train.monocle.DEG.xls",col.names=T,row.names=F,sep="\t",quote=F)

## 軌跡構建基因可視化
ordergene <- rownames(deg) 
cds <- setOrderingFilter(cds, ordergene)  
#這一步是很重要的,在我們得到想要的基因列表后,我們需要使用setOrderingFilter將它嵌入cds對象,后續的一系列操作都要依賴于這個list。
#setOrderingFilter之后,這些基因被儲存在cds@featureData@data[["use_for_ordering"]],可以通過table(cds@featureData@data[["use_for_ordering"]])查看
pdf("train.ordergenes.pdf")
plot_ordering_genes(cds)
dev.off()
#出的圖黑色的點表示用來構建軌跡的差異基因,灰色表示背景基因。紅色的線是根據第2步計算的基因表達大小和離散度分布的趨勢(可以看到,找到的基因屬于離散度比較高的基因)

??選擇的用于排序的基因數目一般在2000左右比較合適

gene數太多的話也可以選擇top基因

ordergene <- row.names(deg)[order(deg$qval)][1:400]

這樣用的文獻:腫瘤浸潤髓系細胞的pan-cancer單細胞轉錄圖譜

Step 2: 降維
一旦細胞有序排列,我們就可以在降維空間中可視化軌跡。所以首先選擇用于細胞排序的基因,然后使用反向圖嵌入(DDRTree)算法對數據進行降維。

cds <- reduceDimension(cds, max_components = 2,
    method = 'DDRTree')

Step 3: 擬時間軸軌跡構建和在擬時間內排列細胞
將表達數據投射到更低的維度空間,通過機器學習描述細胞如何從一種狀態過渡到另一種狀態的軌跡。假設軌跡具有樹狀結構,一端是“根”,另一端是“葉”。盡可能地將最佳樹與數據匹配起來。這項任務被稱為“歧管學習”,在生物過程的開始階段,細胞從根部開始,沿著主干前進,直到到達第一個分支(如果有的話)。然后,細胞必須選擇一條路徑,沿著樹走得越來越遠,直到到達一片葉子。一個細胞的偽時間值是它回到根的距離。

根據order gene的表達趨勢,將細胞排序并完成軌跡構建

cds <- orderCells(cds)
#??使用root_state參數可以設置擬時間軸的根,如下面的擬時間著色圖中可以看出,左邊是根。根據state圖可以看出,根是State1,若要想把另一端設為根,可以按如下操作
#cds <- orderCells(cds, root_state = 5) #把State5設成擬時間軸的起始點

可視化:根據cds@phenoData@data中的表型信息(metadata)對細胞上色

  1. 以pseudotime值上色 (Pseudotime是monocle2基于細胞基因表達信息計算的概率,表示時間的先后。)
pdf("train.monocle.pseudotime.pdf",width = 7,height = 7)
plot_cell_trajectory(cds,color_by="Pseudotime", size=1,show_backbone=TRUE) 
dev.off()
圖中123是分叉點,不代表特別意義,也不代表時間先后。這張圖按照sudotime,時間先后是從左往右,左邊是起點(root)。起點的設置可以使用orderCells的root_state參數,將右側設置為起點。
  1. 以細胞類型上色
pdf("train.monocle.celltype.pdf",width = 7,height = 7)
plot_cell_trajectory(cds,color_by="cell_type", size=1,show_backbone=TRUE)
dev.off()
  1. 以細胞狀態上色
pdf("train.monocle.state.pdf",width = 7,height = 7)
plot_cell_trajectory(cds, color_by = "State",size=1,show_backbone=TRUE)
dev.off()
state的多少是monocle算出來的,不能調整,與輸入的用于軌跡學習的基因有關。分叉和頂點之間或者頂點和頂點之間為一個state,與發育軌跡時間先后沒有關系,與細胞類型也不完全相關。
  1. 按照seurat分群排序細胞
pdf("seurat.clusters.pdf",width = 7,height = 7)
plot_cell_trajectory(cds, color_by = "seurat_clusters")
dev.off()
  1. 以細胞狀態上色(拆分)“分面”軌跡圖,以便更容易地查看每個狀態的位置。
pdf("train.monocle.state.faceted.pdf",width = 10,height = 7)
plot_cell_trajectory(cds, color_by = "State") + facet_wrap("~State", nrow = 1)
dev.off()

??這一部分的配色可以直接對接ggsci,也可以使用scale_color_manual()自己設置顏色

library(ggsci)
p1=plot_cell_trajectory(cds, color_by = "cell_type")  + scale_color_npg() 
p2=plot_cell_trajectory(cds, color_by = "State")  + scale_color_nejm()
colour=c("#DC143C","#0000FF","#20B2AA","#FFA500","#9370DB","#98FB98","#F08080")
p3=plot_cell_trajectory(cds, color_by = "State")  + scale_color_manual(values = colour)
p1|p2|p3

覺得這種軌跡不太直觀的也可以畫成樹形圖

p1 <- plot_cell_trajectory(cds, x = 1, y = 2, color_by = "celltype") + 
  theme(legend.position='none',panel.border = element_blank()) + #去掉第一個的legend
  scale_color_manual(values = colour) 
p2 <- plot_complex_cell_trajectory(cds, x = 1, y = 2,
                                   color_by = "celltype")+
  scale_color_manual(values = colour) +
  theme(legend.title = element_blank()) 
p1|p2

還可以畫沿時間軸的細胞密度圖

library(ggpubr)
df <- pData(cds) 
## pData(cds)取出的是cds對象中cds@phenoData@data的內容
View(df)
ggplot(df, aes(Pseudotime, colour = cell_type, fill=cell_type)) +
  geom_density(bw=0.5,size=1,alpha = 0.5)+theme_classic2()
從上面的矩陣中也能提取不同state的細胞,分別畫圖

手動設置顏色注意

ClusterName_color_panel <- c(
  "Naive CD4 T" = "#DC143C", "Memory CD4 T" = "#0000FF", "CD14+ Mono" = "#20B2AA",
  "B" = "#FFA500", "CD8 T" = "#9370DB", "FCGR3A+ Mono" = "#98FB98",
  "NK" = "#F08080", "DC" = "#0000FF", "Platelet" = "#20B2AA"
)
ggplot(df, aes(Pseudotime, colour = cell_type, fill=cell_type)) +
  geom_density(bw=0.5,size=1,alpha = 0.5)+theme_classic2()+ scale_fill_manual(name = "", values = ClusterName_color_panel)+scale_color_manual(name = "", values = ClusterName_color_panel)

提取感興趣的細胞(進行后續分析)

#比如對State7的細胞感興趣
pdata <- Biobase::pData(cds)
s.cells <- subset(pdata, State=="7") %>% rownames()
save(s.cells, file = "Monocle_state7.rda")

保存結果

write.csv(pData(cds), "pseudotime.csv")
save(cds, file = "cds.rda")

7. 指定基因的可視化

直接查看一些基因隨細胞狀態等的表達變化

##選擇前4個top基因并將其對象取出
keygenes <- head(ordergene,4)
cds_subset <- cds[keygenes,]
##可視化:以state/celltype/pseudotime進行
p1 <- plot_genes_in_pseudotime(cds_subset, color_by = "State")
p2 <- plot_genes_in_pseudotime(cds_subset, color_by = "cell_type")
p3 <- plot_genes_in_pseudotime(cds_subset, color_by = "Pseudotime")
plotc <- p1|p2|p3
ggsave("Genes_pseudotimeplot.pdf", plot = plotc, width = 16, height = 8)
#指定基因
s.genes <- c("SELL","CCR7","IL7R", "CD84","CCL5","S100A4")
p1 <- plot_genes_jitter(cds[s.genes,], grouping = "State", color_by = "State")
p2 <- plot_genes_violin(cds[s.genes,], grouping = "State", color_by = "State")
p3 <- plot_genes_in_pseudotime(cds[s.genes,], color_by = "State")
plotc <- p1|p2|p3
ggsave("Genes_Jitterplot.pdf", plot = plotc, width = 16, height = 8)
由于state1-7并不代表分化時間先后,因此這張圖還要結合其他的圖來看

??擬時序展示單個基因表達量

colnames(pData(cds))
pData(cds)$CCL5 = log2( exprs(cds)['CCL5',]+1)
p1=plot_cell_trajectory(cds, color_by = "CCL5")  + scale_color_gsea()
pData(cds)$S100A4 = log2(exprs(cds)['S100A4',]+1)
p2=plot_cell_trajectory(cds, color_by = "S100A4")    + scale_color_gsea()
library(patchwork)
p1+p2

8. 尋找擬時相關的基因(擬時差異基因)

使用回歸算法
注意:不要使用多核運算,經常會出現警告
Monocle的主要工作是通過生物過程(如細胞分化)將細胞按順序排列,而不知道要提前查看哪些基因。一旦這樣做了,你就可以分析細胞,找到隨著細胞進展而變化的基因。

官方給出的差異分析有三大方法:
1、Basic Differential Analysis
2、Finding Genes that Distinguish Cell Type or State
3、Finding Genes that Change as a Function of Pseudotime
我們重點關注第三個:根據偽時間功能尋找差異基因

sm.ns函數指出Monocle應該通過表達式值擬合自然樣條曲線,以幫助它將表達式的變化描述為進程的函數。

  • 尋找擬時差異基因(qvalue體現基因與擬時的密切程度)繪制熱圖
#這里是把排序基因(ordergene)提取出來做回歸分析,來找它們是否跟擬時間有顯著的關系
#如果不設置,就會用所有基因來做它們與擬時間的相關性
Time_diff <- differentialGeneTest(cds[ordergene,], cores = 1, 
                                  fullModelFormulaStr = "~sm.ns(Pseudotime)")
Time_diff <- Time_diff[,c(5,2,3,4,1,6,7)] #把gene放前面,也可以不改
write.csv(Time_diff, "Time_diff_all.csv", row.names = F)
Time_genes <- Time_diff %>% pull(gene_short_name) %>% as.character()
p=plot_pseudotime_heatmap(cds[Time_genes,], num_clusters=4, show_rownames=T, return_heatmap=T)
ggsave("Time_heatmapAll.pdf", p, width = 5, height = 10)

?? ????前面通過設置num_clusters將熱圖聚成了四個cluster,如過想要把每個cluster的基因單獨提出來做分析

p$tree_row
# Call:
# hclust(d = d, method = method)
# Cluster method   : ward.D2 
# Number of objects: 2829 
clusters <- cutree(p$tree_row, k = 4)
clustering <- data.frame(clusters)
clustering[,1] <- as.character(clustering[,1])
colnames(clustering) <- "Gene_Clusters"
table(clustering)
# 1    2    3    4 
# 570 1031  506  722 
write.csv(clustering, "Time_clustering_all.csv", row.names = F)

這樣就把每個基因屬于哪個cluster提取出來了,后續可以做每個cluster的富集分析。參考:擬時序分析的熱圖提取基因問題

  • 擬時差異基因熱圖繪制(提取了前100個)
Time_genes <- top_n(Time_diff, n = 100, desc(qval)) %>% pull(gene_short_name) %>% as.character()
p = plot_pseudotime_heatmap(cds[Time_genes,], num_clusters=4, show_rownames=T, return_heatmap=T)
ggsave("Time_heatmapTop100.pdf", p, width = 5, height = 10)
這個圖的橫軸是擬時間,cluster1的基因是在擬時排序起點高表達的基因,cluster2的基因則是在擬時排序的重點高表達的。cluster數的多少是由plot_pseudotime_heatmap函數中的num_clusters參數定義的

注:plot_pseudotime_heatmap函數可以來可視化所有monocle的假時間依賴性基因。plot_pseudotime_heatmap采用CellDataSet對象(通常只包含重要基因的子集),并生成平滑的表達曲線,非常類似于plot_genes_in_pseudotime。然后它對這些基因進行聚類,并使用pheatmap軟件包進行繪圖。繪出的熱圖可以讓我們觀測到假時間依賴性基因中的不同基因模塊在不同的時間內共同變化,能比較好的回答時間序列基因表達中“哪些基因遵循相似的動力學趨勢”這一常見問題。

  • 顯著差異基因按熱圖結果排序并保存
hp.genes <- p$tree_row$labels[p$tree_row$order]
Time_diff_sig <- Time_diff[hp.genes, c("gene_short_name", "pval", "qval")]
write.csv(Time_diff_sig, "Time_diff_sig.csv", row.names = F)

另外:也可手動選擇基因來繪制熱圖,查看其表達模式

marker_genes <- row.names(subset(fData(cds),
                                 gene_short_name %in% c("MEF2C", "MEF2D", "MYF5",
                                                        "ANPEP", "PDGFRA","MYOG",
                                                        "TPM1",  "TPM2",  "MYH2",
                                                        "MYH3",  "NCAM1", "TNNT1",
                                                        "TNNT2", "TNNC1", "CDK1",
                                                        "CDK2",  "CCNB1", "CCNB2",
                                                        "CCND1", "CCNA1", "ID1")))

diff_test_res <- differentialGeneTest(cds[marker_genes,],
                                      fullModelFormulaStr = "~sm.ns(Pseudotime)")
sig_gene_names <- row.names(subset(diff_test_res, qval < 0.1))
plot_pseudotime_heatmap(cds[sig_gene_names,],
                        num_clusters = 6,
                        cores = 1,
                        show_rownames = T)

9. 單細胞軌跡的“分支”分析

??上一步尋找擬時相關的基因是全局的,找擬時起點和終點相關的基因,這一步則是尋找和分叉點相關的基因。

單細胞軌跡常常包括分支。這些分支的產生是因為細胞執行不同的基因表達程序。在發育過程中,當細胞做出命運選擇時,分支出現在軌跡中:一個發育譜系沿著一條路徑前進,而另一個譜系產生第二條路徑。Monocle包含分析這些分支事件的廣泛功能。Monocle提供了一個特殊的統計測試:分支表達式分析建模,或BEAM。
BEAM(Branched expression analysis modeling)是一種統計方法,用于尋找以依賴于分支的方式調控的基因。

plot_cell_trajectory(cds, color_by = "State")
結合前面color_by="Pseudotime"的圖,這個圖默認的是最左邊是root(pseudotime 0),所以這個圖是status1是最早的,在分叉2處分為status1和status7,status2又隨后在分叉3處分為status3和status4,status4隨后又在分叉1處分出status6和status5。

BEAM進行統計分析

BEAM_res <- BEAM(cds[ordergene,], branch_point = 1, cores = 2) 
#這里用的是ordergene,也就是第六步dpFeature找出來的基因。如果前面用的是seurat的marker基因,記得改成express_genes
#BEAM_res <- BEAM(cds, branch_point = 1, cores = 2) #對2829個基因進行排序,運行慢
BEAM_res <- BEAM_res[order(BEAM_res$qval),]
BEAM_res <- BEAM_res[,c("gene_short_name", "pval", "qval")]
head(BEAM_res)
#           gene_short_name         pval         qval
# CD79A               CD79A 2.757676e-73 7.782161e-70
# TCL1A               TCL1A 1.574889e-65 2.222168e-62
# IGLL5               IGLL5 2.356778e-64 2.216942e-61
# S100A9             S100A9 1.504319e-58 1.061297e-55
# S100A8             S100A8 6.028175e-57 3.402302e-54
# LINC00926       LINC00926 3.180527e-55 1.495908e-52
write.csv(BEAM_res, "BEAM_res.csv", row.names = F)
plot_genes_branched_heatmap(cds[row.names(subset(BEAM_res,
                                                  qval < 1e-4)),],
                            branch_point = 1, #繪制的是哪個分支
                            num_clusters = 4, #分成幾個cluster,根據需要調整
                            cores = 1,
                            use_gene_short_name = T,
                            show_rownames = T)#有632個gene,太多了
該熱圖顯示的是同一時間點兩個譜系的變化,熱圖的列是偽時間的點,行是基因。這張圖最上面的條條,灰色的代表分叉前,左邊紅色代表左邊這個cell fate,右邊藍色代表右邊這個cell fate,從熱圖中間往右讀,是偽時間的一個譜系,往左是另一個譜系?;蚴潜话凑盏燃壘垲惖?,需要結合生物學知識來進行解讀。

????因為前面設置的branch_point = 1,根據按照State繪制的trajectory圖,在1這個分枝上分出的是5和6這兩個status,所以上圖比較的是state5和state6這兩個branch,而且上圖中的pre-branch使用的是4, 2, 7, 1這四個status(BEAM tries to traverse backward from the cell on the branch point all the way back to the root cell (the cell with pseudotime 0) and use all those cells as the the pre-branch)。而且,上圖左邊的Cell fate 1指的是state5,Cell fate 2指的是state6(Cell fate 1 corresponds to the state with small id while cell fate 2 corresponds to sate with bigger id )。

#選前100個基因可視化
BEAM_genes <- top_n(BEAM_res, n = 100, desc(qval)) %>% pull(gene_short_name) %>% as.character()
p <- plot_genes_branched_heatmap(cds[BEAM_genes,],  branch_point = 1, 
                                 num_clusters = 3, show_rownames = T, return_heatmap = T)
ggsave("BEAM_heatmap.pdf", p$ph_res, width = 6.5, height = 10)

這個圖的解讀:
· How to map cell fate to branches?
· monocle2 擬時間分支點分析結果解讀

#顯著差異基因(top100)按熱圖結果排序并保存
##如果要所有的差異基因,就把前面所632個基因的熱圖存為p
hp.genes <- p$ph_res$tree_row$labels[p$ph_res$tree_row$order]
BEAM_sig <- BEAM_res[hp.genes, c("gene_short_name", "pval", "qval")]
write.csv(BEAM_sig, "BEAM_sig.csv", row.names = F)

選擇上面熱圖中或顯著差異基因中感興趣的基因進行可視化

head(BEAM_sig)
#        gene_short_name         pval         qval
# STX11            STX11 2.928177e-20 1.180474e-18
# CEBPD            CEBPD 2.137741e-22 1.058369e-20
# TYROBP          TYROBP 3.157539e-54 1.272939e-51
# FCER1G          FCER1G 1.094272e-45 2.573364e-43
# SRGN              SRGN 7.564014e-24 4.356255e-22
# CTSD              CTSD 2.666673e-17 7.601364e-16
genes <- row.names(subset(fData(cds),
                          gene_short_name %in% c( "SITX11", "CEBPD", "TYROBP")))

plot_genes_branched_pseudotime(cds[genes,],
                               branch_point = 1,
                               color_by = "State",
                               ncol = 1)
可以看到,在pre-branch細胞向 5/6這兩個分叉分化時,這兩個基因都是在state5中高表達的,也就是state5的分支相關基因。

??注意:不同分組間的細胞盡量不要放在一起做軌跡分析,同一組的生物學重復可以一起分析。明顯沒有生物學相關性的細胞也不要放在一起做軌跡分析。

10. 文獻里的monocle

有時候細胞群不會完美的按照分叉排列。如下,只要一類細胞占某一個分叉細胞的大部分也可以。

Single-cell reconstruction of the adult human heart during heart failure and recovery reveals the cellular landscape underlying cardiac function, Extended Data Fig. 8a-e
分析過程中使用的主要函數匯總
使用的函數 函數包 功能 重要參數
fread data.table 和read.table類似,但更快 -
new methods A call to new returns a newly allocated object from the class identified by the first argument. -
AnnotatedDataFrame Biobase 數據框的另一種形式 -
newCellDataSet monocle 創建一個CDS對象 expressionFamily
estimateSizeFactors BiocGenerics - -
estimateDispersions BiocGenerics - -
detectGenes monocle 對cds對象進行全局的基因表達檢測 min_expr = 0.1
setOrderingFilter monocle 將用于機器學習的基因列表嵌入cds對象 -
plot_ordering_genes monocle 根據均值和離散度繪制基因點圖,highlight setOrderingFilter設置的細胞 -
differentialGeneTest monocle Monocle做差異分析的主要方法 -
reduceDimension monocle 降維 method = 'DDRTree'
orderCells monocle 將細胞排序并完成軌跡構建 -
plot_cell_trajectory monocle 繪制軌跡 color_by
facet_wrap ggplot2 繪制分面圖 -
fData Biobase featureData returns an object containing information on both variable values and variable meta-data -
sm.ns VGAM Smart Prediction -
plot_genes_in_pseudotime monocle Plots expression for one or more genes as a function of pseudotime. -
plot_pseudotime_heatmap monocle visualize modules of genes that co-vary across pseudotime -
BEAM monocle Identify genes with branch-dependent expression. -
plot_genes_branched_heatmap monocle Create a heatmap to demonstrate the bifurcation of gene expression along two branchs -
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯系作者。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容