Statistics
| Revision:

root / tmp / org.txm.statsengine.r.core.win32 / res / win32 / library / BH / include / boost / accumulators / statistics / tail_mean.hpp @ 2486

History | View | Annotate | Download (8.6 kB)

 1 ///////////////////////////////////////////////////////////////////////////////  // tail_mean.hpp  //  // Copyright 2006 Daniel Egloff, Olivier Gygi. Distributed under the Boost  // Software License, Version 1.0. (See accompanying file  // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)  #ifndef BOOST_ACCUMULATORS_STATISTICS_TAIL_MEAN_HPP_DE_01_01_2006  #define BOOST_ACCUMULATORS_STATISTICS_TAIL_MEAN_HPP_DE_01_01_2006  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #ifdef _MSC_VER  # pragma warning(push)  # pragma warning(disable: 4127) // conditional expression is constant  #endif  namespace boost { namespace accumulators  {  namespace impl  {   ///////////////////////////////////////////////////////////////////////////////   // coherent_tail_mean_impl   //   /**   @brief Estimation of the coherent tail mean based on order statistics (for both left and right tails)     The coherent tail mean \f$\widehat{CTM}_{n,\alpha}(X)\f$ is equal to the non-coherent tail mean \f$\widehat{NCTM}_{n,\alpha}(X)\f$   plus a correction term that ensures coherence in case of non-continuous distributions.     \f[   \widehat{CTM}_{n,\alpha}^{\mathrm{right}}(X) = \widehat{NCTM}_{n,\alpha}^{\mathrm{right}}(X) +   \frac{1}{\lceil n(1-\alpha)\rceil}\hat{q}_{n,\alpha}(X)\left(1 - \alpha - \frac{1}{n}\lceil n(1-\alpha)\rceil \right)   \f]     \f[   \widehat{CTM}_{n,\alpha}^{\mathrm{left}}(X) = \widehat{NCTM}_{n,\alpha}^{\mathrm{left}}(X) +   \frac{1}{\lceil n\alpha\rceil}\hat{q}_{n,\alpha}(X)\left(\alpha - \frac{1}{n}\lceil n\alpha\rceil \right)   \f]   */   template   struct coherent_tail_mean_impl   : accumulator_base   {   typedef typename numeric::functional::fdiv::result_type float_type;   // for boost::result_of   typedef float_type result_type;   coherent_tail_mean_impl(dont_care) {}   template   result_type result(Args const &args) const   {   std::size_t cnt = count(args);   std::size_t n = static_cast(   std::ceil(   cnt * ( ( is_same::value ) ? args[quantile_probability] : 1. - args[quantile_probability] )   )   );   extractor > const some_non_coherent_tail_mean = {};   return some_non_coherent_tail_mean(args)   + numeric::fdiv(quantile(args), n)   * (   ( is_same::value ) ? args[quantile_probability] : 1. - args[quantile_probability]   - numeric::fdiv(n, count(args))   );   }   };   ///////////////////////////////////////////////////////////////////////////////   // non_coherent_tail_mean_impl   //   /**   @brief Estimation of the (non-coherent) tail mean based on order statistics (for both left and right tails)     An estimation of the non-coherent tail mean \f$\widehat{NCTM}_{n,\alpha}(X)\f$ is given by the mean of the   \f$\lceil n\alpha\rceil\f$ smallest samples (left tail) or the mean of the \f$\lceil n(1-\alpha)\rceil\f$   largest samples (right tail), \f$n\f$ being the total number of samples and \f$\alpha\f$ the quantile level:     \f[   \widehat{NCTM}_{n,\alpha}^{\mathrm{right}}(X) = \frac{1}{\lceil n(1-\alpha)\rceil} \sum_{i=\lceil \alpha n \rceil}^n X_{i:n}   \f]     \f[   \widehat{NCTM}_{n,\alpha}^{\mathrm{left}}(X) = \frac{1}{\lceil n\alpha\rceil} \sum_{i=1}^{\lceil \alpha n \rceil} X_{i:n}   \f]     It thus requires the caching of at least the \f$\lceil n\alpha\rceil\f$ smallest or the \f$\lceil n(1-\alpha)\rceil\f$   largest samples.     @param quantile_probability   */   template   struct non_coherent_tail_mean_impl   : accumulator_base   {   typedef typename numeric::functional::fdiv::result_type float_type;   // for boost::result_of   typedef float_type result_type;   non_coherent_tail_mean_impl(dont_care) {}   template   result_type result(Args const &args) const   {   std::size_t cnt = count(args);   std::size_t n = static_cast(   std::ceil(   cnt * ( ( is_same::value ) ? args[quantile_probability] : 1. - args[quantile_probability] )   )   );   // If n is in a valid range, return result, otherwise return NaN or throw exception   if (n <= static_cast(tail(args).size()))   return numeric::fdiv(   std::accumulate(   tail(args).begin()   , tail(args).begin() + n   , Sample(0)   )   , n   );   else   {   if (std::numeric_limits::has_quiet_NaN)   {   return std::numeric_limits::quiet_NaN();   }   else   {   std::ostringstream msg;   msg << "index n = " << n << " is not in valid range [0, " << tail(args).size() << ")";   boost::throw_exception(std::runtime_error(msg.str()));   return Sample(0);   }   }   }   };  } // namespace impl  ///////////////////////////////////////////////////////////////////////////////  // tag::coherent_tail_mean<>  // tag::non_coherent_tail_mean<>  //  namespace tag  {   template   struct coherent_tail_mean   : depends_on >   {   typedef accumulators::impl::coherent_tail_mean_impl impl;   };   template   struct non_coherent_tail_mean   : depends_on >   {   typedef accumulators::impl::non_coherent_tail_mean_impl impl;   };   struct abstract_non_coherent_tail_mean   : depends_on<>   {   };  }  ///////////////////////////////////////////////////////////////////////////////  // extract::non_coherent_tail_mean;  // extract::coherent_tail_mean;  //  namespace extract  {   extractor const non_coherent_tail_mean = {};   extractor const coherent_tail_mean = {};   BOOST_ACCUMULATORS_IGNORE_GLOBAL(non_coherent_tail_mean)   BOOST_ACCUMULATORS_IGNORE_GLOBAL(coherent_tail_mean)  }  using extract::non_coherent_tail_mean;  using extract::coherent_tail_mean;  // for the purposes of feature-based dependency resolution,  // coherent_tail_mean provides the same feature as tail_mean  template  struct feature_of >   : feature_of  {  };  template  struct feature_of >   : feature_of  {  };  // So that non_coherent_tail_mean can be automatically substituted  // with weighted_non_coherent_tail_mean when the weight parameter is non-void.  template  struct as_weighted_feature >  {   typedef tag::non_coherent_weighted_tail_mean type;  };  template  struct feature_of >   : feature_of >  {};  // NOTE that non_coherent_tail_mean cannot be feature-grouped with tail_mean,  // which is the base feature for coherent tail means, since (at least for  // non-continuous distributions) non_coherent_tail_mean is a different measure!  }} // namespace boost::accumulators  #ifdef _MSC_VER  # pragma warning(pop)  #endif  #endif