monocle3可以执行的3个主要的功能
对细胞进行聚类、分类和计数。Monocle 3 可识别新的(可能是罕见的)亚型细胞
构建单细胞轨迹。通过拟时序分析帮助大家解析生物体发育、疾病等过程中细胞发生的变化。这是最主要的功能。
差异表达分析。Monocle 3 包括一个复杂但易于使用的差分表达系统,可以表征新的细胞类型和状态始于与其他更好理解的细胞进行比较。
主要流程
1.读取数据,创建cell_data_set对象。
2.数据预处理:标准化,去除批次效应
3.降维
4.聚类
5.进行差异基因表达分析
6.拟时序分析
monocle3读取的数据要包含3个部分:
:
数据框,其中行是cell,列是细胞属性(如细胞类型、培养条件、获取日期等):
数据框,其中行是特征(例如基因),列是基因属性,例如生物型,GC含量等。输入前应该确保几个“等式”
创建对象示例
# Load the data
expression_matrix <- readRDS(url("https://depts.washington.edu:/trapnell-lab/software/monocle3/celegans/data/cao_l2_expression.rds"))
cell_metadata <- readRDS(url("https://depts.washington.edu:/trapnell-lab/software/monocle3/celegans/data/cao_l2_colData.rds"))
gene_annotation <- readRDS(url("https://depts.washington.edu:/trapnell-lab/software/monocle3/celegans/data/cao_l2_rowData.rds"))
# Make the CDS object
cds <- new_cell_data_set(expression_matrix,
cell_metadata = cell_metadata,
gene_metadata = gene_annotation)
要找到正确的文件,必须提供包含未修改的Cell Ranger“outs”文件夹的文件夹的路径。文件结构应如下所示:10x_data/outs/filtered_feature_bc_matrix/,其中filtered_feature_bc_matrix包含 files features.tsv.gz、barcodes.tsv.gz 和 matrix.mtx.gz。(还可以处理Cell Ranger V2数据,其中“feature”被替换为“gene”,并且文件未被gz压缩。(这个读取起来很容易报错)
读取示例:注意使用函数是load_cellranger_data
# Provide the path to the Cell Ranger output.
cds <- load_cellranger_data("~/Downloads/10x_data")
或者如果有以下3个文件,也可直接读取:注意使用函数是load_mm_data
cds <- load_mm_data(mat_path = "~/Downloads/matrix.mtx",
feature_anno_path = "~/Downloads/features.tsv",
cell_anno_path = "~/Downloads/barcodes.tsv")
当细胞量或基因量比较大的话,可以使用稀疏矩阵的方法读取
cds <- new_cell_data_set(as(umi_matrix, "sparseMatrix"),
cell_metadata = cell_metadata,
gene_metadata = gene_metadata)
# make a fake second cds object for demonstration
cds2 <- cds[1:100,]
big_cds <- combine_cds(list(cds, cds2))
cds <- preprocess_cds(cds, num_dim = 100)#主要是完成数据的标准化+PCA
plot_pc_variance_explained(cds)#查看的是每个维度的变异分数
cds <- align_cds(cds, alignment_group = "plate")#去除批次效应
查看每个PC的变异分数:plot_pc_variance_explained()
Monocle 3默认使用UMAP降维,降维方法有两种可以选择:PCA和LSI,RNA-seq数据选择 PCA,如果是ATAC-seq则使用LSI
cds <- reduce_dimension(cds,preprocess_method = 'PCA')
method = c("PCA", "LSI")
,默认是PCAnum_dim
是50norm_method
默认是log处理可视化:
plot_cells(cds)
对分群进行着色
colnames(colData(cds))#可以选任意一个进行着色
#[1] "plate" "cao_cluster" "cao_cell_type" "cao_tissue"
#[5] "Size_Factor"
plot_cells(cds, color_cells_by="cao_cell_type")
查看某些基因的表达分布
ciliated_genes <- c("che-1",
"hlh-17",
"nhr-6",
"dmd-6",
"ceh-36",
"ham-1")
plot_cells(cds,
genes=ciliated_genes,
label_cell_groups=FALSE,
show_trajectory_graph=FALSE)
tsne降维
可以看到效果不是很好
#也可以用tsne的方法进行降维,但是效果不好
cds <- reduce_dimension(cds, reduction_method="tSNE")
plot_cells(cds, color_cells_by="cao_cell_type", reduction_method="tSNE")
plot_cells(cds, reduction_method="tSNE",
color_cells_by="cao_cell_type",
cell_size = 2,
group_label_size = 3)
这是细胞分群过程中非常重要的一步。Monocle利用Louvain community detection 这个非监督聚类方法(它是phenoGraph
算法的一部分),它和我们常见的Kmeans、hclust层次聚类等还不太一样,这个方法更倾向于找到一个网络中联系紧密的部分,而经常忽略节点的特性;而我们常见的聚类呢,它一般会忽视整体中各个部分的联系,而通过计算两个节点(目标)之间的距离(如欧式距离、曼哈顿距离、余弦相似度等) 找到相似的特性
这里的聚类已经不再是单单的聚类,按照作者的说法,是把细胞进行分区,后去的轨迹分析都会针对这个分区来进行。partition是一些小的cluster的聚合,如果根据cluster进行着色的话会显得比较乱。
cds <- cluster_cells(cds)#聚类之后,每一个cluster会自成一个”拟时序轨迹“
plot_cells(cds, color_cells_by = "partition")
识别轨迹:对每个cluster进行主成分分析,这步以后拟时序图谱就已经初步产生了
cds <- learn_graph(cds)#对每个cluster进行主成分分析,这步以后拟时序图谱就已经初步产生了
plot_cells(cds,
color_cells_by = "cao_cell_type",
label_groups_by_cluster=FALSE,
label_leaves=FALSE,
label_branch_points=FALSE)
plot_cells(cds,
color_cells_by = "cao_cell_type",
label_cell_groups=FALSE,
label_leaves=TRUE,#展示分支
label_branch_points=TRUE,#展示分支节点
graph_label_size=1.5)
label_leaves
控制;label_branch_points
控制;cds <- order_cells(cds)
plot_cells(cds,
color_cells_by = "pseudotime",
label_cell_groups=FALSE,
label_leaves=FALSE,
label_branch_points=FALSE,
graph_label_size=1.5)
#某个基因的展示
plot_genes_in_pseudotime(cds[1:5,],
color_cells_by="cao_cell_type",
min_expr=0.5)
#方法一
get_earliest_principal_node <- function(cds, my_select="Am/PH sheath cells"){
cell_ids <- which(colData(cds)[, "cao_cell_type"] == my_select)
closest_vertex <-
cds@principal_graph_aux[["UMAP"]]$pr_graph_cell_proj_closest_vertex
closest_vertex <- as.matrix(closest_vertex[colnames(cds), ])
root_pr_nodes <-
igraph::V(principal_graph(cds)[["UMAP"]])$name[as.numeric(names
(which.max(table(closest_vertex[cell_ids,]))))]
root_pr_nodes
}#选择想要定义为起点的细胞类型
cds <- order_cells(cds, root_pr_nodes=get_earliest_principal_node(cds))#定义起点
#另一种方法
myselect <- function(cds,select.classify,my_select){
cell_ids <- which(colData(cds)[,select.classify] == my_select)
closest_vertex <-
cds@principal_graph_aux[["UMAP"]]$pr_graph_cell_proj_closest_vertex
closest_vertex <- as.matrix(closest_vertex[colnames(cds), ])
root_pr_nodes <-
igraph::V(principal_graph(cds)[["UMAP"]])$name[as.numeric(names
(which.max(table(closest_vertex[cell_ids,]))))]
root_pr_nodes
}
cds <- order_cells(cds,
root_pr_nodes=myselect(cds,select.classify = 'cao_cell_type',
my_select = "Body wall muscle")
#绘图
plot_cells(cds,
color_cells_by = "pseudotime",
label_cell_groups=FALSE,
label_leaves=FALSE,
label_branch_points=FALSE,
graph_label_size=1.5)|plot_cells(cds,
color_cells_by = "cao_cell_type",
label_cell_groups=FALSE,
label_leaves=FALSE,
label_branch_points=FALSE,
graph_label_size=1.5)#两种着色方式
可以看到以pseudotime为依据着色的话,就是以Body wall muscle为起点的紫色区域,序号1就是这个细胞所在区域。
3D轨迹实际上就是降维时选前3个主成分 => max_components = 3
,后续都和2D保持类似
cds_3d <- reduce_dimension(cds, max_components = 3)#降维
cds_3d <- cluster_cells(cds_3d)#聚类
cds_3d <- learn_graph(cds_3d)#轨迹学习
cds <- order_cells(cds,
root_pr_nodes=myselect(cds,select.classify = 'cao_cell_type',
my_select = "Body wall muscle")
)#选择拟时序分析的起点,和前面2D一样,用代码选择起点
cds_3d_plot_obj <- plot_cells_3d(cds_3d, color_cells_by="cao_cell_type")#绘图
差异表达分析,进行基因的轨迹分析,找出哪一些基因在这个轨迹中变化最大,graph_test()
这个函数可以进行一个叫做Moran's I 的spatial autocorrelation分析方法
subset_pr_test_res <- graph_test(cds, neighbor_graph="principal_graph", cores=4)#cores是指定核心数
运行好之后会得到一个表格,
Moran's I
这个指标叫:莫兰指数,澳大利亚统计学家莫兰于1950年提出。它是用来度量空间相关性的一个指标,数据经过方差归一化之后,会落在-1.0和1.0之间。这个值大于0表示空间正相关,值越大空间相关性越强;等于0时空间是随机性分布;小于0时表示空间负相关,值越小空间差异越大
morans_I(空间共表达),其数值越靠近1代表这个基因在空间距离相近的细胞中表达值越相似,0则代表没有空间共表达效应
#我们这里就按照morans_I的大小来选择前十个基因
top10 <- subset_pr_test_res %>% top_n(n=10, morans_I) %>%
pull(gene_short_name) %>% as.character()
#基因表达趋势图,绘图,画不出来,一直报错。
p <- plot_genes_in_pseudotime(cds[top10,],
color_cells_by="cao_cell_type",
min_expr=0.5,
ncol = 4)
#基因特征图
plot_cells(cds, genes=top10, show_trajectory_graph=FALSE,
label_cell_groups=FALSE, label_leaves=FALSE)
这个是寻找module与细胞/cluster/partition的相关性,module是指协同表达的基因模块,每个模块的基因可能有相似的表达趋势。
##寻找共表达模块
genelist <- pull(subset_pr_test_res, gene_short_name) %>% as.character()
gene_module <- find_gene_modules(cds[genelist,], resolution=1e-2, cores = 5)
cell_group <- tibble::tibble(cell=row.names(colData(cds)),
cell_group=colData(cds)$celltype)
agg_mat <- aggregate_gene_expression(cds, gene_module, cell_group)
row.names(agg_mat) <- stringr::str_c("Module ", row.names(agg_mat))
pheatmap::pheatmap(agg_mat, scale="column", clustering_method="ward.D2")