拿到测序数据却不知道从哪一步开始,这种感觉在生信入门时几乎人人都会遇到。手头有 FASTQ 文件,有参考基因组,甚至服务器上各种工具都装好了,但对着命令行就是不知道先跑什么、后跑什么、跑完的结果又该怎么看。网上教程很多,但要么直接甩一段全基因组分析流程,要么只讲某个工具的参数,缺少一条能把“原始数据”串到“生物学结论”的主线。
这篇文章不打算再堆一套“从零写代码”的教学,而是换一个思路:把测序数据分析当成一条流水线来拆解。我会先讲清楚测序数据最常见的几种格式和它们之间的关系,再按真实项目顺序演示从数据下载、质量评估、序列比对、变异检测到注释可视化的完整流程。代码会给出可直接复制运行的命令,但更重要的是说明每一步在做什么、为什么放在这个位置、输出结果怎么理解。读完这篇文章,你应该能独立跑通一个小型 WGS 或 RNA-seq 分析流程,并且知道结果文件里每一列大致代表什么。
1. 测序数据入门:先搞清楚你手里拿的是什么
很多初学者拿到数据后的第一反应是去搜“代码”,但实际上,测序数据分析的难点从来不在代码本身,而在数据格式和分析逻辑。代码只是把分析思路翻译成机器能执行的指令而已。所以第一步,先把数据格式和文件类型弄明白。
1.1 测序数据最常见的三种格式
测序分析过程中,你会反复和下面几种文件打交道:
| 文件格式 | 是什么 | 常见后缀 | 一句话解释 |
|---|---|---|---|
| FASTQ | 原始测序序列及质量值 | .fastq、.fq、.fastq.gz |
每一个 reads 包含四行:序列ID、碱基序列、分隔符、碱基质量 |
| SAM/BAM | 比对结果文件 | .sam、.bam |
记录了每一条 reads 比对到参考基因组的坐标和比对质量 |
| VCF/BCF | 变异结果文件 | .vcf、.bcf |
存储样品相对于参考基因组的 SNP、InDel 等变异信息 |
除了这三种核心格式,还会遇到 GFF/GTF(基因注释)、FASTA(参考序列)、BED(区间文件)等辅助文件。理解这些格式之间的关系,是看懂整个分析流程的关键。
简化理解就是这样一条链路:
code复制FASTQ(原始序列)
↓ 质控 / 过滤
FASTQ(高质量序列)
↓ 序列比对
SAM/BAM(每条reads的位置)
↓ 排序 / 去重 / 索引
BAM(可用于查看或变异检测)
↓ 变异检测 / 定量分析
VCF(变异) / 表达量矩阵(RNA-seq)
↓ 注释 / 过滤
生物学结论
1.2 FASTQ 文件里的四行到底在说什么
FASTQ 是绝大多数测序下机数据的第一站。一个典型的 FASTQ 记录长这样:
code复制@HISEQ:123:ABCXX:1:1101:1234:5678 1:N:0:ACAC
GATTACAGATTACAGATTACAGATTACA
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIII
- 第一行
@开头,是 reads 的唯一标识符,不同测序平台的命名规则不同。 - 第二行是实际测出来的碱基序列。
- 第三行通常是一个
+,有的平台会在这里重复 ID。 - 第四行是质量字符串,每个字符对应第二行每个碱基的测序质量。
质量字符串里的每个字符对应一个 ASCII 码,减去 33 就是 Phred 质量分数 Q。Q20 表示该碱基测错概率是 1%,Q30 表示测错概率是 0.1%。目前主流 Illumina 平台的 Q30 比例,是衡量测序质量的重要指标。
1.3 为什么需要把 FASTQ 比对到参考基因组
不加任何处理的话,几千万条随机 reads 摆在你面前,根本看不出什么生物学意义。只有把每一条 reads“放回”到基因组上它原本的位置,才能知道覆盖了哪些基因、存在哪些变异、表达了哪些转录本。这个“放回去”的过程就是序列比对(Alignment)。
比对会产生 SAM 文件,SAM 是人类可读的文本格式,但文件非常大。为了节省空间和加快访问速度,实际项目中一般会压缩成 BAM 文件,同时建立索引(.bai)。BAM 是二进制格式,不能直接 cat 查看,需要借助 samtools 等工具。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 分析流程总览:一张图看懂测序数据要经历什么
在动手跑命令之前,先在脑子里建立整条流程的框架。以最常用的全基因组测序(WGS)变异检测流程为例,数据通常要经历八个阶段:
2.1 完整流程的阶段划分
- 数据获取与格式确认:从测序公司或公共数据库拿到 FASTQ 文件。
- 质量评估:用 FastQC 查看原始数据质量。
- 质量过滤:用 fastp 或 Trimmomatic 去除低质量碱基和接头序列。
- 序列比对:用 BWA-MEM 或 Bowtie2 将 reads 比对到参考基因组。
- 比对后处理:排序、标记重复、建立索引,得到干净的 BAM 文件。
- 变异检测:用 GATK HaplotypeCaller 或 bcftools 寻找 SNP 和 InDel。
- 变异过滤与注释:用 ANNOVAR 或 SnpEff 给变异注释基因、氨基酸变化等信息。
- 结果可视化与解读:用 IGV 人工检查,用 R/Python 做统计绘图。
2.2 不同测序类型的流程差异
不是所有测序数据都走同一条路。常见测序类型和分析终点如下:
| 数据类型 | 核心问题 | 对比工具 | 终点结果 |
|---|---|---|---|
| WGS 全基因组测序 | 这个样本有哪些突变 | BWA-MEM + GATK | VCF + 注释 |
| WES 全外显子组测序 | 外显子区域有哪些突变 | BWA-MEM + GATK | VCF + 注释 |
| RNA-seq 转录组测序 | 哪些基因差异表达 | STAR/HISAT2 + StringTie | 表达矩阵 + 差异基因 |
| ChIP-seq 染色质免疫沉淀测序 | 蛋白结合在哪些区域 | Bowtie2 + MACS2 | Peak 峰文件 + Motif |
| 16S rRNA 扩增子测序 | 微生物群落里有什么 | QIIME2 / DADA2 | OTU 表 + 物种注释 |
切入角度不同,分析工具链就不同。不要死记工具名称,要理解你面对的是“基因组变异问题”还是“转录表达问题”,再选对应的工具链。
3. 环境准备:服务器、软件和参考基因组
明确一点:测序数据分析不建议在个人笔记本上跑大数据量的比对和变异检测。常见做法是在 Linux 服务器或云服务器上操作。如果只是学习流程,可以用公共的小型测试数据,跑通之后再上真实数据。
3.1 软件安装方式
最省心的是用 Conda 创建独立的生信分析环境,避免各种工具依赖互相冲突。下面演示创建一个名为 bio 的环境,并安装核心工具:
bash复制# 创建环境并指定 Python 版本(生信工具往往依赖 Python)
conda create -n bio python=3.9 -y
# 激活环境
conda activate bio
# 安装核心分析工具
conda install -c bioconda -c conda-forge fastqc fastp bwa samtools bcftools -y
# 如果需要 GATK,推荐单独安装,因为它依赖 Java
conda install -c bioconda -c conda-forge gatk4 -y
各个工具版本需要根据实际系统和网络环境调整。核心思路是:把生信环境独立出来,不要污染系统自带的 Python,也不要让不同项目之间的工具版本互相覆盖。
3.2 数据目录规划
接触过一段时间生信后你一定会发现,文件命名混乱导致返工是最常见的问题。初次搭建流程时,建议按下面的目录结构组织:
bash复制mkdir -p ~/project/wgs_demo/{raw_data,clean_data,alignment,variants,annotation}
目录规划示例见下表:
| 目录 | 用途 |
|---|---|
raw_data/ |
存放原始 FASTQ 文件 |
clean_data/ |
存放质控后的 FASTQ |
alignment/ |
存放 BAM 及其索引 |
variants/ |
存放 VCF 结果 |
annotation/ |
存放注释结果和统计表 |
把每一步的输出放到对应目录,后面排查问题会清晰很多。
3.3 参考基因组准备
比对和变异检测都需要参考基因组。常用的是 Ensembl 或 UCSC 下载的 FASTA 文件。下载后一般还要做两件事:建立 BWA 索引和建立 faidx 索引。
bash复制# 假设参考基因组文件为 homo_sapiens.fa
# 1. 建立 faidx 索引
samtools faidx homo_sapiens.fa
# 2. 建立 BWA 索引(会生成 .amb .ann .bwt .pac .sa 五个文件)
bwa index -a bwtsw homo_sapiens.fa
# 3. 建立 GATK 所需的 dict 文件
gatk CreateSequenceDictionary -R homo_sapiens.fa -O homo_sapiens.dict
如果你的数据来自公共数据库(比如 NCBI SRA),需要先下载。之后用 fastq-dump 或 fasterq-dump 把 SRA 文件拆成 FASTQ:
bash复制# 示例:下载编号为 SRR1234567 的数据
fastq-dump --split-files --gzip SRR1234567
这里有一个容易踩坑的地方:双端测序用 --split-files 会生成 _1.fastq 和 _2.fastq 两个文件,分别对应读段的两端。如果下载后发现只有一个文件,赶紧检查是不是忘了加这个参数。
4. 完整案例:从 FASTQ 到变异注释的七步实战
下面用一个模拟双端测序数据完成从原始 FASTQ 到 VCF 注释的完整流程。数据量不要大,重点是把流程跑通、把每个阶段的输出看明白。假设你已经按照上一节准备好了环境和参考基因组。
4.1 第一步:原始数据质量评估
拿到 FASTQ 后第一件事不是急着比对,而是先看质量。这里用 FastQC:
bash复制# 进入原始数据目录
cd ~/project/wgs_demo/raw_data/
# 对双端测序的 R1 文件做质量评估
fastqc sample_R1.fastq.gz -o ../qc_results/
# 对 R2 也执行
fastqc sample_R2.fastq.gz -o ../qc_results/
FastQC 会生成一个 HTML 报告,主要关注以下几个模块:
| 模块 | 看什么 | 不合格怎么办 |
|---|---|---|
| Per base sequence quality | 每个位置的碱基质量是否都在 Q20 以上 | 尾部质量低,需要裁切 |
| Per sequence GC content | 分布是否接近理论正态分布 | 可能有污染或建库偏差 |
| Adapter Content | 是否残留接头序列 | 需要去接头 |
| Overrepresented sequences | 是否有异常高丰度序列 | 可能是接头或 rRNA 污染 |
| Sequence Duplication Levels | 重复率是否过高 | 高重复率影响变异检测灵敏度 |
4.2 第二步:质量过滤与接头去除
回归最常见的场景:原始数据有接头残留和低质量尾部。此时用 fastp 一步完成过滤、裁切和接头去除:
bash复制cd ~/project/wgs_demo/
fastp \
-i raw_data/sample_R1.fastq.gz \
-I raw_data/sample_R2.fastq.gz \
-o clean_data/sample_R1.clean.fastq.gz \
-O clean_data/sample_R2.clean.fastq.gz \
--detect_adapter_for_pe \
--trim_poly_g \
-h clean_data/fastp_report.html \
-j clean_data/fastp_report.json
参数说明:
-i和-I:双端测序的两个输入文件。-o和-O:过滤后的两个输出文件。--detect_adapter_for_pe:自动识别并去除双端测序的接头序列。--trim_poly_g:Illumina NextSeq 平台会在末端出现多聚 G,这个参数会把它们裁掉。-h/-j:生成可读的 HTML 报告和 JSON 格式报告。
运行结束后,查看 fastp 报告里过滤前后的 reads 数量、Q30 比例和接头残留率。如果过滤后 Q30 比例没有明显提升,很可能是原始数据本身质量好,只是存在少量接头,这是正常的。
4.3 第三步:BWA 序列比对
质控完成后,就要把 reads 放到基因组上。BWA-MEM 是目前 WGS 数据比对的主流工具:
bash复制# 进入比对输出目录
cd ~/project/wgs_demo/alignment/
# 执行比对
# 注意:-t 参数根据服务器 CPU 核数设置
bwa mem -t 8 \
-R "@RG\tID:sample\tSM:sample\tPL:ILLUMINA\tLB:lib1" \
~/reference/homo_sapiens.fa \
../clean_data/sample_R1.clean.fastq.gz \
../clean_data/sample_R2.clean.fastq.gz \
> sample.sam
很多人第一次用完 BWA 后会忽略 -R 参数。这个参数的作用是给每条 reads 添加 Read Group 信息。后续 GATK 进行样本去重和变异检测时,会依赖 Read Group 区分不同样本和文库。不写的话,后续处理会频繁报错或无法合并多样本数据。建议从第一步就把样本 ID、文库 ID、平台信息写清楚。
比对完成后,SAM 文件体积较大,接下来用 samtools 完成三个动作:转为 BAM、按坐标排序、建立索引:
bash复制# SAM 转 BAM(二进制格式,体积小)
samtools view -bS sample.sam > sample.bam
# 按参考基因组坐标排序(GATK 要求)
samtools sort sample.bam -o sample.sorted.bam
# 建立索引,后续 IGV 查看和 GATK 分析都需要
samtools index sample.sorted.bam
# 查看比对统计结果
samtools flagstat sample.sorted.bam
如果数据量不大,samtools flagstat 的输出里重点看两列:mapped 比例和 properly paired 比例。正常人类 WGS 数据的有效比对率一般在 95% 以上。比对率明显偏低时,先检查参考基因组是否选择正确,再看是否有污染。
4.4 第四步:标记重复与碱基质量校正(可选但推荐)
测序建库时,同一 DNA 片段可能被多次测序,导致 PCR 重复。这些重复 reads 会影响变异检测的准确性。GATK 提供了 MarkDuplicates 工具:
bash复制# 标记重复
gatk MarkDuplicates \
-I sample.sorted.bam \
-O sample.markdup.bam \
-M marked_dup_metrics.txt
这一步不是物理删除重复 reads,而是在 BAM 文件中打上标记。后续分析工具可以忽略这些标记。检查 marked_dup_metrics.txt 中 PERCENT_DUPLICATION 的值。如果超过 20%,要警惕建库质量问题或测序深度不足。
对于需要精确变异检测的项目,可以继续做 Base Quality Score Recalibration(BQSR)。这一步能够基于已知位点数据库重新校正碱基质量分数。但新手阶段如果只跑流程验证,可以先跳过,后续再补。
4.5 第五步:变异检测
进入变异检测阶段。通常先用 samtools faidx 生成参考基因组区域列表,然后按区间并行跑 GATK HaplotypeCaller。
如果要快速跑通流程,可以先选定一条染色体的一小段区间。小型测试数据这样处理速度会快很多:
bash复制cd ~/project/wgs_demo/variants/
# 只对 chr21 部分区域做变异检测(示例区间)
gatk HaplotypeCaller \
-R ~/reference/homo_sapiens.fa \
-I ../alignment/sample.markdup.bam \
-O sample_raw.vcf \
-L chr21:10000000-12000000 \
--sample-ploidy 2
参数要点:
-L:限定区间。不指定就会对整个基因组做变异检测,耗时比较长。--sample-ploidy:人类二倍体样本填 2。
除了 GATK,bcftools 也能做变异检测。如果只是快速查看变异位点,bcftools 的流程更轻量:
bash复制bcftools mpileup -f ~/reference/homo_sapiens.fa \
../alignment/sample.markdup.bam | \
bcftools call -mv -Oz -o sample_bcftools.vcf.gz
从工程角度看,GATK 流程的变异结果更规范,适合后续注释和过滤;bcftools 流程更快,适合初步筛查。两种工具可以结合使用。
4.6 第六步:变异过滤
GATK HaplotypeCaller 输出的 VCF 里,包含很多假阳性位点。需要进行过滤。一种比较传统但好理解的方式是用 GATK VariantFiltration:
bash复制gatk VariantFiltration \
-R ~/reference/homo_sapiens.fa \
-V sample_raw.vcf \
-O sample_filtered.vcf \
--filter-expression "QD < 2.0" --filter-name "LowQD" \
--filter-expression "FS > 60.0" --filter-name "HighFS" \
--filter-expression "MQ < 40.0" --filter-name "LowMQ" \
--filter-expression "SOR > 3.0" --filter-name "HighSOR"
这里的过滤阈值多来自 GATK 最佳实践。不同项目、不同测序深度下,阈值会调整。比如深度较低的数据,MQ 阈值需要放宽。过滤完成后,VCF 里的每个位点会被标记为 PASS 或失败原因,后续只用 PASS 位点做分析即可。
快速统计 PASS 位点数量:
bash复制# 统计全部位点
grep -v "^#" sample_filtered.vcf | wc -l
# 统计 PASS 位点
grep -v "^#" sample_filtered.vcf | awk '$7=="PASS"' | wc -l
如果 PASS 位点比例过低,不要急着怀疑数据质量。先回头检查比对环节的 Read Group 是否写对、参考基因组版本和数据来源是否一致。
4.7 第七步:变异注释
VCF 里的信息只是一堆坐标和等位基因,要理解这些变异落在哪个基因、是否导致氨基酸改变,需要注释工具。这里以 SnpEff 为例:
bash复制# 下载并构建人类基因注释库(不同版本可能在数据库名上有差异)
# 以 GRCh38 参考基因组为例
snpEff download GRCh38.99
# 注释
snpEff ann GRCh38.99 sample_filtered.vcf > sample_annotated.vcf
SnpEff 注释结果中最值得关注的是 ANN 信息字段。它会在每个变异位点下方标注出基因名、变异类型(同义突变、错义突变、终止获得等)。简单的统计命令:
bash复制# 提取变异类型统计
grep -v "^#" sample_annotated.vcf | \
awk -F "ANN=" '{split($2,a,"|"); print a[2]}' | \
sort | uniq -c | sort -rn
如果你更习惯用 R 语言,也可以读入注释后的 VCF,对变异类型做柱状图或饼图。这一步的产出,才是真正能写进论文或报告里的结果。
5. 不想写代码?理解分析逻辑比背命令更重要
文章标题说“别硬学代码”,并不是说完全不需要写代码,而是强调先建立分析框架,再学习具体命令。换个角度看:很多人折腾很久跑不通流程,问题往往不在命令不会敲,而在于不知道这一步的输出会变成下一步的输入。
建议学习路径:
- 先用网页版工具(如 Galaxy)把每一步的操作点一遍,感受输入输出之间的流转。
- 再用现成流程框架(如 nf-core、Snakemake 流程)跑通一次小型测试数据。
- 最后再回来看每个工具的底层参数,理解每一步的原理。
这个顺序对新手更友好,不会一开始就被命令和大文件吓退。
Galaxy 是一个图形化生信分析平台,你可以在浏览器里拖拽工具完成 FastQC、fastp、BWA、GATK 等操作。想跑公共数据时,可以把 SRA 数据直接导入,体验完整流程。当然,如果后续你要处理几十上百个样本,还是需要回到命令行,因为图形化平台在批量任务管理方面不够方便。
6. 高频报错与排查思路
下面汇总几种常见问题,基本覆盖了新手跑流程时最容易卡住的位置:
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
bwa: command not found |
Conda 环境未激活或工具未安装 | conda activate bio 后重新安装 |
SAM 转 BAM 报错 truncated file |
FASTQ 下载不完整,或两个端文件 reads 数量不一致 | 重新下载;检查 R1/R2 reads 数是否一致 |
GATK 报 Badly formed genome loc |
-L 区间格式写错或参考基因组版本不一致 |
确认染色体名格式为 chr1,区间格式为 chr1:1000-2000 |
变异结果全是 LowQD 被过滤 |
测序深度过低或比对质量差 | 检查比对率、降噪过滤阈值 |
| 注释结果里基因名为空 | 参考基因组与注释数据库版本不匹配 | 换对应版本的注释库 |
| 内存不足导致比对中断 | 单条 reads 太长或并发过高 | 降低 -t 线程数,分段比对 |
这里补充一个非常容易忽略的点:很多公共数据集的参考基因组版本和你的注释库版本不是同一套。比如数据比对用的是 GRCh37,注释却用了 GRCh38,结果会出现染色体编号对不上、变异注释大量失败。拿到数据后先看 README 或文章方法部分,确认参考基因组版本。
7. 工程化建议:从跑通到跑好
如果只是学习流程,随便跑通一次就够了。但如果是真实项目,有几个工程层面的问题建议提前规划。
7.1 用流程管理工具替代一条条命令
样本多了以后,一条条手动跑命令既容易漏步骤,也不利于复现。Snakemake 和 Nextflow 是两个主流选择。以 Snakemake 为例:
python复制# Snakefile 片段示例(示意,不可直接运行)
rule fastp_trim:
input:
"raw_data/sample_R1.fastq.gz",
"raw_data/sample_R2.fastq.gz"
output:
"clean_data/sample_R1.clean.fastq.gz",
"clean_data/sample_R2.clean.fastq.gz"
shell:
"fastp -i {input[0]} -I {input[1]} -o {output[0]} -O {output[1]}"
这样做的好处很明显:每一步的输入输出都被记录,后续增加样本时只需要在配置列表里加一行。Snakemake 还会自动判断哪些步骤已经完成,重跑时跳过已完成步骤,节省大量时间。
7.2 文件命名和版本记录
建议在项目根目录建一个 README.md。记录数据来源、参考基因组版本、工具版本、过滤参数。很多人跑完分析两周后回来看结果,发现自己已经想不起来过滤阈值是参考哪篇文献设的。版本记录不花多少时间,后面做报告和审稿回复时能省下大量精力。
7.3 数据安全与备份
原始 FASTQ 文件是经费买来的或从公共数据库下载的,一定要保证它“只读不修改”。所有过滤、比对结果都输出到另外的目录。BAM 和 VCF 这类中间文件体积大但重要,建议定期备份。如果条件允许,把注释数据库和参考基因组单独存放,别跟项目临时文件混在一起。
8. 可视化:把结果变成能看懂的东西
分析跑完只是第一步,结果怎么展示也同样重要。下面介绍几个轻量级可视化方法。
8.1 IGV 查看 BAM 和 VCF
IGV(Integrative Genomics Viewer)是人工检查变异位点的常用工具。将 sample.sorted.bam 和 sample_filtered.vcf 拖进 IGV,输入基因组坐标,就能看到 reads 堆叠情况和变异位点。需要注意:IGV 查看前必须保证 BAM 已经完成排序和索引。
8.2 用 R 快速画变异分布
下面是一个简单的 R 脚本思路,统计 VCF 中 SNP 在不同染色体上的数量并画柱状图:
R复制# 读取 VCF(需要安装 VariantAnnotation 包)
library(VariantAnnotation)
vcf <- readVcf("sample_filtered.vcf", "GRCh38")
# 提取染色体和位置
gr <- rowRanges(vcf)
chr_counts <- table(as.character(seqnames(gr)))
# 画柱状图
barplot(chr_counts, las=2, main="SNP counts per chromosome",
ylab="Count", cex.names=0.7)
如果不想使用 VariantAnnotation,也可以用 read.table 配合 grep -v "^#" 过滤注释行后读取,本质上就是对 VCF 做文本处理。这里的关键不是学会某个特定包,而是理解 VCF 的列结构后,任何数据分析工具都能接入。
8.3 数据洞察:从VCF统计到样品质量
对单个样本来说,查看转换率(Ti/Tv ratio)是一个常用的质量指标。转换(Transition)指嘌呤到嘌呤或嘧啶到嘧啶的突变,颠换(Transversion)是嘌呤到嘧啶的突变。正常人类 WGS 数据的 Ti/Tv 比值大约在 2.0 到 2.1 之间。明显偏离这个范围,提示变异检测可能存在问题。
GATK 提供了 CollectVariantCallingMetrics 工具可以输出这个指标。如果不用 GATK,也可以用 bcftools 统计:
bash复制bcftools view -v snps sample_filtered.vcf | \
bcftools query -f '%REF%ALT\n' | \
awk '{if (($1=="A"&&$2=="G")||($1=="G"&&$2=="A")||($1=="C"&&$2=="T")||($1=="T"&&$2=="C")) ti++; else tv++} END {print ti/tv}'
这里需要说明的是,这段命令里的 awk 判断逻辑是演示性质的,真实分析中还要考虑多种碱基形式。核心思路是:用简单的文本处理,也能获得统计学上的质量信号。
9. 常见问题速查与避坑指南
下面再补充几个特别容易被坑的点,这些在真实项目中几乎都出现过。
9.1 双端测序文件命名陷阱
下载的 FASTQ 文件如果来自同一个样本的多次测序 run,建议不要简单命名为 sample_R1.fastq.gz 和 sample_R2.fastq.gz 就完事。多次 run 产生的文件必须分别标注 run 编号,否则合并时很容易搞混。正确做法例如:
bash复制sample_run1_R1.fastq.gz
sample_run1_R2.fastq.gz
sample_run2_R1.fastq.gz
sample_run2_R2.fastq.gz
后续可以用 cat 把相同方向的 reads 文件合并(前提是它们来自同一样本且测序类型一致)。
9.2 参考基因组版本不一致
这是变异注释阶段最隐蔽的坑。比对时用 GRCh37,注释时下载了 GRCh38 的数据库,结果大多数变异注释不出来,甚至位于不同染色体上。所以在项目开始的第一天,先确认参考基因组版本并写进 README。
9.3 结果文件权限与路径问题
服务器上跑分析时,绝对路径和相对路径要统一。如果使用 ~ 或相对路径,一旦切换目录或迁移项目,之前生成的文件可能找不到。更推荐的做法是:在项目目录下定义一个环境变量:
bash复制export REF=~/reference/homo_sapiens.fa
export WD=~/project/wgs_demo
所有命令都用 $REF 和 $WD 引用,脚本可迁移性大幅提升。
9.4 别忘了保存运行日志
跑长任务时,最好将输出重定向到日志文件:
bash复制bwa mem ... > sample.sam 2> bwa.log
这样即使中间断掉,也可以从日志里看到是哪个环节报错,不需要重新从头跑到出错处。对批次运行的样本,这一点尤其重要。
10. 最佳实践:一套值得长期坚持的分析习惯
最后,把这几年跑测序数据的过程中沉淀下来的一些习惯整理一下。这些不是必须严格遵守的规范,但按这个思路组织分析,能有效减少返工,并提高结果的可信度与可复现性。
10.1 原始数据不可变原则
从不修改 raw_data 目录下的任何文件。所有清洗、过滤、转换操作一律在输出目录中进行。这样无论后续用什么方式重新分析,底层数据始终是干净的。
10.2 每个分析步骤都写版本记录
可以简单到用一个文本文件登记:
bash复制# analysis_notes.txt
# 2025-06-01
# fastp v0.23.4, settings: --detect_adapter_for_pe --trim_poly_g
# BWA v0.7.17, settings: -t 8
# GATK v4.3.0.0
# 参考基因组: GRCh38
这个笔记看起来简单,但它能在你一个月后需要写 Methods 部分时派上大用场。学术论文审稿人几乎都会要求提供工具版本和参数。
10.3 先小后大
正式跑全量数据前,先用一个小型测试数据集把流程跑通。比如只取 10 万条 reads 做 BAM 和 VCF,确认每一步的命令格式、文件路径和参数没有写错。全量数据通常需要跑十几小时甚至几天,等到报错才发现命令格式有误,代价太高。
10.4 数据解读永远摆在最前面
跑流程的最终目的是回答生物学问题。在开始比对之前,先想清楚:你的实验设计是 case-control 比较吗?你需要的是单个样本的变异还是多个样本的共有变异?这个思考会直接影响你要不要把多个 BAM 文件合并进行 joint calling,以及后续用哪种注释数据库。
分析计划比执行命令重要,想清楚“要得到什么结论”再动手,代码层面反而轻松很多。
对于测序数据,不要试图背下所有工具的命令,也不要把自己锁死在代码学习上。更重要的能力是拿到数据后能回答出:这是什么类型的数据、要分析到哪一层的结论、中间经过哪些核心步骤、每个步骤的输出文件在哪里。流程框架一旦建立,命令行操作就像填空一样自然。如果这篇文章能帮你把这条主线捋清楚,后续遇到具体报错,再针对性查工具文档,效率会比一开始就埋头敲代码高很多。
