1 #ifndef _theplu_yat_statistics_tukey_biweight_estimator
2 #define _theplu_yat_statistics_tukey_biweight_estimator
25 #include "AveragerWeighted.h"
28 #include "yat/regression/TukeyBiweight.h"
30 #include "yat/utility/concept_check.h"
31 #include "yat/utility/Exception.h"
32 #include "yat/utility/iterator_traits.h"
34 #include <boost/concept_check.hpp>
43 namespace statistics {
76 : cutoff_(cutoff), sorted_(sorted) {}
81 template<
typename RandomAccessIterator>
83 RandomAccessIterator last)
const;
89 template<
typename RandomAccessIterator>
90 double estimate(RandomAccessIterator first,
91 RandomAccessIterator last)
const;
93 template<
typename InputIterator>
94 double estimate(InputIterator first, InputIterator last,
95 double center,
double spread)
const;
98 template<
typename RandomAccessIterator>
100 RandomAccessIterator last)
const
102 BOOST_CONCEPT_ASSERT((boost::RandomAccessIterator<RandomAccessIterator>));
104 BOOST_CONCEPT_ASSERT((DataIteratorConcept<RandomAccessIterator>));
107 return estimate(first, last);
110 typedef typename std::iterator_traits<RandomAccessIterator> traits;
111 std::vector<typename traits::value_type> vec;
112 vec.reserve(last-first);
113 std::copy(first, last, std::back_inserter(vec));
114 std::sort(vec.begin(), vec.end());
115 return estimate(vec.begin(), vec.end());
117 const double scale =
mad(first, last,
true);
118 double m =
median(first, last,
true);
126 m = estimate(first, last, m, scale);
135 template<
typename RandomAccessIterator>
136 double TukeyBiweightEstimator::estimate(RandomAccessIterator first,
137 RandomAccessIterator last)
const
139 BOOST_CONCEPT_ASSERT((boost::RandomAccessIterator<RandomAccessIterator>));
141 BOOST_CONCEPT_ASSERT((DataIteratorConcept<RandomAccessIterator>));
143 const double scale =
mad(first, last,
true);
144 double m =
median(first, last,
true);
155 m = estimate(first, last, m, scale);
165 template<
typename InputIterator>
166 double TukeyBiweightEstimator::estimate(InputIterator first,
168 double center,
double spread)
const
170 double scale = spread*cutoff_;
171 AveragerWeighted averager;
172 regression::TukeyBiweight biweight;
173 utility::iterator_traits<InputIterator> traits;
174 for ( ; first!=last; ++first) {
175 double x = traits.data(first);
176 double w = traits.weight(first) * biweight((x-center)/scale);
179 return averager.mean();
TukeyBiweightEstimator(double cutoff=4.685, bool sorted=false)
Constructor.
Definition: TukeyBiweightEstimator.h:75
double mad(RandomAccessIterator first, RandomAccessIterator last, bool sorted=false)
Median absolute deviation from median.
Definition: utility.h:311
double operator()(RandomAccessIterator first, RandomAccessIterator last) const
Definition: TukeyBiweightEstimator.h:99
Concept check for Data Iterator.
Definition: concept_check.h:224
double median(RandomAccessIterator first, RandomAccessIterator last, bool sorted=false)
Definition: utility.h:335
Class used for all runtime error detected within yat library.
Definition: Exception.h:38
Tukey's Biweight Estimator.
Definition: TukeyBiweightEstimator.h:63