引言Introduction
差异分析是生信文章最常见的起点,但很多人卡在两个地方。第一,不知道 limma 该怎么写。第二,不知道结果如何写进论文,才符合发文逻辑。本文从 差异分析R代码 、结果解释到生信发文思路,帮你把这一步讲清楚。

1. limma包为什么适合做差异分析
1.1 limma的核心定位
limma 最早用于芯片数据差异分析,后来也广泛用于 RNA-seq 计数数据。它的优势在于流程成熟,统计框架清晰,适合标准化表达矩阵后的组间比较。
对于医学生、医生和科研人员来说,limma的价值不只是“能出结果”,而是“结果可解释、可复现、便于写进文章”。 在规范的生信文章中,差异表达分析往往就是后续火山图、热图、富集分析和PPI网络的入口。
1.2 适用数据与基本前提
limma 适合处理已经整理好的表达矩阵。常见输入包括:
- 芯片表达矩阵
- RNA-seq count矩阵
- 已完成基础预处理的数据
如果是 RNA-seq 数据,通常需要先做标准化,再进入 limma 分析。常见做法是结合 voom 方法,将 count 数据转换为适合线性模型处理的表达值。
关键点是,limma并不是“拿来就跑”的工具。 它依赖合理的分组、合适的标准化和明确的对比设计。分组错了,方向就可能错。对比矩阵错了,结果也会错。
2. limma差异分析的标准流程
2.1 第一步,构建设计矩阵
差异分析的起点不是画图,而是明确分组。你要先回答一个问题,谁和谁比较。
常见场景包括:
- 疾病组 vs 对照组
- 处理组 vs 未处理组
- 高表达组 vs 低表达组
- 多亚型之间的两两比较
在 limma 中,通常先用 model.matrix() 构建设计矩阵。这个步骤的作用,是把样本分组信息转化为统计模型可识别的形式。
2.2 第二步,线性建模与对比设置
完成分组后,下一步是拟合线性模型。芯片数据通常可以直接进入 lmFit()。如果是 RNA-seq 数据,常见流程是先 voom(),再 lmFit()。
随后根据研究问题设置对比。比如肿瘤组减去对照组,或者处理组减去模型组。这个阶段常用 contrasts.fit() 来指定比较方向。
这里最容易出错的不是代码本身,而是“比较方向”。
如果你写的是 tumor-control,那么 logFC>0 表示肿瘤组上调,logFC<0 表示肿瘤组下调。方向一旦写反,后面的生物学解释也会跟着错。
2.3 第三步,贝叶斯校正与结果提取
limma 的经典优势之一,是使用经验贝叶斯方法稳定方差估计。常见函数是 eBayes()。它的作用,是让小样本分析更稳健,减少单个基因方差波动过大的影响。
之后用 topTable() 提取结果。这个函数通常会输出:
- 基因名
- logFC
- AveExpr
- t 值
- P.Value
- adj.P.Val
- B 值
如果只记住一个字段,优先记住 logFC 和 adj.P.Val。
前者代表变化幅度,后者代表多重检验校正后的显著性。
3. 差异分析R代码怎么写才规范
3.1 一套常用limma代码框架
下面是一套适合论文分析思路的标准框架。不同项目可按实际数据调整。
library(limma)
# expr:表达矩阵,行为基因,列为样本
# group:分组向量,如 control / tumor
design <- model.matrix(~0 + group)
colnames(design) <- levels(group)
fit <- lmFit(expr, design)
contrast.matrix <- makeContrasts(tumor-control, levels = design)
fit2 <- contrasts.fit(fit, contrast.matrix)
fit2 <- eBayes(fit2)
deg <- topTable(fit2, adjust.method = "BH", number = Inf)
这段代码的逻辑很清楚:
- 先定义分组
- 再建模
- 再设置对比
- 再做统计校正
- 最后输出全量结果
这就是差异分析R代码最核心的骨架。
3.2 结果筛选的常用阈值
拿到 topTable() 结果后,通常会再做筛选。最常见的标准是:
adj.P.Val < 0.05|logFC| > 1
有些文章会使用更严格标准,例如:
adj.P.Val < 0.01|logFC| > 1.5或|logFC| > 2
阈值并没有绝对统一答案。关键是和研究设计一致,并在方法部分写清楚。 如果样本量小,过严阈值可能导致差异基因太少。如果样本量大,较严格阈值更有助于提升结果可信度。
3.3 上下调基因的定义
筛选之后,通常还要区分上调和下调:
logFC > 0,定义为上调logFC < 0,定义为下调
建议在文章和代码中都明确说明比较方向。例如“tumor versus normal”,不要只写“差异分析”。因为差异分析不是绝对概念,它一定依赖对比对象。
4. 从结果到图:火山图和热图怎么做
4.1 火山图的作用
火山图是差异分析结果最常见的展示方式。它可以同时呈现变化幅度和显著性。
通常:
- 横轴是
logFC - 纵轴是
-log10(P.Value)或-log10(adj.P.Val)
火山图的意义不是“好看”,而是快速识别显著差异基因。
红色常表示上调,蓝色常表示下调,灰色表示不显著基因。
4.2 热图的作用
热图更适合展示代表性差异基因在样本间的表达模式。一般会选取显著上调和下调基因中的前若干个,或者选取功能相关基因集。
在论文中,热图常用于回答两个问题:
- 差异基因是否能区分样本分组。
- 样本聚类是否与临床分组一致。
如果热图显示组内聚类稳定、组间分离清楚,说明你的差异结果有一定说服力。
4.3 可视化要避免的常见问题
很多图看起来“像差异分析”,但实际上不够规范。常见问题包括:
- 阈值未标明
- 颜色含义不一致
- 使用原始P值却不说明
- 样本分组方向未交代
- 只放图,不写图注
生信文章中,图不是装饰,而是证据。
每张图都要能回答一个明确问题。
5. limma结果如何写进生信文章
5.1 方法部分怎么写
方法部分要写清楚三件事:
- 用了什么数据
- 怎么做的差异分析
- 用了什么阈值
一个规范的写法思路是:
- 采用 limma 包进行差异表达分析
- 根据样本分组构建设计矩阵
- 使用线性模型拟合并进行贝叶斯校正
- 以
adj.P.Val和logFC作为筛选标准
方法部分越具体,文章越容易过审。
因为审稿人最关注的是可重复性。
5.2 结果部分怎么写
结果部分不要只写“获得若干差异基因”。要写清楚:
- 总共筛到多少个差异基因
- 上调多少个,下调多少个
- 用什么阈值筛选
- 差异基因主要涉及哪些生物过程
例如,结果段落通常应包含:
- 差异基因数量统计
- 火山图展示
- 热图展示
- 后续富集分析入口
数字比形容词更有说服力。
“显著改变”不如“筛得 238 个差异基因,其中上调 146 个,下调 92 个”更适合论文表达。
5.3 发文思路的主线
一个常见的生信发文逻辑是:
- 找到差异基因
- 做功能富集
- 建PPI或调控网络
- 筛关键基因
- 做外部验证或临床相关分析
差异分析只是起点。真正的发文价值,在于你能否把差异基因进一步转化成机制线索或临床价值。
如果你只是输出一个 DEG 列表,文章通常不够完整。
6. 差异分析中最容易忽略的细节
6.1 样本质量和分组准确性
在正式分析前,建议先看 PCA、聚类图或样本间相关性。这样可以排查离群样本和分组错误。
如果样本本身质量有问题,再精致的代码也救不回来。差异分析的上限,往往由样本质量决定。
6.2 多重检验校正不能省
基因表达分析通常涉及上万次检验。如果只看原始P值,假阳性会明显增加。因此,limma 输出中的 adj.P.Val 非常重要。
常用校正方法是 BH 法。它在控制假发现率方面较为常见,也更适合高通量数据。
6.3 数据类型决定方法细节
芯片和 RNA-seq 虽然都能用 limma,但细节并不完全相同。
- 芯片数据:通常直接进入线性模型
- RNA-seq 数据:常结合 voom 转换后再分析
不要把不同平台的数据当成完全一样处理。
这一步做错,后面整篇文章的统计基础都会受影响。
总结Conclusion
limma 是差异分析中最实用、最成熟的工具之一。它适合芯片和 RNA-seq 表达矩阵,能完成从建模、对比、校正到结果提取的标准流程。对医学生、医生和科研人员来说,真正重要的不只是会跑代码,而是理解 差异分析R代码 背后的统计逻辑、结果阈值和论文表达方式。
如果你希望把差异分析结果进一步用于火山图、热图、富集分析和生信发文,建议从一开始就按论文标准设计流程。这样后续写作会更顺,也更容易形成完整的研究链条。
如果你想少走弯路,可以结合 解螺旋 的生信方法体系,把差异分析、可视化和发文思路一起打通。

- 引言Introduction
- 1. limma包为什么适合做差异分析
- 2. limma差异分析的标准流程
- 3. 差异分析R代码怎么写才规范
- 4. 从结果到图:火山图和热图怎么做
- 5. limma结果如何写进生信文章
- 6. 差异分析中最容易忽略的细节
- 总结Conclusion






