def opt_drate_fix_drate_times_b(multiAlign, dRate, tree, qMat, piProb, cList, qRates=[1.]): """ optimization function for rate = (iRate, dRate) based on PIP """ dRateTimesTreeTotalBranchLength = dRate * tree.length() res = minimize_scalar(nllk_drate_fix_drate_times_b, args=(multiAlign, dRateTimesTreeTotalBranchLength, tree, qMat, piProb, cList, qRates)) dRate = res.x treeNew = copy.deepcopy(tree) treeNew.scale_edges(dRateTimesTreeTotalBranchLength / (dRate * treeNew.length())) seqNames = multiAlign.keys() nLeaf = len(seqNames) cPhi = '-' * nLeaf tau = tree.length() cListExt = cList + ['-'] piProbExt = np.append(piProb, 0) pc0 = 0 for qRate in qRates: qMatExt = q_to_qext(qMat*qRate, dRate) pc0 += prob_msa_one_site(cPhi, seqNames, tree, qMatExt, piProbExt, dRate, cListExt) pc0 = pc0 / len(qRates) mlen = len(multiAlign.values()[0]) nu = mlen / (1. - pc0) # logPsi = -np.sum(np.log(np.arange(1, mlen+1))) + mlen * np.log(nu) + (pc0 - 1) * nu # nu = iRate * (tau + 1. / dRate) iRate = nu / (tau + 1. / dRate) rate = (iRate, dRate) return rate, treeNew
def opt_drate(multiAlign, tree, qMat, piProb, cList, qRates=[1.]): """ optimization function for rate = (iRate, dRate) based on PIP """ res = minimize_scalar(nllk_drate, args=(multiAlign, tree, qMat, piProb, cList, qRates)) dRate = res.x seqNames = multiAlign.keys() nLeaf = len(seqNames) cPhi = '-' * nLeaf tau = tree.length() cListExt = cList + ['-'] piProbExt = np.append(piProb, 0) pc0 = 0 for qRate in qRates: qMatExt = q_to_qext(qMat * qRate, dRate) pc0 += prob_msa_one_site(cPhi, seqNames, tree, qMatExt, piProbExt, dRate, cListExt) pc0 = pc0 / len(qRates) mlen = len(multiAlign.values()[0]) nu = mlen / (1. - pc0) # logPsi = -np.sum(np.log(np.arange(1, mlen+1))) + mlen * np.log(nu) + (pc0 - 1) * nu # nu = iRate * (tau + 1. / dRate) iRate = nu / (tau + 1. / dRate) rate = (iRate, dRate) return rate
def pc0_from_dRate_and_tree(dRate, seqNames, tree, qMat, piProb, cList, qRates=[1.]): """ calculate P(cPhi) under PIP """ nLeaf = len(seqNames) cPhi = '-' * nLeaf cListExt = cList + ['-'] pc0 = 0 for qRate in qRates: qMatExt = q_to_qext(qMat*qRate, dRate) piProbExt = np.append(piProb, 0) pc0 += prob_msa_one_site(cPhi, seqNames, tree, qMatExt, piProbExt, dRate, cListExt) pc0 = pc0 / len(qRates) return pc0
def pc0_from_dRate_and_tree(dRate, seqNames, tree, qMat, piProb, cList, qRates=[1.]): """ calculate P(cPhi) under PIP """ nLeaf = len(seqNames) cPhi = '-' * nLeaf cListExt = cList + ['-'] pc0 = 0 for qRate in qRates: qMatExt = q_to_qext(qMat * qRate, dRate) piProbExt = np.append(piProb, 0) pc0 += prob_msa_one_site(cPhi, seqNames, tree, qMatExt, piProbExt, dRate, cListExt) pc0 = pc0 / len(qRates) return pc0