大家好,好久沒有分享單細(xì)胞分析的流程啦,今天給大家分享一個(gè)單細(xì)胞中常見的分析--細(xì)胞發(fā)育軌跡分析。之前也給大家分享過RNA velocity,今天就給大家介紹另一個(gè)軟件包(monocle)。
monocle更新得很快,目前已經(jīng)更新到3了,但是今天我們主要是講一個(gè)monocle2的使用方法。moncole2中進(jìn)行軌跡分析的流程主要分為以下幾個(gè)步驟:
1. 數(shù)據(jù)預(yù)處理
1.1 安裝monocle2
如果之前沒有安裝過monocl2,則需要先運(yùn)行以下命名,如果已經(jīng)安裝則忽略。
install.packages("BiocManager")
BiocManager::install("monocle")
install.packages("RColorBrewer") #畫圖配色板
1.2 加載安裝包
library(monocle)
library(RColorBrewer)
setwd("工作路徑")
1.3 讀取數(shù)據(jù)
測(cè)試數(shù)據(jù)來源于2017 年北大徐成冉課題組發(fā)表在《Hepatology》雜志上小鼠胚胎E10.5-E17.5雙潛能的成肝細(xì)胞分化為肝實(shí)質(zhì)細(xì)胞和肝內(nèi)膽管細(xì)胞的表達(dá)數(shù)據(jù)(GSE90047)。可以在GEO中通過輸入GSE90047下載單細(xì)胞的表達(dá)矩陣。
# TPM矩陣(行為基因名,列為細(xì)胞名)
expr_matrix <- read.table("0.data/scRNA-seq_TPM_GSE90047.xls",header=T,row.names=1, sep = "\t")
# 細(xì)胞注釋矩陣(行為細(xì)胞名)
sample_sheet <- read.table("0.data/XCR_paper_cell_anno_sub.txt",header=T,row.names=1, sep ="\t")
# 基因注釋矩陣(行為基因名)
gene_annotation <- read.table("0.data/Mus_ref.txt",header=T,row.names=1, sep = "\t")
# 從注釋信息中篩選出有表達(dá)的基因
pos <- which(rownames(gene_annotation) %in% rownames(expr_matrix))
gene_annotation <- gene_annotation[pos,]
# 注意:expr_matrix中列名的順序和 sample_sheet中行名的順序必須一致
expr_matrix <- expr_matrix[rownames(gene_annotation),rownames(sample_sheet)]
pd <- new("AnnotatedDataFrame", data = sample_sheet)
fd <- new("AnnotatedDataFrame", data = gene_annotation)
2. 創(chuàng)建對(duì)象
2.1 創(chuàng)建monocle2的對(duì)象
# 創(chuàng)建monocle對(duì)象
cd <- newCellDataSet(as.matrix(expr_matrix),
phenoData = pd,
featureData = fd,
lowerDetectionLimit = 0.1,
expressionFamily = tobit(Lower = 0.1))
# expressionFamily: 數(shù)據(jù)為TPM/FPKM時(shí)設(shè)置為tobit(Lower = 0.1),數(shù)據(jù)為count時(shí)設(shè)置為negbinomial.size())
# 將FPKM/TPM數(shù)據(jù)轉(zhuǎn)換為UMI數(shù)據(jù)(read count)
rpc_matrix <- relative2abs(cd)
# 重新創(chuàng)建monocle對(duì)象
cd <- newCellDataSet(as(as.matrix(rpc_matrix),"sparseMatrix"),
phenoData = pd,
featureData = fd,
lowerDetectionLimit = 0.5,
expressionFamily = negbinomial.size())
根據(jù)表達(dá)量數(shù)據(jù)的類型選擇合適的分布(默認(rèn)為文本計(jì)數(shù)數(shù)據(jù)輸入,適用于負(fù)二項(xiàng)分布;FPKM/TPM 適用于對(duì)數(shù)正態(tài)分布)。
2.2 計(jì)算數(shù)據(jù)的size factors和dispersions
size factors有助于消除細(xì)胞間mRNA捕獲的差異;dispersions用于后續(xù)的差異表達(dá)分析
cd <- estimateSizeFactors(cd)
cd <- estimateDispersions(cd)
2.3 數(shù)據(jù)過濾
# 過濾低于1%細(xì)胞中檢出的基因,最低表達(dá)閾值為0.5
cd <- detectGenes(cd, min_expr = 0.5)
expressed_genes <- row.names(subset(fData(cd), num_cells_expressed > nrow(sample_sheet) * 0.01))
# 查看篩選后的基因個(gè)數(shù)(用于后面基因的篩選)
length(expressed_genes)
3. 構(gòu)建軌跡
3.1 關(guān)鍵基因的篩選
發(fā)育過程中細(xì)胞處于動(dòng)態(tài)變化的過程,細(xì)胞在不同狀態(tài)表達(dá)的基因表達(dá)譜有所差異,monocle根據(jù)每個(gè)細(xì)胞基因的表達(dá)譜的相似和連續(xù)變化對(duì)細(xì)胞構(gòu)建發(fā)育軌跡。第一個(gè)步驟是挑選合適的基因,包括3種方法,分別是:
1)挑選細(xì)胞間高度離散的基因
2)挑選在指定類型間差異表達(dá)的基因
3)根據(jù)已知標(biāo)記基因?qū)?xì)胞進(jìn)行排序
3.1.1 挑選細(xì)胞間高度離散的基因
disp_table <- dispersionTable(cd)
# 高度離散基因的篩選標(biāo)準(zhǔn),可根據(jù)數(shù)據(jù)情況設(shè)置mean_expression的值
ordering_genes <- as.character(subset(disp_table,mean_expression >= 0.3 & dispersion_empirical >= dispersion_fit)$gene_id)
cd <- setOrderingFilter(cd, ordering_genes)
plot_ordering_genes(cd)
每一個(gè)點(diǎn)代表一個(gè)基因,X軸是每個(gè)基因的表達(dá)量均值,Y軸是每個(gè)基因的離散程度,紅線為擬合的基因離散程度隨著表達(dá)量變化的趨勢(shì)線,黑色的點(diǎn)是用于后續(xù)分析的基因。
3.1.2 挑選在指定類型間差異表達(dá)的基因
# 根據(jù)數(shù)據(jù)的某種分類(如本例中根據(jù)Stage的類型)進(jìn)行差異分析
diff_test_res <- differentialGeneTest(cd[expressed_genes,],fullModelFormulaStr = "~Stage")
# 篩選差異基因(q < 1e-5并且屬于之前計(jì)算的expressed_genes列表中)
ordering_genes <- row.names (subset(diff_test_res, qval < 1e-5))
ordering_genes <- intersect(ordering_genes, expressed_genes)
cd <- setOrderingFilter(cd, ordering_genes)
plot_ordering_genes(cd)
其中黑色的點(diǎn)就是根據(jù)分類篩選出的差異基因并且用于后續(xù)的分析。
3.1.3 根據(jù)已知標(biāo)記基因?qū)?xì)胞進(jìn)行排序
這種方法需要參考一些已發(fā)表的文獻(xiàn)或者先驗(yàn)知識(shí)收集到的基因。
3.2 細(xì)胞降維
# 選取的基因數(shù)目為每個(gè)細(xì)胞的維度,基于默認(rèn)的'DDRTree'方法進(jìn)行數(shù)據(jù)降維
cd <- reduceDimension(cd, max_components = 2, method = 'DDRTree')
3.3 細(xì)胞排序
# 對(duì)細(xì)胞進(jìn)行排序,由于排序無法區(qū)分起點(diǎn)和終點(diǎn),若分析所得時(shí)序與實(shí)際相反,根據(jù)“reverse”參數(shù)進(jìn)行調(diào)整,默認(rèn)reverse=F
cd <- orderCells(cd, reverse = F)
3.4 軌跡可視化
# 排序好的細(xì)胞可以進(jìn)行可視化,可標(biāo)注細(xì)胞的各注釋信息"Stage", "Putative_cell_type", "Sort_by", "State", "Pseudotime"等)
# 查看細(xì)胞注釋信息
head(cd@phenoData@data)
# 設(shè)置顏色
color1 <- c(brewer.pal(6, "Set1"))
getPalette <- colorRampPalette(brewer.pal(6, "Set1"))
# 按照時(shí)間點(diǎn)進(jìn)行映射
plot_cell_trajectory(cd, show_cell_names = F, color_by = "Stage") + scale_color_manual(values = getPalette(length(unique(sample_sheet[,"Stage"]))))
# 按照細(xì)胞類型進(jìn)行映射(手動(dòng)設(shè)置顏色)
plot_cell_trajectory(cd, show_cell_names = F, color_by = "Putative_cell_type") + scale_color_manual(values = c("#E41A1C", "#999999"))
# 按照State進(jìn)行映射
plot(plot_cell_trajectory(cd, show_cell_names = F, color_by = "State") + scale_color_manual(values = color1))
# 按照計(jì)算的Pseudotime進(jìn)行映射
plot(plot_cell_trajectory(cd, show_cell_names = F, color_by = "Pseudotime") + scale_color_viridis_c())
每一個(gè)點(diǎn)代表一個(gè)細(xì)胞,Pseudotime代表計(jì)算的發(fā)育時(shí)間,值越小則表示該細(xì)胞作為發(fā)育起始,值越大代表該細(xì)胞更接近發(fā)育終點(diǎn)
如果發(fā)現(xiàn)發(fā)育軌跡和真實(shí)的時(shí)間不一致,那么可以通過運(yùn)行cd <- orderCells(cd, reverse = F),其中reverse = T重新計(jì)算發(fā)育軌跡。
運(yùn)行完上面的命令這樣就能構(gòu)建好一個(gè)發(fā)育軌跡啦,這期的內(nèi)容就先到這里啦,下一期我們?cè)诶^續(xù)學(xué)習(xí)發(fā)育軌跡中的差異分析~