1071 words
5 minutes
使用SeqKit对双端FASTQ数据进行降采样
2026-07-17
2026-07-17

1. 目的#

为了缩短流程测试时间、降低计算资源消耗,可以从完整的双端测序数据中随机抽取一定比例的 reads,生成较小规模的测试数据集。

本例使用 seqkit sample 从双端 FASTQ 数据中抽取约 10% 的 read pairs,并使用固定随机种子保证结果可重复。

原始数据:

SRR10129631_1.fastq.gz
SRR10129631_2.fastq.gz

降采样结果:

SRR10129631_ds10_raw_1.fq.gz
SRR10129631_ds10_raw_2.fq.gz

其中,ds10 表示 downsample 10%。


2. 双端 FASTQ 降采样的关键原则#

双端测序数据中的 R1 和 R2 必须保持一一对应。因此,不能分别使用不同的随机条件对两个文件进行抽样。

SeqKit 官方文档指出,对双端 FASTQ 文件进行抽样时,应当为 R1 和 R2 使用相同的随机种子,从而抽取相同位置的 read pairs。

本例统一使用:

Terminal window
-p 0.1
-s 42

参数含义:

  • -p 0.1:随机保留约 10% 的 reads。
  • -s 42:设置随机种子为 42。
  • R1 和 R2 使用完全相同的比例和随机种子。

固定随机种子后,在输入文件不变的情况下,可以重复获得相同的抽样结果。

需要注意,使用这种方法的前提是:

  1. 原始 R1 和 R2 的记录数量相同。
  2. R1 和 R2 中的 reads 顺序严格对应。
  3. 两次执行 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/ref

4. 完整命令#

Terminal window
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/rawdata

5. 使用变量和循环的推荐写法#

当样本名称或目录较长时,可以使用变量减少重复:

#!/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 的记录数是否一致:

Terminal window
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 查看文件大小和序列数量#

Terminal window
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 文件完整性#

Terminal window
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 是否对应#

Terminal window
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.ids

SeqKit 的 seq -n -i 可以仅输出序列 ID,而不是完整 FASTQ 记录。

如果 cmp 没有输出,说明两个 ID 文件完全一致,即降采样后的 R1 和 R2 顺序保持对应。

检查完成后可以删除临时文件:

Terminal window
rm -f /tmp/downsampled_r1.ids /tmp/downsampled_r2.ids

8. 使用 pigz 加速压缩#

普通 gzip 通常只使用单线程。如果数据量较大且已安装 pigz,可以改成:

Terminal window
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.gz

R2 使用相同参数处理即可。


9. 方法总结#

本次降采样使用 seqkit sample,分别对 R1 和 R2 抽取约 10% 的 reads。

核心参数为:

Terminal window
-p 0.1 -s 42

其中,相同的随机种子用于保证 R1 和 R2 抽取相同位置的 records。降采样后需要检查:

  1. R1 和 R2 的序列数量是否一致。
  2. R1 和 R2 的 read ID 是否一一对应。
  3. 输出 gzip 文件是否完整。
  4. 实际抽样比例是否接近预期值。

最终生成的双端降采样数据可以用于流程调试、参数测试和快速运行,但不应直接替代完整数据进行最终定量分析。

使用SeqKit对双端FASTQ数据进行降采样
https://blog.lihuax.online/posts/work/dev/fastq_downsample/
Author
Lihuax
Published at
2026-07-17
License
CC BY-NC-SA 4.0