edgeR简介与安装

1.1 什么是edgeR?

edgeR,说白了,就是一个专为RNA-seq差异表达分析打造的R包。它的核心思想很简单:用负二项分布模型来处理测序数据里的过度离散问题。

我记得刚接触转录组分析那会儿,大家还在用简单的t检验。结果假阳性多到让人头疼。后来才发现,测序数据天生就有“过度离散”——基因表达在生物学重复间的波动比泊松分布假设的要大。edgeR正是专门解决这个问题的。

我个人习惯,拿到一个新数据集的第一件事就是用edgeR快速扫一遍差异基因。它速度快,内存占用也小,很适合做探索性分析。

1.2 核心统计模型

edgeR用的模型叫“经验贝叶斯负二项模型”。名字听起来唬人,其实就两个关键点:

  • 负二项分布:每个基因的表达量服从NB(μ, φ),其中μ是均值,φ是离散度。离散度越大,数据越“散”。
  • 经验贝叶斯:多个基因共享信息,对离散度做收缩估计。说白了,就是把所有基因的离散度拉向一个共同的先验,这样低表达基因的估计不会太离谱。

我在项目中遇到过这样的情况:测了三组生物学重复,其中一组有个明显的异常样本。如果不做离散度收缩,那个基因的p值会被严重低估。用了edgeR的默认方法,结果扎实很多。

为什么要用负二项? 因为RNA-seq计数数据的方差通常大于均值。泊松分布假设方差=均值,hold不住。负二分布多了离散参数,能更真实地拟合测序数据的波动。

1.3 安装环境准备

edgeR是Bioconductor生态的一员。所以安装前需要先搞定BiocManager。你的R版本最好别太老,3.5以上的基本都行。

# 安装BiocManager(如果还没有)
install.packages("BiocManager")

# 通过BiocManager安装edgeR
BiocManager::install("edgeR")
小技巧:如果你在服务器上安装,记得先options(repos = c(CRAN = "https://cloud.r-project.org")),不然下载可能很慢。

1.4 验证安装

装完之后,加载一下看有没有报错。我一般会用sessionInfo()看看版本信息。

library(edgeR)
sessionInfo()

如果看到类似这样的输出,就说明安装成功了:

R version 4.3.1 (2023-06-16)
Platform: x86_64-pc-linux-gnu (64-bit)

other attached packages:
[1] edgeR_4.0.0   limma_3.58.0

1.5 核心数据结构:DGEList

edgeR处理数据的起点是DGEList对象。你只需要准备一个基因×样本的计数矩阵,加上分组信息,就能构建它。

counts <- matrix(rpois(1000, lambda = 10), nrow = 100, ncol = 10)
group <- factor(rep(c("Ctrl", "Treat"), each = 5))
y <- DGEList(counts = counts, group = group)
y

输出会显示样本数、基因数、库大小等信息。你想想看,这个对象就像是一个数据容器,后面所有的归一化、离散度估计、差异检验都是基于它进行的。

坑! 我曾经因为列名搞混,把样本顺序搞反了。建议在处理真实数据时,先检查一下colnames(counts)和group的对应关系。少一个“Ctrl”写错,整个分析就偏了。

1.6 edgeR的工作流程总览

下面这张SVG图总结了你马上要经历的几个步骤。每一次参数调整,都会影响中间某个环节的输出。我会在后面的章节中逐一演示。

edgeR差异分析流程 原始计数矩阵 构建DGEList对象 归一化 (calcNormFactors) 离散度估计 (estimateDisp) 差异检验 (exactTest/glmQLFTest) 结果表格 (topTags) 参数影响区域 • 归一化方法 • 离散度先验 • 检验方法 • 多重校正

1.7 参数调整的意义

你仔细看上面的SVG图,绿色方框后面标注了“参数影响区域”。后面每修改一个参数(归一化方法、离散度先验强度、检验类型),都会导致最终的差异基因列表发生变化。这正是本课程的核心——让你直观看到参数变动带来的可视化输出差异。

举个例子:estimateDisp函数里有个参数trend.method,可选"none"、"movingave"、"loess"。我曾经在一次项目里发现,选"loess"和选"none"相比,高表达基因的离散度会收缩得更厉害,直接导致两组中几个高表达基因的p值变化了三个数量级。要是没有可视化对比,你根本不会注意到这个细节。

1.8 避坑指南

  • 零计数基因:edgeR会自动过滤掉在所有样本中表达量很低的基因。但有时候过滤阈值需要调整。我通常会用filterByExpr看默认过滤情况,再根据实际数据微调。
  • 库大小差异大:如果样本间总计数相差超过3倍,建议使用TMM归一化(默认就是TMM)。但极端情况下(比如某个样本只有其他样本的1/10),最好先检查一下那个样本是不是有问题。
  • 批量效应:edgeR本身不支持直接加入批次校正。我一般先用limma::removeBatchEffect处理后再转为DGEList,但要注意这样会损失一些自由度。
记住: 参数改变不只是数字的变化,它会直接影响你最终画出来的火山图、MA图、热图。后面每一章我都会用一个实际数据集,配合不同的参数组合,让你亲眼看到输出效果的变化。

小结

这一章我们把edgeR的“家底”摸了一遍:它是什么、为什么需要它、怎么装、怎么做。更重要的是,我们理清了整个数据分析流程中的参数敏感节点。

接下来,我会带你去看看默认参数下的可视化效果,然后再一个个改参数,看它怎么变。准备好了吗?