拟时序分析(Pseudotime Analysis)在单细胞测序(Single-cell RNA-seq)中是一个重要的分析步骤,主要用于研究细胞在发育过程或其他生物学过程中所经历的状态变化。与传统的时间序列不同,拟时序分析不依赖于实际的时间信息,而是通过单细胞转录组数据来推测出细胞状态的动态变化轨迹。以下是进行拟时序分析的几个主要原因:
通过拟时序分析,可以获得比传统方法更细致的关于细胞命运决定过程的见解,这对于理解复杂的生物过程、疾病机理,以及开发新的治疗策略具有重要意义
rm(list = ls())
library(cowplot)
library(dplyr)
library(data.table)
library(tidyverse)
library(paletteer)
library(vcd)
library(limma)
library(gplots)
library(Seurat)
library(clustree)
library(ggplot2)
library(reshape2)
library(dplyr)
library(monocle)
library(RColorBrewer)
library(ggpubr)
library(ggsignif)
library(patchwork)
library(tidydr)
library(ggforce)
library(ggrastr)
library(viridis)
library(gridExtra)
library(ggnewscale)
library(org.Mm.eg.db)
library(ComplexHeatmap)
library(ClusterGVis)
load(file = 'first_sce3.Rdata')
table(sce$celltype)
sce <- sce[,!(sce$celltype %in% c( "Carcer","CAF5","CAF6"))]
dir.create("monocle2")
setwd("monocle2/")
# 1.构建cds对象 ---------------------------------------------------------------
####################### 定义函数
run_monocle2 <- function(scRNAsub) {
scRNAsub <- sce
# 将counts矩阵转换为sparseMatrix
data <- as(as.matrix(scRNAsub@assays$RNA@counts), 'sparseMatrix')
# 将meta数据转换为AnnotatedDataFrame
pd <- new('AnnotatedDataFrame', data = scRNAsub@meta.data)
# 创建基因名表并转换为AnnotatedDataFrame
fData <- data.frame(gene_short_name = row.names(data), row.names = row.names(data))
fd <- new('AnnotatedDataFrame', data = fData)
# 创建CellDataSet对象
mycds <- newCellDataSet(data,
phenoData = pd,
featureData = fd,
expressionFamily = negbinomial.size())
# 估计size factors和dispersions
mycds <- estimateSizeFactors(mycds)
mycds <- estimateDispersions(mycds, cores = 16, relative_expr = TRUE)
disp_table <- dispersionTable(mycds)
unsup_clustering_genes <- subset(disp_table, mean_expression >= 0.1)
mycds <- setOrderingFilter(mycds, unsup_clustering_genes$gene_id)
pData(mycds)$orig.ident
> CONTROL GEM
> 1809 2974
# diff_test_res <- differentialGeneTest(mycds,
# fullModelFormulaStr = " celltype ~ orig.ident",
# reducedModelFormulaStr = " ~ orig.ident",
# relative_expr=TRUE, cores=16)
# ordering_genes <- row.names (subset(diff_test_res, qval < 0.01))
# ordering_genes
# mycds <- setOrderingFilter(mycds, ordering_genes)
#
# 寻找差异表达基因
diff.wilcox <- FindAllMarkers(scRNAsub)
all.markers <- diff.wilcox %>% dplyr::select(gene, everything()) %>% subset(p_val < 0.05)
diff.genes <- subset(all.markers, p_val_adj < 0.01)$gene
#设置代表性基因并绘图
mycds <- setOrderingFilter(mycds, diff.genes)
#降维
mycds <- reduceDimension(mycds , max_components = 4,
residualModelFormulaStr = "~orig.ident", #去除样本影响
reduction_method = 'DDRTree')
#排序
mycds <- orderCells(mycds )
save(mycds,file = "mycds.monocle2.Rdata")
# 返回处理过的CellDataSet对象和差异基因绘图
list(mycds = mycds)
}
# 使用示例
result <- run_monocle2(sce)
mycds <- result$mycds
代码解释
data <- ...
pd <- ...
fData <- ...
fd <- ...
在使用 Monocle2 进行单细胞 RNA 测序数据分析时,数据的格式需要符合特定的要求,以便能够利用 Monocle2 的功能。这几行代码将数据从 Seurat 对象的结构转换为适合 Monocle2 的结构。
sparseMatrix
) 的形式存储,但也可以是其他形式。为了确保数据在 Monocle2 中的高效处理,这一步先将表达矩阵转换为常规的矩阵形式 (as.matrix
),然后再将其转换为稀疏矩阵形式 (sparseMatrix
)。data.frame
的形式存储,包含每个细胞的附加信息,如细胞类型、样本来源等。在 Monocle2 中,这些元数据需要以 AnnotatedDataFrame
的形式提供。AnnotatedDataFrame 是 Bioconductor 数据包中的一种特殊数据结构,能够更好地管理数据和元数据的关联。Monocle2 使用 AnnotatedDataFrame来存储细胞的注释信息,以便在后续分析中访问这些元数据。
通过调用 new()
函数,代码创建了一个 AnnotatedDataFrame 类的实例 pd
,并将 scRNAsub@meta.data中的数据作为该对象的内容。
data.frame
,它存储了每个基因的基本信息。在 Monocle2 中,这些信息必须以 AnnotatedDataFrame 的形式提供,# 估计size factors和dispersions
mycds <- estimateSizeFactors(mycds)
mycds <- estimateDispersions(mycds, cores = 16, relative_expr = TRUE)
#数据过滤
disp_table <- dispersionTable(mycds)
unsup_clustering_genes <- subset(disp_table, mean_expression >= 0.1)
mycds <- setOrderingFilter(mycds, unsup_clustering_genes$gene_id)
diff.wilcox <- FindAllMarkers(scRNAsub)
all.markers <- diff.wilcox %>% dplyr::select(gene, everything()) %>% subset(p_val < 0.05)
diff.genes <- subset(all.markers, p_val_adj < 0.01)$gene
默认情况下,FindAllMarkers使用 Wilcoxon 排序检验来计算每个基因在每个细胞群体中与其他群体相比的差异表达程度。它会返回一个数据框,其中每行对应一个基因,包含基因名称、细胞群体、p 值等信息。
dplyr
包中的 select
函数,从 diff.wilcox
数据框中选择特定的列。gene
指定了需要提取的列,这里它确保基因名称列被包括在内。everything()
则会选择数据框中的所有其他列。这里筛选出所有 p 值小于 0.05 的基因,意味着这些基因在至少一个细胞群体中表现出显著的差异表达。#设置代表性基因并绘图
mycds <- setOrderingFilter(mycds, diff.genes)
#降维
mycds <- reduceDimension(mycds , max_components = 4,
residualModelFormulaStr = "~orig.ident", #去除样本影响
reduction_method = 'DDRTree')
#排序
mycds <- orderCells(mycds )
save(mycds,file = "mycds.monocle2.Rdata")
# 返回处理过的CellDataSet对象和差异基因绘图
list(mycds = mycds)
这段代码是在 Monocle2 中进行降维、细胞排序和保存结果的过程。它的目的是利用筛选出的差异表达基因,按照拟时序的方式对细胞进行排序,从而推断出细胞状态的动态变化。
DDRTree
(Discriminative Dimensionality Reduction with Trees)是 Monocle2 中的一种特殊降维方法,它不仅降低了数据的维度,还试图捕捉细胞状态之间的分支和拟时序轨迹。这种方法适用于拟时序分析,因为它可以揭示细胞状态如何随时间或分化进程变化。GM_state <- function(cds,x){
if (length(unique(pData(cds)$State)) > 1){
T0_counts <- table(pData(mycds)$State, pData(mycds)$RNA_snn_res.0.8)[,x]
return(as.numeric(names(T0_counts)[which
(T0_counts == max(T0_counts))]))
} else {
return (1)
}
}
# 使用示例
mycds <- orderCells(mycds, root_state = GM_state(mycds,"7"))
代码解释
这段代码的目的是根据细胞状态信息确定拟时序分析中的“根状态”(root_state),并使用这个根状态来重新对细胞进行排序。这在拟时序分析中是关键的一步,因为根状态通常代表最早的或未分化的细胞状态,而其他细胞状态将在拟时序轨迹中相对于这个根状态进行排序。
x
指定的簇,比如 "7"
)的细胞数目统计表。root_state
参数,可以确定细胞排序的起点,即轨迹的起始位置。调用 GM_state 函数,确定簇 "7"的根状态,然后将其作为 root_state 传递给 orderCells()函数。这意味着希望使用簇 "7"中细胞数目最多的状态作为拟时序轨迹的起点。######################作图
process_single_cell_data <- function(mycds) {
data_df <- t(reducedDimS(mycds)) %>%
as.data.frame() %>%
select_('Component 1' = 1, 'Component 2' = 2) %>%
rownames_to_column("Cells") %>%
mutate(pData(mycds)$State,
pData(mycds)$Pseudotime,
pData(mycds)$orig.ident,
pData(mycds)$celltype)
colnames(data_df) <- c("cells","Component_1","Component_2","State",
"Pseudotime","orig.ident","celltype")
reduced_dim_coords <- reducedDimK(mycds)
ca_space_df <- Matrix::t(reduced_dim_coords) %>%
as.data.frame() %>%
select_(prin_graph_dim_1 = 1, prin_graph_dim_2 = 2) %>%
mutate(sample_name = rownames(.), sample_state = rownames(.))
p1=ggplot() +
geom_point_rast(data = data_df, aes(x = Component_1,
y = Component_2,
color =Pseudotime),size =0.5) +
scale_color_viridis()+
theme_bw()+
#theme_dr(arrow = grid::arrow(length = unit(0, "inches")))+#坐标轴主题修改
theme(
axis.line = element_line(color = "black", size = 0.5),
panel.background = element_blank(),
panel.border = element_blank(),
panel.grid = element_blank(),
axis.ticks.length = unit(0.1, "lines"),
axis.ticks = element_blank(),
axis.title = element_text(size=15),
)
ggsave(p1,filename = "seurat_Pseudotime.pdf",width = 5,height = 3)
p3=ggplot() +
geom_point_rast(data = data_df, aes(x = Component_1,
y = Component_2, color = celltype),size =0.5) +
scale_color_npg()+
theme_bw()+
#theme_dr(arrow = grid::arrow(length = unit(0, "inches")))+#坐标轴主题修改
theme(
panel.background = element_blank(),
panel.border = element_blank(),
panel.grid = element_blank(),
axis.ticks.length = unit(0.1, "lines"),
axis.ticks = element_blank(),
axis.line = element_line(color = "black", size = 0.5),
axis.title = element_text(size=15),
)+ facet_wrap(~celltype, nrow = 1)
w=length(unique(data_df$celltype))*3
ggsave(p3,filename = "seurat_celltype2.pdf",width = w,height = 3)
colnames(data_df)
p4=ggplot() +
geom_point_rast(data = data_df, aes(x = Component_1,
y = Component_2, color = celltype),size =0.5) +
scale_color_npg()+
theme_bw()+
#theme_dr(arrow = grid::arrow(length = unit(0, "inches")))+#坐标轴主题修改
theme(
panel.background = element_blank(),
panel.border = element_blank(),
panel.grid = element_blank(),
axis.ticks.length = unit(0.1, "lines"),
axis.ticks = element_blank(),
axis.line = element_line(color = "black", size = 0.5),
axis.title = element_text(size=15),
)+ facet_wrap(~orig.ident, nrow = 1)
w=length(unique(data_df$orig.ident))*3
ggsave(p4,filename = "seurat_celltype3.pdf",width = w,height = 3)
# 返回两个数据框
list(data_df = data_df, ca_space_df = ca_space_df)
}
# 使用示例
result <- process_single_cell_data(mycds)
data_df <- result$data_df
ca_space_df <- result$ca_space_df
代码解释
list(data_df = data_df, ca_space_df = ca_space_df):
data_df
和 ca_space_df
),通过将它们放在列表中返回,可以方便地将它们一起传递给后续的处理步骤。process_single_cell_data函数实现了对单细胞数据的伪时间分析和降维可视化,并生成了多种散点图,分别展示了伪时间、细胞类型和样本来源在低维空间中的分布。
函数的主要步骤包括:
p1 seurat_Pseudotime.pdf
伪时间散点图
p2 seurat_celltype.pdf
细胞类型散点图
p3 seurat_celltype2.pdf
分面显示不同细胞类型的散点图
p4 seurat_celltype3.pdf
分面显示不同样本来源的散点图
###################时序相关差异基因
clusterAndVisualize <- function(mycds, num_clusters = 4, gene_num = 200, enrich_db = "org.Mm.eg.db",
organism = "mmu", pvalue_cutoff = 0.05, topn = 5, seed = 123456,
output_pdf = "gh.pdf", pdf_height = 5, pdf_width = 12) {
# 差异基因测试
diff_test <- differentialGeneTest(mycds, cores = 16, fullModelFormulaStr = "~sm.ns(Pseudotime)")
diff_genes <- diff_test %>% arrange(qval) %>% head(gene_num) %>% dplyr::select(gene_short_name)
# 聚类并可视化
df <- plot_pseudotime_heatmap2(mycds[diff_genes[,1],],
num_clusters = num_clusters,
cores = 1,
use_gene_short_name = TRUE,
show_rownames = TRUE)
# 富集分析
enrich <- enrichCluster(object = df,
OrgDb = enrich_db,
type = "BP",
organism = organism,
pvalueCutoff = pvalue_cutoff,
topn = topn,
seed = seed)
# 采样标记基因
markGenes <- sample(unique(df$wide.res$gene), 25, replace = FALSE)
# 创建PDF输出
pdf(file = output_pdf, height = pdf_height, width = pdf_width, onefile = FALSE)
# 可视化聚类结果和富集分析结果
visCluster(object = df,
plot.type = "both",
column_names_rot = 45,
show_row_dend = FALSE,
markGenes = sample(df$wide.res$gene, gene_num, replace = FALSE),
markGenes.side = "right",
annoTerm.data = enrich,
go.col = rep(jjAnno::useMyCol("calm", n = num_clusters), each = 5),
line.side = "left")
# 关闭PDF设备
dev.off()
}
#使用示例
clusterAndVisualize(mycds, num_clusters = 4, gene_num = 400, enrich_db = "org.Mm.eg.db",organism = "mmu")
代码解释
clusterAndVisualize 函数用于对单细胞测序数据中的拟时序分析结果进行聚类和可视化,并执行富集分析
函数参数
mycds
:拟时序分析后的 CellDataSet 对象,包含了细胞的表达矩阵、元数据等信息。num_clusters
:聚类的数量,用于将差异基因分成 num_clusters 个簇。gene_num
:用于聚类和可视化的基因数量。enrich_db
:用于富集分析的数据库,默认为 "org.Mm.eg.db"
,小鼠的基因数据库。organism
:用于富集分析的物种,默认为 "mmu"
,即小鼠。pvalue_cutoff
:富集分析的 P 值阈值。topn
:在富集分析中显示的前 topn
个富集项。seed
:用于随机过程中的种子,以保证结果的可重复性。output_pdf
:输出 PDF 文件的名称。pdf_height
和 pdf_width
:输出 PDF 的高度和宽度。diff_test <- ...
diff_genes <- ...
这两行代码主要涉及差异基因分析,用于识别那些在拟时序过程中显著变化的基因。
mycds
对象中的基因进行差异表达分析,目的是找出哪些基因在细胞的拟时序轨迹中发生显著变化。fullModelFormulaStr = "~sm.ns(Pseudotime)": 这是一个线性模型的公式,指定了如何解释基因表达的变化。返回一个包含测试结果的数据框,其中每一行代表一个基因,并包含该基因的统计检验结果,如 p 值(p-value)、校正后的 p 值(q-value)等。qval
越小,基因的表达变化越显著,因此这种排序方式有助于找到那些在拟时序中变化最显著的基因。select(gene_short_name):从结果中只选择 gene_short_name
列。最终结果 diff_genes 是一个包含 gene_num个基因符号的数据框,表示这些基因在拟时序分析中表达显著变化。这些基因随后可以用于进一步分析,如聚类分析或功能富集分析。df <- plot_pseudotime_heatmap2(...)
plot_pseudotime_heatmap2 函数生成一个热图(并不直接生成热图),展示指定基因在拟时序轨迹中的表达情况,并根据这些基因的表达模式进行聚类。这种可视化有助于识别基因表达在细胞状态变化过程中的动态变化。
df这个变量保存了 plot_pseudotime_heatmap2函数的输出。根据命名规则和上下文,这个输出可能是一个数据框,包含了基因表达和聚类的信息,也可能是热图的相关数据结构,用于进一步分析或绘图。
enrich <- enrichCluster(...)
参数解释:
object = df
: 输入的数据框,通常包含基因表达数据。OrgDb = enrich_db
: 指定用于富集分析的基因注释数据库(如 org.Mm.eg.db
用于小鼠)。type = "BP"
: 指定富集分析的类型,这里是生物过程(BP)。organism = organism
: 物种信息,例如小鼠(mmu
)。pvalueCutoff = pvalue_cutoff
: 指定显著性水平的阈值,筛选显著的富集结果。topn = topn
: 返回前 topn
个显著的富集结果。seed = seed
: 设置随机种子,以确保结果的可重复性。 在 enrichCluster 函数中设置 seed 是为了确保分析结果的可重复性。具体来说,以下是为什么在这样的函数中设置 seed
的原因:
seed
可以使得这些随机过程在每次运行时产生相同的结果,从而确保分析的稳定性和可重复性。markGenes <- sample(...)
sample函数: 从 df$wide.res$gene
中不重复地随机抽取 25 个基因。unique(df$wide.res$gene): 获取所有独特的基因名。replace = FALSE`: 表示采样时不放回。
pdf(...)
visCluster(...)
dev.off()
参数解释:
object = df
: 输入的数据对象,通常是聚类或热图的数据。plot.type = "both"
: 指定绘制类型,如同时绘制热图和柱状图。column_names_rot = 45
: 设置列名旋转角度。show_row_dend = FALSE
: 指定是否显示行聚类树。markGenes
: 指定要标记的基因。markGenes.side = "right"
: 标记基因显示在图形的右侧。annoTerm.data = enrich
: 富集分析结果数据,用于在热图上进行注释。go.col
: 设置不同聚类的颜色。line.side = "left"
: 将线条显示在图形的左侧。gh.pdf
图片解读
这张图展示了基因表达模式在不同细胞簇中的变化,并将这些模式与特定的生物学过程(通过富集分析得到的结果)关联起来。以下是对这张图的详细解读:
1. 热图概述
2. 基因簇(C1, C2, C3, C4)
3. 基因名称
4. 富集的生物学过程
5. 颜色刻度
解读
plotGeneOverPseudotime <- function(data, gene, output_file1, output_file2, colors_orig_ident) {
counts = Biobase::exprs(mycds)
phe <- pData(mycds)
dim(counts)
#z=as.data.frame(counts[gene_to_cluster,])
z=as.data.frame(counts)
ac=phe[,c("orig.ident","celltype","Pseudotime")]#这里是对热图进行分组的信息,从colnames(phe)中选
head(ac)
A=merge(ac,t(z),by = "row.names")
rownames(A)=A$Row.names
A=A[,-1]
# 绘制第一个图
p1 <- ggplot(data = A, aes(x = Pseudotime, y = .data[[gene]])) +
geom_point(aes(color = celltype), alpha = 0.7, size = 0.5) +
scale_color_npg() + # 替换为实际的celltype值和颜色
new_scale_color() +
geom_smooth(method = "loess", se = FALSE, aes(color = orig.ident)) +
scale_color_manual(values = colors_orig_ident, aesthetics = "colour", name = "orig.ident") +
theme_bw() +
theme(
panel.background = element_blank(),
panel.border = element_blank(),
panel.grid = element_blank(),
axis.ticks.length = unit(0.1, "lines"),
axis.ticks = element_blank(),
axis.line = element_line(color = "black", size = 0.5),
axis.title = element_text(size = 15)
)
ggsave(p1, filename = output_file1, width = 5, height = 3)
# 绘制第二个图,带facet_wrap
p2 <- ggplot(data = A, aes(x = Pseudotime, y = .data[[gene]])) +
geom_point(aes(color = celltype), alpha = 0.7, size = 0.5) +
scale_color_npg() + # 替换为实际的celltype值和颜色
new_scale_color() +
geom_smooth(method = "loess", se = FALSE, aes(color = orig.ident)) +
scale_color_manual(values = colors_orig_ident, aesthetics = "colour", name = "orig.ident") +
facet_wrap(~orig.ident) +
theme_bw() +
theme(
panel.background = element_blank(),
panel.border = element_blank(),
panel.grid = element_blank(),
axis.ticks.length = unit(0.1, "lines"),
axis.ticks = element_blank(),
axis.line = element_line(color = "black", size = 0.5),
axis.title = element_text(size = 15)
)
# 计算宽度
w <- length(unique(data$orig.ident)) * 3
ggsave(p2, filename = output_file2, width = w, height = 3)
}
# 示例用法
plotGeneOverPseudotime(mycds, "S100a8", "gene_Pseudotime.pdf", "gene_Pseudotime_orig.ident.pdf",
colors_orig_ident = c("CONTROL" = "skyblue", "GEM" = "pink"))
定义了一个名为 plotGeneOverPseudotime
的函数,用于绘制特定基因在伪时间(Pseudotime)上的表达趋势,并将其结果保存为PDF文件。这个函数包括了两种可视化方式:一个简单的点图和一个带有 facet_wrap 分组的图。以下是对这段代码的详细解释:
函数参数:
data
:输入的数据集,一般是一个包含细胞信息和基因表达数据的对象。gene
:指定要绘制的基因名称。output_file1
和 output_file2
:两个PDF输出文件的路径,用于保存生成的图。colors_orig_ident
:一个命名向量,用于指定不同 orig.ident
组别的颜色。代码解释
counts = Biobase::exprs(mycds)
phe <- pData(mycds)
counts
:提取包含基因表达数据的矩阵,行表示基因,列表示细胞。phe
:提取细胞的表型数据(metadata),包括 orig.ident、celltype和 Pseudotime 等信息。z=as.data.frame(counts)
ac=phe[,c("orig.ident","celltype","Pseudotime")]
A=merge(ac,t(z),by = "row.names")
rownames(A)=A$Row.names
A=A[,-1]
ac
:提取与伪时间分析相关的表型信息,包括 orig.ident
(实验组别)、celltype
(细胞类型)和 Pseudotime
(伪时间)。A
:将表型信息与转置后的表达数据合并,生成一个综合数据框 A
。gene_Pseudotime.pdf
gene_Pseudotime_orig.ident.pdf
参考链接
https://www.jianshu.com/p/9995cd707002
#########################差异分析分支节点
# 定义函数
plot_cell_trajectory(mycds, color_by = "State",size=0.01)
ggsave(filename = "plot_cell_trajectory.pdf",width = 5,height = 5)
analyze_and_visualize_BEAM <- function(mycds, branch_point_BEAM = 1, branch_point_heatmap = 1,
num_clusters = 4, cores = 8, qval_threshold = 1e-4,
enrich_db = "org.Mm.eg.db", organism = "mmu", pvalueCutoff = 0.05, topn = 5,
seed = 123456, output_filename = "branch-enrich.pdf") {
# 运行BEAM
BEAM_res <- BEAM(mycds, branch_point = branch_point_BEAM, cores = cores, progenitor_method = 'duplicate')
BEAM_res <- BEAM_res[order(BEAM_res$qval),]
# 筛选基因并绘制热图
selected_genes <- row.names(subset(BEAM_res, qval < qval_threshold))
df <- plot_genes_branched_heatmap2(mycds[selected_genes,],
branch_point = branch_point_heatmap,
num_clusters = num_clusters,
cores = cores,
use_gene_short_name = TRUE,
show_rownames = TRUE)
# 富集分析
enrich <- enrichCluster(object = df,
OrgDb = enrich_db,
type = "BP",
organism = organism,
pvalueCutoff = pvalueCutoff,
topn = topn,
seed = seed)
# 随机选择标记基因
markGenes = sample(unique(df$wide.res$gene), 25, replace = FALSE)
# 可视化
pdf(output_filename, height = 6, width = 12, onefile = FALSE)
visCluster(object = df,
plot.type = "both",
column_names_rot = 45,
show_row_dend = FALSE,
markGenes = markGenes,
markGenes.side = "right",
annoTerm.data = enrich,
go.col = rep(jjAnno::useMyCol("calm", n = 4), each = 5),
go.size = "pval",
line.side = "left")
dev.off()
# 返回结果对象(如果需要)
list(heatmap_df = df, enrich_results = enrich, marked_genes = markGenes)
}
# 示例用法
result <- analyze_and_visualize_BEAM(mycds,branch_point_BEAM = 1,branch_point_heatmap = 1,
num_clusters = 4,
enrich_db = "org.Mm.eg.db", organism = "mmu")
补充:指定基因在分支上的表达差异(只显示branch,不显示pre_branch)
test_genes <- row.names(subset(fData(mycds), gene_short_name %in% c("Fam92a", "Tecr", "Cdon")))
p_test <- plot_genes_branched_pseudotime(mycds[test_genes,],
branch_point = 1,
color_by = "State",
ncol = 1)
ggsave(p_test, filename = "test_gene_branch.pdf", width = 10, height = 8)
test_gene_branch.pdf
对比branch-enrich.pdf理解
代码解释
plot_cell_trajectory(...)
这两行代码先绘制细胞轨迹图,将轨迹按 "State" 着色
plot_cell_trajectory.pdf
analyze_and_visualize_BEAM <- function(...)
定义了一个名为 analyze_and_visualize_BEAM 的函数,用于在单细胞轨迹分析中进行分支点的差异基因分析和富集分析,并生成相应的可视化结果。
参数解释:
mycds
: 输入的单细胞 RNA-seq 数据对象,包含基因表达数据和细胞元数据。branch_point_BEAM = 1
: 指定用于 BEAM 分析的分支点编号,确定在哪个细胞分支点进行差异分析,默认值为1。branch_point_heatmap = 1
:指定用于绘制基因表达热图的分支点编号,用于展示该分支点上基因的表达模式。num_clusters = 4
: 指定在热图中进行基因聚类的数量。基因根据表达模式被分为指定数量的聚类,并在热图中进行可视化。cores = 8
: 指定用于并行计算的 CPU 核心数量,以加速 BEAM 分析和聚类过程。qval_threshold = 1e-4
: 指定 q 值的阈值,用于筛选显著性基因。只有 q 值小于该阈值的基因才会被用于热图绘制。enrich_db = "org.Mm.eg.db"
: 指定用于富集分析的基因注释数据库。此处的数据库适用于小鼠 (Mus musculus) 的基因。如果分析的是其他物种的数据,需要使用对应物种的数据库。organism = "mmu"
: 指定物种代号,"mmu"
表示小鼠。如果分析其他物种的数据,需要替换为相应的物种代号。pvalueCutoff = 0.05
: 设置富集分析中显著性的 p 值阈值。只有 p 值小于该阈值的条目才会被认为是显著富集的。topn = 5
: 指定在富集分析结果中展示的每个基因集群的前 n
个最显著的功能类别数量。seed = 123456
:设置随机数生成的种子值,以确保分析的可重复性,特别是在涉及随机过程的步骤中(例如标记基因的随机选择)。output_filename = "branch-enrich.pdf"
: 指定输出 PDF 文件的文件名,该文件将保存热图和富集分析结果的可视化内容。BEAM_res <- BEAM(...)
BEAM_res <- BEAM_res[order(BEAM_res$qval),]
注:什么是 BEAM 分析?
BEAM(Branch Expression Analysis Modeling) 是 Monocle 软件中的一种分析方法,专门用于处理单细胞 RNA-seq 数据。它用于识别在不同细胞命运分支之间差异表达的基因。简单来说,BEAM 分析可以帮助我们理解在细胞发育过程中,哪些基因在某个分支点上发生了显著变化,从而导致细胞向不同的方向分化。
1 branch_point = branch_point_BEAM: 指定进行 BEAM 分析的分支点(branch point),这个参数决定了在哪个细胞命运分支点上进行基因差异表达分析。
2 progenitor_method = 'duplicate': 指定使用哪种方法来处理 progenitor 细胞,'duplicate' 是一种方法,用于复制 progenitor 细胞的信息。
BEAM_res
返回的是一个数据框,其中包含了每个基因在指定分支点上的差异表达统计结果。selected_genes <- ...
df <- plot_genes_branched_heatmap2(...)
qval_threshold
的基因,然后使用 plot_genes_branched_heatmap2
绘制这些基因的分支热图。热图展示了不同分支上基因的表达情况,并按指定的集群数量进行聚类。enrich <- enrichCluster(...)
markGenes = sample(...)
pdf(...)
visCluster(...)
dev.off()
list(heatmap_df = df, enrich_results = enrich, marked_genes = markGenes)
branch-enrich.pdf
图片解读
曲线图,具体反映了在不同分支(branch1
和 branch2
)上,各个基因聚类(C1, C2, C3, C4)的表达变化模式。以下是对这些曲线图的详细解释:
基因聚类(C1, C2, C3, C4)
曲线图
branch1
到 branch2
的分化轨迹。左端代表 branch1
,右端代表 branch2
。曲线的含义
branch1
中,这些基因的表达水平较高(曲线起始较高)。Pre-branch
),表达水平有所下降(曲线下降)。branch2
时,表达水平再次上升(曲线回升)。branch1
和 branch2
中的表达水平相对稳定,但在过渡区域略有波动。branch1
中波动较大,在 branch2
中趋于稳定):branch1
中,这些基因的表达水平有波动,但整体较高。branch2
时,表达水平逐渐趋于稳定。branch1
中,基因表达水平先下降。branch2
中达到峰值。总结
左侧的这些曲线图直观展示了各个基因聚类在两个分支间的表达变化模式。这些变化趋势反映了不同基因在细胞分化过程中如何响应分支选择,帮助理解特定基因在不同分化路径中的角色和功能。
热图,展示了单细胞分化轨迹上的基因表达模式,重点放在两个分支 branch1
和 branch2
之间的差异。
热图部分(中间部分)
branch1
和 branch2
,它们代表了不同的分化轨迹或细胞命运。热图的列代表单个细胞,按分支顺序排列。右侧部分
颜色图例
Cell fate 1
,Pre-branch
,Cell fate 2
)中的归属。特别说明
借用官网对类似图片的描述
“列是伪时间中的点,行是基因,伪时间的开始位于热图的中间。当您从热图的中间向右阅读时,您正在通过伪时间跟踪一个谱系。当你向左阅读时,另一个。这些基因是分层聚类的,因此您可以可视化具有相似谱系依赖性表达模式的基因模块。”
plot_gene_branched_pseudotime <- function(mycds, genes, gene_name ,branch_point = 1, color_by = "celltype",
ncol = 1, cell_size = 2, width = 5, height = 3,
output_filename = "gene_branched_Pseudotime.pdf",
colors_celltype = NULL, colors_branch = NULL) {
# 绘制基因表达伪时间图
kk <- plot_genes_branched_pseudotime(mycds[genes,],
branch_point = branch_point,
color_by = color_by,
ncol = ncol,
cell_size = cell_size)
# 将ggplot对象转换为数据框
kk <- ggplot_build(kk)
B <- kk$plot$data
# 选择需要的列
B2 <- B[, c("Cell", "expression", "orig.ident", "f_id", "Pseudotime", "celltype", "Branch")]
# 转换数据框为宽格式
df <- dcast(B2, Cell + orig.ident + Pseudotime + celltype + Branch ~ f_id, value.var = "expression")
# 检查genes中是否有多个基因,并只选择第一个(如果有多个,需要修改以适应多个基因)
gene_name <- gene_name # 假设我们只处理一个基因,如果有多个需要调整
# 绘制ggplot
p1 <- ggplot(data = df, aes(x = Pseudotime, y = get(gene_name))) + # 使用get()来处理字符串作为列名
geom_point(aes(color = celltype), alpha = 0.7, size = 0.5) +
scale_color_npg() + # 替换为实际的celltype值和颜色
new_scale_color() +
geom_smooth(method = "loess", se = FALSE, aes(color = Branch)) +
scale_color_manual(values = c("skyblue","pink"), name = "Branch", aesthetics = "colour") +
theme_bw() + labs(x="Pseudotime",y =gene_name ,title = "")+
theme(panel.background = element_blank(),
panel.border = element_blank(),
panel.grid = element_blank(),
axis.ticks.length = unit(0.1, "lines"),
axis.ticks = element_blank(),
axis.line = element_line(color = "black", size = 0.5),
axis.title = element_text(size = 15))
# 保存图片
ggsave(p1, filename = output_filename, width = width, height = height)
# 可选:返回ggplot对象以供进一步使用
return(p1)
}
# 示例用法
plot_gene_branched_pseudotime(mycds, genes = c("S100a10", "S100a8"),gene_name= "S100a10" ,branch_point = 3)
plot_genes_branched_pseudotimes是内置函数,plot_gene_branched_pseudotime是重新定义的函数。
代码解释
kk <- ggplot_build(kk): 这行代码将 ggplot 对象 kk 转换为一个列表,其中包含 ggplot内部的数据和布局信息。
B <- kk$plot$data: 从 ggplot 对象中提取实际用于绘图的数据框,并将其存储在 B
中。
B2 <- B, c("Cell", "expression", "orig.ident", "f_id", "Pseudotime", "celltype", "Branch"): 从数据框 B
中选择特定的列,并将这些列存储到一个新的数据框 B2
中。
df <- dcast(B2, Cell + orig.ident + Pseudotime + celltype + Branch ~ f_id, value.var = "expression")“:将数据框 B2 转换为宽格式,并将其存储在 df 中。
注:
问:我只关注gene_name= "S100a10",为什么还要设置genes = c("S100a10", "S100a8")?
答:即使只关注 S100a10 这个基因。但因为 plot_genes_branched_pseudotime() 函数需要输入一组基因(即使只打算绘制其中一个) ,即plot_genes_branched_pseudotime(mycdsgenes,, ...)
gene_branched_Pseudotime.pdf
注:图中只有branch上的信息,而没有pre_branch上的信息。
补充:总体展示降维聚类分群
DimPlot(sce, reduction = "umap", group.by = "celltype",
split.by = 'orig.ident',
label = T,pt.size = 0.1,label.size = 3,
repel = T,label.box = T) +
scale_colour_manual(values = pal_d3("category20")(20),
aesthetics = c("colour", "fill"))
ggsave('umap-by-celltype-ggsci.pdf',height = 4,width=8)
umap-by-celltype-ggsci.pdf
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。