
节选了其中的部分内容进行翻译 。此文章的原文可在Kate dNA的博客上找到: http://stupidbeauty.com/KNA/2011/04/ phylip3-69文档翻译:主文档( 三 )/ 。
第一部分 : http://stupidbeauty.com/KNA/2011/04/ phylip3-69文档翻译:主文档(一)/
第二部分: http://stupidbeauty.com/KNA/2011/04/ phylip3-69文档翻译:主文档( 二 )/
这些常见问题及它们的回答来自于PHYLIP 网站。最新版本可在这里找到 :
http://evolution.gs.washington.edu/phylip/faq.html
"程序读取我的数据文件 ,然后告诉我说它在分配内存时出错 (a memory allocation error)! "
一般是由于数据文件中的格式错误导致的,程序被弄昏头咯 ,以为它需要为1,000,000 个或者更多的物种分配内存 。结果就是"memory allocation error"(“内存分配错误”)(错误消息的意思可能是指“这个函数申请咯不可满足的数量的内存”).对照着文档检查一下数据文件的格式:检查以确认数据文件不是以你的文字处理器(例如微软Word)的格式保存的,而是以 “普通 ASCII”或者“纯文本”格式保存的。注意 ,往你的电脑中加内存 不是 解决问题的方法--一旦数据文件的格式正确咯,你可能就有足够的内存来运行那个程序咯 。
"某个程序写咯一个输出文件 ,接下来另一个程序在读取它的时候崩溃咯 ! "
你有没有改文件的名字?如果某个程序写咯一个叫做 outfile 的文件 ,然后另一个程序被告之使用 outfile 作为它的输入文件的话 ,就会发生可怕的事 。第二个程序首先将打开 outfile 作为输出文件,也就是抹掉咯它 。当它接下来尝试着从这个空的 outfile 文件里读取数据时 ,就会发生神经错乱。解决方法就是 ,简单地将 outfile 重命名,再用它作为输入文件。
"Consense给出咯奇怪的分支长度 !我怎么才能得到合理的值? "
Consense给出的分支长度是支持那个分支的复制的个数。这不是一个对于分支的长度的好的反映 。最好的在一个一致性树上放置最佳的分支长度的方法是 :将它作为一个用户树用在一个可以为它估计分支长度的程序中 ,例如DnaML。你可能需要先用Retree 将它转换成一棵无根树 。如果你原来用的程序不估计分支长度的话 ,你可能需要使用一个会估计分支长度的 。你可以使用一个似然法程序或者在你的物种之间制造一些距离 (比如使用Dnadist),再用Fitch 来在用户树上添加分支长度 。下面是你应当采取的步骤 :
1.获取那棵树,使用Retree来确保它是无根的(读入到Retree 中 ,再保存,指明无根选项 )
2.在我们的某个程序(例如Dnaml或者Fitch)中将那棵无根树用作一个用户树(选项 U )。如果你使用Fitch 的话 ,你还需要先用一个距离程序 (比如Dnadist)来计算一组距离,以作为输入用。
3.指明那棵树中的分支长度不是拿来用的,而是要重新计算的。实际上 , 这是默认设置。
"Drawgram 可以在树的旁观绘制一个标尺吗 ?可以用数字印上分支长度吗 ? "
都不能。这么做会使程序更复杂 ,而且 ,没有明确的方法来将分支长度的数值绘制到一棵有着很多短短的内部分支的树中的合适位置去 。如果你想要那些标尺或者数字的话 ,选择一种可被绘图程序 (比如Adobe Illustrator 、 Freehand 、 Canvas 、 CorelDraw或者MacDraw) 读取的绘图文件格式 (比如Postscript 、 PICT 或者PCX) 。接下来你可以手动添加标尺和分支长度数值 。注意 ,在Drawtree 和Drawgram 中指定树大小的菜单选项的单位是厘米/单位分支长度 。
"如何让Drawgram 或者Drawtree 将自举值印在分支的旁边 ? "
当你在做引导并且使用Consense 的时候,它会将自举值输出到输出文件 (在集合的表中 ,和树的图中都有 )中。这些东西同时还会出现在Consense 的输出树文件中 。它们位于分支长度的位置 。所以 ,要想让它们出现在Drawgram 或者Drawtree 的输出中 ,你必须用一个绘图程序的格式来输出那棵树 ,再用那个程序来手动添加那些值 ,就像在前一个问题中回答的那样。
"Dnaml无法读取由Dnapars 产生的树文件!"
那是因为Dnapars 树文件是一棵有根树,而Dnaml 需要一棵无根树。试试用Retree 将那个文件变成一个无根树文件 。我们最新版本的程序在需要的情况下通常会自动将一棵有根树转换成无根树 。但是像Dnamlk 或者Dollop 这样需要有根树的程序无法使用一棵无根树 。
"在引导中 , Seqboot生成的文件太大咯"
如果有1000 次引导复制的话,会导致那个文件达到你原来的数据的1000 倍那么长。但是对于很多方法来说 ,有另外一种占用少得多的文件空间的方式。你可以使用Seqboot 来制作一个包含多个权重集的文件 ,再将那些文件与原始数据集一起使用,来进行引导。
"在引导中,输出文件太大咯 。 "
在运行像Neighbor 或者Dnapars 这样的程序,带着多数据集(或者多权重),来做引导时,通常不需要输出文件,因为下一步要用的是输出的树文件 。你可以使用程序的菜单来关掉将树写入到输出文件中去的选项 。那些树仍然会被写入到输出树文件中 。
"为什么你的程序不能正确地读取由ClustalW 生成的序列比对文件 ? "
如果你生成咯正确的类型的文件的话,它们会正确地读取的。ClustalV或者ClustalW生成的以 ".aln" 作为后缀名的文件不是PHYLIP格式的 ,而是Clustal自己的格式的 ,对PHYLIP无效。你需要找到让它输出PHYLIP格式文件的选项 ,ClustalW和ClustalV通常给那种文件赋予 .phy 这个后缀名 。
"为什么Neighbor 不能正确读取我的DNA 序列 ? "
因为它需要的输入信息是一个距离矩阵,不是序列。你需要先用Dnadist 制作距离矩阵 。
"怎么做引导 ? "
一般的引导方法是:运行Seqboot 以从你的单个数据集中制造出引导过的多个数据集 ,然后带着多数据集选项运行其中的一个生成树的程序来分析这些数据集 ,再运行Consense 来从结果的树文件中得到一个多数性规则的一致树 。读一下Seqboot 的文档 ,以了解更多的信息。以前 ,只有 简约法的程序可以被引导。在新的版本中 ,软件包里几乎任意的生成树的方法都可以被引导 。它有点乏味 ,但是是值得的。
" 在你的简约法程序中,我怎么样才能指定一个包含多个物种的单独分组 ? "
这并不是一个已有的特性,但是在很多程序中都可以轻易做到 。在像 Mix 这样的简约法程序中 ,它们提供咯W (权重)和A(祖先状态)选项,而权重可以大于1,你所需要做的就是:
|
(a)
|
在Mix 中,造出一个额外的字符 ,它针对所有单独分组的物种的状态是0 ,对其它物种的状态是1。如果是使用Dnapars 的话 ,其它物种可以是 (比如说) G 而单独分组的物种是 A 。 |
|
(b)
|
使用W 选项来给这个字符赋予一个巨大的权重(比如用 Z 来表示的 35),其它的字符的权重都是1 ,或者是它们原来的权重。 |
|
(c)
|
如果可以的话,使用A (祖先状态) 选项来指明:对于那个新的字符来说 ,在单独分组中的物种的状态就是祖先状态。 |
|
(d) |
在Mix 中,不要使用O(单独分组)选项。 |
|
(e)
|
在找到树之后,指明的单独分组之外的物种应当被一个假的字符从整体上代替。树的根应当位于单独分组中的某个地方 (程序可能会判断出某些地方优于其它地方 , 也可能不会)。要确保你把新字符中的全部步数都从树中的全部步数里减去咯 。 |
|
在像 Dnapars这样的程序中,你无法使用这个方法,因为位点的权重不能大于1 。但是你可以耍一个模拟的小花招 :将大量的额外位点添加到数据中 ,用一个核苷酸状态 ("A")来表示单独分组以外的物种,另一个状态 ("G") 表示单独分组的物种。接下来需要使用Retree 手动地将树根移动到合适的地方 。 |
|
"在你的简约法程序中 ,如何强制让某些特定的组保持是单源的 ? "
使用前面那个问题里相同的方法,用上多个假的字符,可以让任意个组的物种强制保持是单源的 。在Move 、 Dolmove和Dnamove 中 ,你可以不用这么麻烦就能指定任何的单独分组物种 。
"在我的序列中 ,怎么对付缺失和插入 ? "
那些分子序列程序能够接受带有缺口(" - "字符)的序列。它们会针对这些东西做很多事情 ,大部分不是最优的。像Dnaml 和Dnadist 这样的程序会把缺口计数为未知的核苷酸 (或者未知的氨基酸),因为 , 如果有某个东西在那里的话 ,我们不知道它是什么。这样就完全不用考虑缺口本身是否存在咯 ,但是不会令带缺口的序列与其它带有或者不带有缺口的序列之间产生或者缩小差异。在某个位点拥有同一个缺口的序列们并不倾向于在树上聚焦在一起 。所以不必要将缺口从你的序列中删除 ,除非缺口的存在使得那片区域的比对结果很糟糕 。Dnapars 是一个例外,它把 “缺口”当成第五种核苷酸状态(除A 、 C 、 G和T 之外)来计数。当一个缺口出现或者消失时 ,每个位点都被计数一次。这种方法的缺点就是 ,一个长的缺口会拥有过高的权重 ,因为每个缺口位点都会计数一次。所以 ,一个由10 个核苷酸组成的缺口会被计数为10 个单个核苷酸位点的变换。如果没有重叠的缺口 ,那么有一个方法可以改正这一点 ,就是将缺口中的第一个位点重新编码为" - " ,但是将剩余的其它位点编码为" ? " ,这样,缺口就只被计数一次咯。
"如何为我的有0 和1 的数据集产生距离 ? "
由于一个很直接的原因,你无法以一种简单和通用的方法来做那个。那些距离方法必须针对重叠的 变化而改正那些距离 。除非我们具体地知道咯如何针对你的特殊字符做这个 ,否则我们不能完成这个改正 。有很多公式可供我们使用 ,但是在获取足够的信息之前 ,我们无法选择其中的哪个公式。其中有重叠的变化 ,还有在不同字符上不同的变化率 。所以 ,我们没有为 0/1 数据提供距离程序。得由你自己来为你的数据找到一个合适的随机模型 ,并找到正确的距离公式。
"我有RFLP 片段数据 :我应当用哪些程序? "
这个问题比你可能想到的还要困难。下面是针对这个问题的快速教程 :
•.你可以将片段编码为0 和1,并且使用一个简约法程序 。并不能明确地知道0 还是1 是祖先 ,不过看起来对于每个片段来说 ,一个方向的改变比另一个方向的改变更容易发生 。你可以在祖先状态设置为未知 (" ? ")的情况下使用Wagner 简约法( PARS 、 Mix 、 Penny或者Move程序 )或者Dollo 简约法 ( Dollop 、 Dolpenny或者Dolmove ) 。
•.你可以使用一个距离矩阵方法,并且使用Nei 和Li 的RFLP 距离(1979)。它们的限制性片段距离是在我们的RestDist 程序中使用的 。
•.你应当谨慎地对RFLP进行引导。那些单个的片段不是独立进化的:一个单个的核苷酸变换可能消除一个片段却产生两个新的 (或者正好相反)。
对于限制性位点 (而不是片段)来说,事情要简单一些:它们几乎是独立地进化的 ,所以 ,引导是可能的,而且 Restml 是可以使用的 ,并且限制性位点距离也可以在 Restdist 中计算 。并且 ,在使用简约法时 ,变化的方向性也不是那么有歧义咯 。在我的书 (Felsenstein, 2004)中的第15 章,有一个更完整的针对限制性位点和限制性片段的教程。
"为什么你的简约法程序不印出分支长度?"
呃,Dnapars和Pars 可以做到。其它程序还没有升级到这个程度 。更详细的答案是 :在定义分支长度的时候有问题 。如果你针对几乎所有的数据集和几乎所有的简约方法来注意观察那些假想的祖先节点的状态的重构的话 ,你会在那些节点上找到一些有歧义的状态。因此,就有一个歧义存在 :那个变化究竟是在哪个分支上发生的勒。其它的简约法程序用另一种方式来解决这个问题 ,某些时候是由用户来指定如何判断(例如,一些方法将变化朝着树的上方尽可能远地推 ,或者朝树的下方尽可能远地推 )。我们的那些旧程序把这个工作留给用户来做 。在Dnapars 和PARS 中 ,我们使用Hochbaum 和Pathria (1997)(同时由Wayne Maddison 独立地)发现的一个算法来计算分支长度 ,它会将所有可能放置变化的地方进行平均 。但是这些分支长度,尽管很准确 ,对于多重重叠的变化还是不正确 。现在几乎没有其他人的程序能够对这种可能互相重叠的多个变化状态进行正确的分支长度校正 。从核苷酸序列数据中获取分支长度的一种可能的方法是 :拿着你弄到的树拓扑 ,使用Retree 将它转换成无根的,使用Dnadist 从你的数据中准备一个距离矩阵 ,再使用Fitch 并且将那棵树作为用户树来操作 ,看看它估计的分支长度。
"为什么你的程序不能处理无序的多状态字符 ? "
在这个3.6版的软件包中,有一个程序Pars ,它能为多达8个状态并且附加上 ? 状态的无序多状态字符进行简约法分析 。另外的那些离散字符简约法程序只能处理 2个状态: 0 和 1 。主要是因为我还没有时间来修改代码让它们做这件事-修改必须是全面的。我希望最终给做到这个 。如果你只有 4个或者更少的状态并且需要一个Pars所没有的特性的话 ,那么 ,你可以对状态进行重编码使它看起来像核苷酸 ,并且使用PHYLIP中分子序列组里的简约法程序 ,或者你可能使用其他人做的优秀的简约法程序 。
3.6 版有很多新特性:
•.更快(呃,不那么慢)的似然法程序。
•.DNA 和蛋白质似然法程序和距离程序允许位点之间的概率的差别,使用的是 :位点之间的概率的伽玛分布 ; 或者是一个伽玛分布加上一小部分假设为不变的位点 。
•.一个新的多状态离散字符简约法程序,Pars, 它处理无序的多状态字符。
•.Dnapars 和Pars 简约法程序可以推导多叉树,这样就能够有效地减少它们找到打结的树的个数。
•.一个新的蛋白质序列似然法程序,Proml,以及一个假设有分子时钟的版本,Promlk。
•.一个新的限制性位点和限制性片段距离程序,Restdist,它还可以为RAPD 和 AFLP 数据计算距离。它还允许DNA 位点之间有伽玛分布的概率变化 。
•.在那些DNA 似然法程序中,你现在可以指定不同种类的变化概率(比如一个编码序列中的第一 、第二和第三个位置的概率 )并且将它们赋予给指定的位点。另外 ,程序还能使用隐式马尔科夫模型机制来允许位点之间有着不同的变化概率 ,而且不需要你来指定哪个概率是对应哪个位点的 。
•.很多程序的输入文件现在更简单咯,它们不再包含那些指定权重和类别等东西的信息咯。那些信息现在是用单独的文件来提供的 ,它们都有默认名字 ,例如 weights 和 categories 。
•.DNA 似然法程序现在可以估计多叉的用户树(选项 U )咯。
•.所有读入用户定义的树的程序现在从一个单独的文件中读取咯,它的默认名字是 intree ,而不是像以前那样要求那棵树保存在输入文件中 。
•.DNA 似然法程序可以在树的内部的祖先节点上推断序列。
•.Dnapars现在可以进行颠换的简约法分析。
•.引导程序Seqboot 现在可以:不再生成一个包含多个数据集的巨型文件 , 而是按照用户的要求生成一个带有多个权重集的权重文件 。这个软件包中的很多程序现在都可以将那些多权重集数据与原始数据集一起分析 ,这样就能节省磁盘空间。
•.引导程序Seqboot 可以将权重和类别信息传递到一个多权重文件或者一个多类别文件中。
•.Seqboot还可以将序列文件从交错格式转换成串行格式,或者做相反的转换。
•.Seqboot可以将一个PHYLIP 分子序列或者离散字符形态学数据文件转换成NEXUS 格式,它是很多其它的系统发生史程序使用的格式,比如MacClade 、 MrBayes和PAUP*。
•.Seqboot还可以执行一系列不同的用来排列一个数据集中的字符的顺序的方法。这可以用来执行那个用来测试数据集的同质性的不一致长度区别 (Incongruence Length Difference) (或者部分同质性 (Partition Homogeneity) )方法。
•.Seqboot还可以用XML 格式来输出序列数据文件以用于序列比对,以供那些需要XML 格式的输入的程序使用 (当前版本的PHYLIP 中 ,没有哪个程序可以读取这种格式,但是将来可能能够读取 )。
•.Kishino-Hasegawa 模板(KHT)测试(它能比较用户定义的树 (选项U) )现在与Shimodaira-Hasegawa (SH) 测试(Shimodaira和Hasegawa, 1999)(它能对多个测试间的比较进行校正)结合在一起 。这就避免咯一个针对多个用户树的统计问题 。
•.Contrast现在可以进行一项将物种内部的变化计算在内的分析,依据的是一个与Michael Lynch (1990)所提的模型类似 (但是不完全相同)的模型。这就使得可以采用一种合理地将采 样错误计算在内的方式来对物种中的个体进行分析 。
•.有一个新程序,Treedist,它能计算树之间的Robinson-Foulds 对称差异距离 。这种距离计算的是那些存在于一棵树中却不存在于另一棵树中的分支的个数 。它还可以计算由Kuhner 和Felsenstein (1994)定义的分支分数(Branch Score)距离,那个距离会把分支长度计算在内 。
•.Fitch和Kitsch现在有一个选项,可以使用最小进化距离矩阵方法来制造树 。
•.蛋白质简约法程序Protpars 现在允许你在很多不同的基因编码中选择,比如线粒体编码 。
•.一致树程序Consense 可以计算Ml 家族的一致树方法,那是对多数规则一致树方法的一般化 。它还可以计算我们的扩展多数规则一致性 (在多数规则的基础上添加一些额外的组 ,使得处理树的过程更完整 ),它还可以计算原始的多数规则一致性树方法 ,那种方法不添加这些额外的组 。它还可以计算严格一致性 。
•.树的绘图程序Drawgram 和Drawtree 有一些新的用来指定输出的文件类型的选项,包括Windows 位图 、Idraw 绘图程序的格式 、FIG X windows绘图程序的格式、POV光线跟踪器、甚至是VRML 虚拟现实标记语言文件 (它使得你可以使用浏览器的VRML 插件 (比如Cosmo Player 或者Cortona) 来在树中间游荡)。
•.Drawtree现在使用我的平等日光算法(Equal Daylight Algorithm)来绘制无根树。这样就绘制出一个很好看的树 。当然 ,像TREEVIEW 和PAUP 那些竞争者绘制出的树也很好看-因为它们也(在我的教唆下)开始使用我的方法。Drawtree还可以使用另一个算法, n躯干(n-body)算法。
•.那些树绘制程序现在可以产生出跨越多个页面的树,这对于观看那种有大量末梢的树很方便 ,对于产生巨幅的图片也很方便 ,只要将多张纸粘贴在一起就行咯。
还有很多比较繁琐的新特性。
在这个版本里有一些明显的缺陷。其中的一些问题会在接下来的几个版本 (直到4.0 版本)中修复。包括 :
1.显然,我们需要考虑做一个更加可视化的鼠标 /窗口界面,但是它必须能同时在 X windows 、 Macintosh和Windows 上使用 。
2.程序Penny 和它的亲戚将会被改进,以让它们运行得更快 ,并且更迅速地找到所有的最简约的树。
3.会有一个带有“进化时钟”的Contml 版本,而Restml 也可能会有一个 。
4.我们正在程序中逐渐将树的结构一般化,以让它们既能推论二叉树也能推论多叉树 。我们应当能让任何程序读入任何树并且知道该做什么 ,不需要用户来操心是不是把一棵无根树提供给一个需要有根树的程序咯 。
5.概括地说,我们需要更多的对蛋白质序列的支持 ,包括一个变化的密码子模型 ,允许同义变化和非同义变化有着不同的概率。
6.我们还需要对于从多个基因座发起的组合运行提供更多的支持,允许不同的基因座有不同的进化概率 。
7.我们会进一步设计及使用XML 数据集文件和XML 树文件。
8.最终,可能会包含一个在预定义的用户树上比对分子序列的程序 。这样就使得比对和系统发生史 的重构过程可以通过连续运行 2个程序的方式来循环地进行 ,其中 1个在一棵树上比对,另一个依据比对结果找到一个更好的树。从短期来看 ,一个简单的 2序列比对程序可能会包含在其中。
9.将会写一个交互式的 DNA序列“似然性探索器 (likelihood explorer) ”。这样的话 ,无论是否会假设有一个分子时钟,都能交互式地改变树 ,这样用户就能更好地感受一下似然性表面的形状似然性可以针对任何的分支的分支长度来绘制。
10.如果可能的话,我们会允许在那些最大似然性程序的框架中使用隐式马尔科夫模型来校正物种之间的嘌呤 /嘧啶的丰富程度的差异。当前 ,那些最大似然性程序的主要局限在于 :不允许基本结构的差异 。
11.Dnaml 和Dnamlk 的隐式马尔科夫模型(区域概率)选项会被一般化,以允许在你沿着树移动的时候让位点的概率逐渐变化 ,这样来尝试实现Fitch 和Markowitz (1970)的“伴变密码子 (covarion) ”标记。
12.应当会包含一个更高端的兼容性法程序,如果我能找到一个的话。
13.我们正在缩减源代码的体积,并且强制加上一些标准化 ,所 用的手段是:将频繁使用的函数放到单独的文件中 ,这样它们就能链接到各个程序中去咯 。这将会让我们的代码变得相当标准 。
14.我们会将代码移植到一个面向对象语言上,最有可能是C++。可以这样说 ,在3.4 版本中用的语言是 “ Pascal ”, 3.5 版本 中是 “用C 写的 Pascal”,3.6 版本中是“用C 写的 C”,而4.0 版本中可能会是“用C 写的C++”,接下来4.1 版本中是“用C++写的C++”。最少那是一种可能 。
另外,还会对那些处理连续数据 (数量型 (quantitative) 字符)和带有离散状态的形态学或者行为学数据的程序进行更多的开发,因为我有一些新的分析这些数据的主意 ,采用的是一些联系到物种间的数量型基因分析的方法 。这将会与简约法分析竞争 。
HxLauncher: Launch Android applications by voice commands