treetime/treetime.py
def clock_filter(self, reroot='least-squares', n_iqd=None, plot=False):
        '''
        Labels outlier branches that don't seem to follow a molecular clock
        and excludes them from subsequent molecular clock estimation and
        the timetree propagation.

        Parameters
        ----------
         reroot : str
            Method to find the best root in the tree (see :py:meth:`treetime.TreeTime.reroot` for options)

         n_iqd : int
            Number of iqd intervals. The outlier nodes are those which do not fall
            into :math:`IQD\cdot n_iqd` interval (:math:`IQD` is the interval between
            75\ :sup:`th` and 25\ :sup:`th` percentiles)

            If None, the default (3) assumed

         plot : bool
            If True, plot the results

        '''
        if n_iqd is None:
            n_iqd = ttconf.NIQD
        if type(reroot) is list and len(reroot)==1:
            reroot=str(reroot[0])

        terminals = self.tree.get_terminals()
        if reroot:
            if self.reroot(root='least-squares' if reroot=='best' else reroot, covariation=False)==ttconf.ERROR:
                return ttconf.ERROR
        else:
            self.get_clock_model(covariation=False)

        clock_rate = self.clock_model['slope']
        icpt = self.clock_model['intercept']
        res = {}
        for node in terminals:
            if hasattr(node, 'raw_date_constraint') and  (node.raw_date_constraint is not None):
                res[node] = node.dist2root - clock_rate*np.mean(node.raw_date_constraint) - icpt

        residuals = np.array(list(res.values()))
        iqd = np.percentile(residuals,75) - np.percentile(residuals,25)
        for node,r in res.items():
            if abs(r)>n_iqd*iqd and node.up.up is not None:
                self.logger('TreeTime.ClockFilter: marking %s as outlier, residual %f interquartile distances'%(node.name,r/iqd), 3, warn=True)
                node.bad_branch=True
            else:
                node.bad_branch=False

        # redo root estimation after outlier removal
        if reroot and self.reroot(root=reroot)==ttconf.ERROR:
                return ttconf.ERROR

        if plot:
            self.plot_root_to_tip()

        return ttconf.SUCCESS
def clock_filter(self, reroot='least-squares', n_iqd=None, plot=False):
        '''
        Labels outlier branches that don't seem to follow a molecular clock
        and excludes them from subsequent molecular clock estimation and
        the timetree propagation.

        Parameters
        ----------
         reroot : str
            Method to find the best root in the tree (see :py:meth:`treetime.TreeTime.reroot` for options)

         n_iqd : int
            Number of iqd intervals. The outlier nodes are those which do not fall
            into :math:`IQD\cdot n_iqd` interval (:math:`IQD` is the interval between
            75\ :sup:`th` and 25\ :sup:`th` percentiles)

            If None, the default (3) assumed

         plot : bool
            If True, plot the results

        '''
        if n_iqd is None:
            n_iqd = ttconf.NIQD
        if type(reroot) is list and len(reroot)==1:
            reroot=str(reroot[0])

        terminals = self.tree.get_terminals()
        if reroot:
            if self.reroot(root='least-squares' if reroot=='best' else reroot, covariation=False)==ttconf.ERROR:
                return ttconf.ERROR
        else:
            self.get_clock_model(covariation=False)

        clock_rate = self.clock_model['slope']
        icpt = self.clock_model['intercept']
        res = {}
        for node in terminals:
            if hasattr(node, 'raw_date_constraint') and  (node.raw_date_constraint is not None):
                res[node] = node.dist2root - clock_rate*np.mean(node.raw_date_constraint) - icpt

        residuals = np.array(list(res.values()))
        iqd = np.percentile(residuals,75) - np.percentile(residuals,25)
        for node,r in res.items():
            if abs(r)>n_iqd*iqd and node.up.up is not None:
                self.logger('TreeTime.ClockFilter: marking %s as outlier, residual %f interquartile distances'%(node.name,r/iqd), 3, warn=True)
                node.bad_branch=True
            else:
                node.bad_branch=False

        # redo root estimation after outlier removal
        if reroot and self.reroot(root=reroot)==ttconf.ERROR:
                return ttconf.ERROR

        if plot:
            self.plot_root_to_tip()

        return ttconf.SUCCESS
def clock_filter ( self , reroot = 'least-squares' , n_iqd = None , plot = False ) : if n_iqd is None : n_iqd = ttconf . NIQD if type ( reroot ) is list and len ( reroot ) == 1 : reroot = str ( reroot [ 0 ] ) terminals = self . tree . get_terminals ( ) if reroot : if self . reroot ( root = 'least-squares' if reroot == 'best' else reroot , covariation = False ) == ttconf . ERROR : return ttconf . ERROR else : self . get_clock_model ( covariation = False ) clock_rate = self . clock_model [ 'slope' ] icpt = self . clock_model [ 'intercept' ] res = { } for node in terminals : if hasattr ( node , 'raw_date_constraint' ) and ( node . raw_date_constraint is not None ) : res [ node ] = node . dist2root - clock_rate * np . mean ( node . raw_date_constraint ) - icpt residuals = np . array ( list ( res . values ( ) ) ) iqd = np . percentile ( residuals , 75 ) - np . percentile ( residuals , 25 ) for node , r in res . items ( ) : if abs ( r ) > n_iqd * iqd and node . up . up is not None : self . logger ( 'TreeTime.ClockFilter: marking %s as outlier, residual %f interquartile distances' % ( node . name , r / iqd ) , 3 , warn = True ) node . bad_branch = True else : node . bad_branch = False # redo root estimation after outlier removal if reroot and self . reroot ( root = reroot ) == ttconf . ERROR : return ttconf . ERROR if plot : self . plot_root_to_tip ( ) return ttconf . SUCCESS
Labels outlier branches that don't seem to follow a molecular clock
        and excludes them from subsequent molecular clock estimation and
        the timetree propagation.

        Parameters
        ----------
         reroot : str
            Method to find the best root in the tree (see :py:meth:`treetime.TreeTime.reroot` for options)

         n_iqd : int
            Number of iqd intervals. The outlier nodes are those which do not fall
            into :math:`IQD\cdot n_iqd` interval (:math:`IQD` is the interval between
            75\ :sup:`th` and 25\ :sup:`th` percentiles)

            If None, the default (3) assumed

         plot : bool
            If True, plot the results
Labels outlier branches that don t seem to follow a molecular clock and excludes them from subsequent molecular clock estimation and the timetree propagation .