我已经在python上实现了一个程序,该程序会生成随机的二叉树。所以现在我想给树的每个内部节点分配一个距离,以使其成为超度量。然后,根与任何叶子之间的距离必须相同。如果节点是叶子,则距离为空。这是一个节点:
class Node() :
def __init__(self, G = None , D = None) :
self.id = ""
self.distG = 0
self.distD = 0
self.G = G
self.D = D
self.parent = None
我的想法是在开始处设置距离h,并在发现内部节点时减小距离h,但仅在左侧起作用。
def lgBrancheRand(self, h) :
self.distD = h
self.distG = h
hrandomD = round(np.random.uniform(0,h),3)
hrandomG = round(np.random.uniform(0,h),3)
if self.D.D is not None :
self.D.distD = hrandomD
self.distD = round(h-hrandomD,3)
lgBrancheRand(self.D,hrandomD)
if self.G.G is not None :
self.G.distG = hrandomG
self.distG = round(h-hrandomG,3)
lgBrancheRand(self.G,hrandomG)
答案 0 :(得分:1)
总而言之,您将创建随机矩阵并将UPGMA应用于每个矩阵。
下面有更完整的答案
只需使用UPGMA算法。这是用于解析成对矩阵的聚类算法。
您将两对“分类单元”(技术上称为OTU)之间的总遗传距离除以2。您将成对矩阵中最接近的成员分配为第一个“节点”。重新格式化矩阵,以便将这两对组合成一个组(“删除”)并无限期找到下一个“最近邻居”。我怀疑R'ape'将具有超测度算法,这将使您免于编程。我看到您使用的是Python,因此BioPython MIGHT具有此功能(很大的功能),就我个人而言,我会通过预编译的C程序将其传递给管道,然后通过paup之类的东西收集结果。我不打算编写代码,因为我更喜欢Perl,如果Python问题中出现了任何Perl代码(帝国已经建立),我都会被炒鱿鱼。
无论如何,您会发现此算法可生成完美的超测树。纯粹主义者不喜欢通过这种算法得出的超度量树。但是,在您的计算中它可能很有用,因为您可以从真实数据中找到系统发育史,这与您所产生的零分布最像“时钟”。在这种情况下,这将很酷。
您可能希望提出有关生物信息学stackexchange的问题。