ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

VCF到IQtree系统发育树构建全流程:SNP过滤与LD修剪实战指南

VCF到IQtree系统发育树构建全流程:SNP过滤与LD修剪实战指南 做玉米群体遗传分析的朋友应该都遇到过这种场面手头有一份几百个样本的VCF文件老板说明天就要看群体结构你想快速用IQtree建一棵系统发育树撑一下场面结果第一步就被格式问题按在地上摩擦。IQtree本身是一个非常高效的建树软件但它不认VCF它要的是多序列比对文件而VCF里的位点也不是能直接拼起来的“乐高积木”里面埋着连锁、缺失、多等位、样本ID等一系列坑。这篇文章就是围绕“VCF → IQtree系统发育树”这条完整链路写的把每一步为什么要这样做、参数怎么定、哪些坑是我实际踩过的写清楚。不管你是刚接触群体遗传分析的学生还是想把手头VCF快速变成一棵可用于汇报的树这篇都值得看完。1. VCF拿到手先别急着跑IQtree不认VCF也不认“全部SNP”1.1 IQtree到底吃哪种文件IQtree官方支持的文件格式是PHYLIP、NEXUS、FASTA等序列比对格式。它读入数据后要做的是基于位点模式计算似然值这个计算对象是“每条样本在每个位点的碱基状态”。VCF本身是变异位点记录表不包含所有位点的完整序列信息更没有直接给出“样本×位点”的比对矩阵所以直接把.vcf丢给IQtree它只会报错。转换逻辑其实不复杂VCF里的REF和ALT是参考基因组上的等位基因对每个样本根据基因型GT字段把0/0写成REF碱基1/1写成ALT碱基0/1写成混合的简并碱基比如A/G杂合就写R缺失用N。这样就把VCF“还原”成一个伪多序列比对。听着简单但中间有很多细节后面专门讲。1.2 为什么不能把全部SNP一股脑拼起来用很多刚入门的同学会问全基因组有一百万个SNP全部拿来拼比对矩阵行不行答案是可以跑但跑出来的树可能不可靠。核心原因是系统发育树的推断模型假设位点之间独立演化严格说是一个没有重组的单基因系谱而真实基因组里相邻SNP往往处于连锁不平衡状态特别是玉米这种基因组大、转座子丰富的物种。直接上百万SNP等于给强连锁区域堆了远超其应有权重的证据树上会出现被长LD区块绑架的假信号。这不是理论问题我在实际数据里见过很典型的情况某条染色体上一个大的重组冷点区域里有几千个紧密连锁的SNP它们把一批本应分散在不同亚群的样本强行拽到同一个分支看起来支持率还特别高实际上只是连锁区块的“一致投票”。所以建树前做LD修剪不是可选项而是必选项。1.3 树没根就急着解读是新手最容易犯的错IQtree默认输出的是无根树。不是说IQtree偷懒而是最大似然法本身推断的是无根拓扑。如果想看“谁先分出来”这种带方向性的结论必须有外群。玉米群体遗传分析里最常用的外群是大刍草或墨西哥高原大刍草那一类材料。所以在设计实验的时候就要把外群样本加进比对和变异检测流程而不是建树之后才开始找。如果手头确实没有外群应急做法是在FigTree里用midpoint rooting但这个定根法依赖分子钟假设仅适合先看看大致分化方向正式结论别这么下。2. 建树前的SNP质控实操过滤标准与LD修剪怎么选参数2.1 bcftools常规过滤双等位、MAF、缺失率在转成序列矩阵之前先把VCF处理成“干净”的SNP集。我平时用的过滤组合是bcftools view -v snps -m2 -M2 -i MAF0.05 F_MISSING0.1 merged.vcf.gz -Oz -o snp.filtered.vcf.gz拆开解释一下-v snps只保留SNP位点去掉indel-m2 -M2保留双等位位点因为系统发育推断和多等位基因纠缠在一起会很麻烦而且后续转换工具大多只认双等位MAF0.05过滤低频SNP去掉大量罕见变异带来的噪音F_MISSING0.1保留缺失率低于10%的位点。注意MAF这个参数对群体遗传分析是把双刃剑如果你研究的群体里有明显的亚群分化过滤太狠会把一些只在某亚群中出现的低频位点全删掉导致亚群间的分化信号变弱。我一般先用0.05跑如果群体结构不够清楚再降到0.03试试。缺失率同理太严会损失位点数太松又会引入低质量位点。2.2 玉米群体的LD特点与plink修剪过滤完之后下一步是LD修剪。我常用的命令plink --vcf snp.filtered.vcf.gz --indep-pairwise 50 10 0.2 \ --allow-extra-chr --set-missing-var-ids :# --out ld plink --vcf snp.filtered.vcf.gz --extract ld.prune.in \ --allow-extra-chr --set-missing-var-ids :# --recode vcf --out snp.pruned其中--indep-pairwise 50 10 0.2的意思是50个SNP的窗口每次滑动10个SNP两两间r²超过0.2就剔除。窗口大小要结合物种的LD衰减距离来调。玉米是异交作物LD衰减通常比自交作物快得多。如果是玉米地方品种或野生近缘种LD衰减距离可能只有几百bp到几kb如果是现代自交系、杂交种材料LD衰减会慢一些几十kb内可能还有明显连锁。保守一点把窗口设成50 10 0.2或100 10 0.2都可以重点不是精确还原LD衰减曲线而是把强连锁区块打散。有一个细节容易卡住新人plink对染色体编号有自己的脾气。玉米有10条染色体VCF里的编号是1到10plink默认会把这些当成非人类染色体不加--allow-extra-chr直接报错。另外VCF里SNP如果没有ID最好加上--set-missing-var-ids :#否则plink在LD计算时会把没有ID的位点报错或跳过。这两个参数我第一次跑的时候都没加硬生生被报错信息折腾了一个多小时。2.3 位点数量到底留多少合适聊一个比较实际的经验值。判断一批SNP够不够建树不是看原始位点数而是看修剪后有效位点数。我做过不少玉米材料包括地方品种、自交系、热带种质混合的样本集一般LD修剪后能在2万到10万个SNP之间。对大多数群体分辨目的这个规模完全够用。如果样本量大、位点过多IQtree跑起来时间成倍增加效果却不一定会更好。我的习惯是控制在5k到30k之间比较舒服。太少了分辨率不够太多了烧时间烧内存收益递减。你可以先跑一版修剪后的数据看看树形如果关键分支支持率低再放宽MAF或调整LD参数而不是盲目堆位点。3. 格式转换的坑vcf2phylip.py 与序列矩阵的“最后一公里”3.1 vcf2phylip.py最省事的转换方案转换工具不少但用得最多、最省心的是vcf2phylip.py这个Python脚本。它专门处理VCF到PHYLIP/FASTA的转换还会处理简并碱基比手写脚本靠谱得多。基本调用python vcf2phylip.py -i snp.pruned.vcf --output-folder ./跑完之后目录里会多出一个类似snp.pruned.min4.phy的文件。后面的min4是脚本默认的最小非缺失样本数阈值也就是说一个位点至少要在4个样本里有真实基因型才保留这个值可以用-m参数改。转换前建议检查一下VCF里有没有多等位位点和indelvcf2phylip.py遇到多等位会直接跳过或报错所以上一章的-m2 -M2过滤一定要做别偷懒。3.2 杂合位点会变成简并碱基别当成报错VCF里0/1基因型在转成比对序列时既不能写成REF也不能写成ALT而是写成IUPAC简并碱基。A/G杂合是RC/T杂合是YG/T杂合是K其他组合同理。很多第一次做的人打开.phy文件看到一堆R、Y、S会以为转错了。不是错这正是保留了杂合信息的结果。IQtree支持简并碱基在计算似然时会按不确定性处理直接跑没有问题。关于缺失VCF里缺失基因型会转成N同样没问题。但要注意如果一个样本的N比例非常高比如超过50%这个样本在树上会被拉到一个很尴尬的位置因为N提供的信号太少IQtree只能靠剩余位点去猜它的位置。这种样本要么删除要么把缺失率阈值从F_MISSING0.1收紧到F_MISSING0.05再过滤一遍。3.3 样本ID的坑重复和特殊字符转换过程中最容易出问题的往往是样本ID。如果VCF里样本名有重名比如不同批次数据合并时没去重IQtree会直接报duplicated sequence name如果样本名包含空格、括号这类特殊字符PHYLIP格式解析也可能出问题虽然IQtree通常能容忍但到了FigTree或iTOL里显示会很奇怪。我的建议是在转换前统一样本命名用bcftools reheader -s samples_new.txt替换成简洁、唯一、不含特殊字符的ID。命名规范看起来是小事但后期画图、与分组信息合并、上下游结果比对全靠它。有一次我手里一份数据里同时有“TST01”和“TST-01”两种写法建出来的树差点把同一个材料当成两个不同样本排查了很久才发现是命名不统一导致的。4. IQtree的正确打开方式模型选择、自举检验、命令行避坑4.1 安装注意IQtree目前主流的安装方式是用condaconda create -n phylo -c bioconda -c conda-forge iqtree conda activate phylo iqtree -h如果没有conda也可以直接从官网下载Release版的预编译二进制文件。源码编译需要cmake和C编译环境编译过程并不复杂但没必要自己折腾能用二进制就直接用。有一点提醒IQtree更新很快不同小版本命令和参数有细微差异。用之前先iqtree -h看一下版本网上很多教程用的是老版本参数照搬可能报错。建议固定一个版本跑完整个项目中途不要随意升级免得结果输出格式变了还要重跑。4.2 一条命令建树最常用也最推荐的命令行组合iqtree -s snp.pruned.min4.phy -m MFP -B 1000 -alrt 1000 -T AUTO -redo逐项说明-s指定输入比对文件-m MFP让ModelFinder自动选择最适模型不用自己纠结-B 1000做1000次Ultrafast Bootstrap-alrt 1000做1000次SH-aLRT检验-T AUTO自动检测可用CPU线程数多核机器会快很多-redo覆盖之前的输出文件避免重复运行报错。实际跑下来一条命令会同时给出支持率和bootstrap值汇报用和论文用的图都能从结果文件里出不用再单独跑两遍。4.3 一个绕不开的模型细节SNP数据到底要不要ASC校正如果你的输入是VCF转出来的SNP矩阵那么位点集合里天然缺失了不变位点因为它们没有变异在VCF里根本不会出现。从严格意义上讲这种数据有发现偏差应该用ASC校正模型。IQtree里做法是iqtree -s snp.pruned.min4.phy -m MFPASC -fconst 0 -B 1000 -alrt 1000 -T AUTO-fconst 0表示假设没有已知的常数位点把校正的条件设为0。实际项目中如果只是快速看群体聚类关系加不加ASC对拓扑结构的影响常常不大这一点我在多份玉米数据上对比过绝大多数情况下主要分支一致。但如果你要严谨汇报或准备发表建议两种都跑一遍对比。尤其是芯片SNP数据ASC基本是必须考虑的选项。这一条很多教程不会写属于真正的经验细节。另外要注意-m MFPASC会显著增加模型选择时间因为模型空间变大了跑之前留点耐心。4.4 UFBoot和标准Bootstrap不要搞混IQtree同时支持标准bootstrap-b和Ultrafast Bootstrap-B。很多人以为bootstrap就是bootstrap其实两者逻辑不同。标准bootstrap会重新抽样位点并重新搜索树计算代价极高UFBoot是基于最大似然树附近的树集合做重抽样速度快很多但当数据存在模型违规时容易偏乐观。直接表现就是UFBoot的支持率普遍比标准bootstrap偏高。所以我的习惯是如果时间允许、样本量又不大比如50个以内可以用-b 200跑一版和-B 1000对比一下。如果两者结论一致很稳如果不一致往往意味着数据里有混合、重组或长枝吸引这时候别急着下结论。为了避免UFBoot的偏乐观问题还可以在命令里加-bnni它通过额外的近邻交换来优化减少模型违规带来的bootstrap偏倚。我正式跑树时通常会带上这个参数不花多少额外时间但能提升结果可靠性。5. 跑完树之后结果文件解读与可视化5.1 输出文件怎么看IQtree跑完会在当前目录生成一堆文件重点看这几个文件作用.iqtree完整报告包含ModelFinder选出的模型、参数估计、bootstrap汇总.treefile最常用的树文件Newick格式可以直接拖进FigTree、iTOL.log运行日志看有没有warning.mldist成对距离矩阵可以在不解树的情况下先看看样本间的遗传距离.ckp.gzcheckpoint文件程序异常退出时可以辅助判断跑到哪一步一定要养成跑完先看.iqtree报告的习惯里面会写清楚最终用的是哪个模型比如GTRFR2位点数是多少以及有没有警告。很多人直接拿.treefile就开画忽略了报告里的信息容易把有问题的树当宝贝供起来。5.2 Bootstrap支持率怎么读业内常用判据SH-aLRT80%UFBoot95%两者同时满足可以认为是强支持。但这两个值最好放一起看而不是只看一个UFBootSH-aLRT判断高≥95%高≥80%强支持高低分支可能依赖少数位点谨慎解读低高少见检查模型和数据低低该分支基本不可信玉米这类异交作物做种内群体树分支支持率往往不会特别漂亮。因为种内样本之间遗传距离近、重组和基因流普遍很多分支本来就不该是一刀切开的关系。看到支持率不高别急着怀疑自己流程先确认样本分组和生物学背景是否对得上再决定要不要用network方法补充分析。5.3 可视化的三个常见选项FigTree桌面程序适合快速改外群、调颜色、导出PDF适合小白上手。iTOL在线工具把.treefile拖进去就能用适合做展示级图配色和图例都比FigTree方便。ggtreeR语言包适合需要批量出图、和分组信息联动的情况。比如你想按温带、热带亚群分别着色把样本分组表导入ggtree一条命令就能搞定。我的建议是如果只是想看个大概FigTreeiTOL基本够用如果要合成复杂图或者有几十棵树要批量画直接上R的ggtree别一棵一棵手动调。5.4 怎么判断一棵树“合理”我的经验是从三个角度自查拓扑合理性已知血缘或地理来源的样本是否聚在一起比如手头既有温带材料又有热带材料正常的话它们应该大致分开如果已知某几个样本是某个育种家族内的近缘材料它们不该散落到毫不相干的地方。支持率分布关键分支是否达到常规阈值支持率极低的分支多不多分支长度分支长度是否异常出现一个超长分支带头一个样本往往说明该样本有污染、参考偏差或大量缺失位点。如果三个方面都有问题先回头查数据不要急着对结果做解释。很多所谓“生物学结论”其实是数据质量问题导致的假象。6. 我实测遇到的五个问题逐个说清楚6.1 不同参考基因组带来的偏差做玉米群体分析时样本可能来自好几个项目不同项目用的参考基因组版本不同B73 RefGen_v3、v4、v5都有。合并VCF时如果没统一某些样本会带上明显的参考偏差表现为建树后同项目样本容易聚在一起而不是按真实亲缘关系聚类。解决办法合并前统一用同一条参考基因组做变异检测实在无法回溯就观察是否存在按项目而不是按群体的聚类模式。如果怀疑有参考偏差可以从树上看这部分样本的分支长度是否异常偏长通常会有明显特征。6.2 样本名不一致导致的“幽灵样本”这个我栽过。一批样本叫TST01另一批叫TST_01看起来是同一个材料合并VCF后却成了两个样本结果树上出现两条几乎一样长的孪生分支乍一看还以为这两个样本本来就是两个不同个体。排查方法跑完树后检查每个样本的缺失率和成对距离用.mldist做一次简单检验转换前用bcftools query -l把样本名列表导出来逐一核对。这个检查花不了十分钟但能省下后面大量解释结果的时间。6.3 运行时间失控40万SNP、300个样本、默认参数下去一晚上没跑完的情况很正常。解决办法是分级处理先LD修剪到几万个位点用不加bootstrap的iqtree -s ... -m MFP -T AUTO快速跑一版确认数据没问题最后再正式加-B 1000 -alrt 1000。时间还是太长就把SNP数降到1万左右跑一版。大部分群体分析场景1万个高质量SNP足够回答“大致关系”了不要一上来就指望上百万位点一步到位。6.4 支持率全红了怎么办“全红了”指的是关键分支的支持率都低于阈值。这种情况常见原因有几个样本间亲缘关系太近、SNP信息量不足、混合群体被强行切割。我的处理顺序是先增加SNP信息量比如把MAF过滤从0.05放宽到0.03再尝试加-bnni如果还不行就换network或structure等方法辅助解释不要死磕建树这一条路。有时候树形不稳定反映的是数据里确实存在基因流和网状演化这时候一棵树本来就不够描述整个群体的关系。6.5 群体混合导致树形不稳定玉米不同亚群之间常年有基因交流杂交种更是一锅粥。部分样本在树上的位置会随SNP选择改变而漂移。这种情况不是bug而是数据本身存在网状演化信号。建议在正式报告里不只放一棵树可以配一个PCA或者structure图把树形和群体结构放在一起看比单纯一棵树更能说明问题。我在实际项目里就是这么处理的汇报时反而更有说服力因为别人一眼就能看到“树形的主干是稳定的部分个体的位置波动源于混合祖先来源”而不是看到一个强行圆润的树形图。最后说点个人经验。VCF转IQtree建系统发育树这个流程技术门槛不算高真正坑人的地方永远在数据准备阶段——参考基因组是否统一、样本命名是否规整、SNP过滤和LD修剪是否合理、外群有没有加。我见过太多同学把大量时间耗在调建树参数上却忽略了一开始的样本和位点质控。建议拿着自己那份VCF先按上面的步骤把过滤和LD修剪跑一遍中途多看看.iqtree报告里的模型选择和warning信息等跑完第一版树再回头审视样本分组和已知生物学背景是否吻合。如果两边对得上这棵树的可靠性基本就稳了。
返回列表