1. 目的
为了缩短流程测试时间、降低计算资源消耗,可以从完整的双端测序数据中随机抽取一定比例的 reads,生成较小规模的测试数据集。
本例使用 seqkit sample 从双端 FASTQ 数据中抽取约 10% 的 read pairs,并使用固定随机种子保证结果可重复。
原始数据:
SRR10129631_1.fastq.gzSRR10129631_2.fastq.gz降采样结果:
SRR10129631_ds10_raw_1.fq.gzSRR10129631_ds10_raw_2.fq.gz其中,ds10 表示 downsample 10%。
2. 双端 FASTQ 降采样的关键原则
双端测序数据中的 R1 和 R2 必须保持一一对应。因此,不能分别使用不同的随机条件对两个文件进行抽样。
SeqKit 官方文档指出,对双端 FASTQ 文件进行抽样时,应当为 R1 和 R2 使用相同的随机种子,从而抽取相同位置的 read pairs。
本例统一使用:
-p 0.1-s 42参数含义:
-p 0.1:随机保留约 10% 的 reads。-s 42:设置随机种子为 42。- R1 和 R2 使用完全相同的比例和随机种子。
固定随机种子后,在输入文件不变的情况下,可以重复获得相同的抽样结果。
需要注意,使用这种方法的前提是:
- 原始 R1 和 R2 的记录数量相同。
- R1 和 R2 中的 reads 顺序严格对应。
- 两次执行
seqkit sample时使用相同参数和随机种子。
3. 本次使用的目录结构
输入目录:
/Volumes/WD_BLACK/data/WGS_HEK293T/rawdata输出目录:
/Volumes/WD_BLACK/data/input_downsampled/rawdata参考文件目录:
/Volumes/WD_BLACK/data/011/ref降采样目录通过软链接复用该参考文件:
/Volumes/WD_BLACK/data/input_downsampled/ref -> /Volumes/WD_BLACK/data/011/ref4. 完整命令
mkdir -p /Volumes/WD_BLACK/data/input_downsampled/rawdata
seqkit sample \ -p 0.1 \ -s 42 \ /Volumes/WD_BLACK/data/WGS_HEK293T/rawdata/SRR10129631_1.fastq.gz | gzip > /Volumes/WD_BLACK/data/input_downsampled/rawdata/SRR10129631_ds10_raw_1.fq.gz
seqkit sample \ -p 0.1 \ -s 42 \ /Volumes/WD_BLACK/data/WGS_HEK293T/rawdata/SRR10129631_2.fastq.gz | gzip > /Volumes/WD_BLACK/data/input_downsampled/rawdata/SRR10129631_ds10_raw_2.fq.gz
ln -sfn \ /Volumes/WD_BLACK/data/011/ref \ /Volumes/WD_BLACK/data/input_downsampled/ref
ls -lh /Volumes/WD_BLACK/data/input_downsampled/rawdata5. 使用变量和循环的推荐写法
当样本名称或目录较长时,可以使用变量减少重复:
#!/usr/bin/env bash
set -euo pipefail
src_dir="/Volumes/WD_BLACK/data/WGS_HEK293T/rawdata"dst_dir="/Volumes/WD_BLACK/data/input_downsampled"ref_dir="/Volumes/WD_BLACK/data/011/ref"
accession="SRR10129631"proportion="0.1"seed="42"
mkdir -p "${dst_dir}/rawdata"
for read in 1 2; do seqkit sample \ -p "${proportion}" \ -s "${seed}" \ "${src_dir}/${accession}_${read}.fastq.gz" | gzip > "${dst_dir}/rawdata/${accession}_ds10_raw_${read}.fq.gz"done
ln -sfn "${ref_dir}" "${dst_dir}/ref"
ls -lh "${dst_dir}/rawdata"6. 检查原始双端数据
降采样前,应首先检查 R1 和 R2 的记录数是否一致:
seqkit stats \ /Volumes/WD_BLACK/data/WGS_HEK293T/rawdata/SRR10129631_1.fastq.gz \ /Volumes/WD_BLACK/data/WGS_HEK293T/rawdata/SRR10129631_2.fastq.gz正常情况下,两个文件的 num_seqs 应完全相同。
如果原始 R1 和 R2 已经发生错位,即使使用相同随机种子,降采样后也无法恢复正确的配对关系。
7. 检查降采样结果
7.1 查看文件大小和序列数量
seqkit stats \ /Volumes/WD_BLACK/data/input_downsampled/rawdata/SRR10129631_ds10_raw_1.fq.gz \ /Volumes/WD_BLACK/data/input_downsampled/rawdata/SRR10129631_ds10_raw_2.fq.gz预期结果:
- R1 和 R2 的
num_seqs相同。 - 序列数量约为原始数据的 10%。
- 两个输出文件都能够被正常识别为 FASTQ。
这里是随机按比例抽样,因此输出数量通常接近 10%,但不一定严格等于原始 reads 数乘以 0.1。
7.2 检查 gzip 文件完整性
gzip -t \ /Volumes/WD_BLACK/data/input_downsampled/rawdata/SRR10129631_ds10_raw_1.fq.gz \ /Volumes/WD_BLACK/data/input_downsampled/rawdata/SRR10129631_ds10_raw_2.fq.gz如果命令没有输出并正常退出,说明 gzip 文件结构完整。
7.3 检查 R1 和 R2 的 read ID 是否对应
r1="/Volumes/WD_BLACK/data/input_downsampled/rawdata/SRR10129631_ds10_raw_1.fq.gz"r2="/Volumes/WD_BLACK/data/input_downsampled/rawdata/SRR10129631_ds10_raw_2.fq.gz"
seqkit seq -n -i "${r1}" | sed -E 's#/([12])$##' > /tmp/downsampled_r1.ids
seqkit seq -n -i "${r2}" | sed -E 's#/([12])$##' > /tmp/downsampled_r2.ids
cmp /tmp/downsampled_r1.ids /tmp/downsampled_r2.idsSeqKit 的 seq -n -i 可以仅输出序列 ID,而不是完整 FASTQ 记录。
如果 cmp 没有输出,说明两个 ID 文件完全一致,即降采样后的 R1 和 R2 顺序保持对应。
检查完成后可以删除临时文件:
rm -f /tmp/downsampled_r1.ids /tmp/downsampled_r2.ids8. 使用 pigz 加速压缩
普通 gzip 通常只使用单线程。如果数据量较大且已安装 pigz,可以改成:
THREADS=16
seqkit sample \ -p 0.1 \ -s 42 \ /Volumes/WD_BLACK/data/WGS_HEK293T/rawdata/SRR10129631_1.fastq.gz | pigz -p "${THREADS}" \ > /Volumes/WD_BLACK/data/input_downsampled/rawdata/SRR10129631_ds10_raw_1.fq.gzR2 使用相同参数处理即可。
9. 方法总结
本次降采样使用 seqkit sample,分别对 R1 和 R2 抽取约 10% 的 reads。
核心参数为:
-p 0.1 -s 42其中,相同的随机种子用于保证 R1 和 R2 抽取相同位置的 records。降采样后需要检查:
- R1 和 R2 的序列数量是否一致。
- R1 和 R2 的 read ID 是否一一对应。
- 输出 gzip 文件是否完整。
- 实际抽样比例是否接近预期值。
最终生成的双端降采样数据可以用于流程调试、参数测试和快速运行,但不应直接替代完整数据进行最终定量分析。