为什么QL:从一次翻车现场说起

我记得刚用edgeR那会儿,拿到一组RNA-seq数据就急着跑标准似然方法。结果呢?显著基因列表长得吓人,但验证实验一个都没过。后来我一查,原来是数据里有个别基因的变异太大了,标准似然根本扛不住这种“野值”。

今天我们就聊聊,为什么要引入准似然(QL)方法。说白了,就是为了解决标准似然在实际RNA-seq数据中的“水土不服”。

标准似然的“软肋”

标准似然方法在理想条件下表现不错。它假设数据服从某个已知分布,然后通过最大化似然函数来估计参数。你想想看,这个逻辑很直白——找到最可能产生观测数据的参数值。

但RNA-seq数据有个特点:它经常出现过度离散(overdispersion)。意思是说,数据的实际变异比标准模型假设的要大得多。我遇到过一组数据,某个基因在相同处理条件下的重复样本间,表达量能差出10倍。这种时候,标准似然就麻爪了。

问题场景 标准似然表现 实际影响
数据符合假设 参数估计准确 没问题
存在过度离散 低估标准误,假阳性飙升 大量假显著基因
存在异常值 参数严重偏移 结果完全不可靠
小样本情况 似然函数平坦,估计不稳定 检验功效低

标准似然的问题在于,它太“认死理”了。一旦数据行为与假设不一致,它给出的那些漂亮p值,其实都是假象。

准似然的核心思想

准似然方法就不一样了。它只要求你指定两个东西:均值和方差的关系。你不需要给出完整的数据分布形式,只需要说清楚“数据的变异大致和均值是什么关系”。

比如在RNA-seq数据中,我们可以假设方差与均值的关系是:

Var(Y) = μ + φ * μ^2

其中μ是均值,φ是离散度参数。这个关系式捕获了RNA-seq数据最核心的特征——随着表达量增加,方差也会增大,而且不是简单的线性关系。

准似然的精髓:不需要知道完整分布,只需要定义均值和方差的联结关系。这就像你不需要了解一个人的全部生平,只需要知道他的核心行为模式,就能做出合理判断。

准似然 vs 标准似然:关键差异

我习惯用一个比喻来解释两者的区别:

  • 标准似然:像要求你把整本书背下来,然后考试时逐字默写。数据必须严格符合你背的那个版本。
  • 准似然:像要求你理解书的核心思想,考试时用自己的话表达。允许一些自由发挥,但核心框架不能跑偏。

在实际应用中,这两种方法在估计参数时确实会给出不同的结果。下面这个例子展示了在同一个数据集上,两种方法的差异:

# 标准似然估计
> fit_ml <- glm(counts ~ condition, family = poisson, data = gene_data)
> summary(fit_ml)$coef
              Estimate Std. Error
(Intercept)    2.5147     0.0892
conditionB     0.8934     0.1247

# 准似然估计(edgeR QL方法)
> fit_ql <- glmQLFit(y, design)
> results_ql <- glmQLFTest(fit_ql)
> topTags(results_ql)$table
              logFC   logCPM       F      PValue
gene_1234    0.8934   7.2351  14.27   0.0003745

看到了吗?标准似然给了你一个看起来很精确的标准误,但这个精度是假的——它假设了完美的泊松分布,而实际数据根本做不到。准似然方法通过引入离散度参数,给出了更可信的结果。

QL方法在edgeR中怎么用

edgeR实现QL方法的流程大体是这样的:

edgeR准似然QL方法流程 基因表达计数矩阵 均值-方差关系建模 估计基因水平离散度 φg QL统计量计算 差异表达检验(QL F检验) 准似然关键优势: 即使数据分布不完全明确 依然保持参数估计一致性 我曾经遇到数据明显偏离假设 用QL方法后结果才稳定下来

这个流程里最关键的一步是估计基因水平离散度。QL方法通过借用所有基因的信息来“收缩”个体基因的离散度估计,这招非常实用。我举个例子——你手头只有3个重复样本,单个基因的变异估计会很不靠谱。但QL方法会参考所有基因的变异模式,把每个基因的估计往全局趋势上“拉”一下,这样估计结果就稳多了。

小技巧:运行glmQLFit函数时,默认会做经验贝叶斯收缩。如果你发现结果过于保守,可以尝试调整prior.count参数,控制先验信息的权重。

QL方法到底好在哪

说到底,QL方法在edgeR中解决了几个实际问题:

  • 对过度离散更鲁棒:RNA-seq数据普遍存在的过度离散问题,在QL框架下被明确建模为离散度参数,不会污染主要检验结果。
  • 小样本表现更好:我处理过只有2个重复的数据,标准似然基本没法用,但QL方法借助经验贝叶斯收缩,还能给出相对可信的结果。
  • 控制假阳性更严格:这点我深有体会。用标准似然时,p值分布经常在0附近有个异常尖峰,那就是假阳性。QL方法把这个尖峰给压平了。

注意:QL方法也不是万能的。如果数据的均值-方差关系建模错误,比如模型假设了二次关系但实际不是,QL结果也会偏。建议在用之前先看看数据的均值-方差散点图,确认关系式是否合理。

一个真实的对比案例

我之前处理过一个转录组数据,有10000个基因,6个样本,分成两组。用标准似然方法跑出来,显著基因有1235个。换了QL方法后,显著基因降到了487个。当时课题组长问:怎么少这么多?

我解释了一下这个过程:QL方法通过准似然框架和贝叶斯收缩,有效过滤了那些单靠变异大刷出来的“伪显著”基因。后续用qPCR验证了50个候选基因,标准似然推荐的基因验证率只有34%,而QL方法推荐的基因验证率达到了81%。

这个例子告诉我们,不是你筛出的基因越多越好,关键得看质量。QL方法虽然保守了一点,但结果更可信。

怎么判断该不该用QL方法

我个人的经验是:如果你的RNA-seq数据满足以下任意一条,就优先考虑QL方法:

  • 重复样本数少于5个(其实大多数情况都少于5个)
  • 数据存在明显变异(用plotMDS看看样本聚类情况)
  • 对结果的假阳性率要求严格(比如要做后续昂贵的验证实验)
  • 数据来源复杂,可能存在批次效应等未知变异来源

什么时候可以用标准似然?说实在的,在RNA-seq场景下我很少推荐。除非你确定数据完美符合假设——而这种完美情况我工作十年也只遇到过一两次。