find the largest parameter(s) contribution for prior and posterior
        forecast  by sequentially evaluating the contribution of parameters in
        parlist_dict.  The largest contributing parameters from each iteration are
        treated as known perfectly for the remaining iterations.  In this way, the
        next iteration seeks the next most influential group of parameters.

        Parameters
        ----------
        forecast : str
            name of the forecast to use in the ranking process.  If
            more than one forecast has been listed, this argument is required
        parlist_dict : dict
            a nested dictionary-list of groups of parameters
            that are to be treated as perfectly known.  key values become
            row labels in dataframe

        Returns
        -------
        pandas.DataFrame : pandas.DataFrame
            a dataframe with index of iteration number and columns
            of parlist_dict keys.  The values are the results of the knowing
            each parlist_dict entry expressed as posterior variance reduction

def next_most_par_contribution(self,niter=3,forecast=None,parlist_dict=None):
        """find the largest parameter(s) contribution for prior and posterior
        forecast  by sequentially evaluating the contribution of parameters in
        parlist_dict.  The largest contributing parameters from each iteration are
        treated as known perfectly for the remaining iterations.  In this way, the
        next iteration seeks the next most influential group of parameters.

        Parameters
        ----------
        forecast : str
            name of the forecast to use in the ranking process.  If
            more than one forecast has been listed, this argument is required
        parlist_dict : dict
            a nested dictionary-list of groups of parameters
            that are to be treated as perfectly known.  key values become
            row labels in dataframe

        Returns
        -------
        pandas.DataFrame : pandas.DataFrame
            a dataframe with index of iteration number and columns
            of parlist_dict keys.  The values are the results of the knowing
            each parlist_dict entry expressed as posterior variance reduction

        """
        if forecast is None:
            assert len(self.forecasts) == 1,"forecast arg list one and only one" +\
                                            " forecast"
        elif forecast not in self.prediction_arg:
            raise Exception("forecast {0} not found".format(forecast))
        org_parcov = self.parcov.get(row_names=self.parcov.row_names)
        if parlist_dict is None:
            parlist_dict = dict(zip(self.pst.adj_par_names,self.pst.adj_par_names))

        base_prior,base_post = self.prior_forecast,self.posterior_forecast
        iter_results = [base_post[forecast].copy()]
        iter_names = ["base"]
        for iiter in range(niter):
            iter_contrib = {forecast:[base_post[forecast]]}
            iter_case_names = ["base"]
            self.log("next most par iteration {0}".format(iiter+1))

            for case,parlist in parlist_dict.items():
                iter_case_names.append(case)
                la_cond = self.get_conditional_instance(parlist)
                iter_contrib[forecast].append(la_cond.posterior_forecast[forecast])
            df = pd.DataFrame(iter_contrib,index=iter_case_names)
            df.sort_values(by=forecast,inplace=True)
            iter_best = df.index[0]
            self.logger.statement("next best iter {0}: {1}".format(iiter+1,iter_best))
            self.log("next most par iteration {0}".format(iiter+1))
            if iter_best.lower() == "base":
                break
            iter_results.append(df.loc[iter_best,forecast])
            iter_names.append(iter_best)
            self.reset_parcov(self.parcov.condition_on(parlist_dict.pop(iter_best)))

        self.reset_parcov(org_parcov)
        return pd.DataFrame(iter_results,index=iter_names)