fGSEA分析富集结果过少的技术咨询
问题解答
关于GSEA的基因过滤阈值
- 不建议仅用
padj < 0.05的基因做GSEA:GSEA的核心逻辑是利用所有基因的表达变化趋势检测通路的整体偏移,而非仅依赖显著差异基因。你观察到的炎症/白细胞招募基因上调的生物学趋势,正是通路整体变化的体现,但仅筛选显著基因会丢失大量趋势性信息,导致GSEA无法捕捉到通路的富集信号。 - 推荐做法:直接使用所有基因的
log2FoldChange值进行GSEA,无需过滤padj。如果担心非显著基因的干扰,可以给绝对值小于0.1的log2FoldChange设为0,或者直接输入DESeq2输出的stat值(该值结合了倍数变化和统计显著性,更适合GSEA排序)。 - 结果解读调整:即使FDR未达到0.05,只要通路的NES值方向符合预期、p值接近显著(如p<0.1),结合你的生物学背景,可以在讨论中提及这种趋势——尤其是样本量有限的情况下,这种趋势本身就有生物学意义。
关于样本量小的伪批量处理问题
- 禁止人为拆分伪重复:给单只小鼠创建2个伪重复属于制造假重复,会导致DESeq2错误估计方差,大幅增加假阳性风险。伪批量的核心是保留真实的生物学重复(每只小鼠对应一个伪批量样本),而非拆分细胞。
- 替代方案:
- 调整DESeq2参数:对于n=2的小样本,使用
DESeq(..., betaPrior=TRUE),该参数在样本量较小时能更稳定地估计差异表达。 - 换用limma-voom做伪批量分析:limma在小样本场景下的表现通常优于DESeq2,更适合处理低重复数据集。
- 合并相似细胞亚群:如果同细胞类型的不同亚群功能相近,可以合并后再做伪批量,增加每个样本的细胞数,提升统计效力。
- 补充细胞水平秩检验:用Seurat的
FindMarkers做Wilcoxon秩和检验作为补充,但需明确说明这是基于细胞水平的检验,存在伪重复风险,仅作为趋势验证。
- 调整DESeq2参数:对于n=2的小样本,使用
代码优化建议
以下是调整后的GSEA代码,直接使用所有基因进行分析:
# 加载数据时不筛选padj data <- analysis_list[["12"]] # 去除含NA的基因,转换为命名向量 gsea_data <- data %>% select(gene, log2FoldChange) %>% filter(!is.na(log2FoldChange)) gsea_data_vec <- gsea_data$log2FoldChange names(gsea_data_vec) <- gsea_data$gene # 按log2FoldChange降序排序(提升fgsea运行效率) gsea_data_vec <- sort(gsea_data_vec, decreasing = TRUE) # 运行fGSEA gsea_out <- fgsea(filtered_gs, stats = gsea_data_vec, scoreType = "std", minSize = 15, maxSize = 500, nPermSimple = 10000) # 按p值排序查看结果 gsea_out %>% arrange(pval) %>% head(20)
其他注意事项
- 确保基因集的基因名与差异分析结果中的基因名完全匹配(比如统一使用MGI符号,无大小写或格式差异)。
- 可尝试使用更聚焦的基因集(比如仅保留GO:BP中的免疫相关通路),减少多重检验压力。
- 小样本差异分析中,优先报告效应量(
log2FoldChange)而非仅依赖显著性,结合通路趋势支撑生物学结论。
内容的提问来源于stack exchange,提问作者Smeerlap
相关产品推荐
相关产品推荐

