軌跡分析系列:
擬時間序列分析(Pseudotime分析)的字面意思是通過構建細胞間的變化軌跡來重塑細胞隨著時間的變化過程。從具體的分類分析和復雜程度來說,可以分為細胞軌跡分析和細胞譜系分析。
其原理此前已經介紹過,參考單細胞測序的軌跡推斷。
細胞軌跡分析指的是簡單模型的細胞變化軌跡分析,通常指的是細胞沿著某個過程有特定化的變化終點,軌跡具有簡單樹狀結構,一端是“根”,另一端是“葉”;細胞譜系分析通常指的是某類祖源細胞,在特定條件下,有多個發育軌跡和命運,變化過程類似復雜樹狀分支變化過程。因此,簡單細胞軌跡分析和細胞譜系分析原理上類似,復雜程度有所區別,當然,基于此的分析手法和方式也會有所不同。
偽時間是衡量單個細胞在細胞分化等過程中取得了多大進展的指標。在許多生物學過程中,細胞并不是完全同步的。在細胞分化等過程的單細胞表達研究中,捕獲的細胞在分化方面可能分布廣泛。也就是說,在同一時間捕獲的細胞群中,有些細胞可能已經很長時間了,而有些細胞甚至還沒有開始這個過程。當想要了解在細胞從一種狀態轉換到另一種狀態時所發生的調節更改的順序時,這種異步性會產生主要問題。跟蹤同時捕獲的細胞間的表達可以產生對基因動力學一個大致的認識,該基因表達的明顯變異性將非常高。Monocle根據每個cell在學習軌跡上的進展對其進行排序,從而緩解了由于異步而產生的問題。Monocle不是跟蹤表達式隨時間變化的函數,而是跟蹤沿軌跡變化的函數,我們稱之為偽時間。偽時間是一個抽象的分化單位:它只是一個cell到軌跡起點的距離,沿著最短路徑測量。軌跡的總長度是由細胞從起始狀態移動到結束狀態所經歷的總轉錄變化量來定義的。
生信技能樹此前推送過一篇文章:擬時序分析就是差異分析的細節剖析,指出擬時序分析就是差異分析的細節剖析,所有的大樣本量差異分析都可以轉為擬時序分析,可以加深我們對擬時序分析的理解。
Monocle2是做單細胞擬時分析最有名的R包。
相較還在持續開發中的Monocle3來說,Monocle2更穩定且更傾向于半監督的分析模式,更適合針對感興趣的細胞亞群做個性化分析。
文章中的核心理論為:每個細胞都可以表示為高維空間中的一個點,在高維空間中,每個維對應著一個有序基因的表達水平。高維數據首先通過幾種降維方法,如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)對細胞上色
- 以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()
- 以細胞類型上色
pdf("train.monocle.celltype.pdf",width = 7,height = 7)
plot_cell_trajectory(cds,color_by="cell_type", size=1,show_backbone=TRUE)
dev.off()
- 以細胞狀態上色
pdf("train.monocle.state.pdf",width = 7,height = 7)
plot_cell_trajectory(cds, color_by = "State",size=1,show_backbone=TRUE)
dev.off()
- 按照seurat分群排序細胞
pdf("seurat.clusters.pdf",width = 7,height = 7)
plot_cell_trajectory(cds, color_by = "seurat_clusters")
dev.off()
- 以細胞狀態上色(拆分)“分面”軌跡圖,以便更容易地查看每個狀態的位置。
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()
手動設置顏色注意
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)
??擬時序展示單個基因表達量
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)
注: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")
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,太多了
????因為前面設置的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)
??注意:不同分組間的細胞盡量不要放在一起做軌跡分析,同一組的生物學重復可以一起分析。明顯沒有生物學相關性的細胞也不要放在一起做軌跡分析。
10. 文獻里的monocle
有時候細胞群不會完美的按照分叉排列。如下,只要一類細胞占某一個分叉細胞的大部分也可以。
分析過程中使用的主要函數匯總
使用的函數 | 函數包 | 功能 | 重要參數 |
---|---|---|---|
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 | - |