实战指南 — 基于TCGA的差异表达分析全流程与可视化呈现
1. TCGA数据下载与预处理
第一次接触TCGA数据库时,我被它庞大的数据量震撼到了。以肝细胞癌(LIHC)为例,整个下载过程就像在数字图书馆里寻找特定书籍。进入GDC官网后,你会发现左侧的筛选栏就是你的导航工具。
实际操作中,我建议先创建一个专门的项目文件夹。比如我在本地建立了"TCGA-LIHC"目录,里面再细分"RawMatrix"和"RawData"子文件夹。这样能避免文件混乱,特别是当你处理几百个样本时。解压下载的tar.gz文件时,记得使用untar()函数指定解压路径,否则文件可能会散落各处。
样本信息表处理有个小技巧:TCGA的样本ID前15位才是真正的barcode。我常用substr()函数截取,再用grepl()筛选"01"(肿瘤)、"11"(正常)样本。遇到过重复barcode的情况,这时filter(!duplicated())就能派上用场。
注意:下载的RNA-seq数据可能包含多个表达量指标,差异分析要用counts值(unstranded列),而TPM适合样本间比较
2. 表达矩阵构建与质控
合并数百个样本的表达数据时,内存管理很重要。我习惯先用data.table::fread()读取单个文件测试内存占用。曾经因为直接读取全部文件导致R崩溃,后来改用循环逐个合并才解决。
表达矩阵的质量控制有这几个关键点:
- 基因过滤:我设置60%的样本中表达量不为零的基因才保留
- 低表达过滤:平均counts值小于100的基因建议剔除
- 重复基因处理:用
avereps()对同基因不同转录本取均值
# 典型的质量控制代码 zero_percentage <- rowMeans(TCGA_LIHC_Exp[, 4:ncol(TCGA_LIHC_Exp)] == 0) TCGA_LIHC_Exp1 <- TCGA_LIHC_Exp[zero_percentage < 0.6, ] TCGA_LIHC_Exp1 <- TCGA_LIHC_Exp1[rowMeans(TCGA_LIHC_Exp1)>100,]保存数据时我总会同时保留txt和csv格式。虽然R中处理用txt更方便,但csv更通用。记得用fwrite()替代基础的write.table(),速度能快好几倍。
3. edgeR差异表达分析实战
edgeR的分析流程就像精密仪器操作,每个步骤都有其意义。创建DGEList对象时,我踩过最大的坑就是忘记设置group参数,导致后续分析全错。分组因子一定要用factor()明确,否则R可能按字母顺序重排。
离散度估计是edgeR的精髓所在。我常用三部曲:
estimateGLMCommonDisp():获取整体离散度estimateGLMTrendedDisp():考虑表达量趋势estimateGLMTagwiseDisp():基因特异性调整
# 完整的edgeR分析流程 DGElist <- DGEList(counts = exprSet_by_group, group = group_list) DGElist <- calcNormFactors(DGElist) DGElist <- estimateGLMCommonDisp(DGElist, design) fit <- glmFit(DGElist, design) results <- glmLRT(fit, contrast = c(-1, 1))差异基因筛选时,我推荐同时考虑logFC和FDR。通常用|logFC|>2且FDR<0.05作为阈值。有个实用技巧:用mutate()+case_when()一次性标记上/下调基因,比分开筛选方便得多。
4. 火山图绘制技巧与美化
火山图是差异分析的门面,好的可视化能让结果说话。我经过多次调整,总结出这些美化要点:
- 颜色搭配:上调基因用暖色(如brown),下调用冷色(如steelblue)
- 辅助线:在logFC=±2和FDR=0.05处添加参考线
- 标签优化:用ggrepel避免文字重叠,设置max.overlaps防止标签过多
ggplot(LIHC_Match_DEG, aes(x = logFC, y = log10FDR)) + geom_point(aes(color=DEG), alpha=0.8) + geom_vline(xintercept=c(-2,2), linetype="dashed") + geom_text_repel(aes(label=label), max.overlaps=20)遇到过图例文字顺序错乱的问题,后来发现是因子水平没设置好。建议在绘图前先用factor()明确DEG列的level顺序。如果点太多导致图片卡顿,可以适当调低alpha透明度。
5. 常见问题排查指南
在实际操作中,这些坑我基本都踩过:
内存不足:处理大矩阵时,改用data.table替代data.frame,用fread替代read.table。也可以先过滤低表达基因再合并样本。
分组错误:确保样本顺序与group_list完全一致。我常用all.equal(colnames(exprSet), names(group_list))验证。
离散度估计报错:检查是否有全零的行或列。必要时增加prior.count参数值。
火山图标签混乱:调整ggrepel的box.padding和point.padding参数,或者只标记top10基因。
差异分析完成后,建议保存三个关键文件:原始count矩阵、差异分析结果表、标记好的基因列表。这样后续做富集分析或验证时就能快速调用。
