使用codeml的时候遇到的一个报错,一直百思不得其解,明明也没有多括号,为什么报错,直到看到了这位仁兄的文章
mcmctree分化时间 - 简书 (jianshu.com)
最后一段,“在跑完树后对树修剪,导致部分node自带括号。”
检查了一下我报错的树,确实是因为修建的原因,修建之后的树虽然没有node了,但是括号还在,举个例子:
((((((Lynx_canadensis:55.3616,(Enhydra_lutris_kenyoni:40.12,(Ailuropoda_melanoleuca:19.2563,Ursus_maritimus:19.2563):20.8637):15.2416):18.8884,Equus_asinus:74.25):1.75,(Sus_scrofa:61.8426,Bos_mutus:57.7881):14.1573):5.02605,(Hipposideros_armiger:62,(Desmodus_rotundus:51.3141,Myotis_myotis:51.3141):10.6859):19.0261):12.974,((Ochotona_princeps:78.9706,((Marmota_flaviventris:11.3826,Ictidomys_tridecemlineatus:11.3826):23.08,Sciurus_carolinensis:34.4626):35.7399):8.22939,((Microcebus_murinus:36,Lemur_catta:36):37.7549,Homo_sapiens:72.3654):13.4451):6.8):66);
这棵树乍一看没啥问题,括号看起来也是一一对应的,我把树简化之后其实是这样的:
(((((Microcebus_murinus:36,Lemur_catta:36):37.7549,Homo_sapiens:72.3654):13.4451):6.8):66);
(((((Microcebus_murinus,Lemur_catta),Homo_sapiens))));
多了冗余的括号,paml不接受,所以得把括号去掉,变成((Microcebus_murinus,Lemur_catta),Homo_sapiens);
那原来的树就删掉后面node的括号,变成
(((((Lynx_canadensis:55.3616,(Enhydra_lutris_kenyoni:40.12,(Ailuropoda_melanoleuca:19.2563,Ursus_maritimus:19.2563):20.8637):15.2416):18.8884,Equus_asinus:74.25):1.75,(Sus_scrofa:61.8426,Bos_mutus:57.7881):14.1573):5.02605,(Hipposideros_armiger:62,(Desmodus_rotundus:51.3141,Myotis_myotis:51.3141):10.6859):19.0261):12.974,((Ochotona_princeps:78.9706,((Marmota_flaviventris:11.3826,Ictidomys_tridecemlineatus:11.3826):23.08,Sciurus_carolinensis:34.4626):35.7399):8.22939,((Microcebus_murinus:36,Lemur_catta:36):37.7549,Homo_sapiens:72.3654):13.4451):6.8);
就可以啦
在这个例子中我其实并不知道我删除的是哪个node,也就是我最后的枝长可能是错误的,之前用hyphy做选择分析,发现hyphy busted和absrel会重新估计枝长,查了下paml的手册,发现codeml也会重新计算,所以其实有没有枝长在做选择分析的时候是无关紧要的。