群体遗传学研究中,位点频谱(Site Frequency Spectrum, SFS)就像是一本记录群体遗传变异的历史账簿。想象你手里有一份包含多个群体样本的VCF文件,里面密密麻麻记录着每个位点的变异信息。但直接把这些原始数据扔给fastsimcoal2或∂a∂i这样的分析工具,就像把一堆未经整理的发票交给会计做年报——效率低下且容易出错。
我处理过的真实案例中,一个包含5个群体、约50万个SNP的VCF文件,直接转换后的多维SFS矩阵大小会超过100MB。而经过easySFS的智能投影优化后,文件体积缩小到3MB左右,不仅节省存储空间,后续分析速度也提升近20倍。这就是为什么我们需要专门工具来处理这个转换过程。
推荐使用conda一键安装:
bash复制conda create -n easysfs_env python=3.8
conda activate easysfs_env
pip install easySFS dadi
验证安装是否成功:
bash复制python -c "import easySFS; print(easySFS.__version__)"
你的VCF文件需要满足两个关键条件:
检查群体定义文件格式(例如pops.txt):
code复制sample1 pop1
sample2 pop1
sample3 pop2
...
运行预览命令获取关键参数:
bash复制python easySFS.py -i input.vcf -p pops.txt --preview
典型输出解读:
code复制pop1 (2, 110) (3, 165) (4, 204)
pop2 (2, 117) (3, 175) (4, 218)
每组括号内第一个数字是投影值,第二个是对应的独立位点数。我习惯用这个经验法则:
当处理3个以上群体时,建议采用分步优化法:
基础命令示例:
bash复制python easySFS.py -i input.vcf -p pops.txt --proj 8,8,6 -o ./output
重要参数说明:
--proj:各群体投影值,逗号分隔--unfolded:是否使用未折叠频谱--dtype:指定输出数据类型处理多维SFS时容易遇到的坑:
--chunksize 500000参数分块处理--missing参数检查缺失模式以pop1-8.sfs为例:
code复制8
0.0 1.0 2.0 ... 8.0
第一行是样本量,第二行是频谱计数。实测发现很多初学者会误读这个格式——那些小数其实是科学计数法表示!
关键区别在于:
我整理了几个常见报错及解决方案:
问题1:ValueError: Sample size mismatch
问题2:MemoryError
--chunksize参数问题3:输出频谱全为零
--unfolded参数在大数据集上(>1M SNPs),这些技巧可以节省数小时计算时间:
bash复制vcftools --vcf input.vcf --maf 0.01 --recode --out filtered
bash复制python easySFS.py -i filtered.vcf ... --batchsize 10000 --threads 8
当把SFS喂给fastsimcoal2时,要注意:
bash复制cat pop1-8.sfs | awk '{if(NR==1) print "1"; else print $0}' > pop1_MAFpop0.obs
在∂a∂i分析中,记得: