【差异分析】FDR

FDR 校正

1. 算法介绍

  • 背景与目标
    在基因表达差异分析中,我们通常对成千上万个基因分别进行统计检验(如 t-test、Wald 检验等),得到大量原始 p 值。直接以显著性水平 α \alpha α 筛选会导致大量假阳性(Type I error)。

    adjust_fdr(FDR 校正)旨在在多重假设检验场景下,控制假发现率(False Discovery Rate),即期望的假阳性结果占所有阳性结果的比例不超过给定阈值。

  • 应用场景

    • RNA-seq、微阵列的全基因差异表达分析
    • 高通量蛋白质组、甲基化等组学数据中的多重检验校正
    • 任何成千上万并行假设检验的场景
  • 核心思路

    1. 排序原始 p 值——将 m m m 个 p 值从小到大排序;
    2. 计算调整后阈值——根据排序位置和总检验数,为每个 p 值分配一个对应的 FDR 阈值;
    3. 反向修正——保证调整后 p 值单调不增;
    4. 选择显著基因——以调整后 p 值 ≤ \le 预设 FDR(如 0.05)为显著。

2. 公式及原理

设对 m m m 个基因检测得到原始 p 值集合 { p 1 , … , p m } \{p_1,\dots,p_m\} {p1,,pm}

  1. 排序
    将 p 值按升序排列,记排序后第 i i i 小的 p 值为 p ( i ) p_{(i)} p(i)

  2. Benjamini–Hochberg 校正
    对每个排序后位置 i i i,计算

    q ( i ) = min ⁡  ⁣ ( 1 ,    m i   p ( i ) ) . q_{(i)} = \min\!\Biggl(1,\;\frac{m}{i}\,p_{(i)}\Biggr). q(i)=min(1,imp(i)).

  3. 单调性修正
    为保证调整后 p 值随着 i i i 增加不降低,反向遍历:

    q ~ ( i ) = min ⁡  ⁣ ( q ( i ) ,   q ~ ( i + 1 ) ) , q ~ ( m ) = q ( m ) . \tilde{q}_{(i)} = \min\!\bigl(q_{(i)},\,\tilde{q}_{(i+1)}\bigr), \quad \tilde{q}_{(m)} = q_{(m)}. q~(i)=min(q(i),q~(i+1)),q~(m)=q(m).

  4. 映射回原序
    q ~ ( i ) \tilde{q}_{(i)} q~(i) 对应回每个基因的原始索引,得到每个基因的 FDR 调整后 p 值。

  • 假设条件
    Benjamini–Hochberg 方法在检验独立或正相关时能严格控制 FDR;若依赖结构未知,可视为保守估计。

3. 伪代码

# 输入
#   P: 原始 p 值列表,长度 m
# 输出
#   Q: 调整后(FDR 控制)p 值列表,长度 m

function adjust_fdr(P):
    m ← length(P)
    # 1) 排序并记录原始索引
    order ← argsort(P)            # 返回排序后索引列表,p[order[0]] 最小
    P_sorted ← P[order]

    # 2) 初步校正 q 值
    Q_sorted ← array_of_length(m)
    for i in 1..m:
        Q_sorted[i] ← min(1, (m / i) * P_sorted[i])

    # 3) 单调性修正(反向遍历)
    for i in m−1 down to 1:
        Q_sorted[i] ← min(Q_sorted[i], Q_sorted[i+1])

    # 4) 映射回原序
    Q ← array_of_length(m)
    for k in 1..m:
        original_idx ← order[k]
        Q[original_idx] ← Q_sorted[k]

    return Q
  • 时间复杂度:主要在排序 O ( m log ⁡ m ) O(m\log m) O(mlogm)

  • 注意事项

    • 若要更严格控制(依赖结构复杂),可使用 Benjamini–Yekutieli 校正,调整 m i \frac{m}{i} im 部分;
    • 输出 Q 中,通常以 Q$\le$0.05 判定差异表达基因;
    • 可配合其它多重检验方法(e.g. Bonferroni)做补充对比,或结合先验信息做基因集富集分析。
### R语言中GEO数据差异分析方法和包 #### 使用`limma`包进行差异表达分析 对于基因表达数据分析,`limma`是一个广泛应用于微阵列和其他高维生物数据的R包。该包提供了稳健的统计模型来进行两组或多组样本之间的差异表达分析。 ```r library(limma) # 假设已经加载并预处理了GEO数据到expressionSet对象exprs_data design <- model.matrix(~0+factor(c(rep("control", 3), rep("treated", 3)))) colnames(design) <- c("Control", "Treated") fit <- lmFit(exprs_data, design) contrast_matrix <- makeContrasts(Treated-Control, levels=design) fit2 <- contrasts.fit(fit, contrast_matrix) fit2 <- eBayes(fit2) topTable(fit2, adjust="fdr", number=nrow(exprs_data)) ``` 此代码片段展示了如何构建线性模型设计矩阵,并利用对比矩阵计算治疗组相对于对照组的变化情况[^1]。 #### 利用`edgeR`包处理RNA-seq类型的GEO数据 当涉及到基于测序技术产生的计数型数据时,推荐采用专门为此类数据定制的方法论之一——`edgeR`。它能够有效地估计离散分布参数以及执行精确的小样本量测试。 ```r library(edgeR) counts <- DGEList(counts=get_counts_from_GEO(), group=factor(c(rep("Ctrl", n_ctrl_samples), rep("Trmt", n_trmt_samples)))) # 进行过滤、标准化等操作... keep <- filterByExpr(counts$counts, counts$samples$lib.size) counts <- calcNormFactors(counts[, keep]) design <- model.matrix(~group, data=samples_info[counts$samples$id]) dge <- estimateDisp(counts, design) fit <- glmQLFit(dge, design) qlf <- glmQLFTest(fit, coef=2) topTags(qlf) ``` 上述脚本说明了从原始读取数目开始直至获得最终显著性结果的过程[^2]。 #### 应用`DESeq2`实现更复杂的实验设计方案 针对具有复杂结构(比如时间序列、配对样本)的研究场景,`DESeq2`不仅支持标准的二元比较,还允许灵活定义协变量从而更好地控制混杂因素影响。 ```r library(DESeq2) dds <- DESeqDataSetFromMatrix(countData = get_counts(), colData = samples, design =~ condition + batch_effect) dds <- DESeq(dds) res <- results(dds) plotMA(res, main="MA plot of differential expression analysis") ``` 这段程序示范了怎样引入额外批次效应因子进入回归方程式的设定里去[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值