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> 35 #include <boost/iterator/iterator_concepts.hpp> 44 namespace statistics {
80 virtual bool operator()(
double current,
double previous)
const=0;
90 bool stop(
double current,
double previous);
103 : cutoff_(cutoff), sorted_(sorted) {}
115 template<
typename RandomAccessIterator>
117 RandomAccessIterator last)
const;
122 template<
typename RandomAccessIterator>
124 RandomAccessIterator last,
125 Stopper& stopper)
const;
131 template<
typename RandomAccessIterator>
132 double estimate(RandomAccessIterator first,
133 RandomAccessIterator last,
134 Stopper& stopper)
const;
136 template<
typename InputIterator>
137 double estimate(InputIterator first, InputIterator last,
138 double center,
double spread)
const;
140 class DefaultStopper :
public Stopper
143 bool operator()(
double current,
double previous)
const;
148 template<
typename RandomAccessIterator>
150 RandomAccessIterator last)
const 152 TukeyBiweightEstimator::DefaultStopper stopper;
153 return (*
this)(first, last, stopper);
157 template<
typename RandomAccessIterator>
160 RandomAccessIterator last,
163 using boost_concepts::RandomAccessTraversal;
164 BOOST_CONCEPT_ASSERT((RandomAccessTraversal<RandomAccessIterator>));
166 BOOST_CONCEPT_ASSERT((DataIteratorConcept<RandomAccessIterator>));
169 return estimate(first, last, stopper);
172 typedef typename std::iterator_traits<RandomAccessIterator> traits;
173 std::vector<typename traits::value_type> vec(first, last);
174 std::sort(vec.begin(), vec.end());
175 return estimate(vec.begin(), vec.end(), stopper);
179 template<
typename RandomAccessIterator>
181 TukeyBiweightEstimator::estimate(RandomAccessIterator first,
182 RandomAccessIterator last,
185 const double scale =
mad(first, last,
true);
186 double m =
median(first, last,
true);
193 while (!stopper.stop(m, m0)) {
195 m = estimate(first, last, m, scale);
201 template<
typename InputIterator>
202 double TukeyBiweightEstimator::estimate(InputIterator first,
204 double center,
double spread)
const 206 double scale = spread*cutoff_;
207 AveragerWeighted averager;
208 regression::TukeyBiweight biweight;
209 utility::iterator_traits<InputIterator> traits;
210 for ( ; first!=last; ++first) {
211 double x = traits.data(first);
212 double w = traits.weight(first) * biweight((x-center)/scale);
215 return averager.mean();
TukeyBiweightEstimator(double cutoff=4.685, bool sorted=false)
Constructor.
Definition: TukeyBiweightEstimator.h:102
double mad(RandomAccessIterator first, RandomAccessIterator last, bool sorted=false)
Median absolute deviation from median.
Definition: utility.h:406
size_t epochs(void) const
Concept check for Data Iterator.
Definition: concept_check.h:240
size_t max_epochs(void) const
The Department of Theoretical Physics namespace as we define it.
Stopper(size_t max_epochs=1000)
virtual bool operator()(double current, double previous) const =0
double median(RandomAccessIterator first, RandomAccessIterator last, bool sorted=false)
Definition: utility.h:429
Tukey's Biweight Estimator.
Definition: TukeyBiweightEstimator.h:64
Definition: TukeyBiweightEstimator.h:70
double operator()(RandomAccessIterator first, RandomAccessIterator last) const
Definition: TukeyBiweightEstimator.h:149