Skip to content

3.3 基因本体(GO)中各 BP、MF 和 CC 的富集分析

Gene Ontology (GO) 系统中的三个本体类别

"BP", "MF", "CC" 是 Gene Ontology (GO) 系统中的三个主要本体类别。这三个类别旨在提供一个全面且分层的框架,用于分类生物学功能和过程及其发生的地点。GO 被广泛用作系统描述基因和蛋白质功能的通用语言。

  • BP (Biological Process): 生物过程本体描述生物学对象(如分子或细胞)参与的生物事件和活动。这包括单个生物学对象执行的功能或多个成分协同进行的过程。例如,细胞周期、代谢和信号传导等过程。

  • MF (Molecular Function): 分子功能本体描述生物学对象在分子水平上的活动。这指的是生物过程中执行的特定任务。例如,DNA 结合、酶活性和受体活性等。

  • CC (Cellular Component): 细胞成分本体描述细胞或细胞外环境中生物学对象的位置,或它们形成的复合体。例如,细胞膜、线粒体、染色质和核糖体等。

按 BP, MF, CC 进行富集分析的方法

接下来介绍如何按 BP, MF, CC 进行富集分析的代码。我们使用绝对值、上调和下调三种基因集合进行分析,但只对绝对值进行可视化。此外,我们使用 facet_grid 函数将 BP, MF, CC 的图表合并到一个图中。为了避免图表过于复杂,每个类别只显示 10 个 term。

# 必需的库
library(readr)
library(ggplot2)
library(clusterProfiler)
library(AnnotationDbi)
library(org.Hs.eg.db)

gene_list <- read_csv("deseq2_results.csv")

# 将基因符号转换为Entrez ID
convertToEntrez <- function(genes) {
  mapIds(
    org.Hs.eg.db,
    keys = genes,
    column = "ENTREZID",
    keytype = "ENSEMBL",
    multiVals = "first"
  )
}

# 进行富集分析并获取唯一的top terms
performGoEnrichment <- function(entrez_ids) {
  list(
    BP = enrichGO(
      entrez_ids,
      OrgDb = "org.Hs.eg.db",
      ont = "BP",
      pAdjustMethod = "BH",
      qvalueCutoff = 0.05
    ),
    MF = enrichGO(
      entrez_ids,
      OrgDb = "org.Hs.eg.db",
      ont = "MF",
      pAdjustMethod = "BH",
      qvalueCutoff = 0.05
    ),
    CC = enrichGO(
      entrez_ids,
      OrgDb = "org.Hs.eg.db",
      ont = "CC",
      pAdjustMethod = "BH",
      qvalueCutoff = 0.05
    )
  )
}

# 假设你将DESeq2结果存储在变量"res_df"中
differentially_expressed_genes <- subset(
  gene_list, abs(log2FoldChange) > 1 & pvalue < 0.05
)
upregulated_genes <- subset(gene_list, log2FoldChange > 1 & pvalue < 0.05)
downregulated_genes <- subset(gene_list, log2FoldChange < -1 & pvalue < 0.05)

# 将基因符号转换为Entrez ID
entrez_ids_deg <- convertToEntrez(differentially_expressed_genes$...1)
entrez_ids_up <- convertToEntrez(upregulated_genes$...1)
entrez_ids_down <- convertToEntrez(downregulated_genes$...1)

# 富集分析
ego_deg <- performGoEnrichment(entrez_ids_deg)
ego_up <- performGoEnrichment(entrez_ids_up)
ego_down <- performGoEnrichment(entrez_ids_down)

visualizeGoEnrichment <- function(enrichment_results) {
  combined_plot <- lapply(enrichment_results, function(ego) {
    df <- as.data.frame(ego@result)

    # 将GeneRatio转换为小数
    parts <- strsplit(as.character(df$GeneRatio), "/")
    df$GeneRatio <- as.numeric(sapply(parts, `[`, 1)) /
      as.numeric(sapply(parts, `[`, 2))

    df$ont <- names(enrichment_results)[
      sapply(enrichment_results, function(x) identical(ego, x))
    ]

    # 选择p.adjust最小的前10行
    df <- df[order(df$p.adjust)[1:10], ]

    return(df)
  })
  combined_plot <- do.call(rbind, combined_plot)

  # 将'ont'列转换为有明确层次的因子
  combined_plot$ont <- factor(combined_plot$ont, levels = c("BP", "MF", "CC"))

  # 根据'GeneRatio'降序重新排序'Description'因子的层次
  combined_plot$Description <- reorder(
    combined_plot$Description, combined_plot$GeneRatio
  )

  ggplot(combined_plot, aes(x = GeneRatio, y = Description)) +
    geom_point(aes(size = Count, color = -log10(p.adjust))) +
    scale_color_continuous(low = "blue", high = "red") +
    facet_grid(ont ~ ., scales = "free_y") +
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
    theme_bw()
}

# 绘图
p <- visualizeGoEnrichment(ego_deg)
print(p)

如果输出结果与预期一致,则表示成功!

image.png

代码解读

该代码用于从 RNA-Seq 数据分析中获得的差异表达基因列表进行 Gene Ontology (GO) 富集分析,并对结果进行可视化。以下是代码各部分的详细说明。

1. 加载库

library(readr)
library(ggplot2)
library(clusterProfiler)

加载所需的 R 包。

2. 读取数据

gene_list <- read_csv("deseq2_results.csv")

deseq2_results.csv 文件读取 DESeq2 的结果。

3. 将基因符号转换为 Entrez ID

convertToEntrez <- function(genes) {
   mapIds(
      org.Hs.eg.db,
      keys = genes,
      column = "ENTREZID",
      keytype = "ENSEMBL",
      multiVals = "first"
   )
}

定义一个函数,将基因符号转换为 Entrez ID。

4. 执行 GO 富集分析

performGoEnrichment <- function(entrez_ids) {
  list(
    BP = enrichGO(
      entrez_ids,
      OrgDb = "org.Hs.eg.db",
      ont = "BP",
      pAdjustMethod = "BH",
      qvalueCutoff = 0.05
    ),
    MF = enrichGO(
      entrez_ids,
      OrgDb = "org.Hs.eg.db",
      ont = "MF",
      pAdjustMethod = "BH",
      qvalueCutoff = 0.05
    ),
    CC = enrichGO(
      entrez_ids,
      OrgDb = "org.Hs.eg.db",
      ont = "CC",
      pAdjustMethod = "BH",
      qvalueCutoff = 0.05
    )
  )
}

定义一个函数,对给定的 Entrez ID 列表进行 GO 富集分析。

5. 选择差异表达基因

differentially_expressed_genes <- subset(
  gene_list, abs(log2FoldChange) > 1 & pvalue < 0.05
)
upregulated_genes <- subset(gene_list, log2FoldChange > 1 & pvalue < 0.05)
downregulated_genes <- subset(gene_list, log2FoldChange < -1 & pvalue < 0.05)

使用 log2 倍变化和 p 值标准,从基因列表中选择差异表达基因。

6. 转换为 Entrez ID

entrez_ids_deg <- convertToEntrez(differentially_expressed_genes$...1)
entrez_ids_up <- convertToEntrez(upregulated_genes$...1)
entrez_ids_down <- convertToEntrez(downregulated_genes$...1)

将选择的差异表达基因列表转换为 Entrez ID。

7. 执行富集分析

ego_deg <- performGoEnrichment(entrez_ids_deg)
ego_up <- performGoEnrichment(entrez_ids_up)
ego_down <- performGoEnrichment(entrez_ids_down)

使用之前定义的 performGoEnrichment 函数进行富集分析。

8. 可视化富集结果

visualizeGoEnrichment <- function(enrichment_results) {
  combined_plot <- lapply(enrichment_results, function(ego) {
    df <- as.data.frame(ego@result)

    # 将GeneRatio转换为小数
    parts <- strsplit(as.character(df$GeneRatio), "/")
    df$GeneRatio <- as.numeric(sapply(parts, `[`, 1)) /
      as.numeric(sapply(parts, `[`, 2))

    df$ont <- names(enrichment_results)[
      sapply(enrichment_results, function(x) identical(ego, x))
    ]

    # 选择p.adjust最小的前10行
    df <- df[order(df$p.adjust)[1:10], ]

    return(df)
  })
  combined_plot <- do.call(rbind, combined_plot)

  # 将'ont'列转换为有明确层次的因子
  combined_plot$ont <- factor(combined_plot$ont, levels = c("BP", "MF", "CC"))

  # 根据'GeneRatio'降序重新排序'Description'因子的层次
  combined_plot$Description <- reorder(
    combined_plot$Description, combined_plot$GeneRatio
  )

  ggplot(combined_plot, aes(x = GeneRatio, y = Description)) +
    geom_point(aes(size = Count, color = -log10(p.adjust))) +
    scale_color_continuous(low = "blue", high = "red") +
    facet_grid(ont ~ ., scales = "free_y") +
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
    theme_bw()
}

# 绘图
p <- visualizeGoEnrichment(ego_deg)
print(p)

定义一个函数来可视化富集分析的结果,然后生成并显示图表。

总结

该代码通过以下步骤,从 RNA-Seq 数据中识别差异表达基因,并对其进行 GO 富集分析和可视化:

  1. 加载必要的 R 包。
  2. 从 CSV 文件读取 DESeq2 结果。
  3. 定义并执行函数将基因符号转换为 Entrez ID。
  4. 选择差异表达基因。
  5. 执行 GO 富集分析。
  6. 定义并执行函数可视化富集结果。