yat/statistics/KolmogorovSmirnovOneSample.h

Code
Comments
Other
Rev Date Author Line
2998 14 Mar 13 peter 1 #ifndef theplu_yat_statistics_kolmogorov_smirnov_one_sample
2998 14 Mar 13 peter 2 #define theplu_yat_statistics_kolmogorov_smirnov_one_sample
2998 14 Mar 13 peter 3
2998 14 Mar 13 peter 4 // $Id$
2998 14 Mar 13 peter 5
2998 14 Mar 13 peter 6 /*
2998 14 Mar 13 peter 7   Copyright (C) 2013 Peter Johansson
2998 14 Mar 13 peter 8
2998 14 Mar 13 peter 9   This file is part of the yat library, http://dev.thep.lu.se/yat
2998 14 Mar 13 peter 10
2998 14 Mar 13 peter 11   The yat library is free software; you can redistribute it and/or
2998 14 Mar 13 peter 12   modify it under the terms of the GNU General Public License as
2998 14 Mar 13 peter 13   published by the Free Software Foundation; either version 3 of the
2998 14 Mar 13 peter 14   License, or (at your option) any later version.
2998 14 Mar 13 peter 15
2998 14 Mar 13 peter 16   The yat library is distributed in the hope that it will be useful,
2998 14 Mar 13 peter 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
2998 14 Mar 13 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2998 14 Mar 13 peter 19   General Public License for more details.
2998 14 Mar 13 peter 20
2998 14 Mar 13 peter 21   You should have received a copy of the GNU General Public License
2998 14 Mar 13 peter 22   along with yat. If not, see <http://www.gnu.org/licenses/>.
2998 14 Mar 13 peter 23 */
2998 14 Mar 13 peter 24
2998 14 Mar 13 peter 25 #include <iosfwd>
2998 14 Mar 13 peter 26
2998 14 Mar 13 peter 27 #include <map>
2998 14 Mar 13 peter 28
2998 14 Mar 13 peter 29 namespace theplu {
2998 14 Mar 13 peter 30 namespace yat {
2998 14 Mar 13 peter 31 namespace statistics {
2998 14 Mar 13 peter 32
2998 14 Mar 13 peter 33   /**
2998 14 Mar 13 peter 34      \brief Kolmogorov Smirnov Test for one class
2998 14 Mar 13 peter 35
2998 14 Mar 13 peter 36      Class can be used to test if data follows standard uniform
2998 14 Mar 13 peter 37      distribution. Other distributions are not supported directly, but
2998 14 Mar 13 peter 38      it is possible to check against other distribution by tranforming
2998 14 Mar 13 peter 39      the data. If, for example, X is standard exponentially
2998 14 Mar 13 peter 40      distributed log(X) is standard uniform. Therefore, rather than
2998 14 Mar 13 peter 41      testing if X is exponential it is equivalent to test if log(X) is
2998 14 Mar 13 peter 42      standard uniform.
2998 14 Mar 13 peter 43
2998 14 Mar 13 peter 44      \since New in yat 0.11
2998 14 Mar 13 peter 45    */
2998 14 Mar 13 peter 46   class KolmogorovSmirnovOneSample
2998 14 Mar 13 peter 47   {
2998 14 Mar 13 peter 48   public:
2998 14 Mar 13 peter 49     /**
2998 14 Mar 13 peter 50        \brief Constructor
2998 14 Mar 13 peter 51      */
2998 14 Mar 13 peter 52     KolmogorovSmirnovOneSample(void);
2998 14 Mar 13 peter 53
2998 14 Mar 13 peter 54     /**
2998 14 Mar 13 peter 55        \brief add a value
2998 14 Mar 13 peter 56
2998 14 Mar 13 peter 57        \a value should be a value in range [0, 1].
2998 14 Mar 13 peter 58      */
2998 14 Mar 13 peter 59     void add(double value, double weight=1.0);
2998 14 Mar 13 peter 60
2998 14 Mar 13 peter 61     /**
2998 14 Mar 13 peter 62        \brief Large-Sample Approximation
2998 14 Mar 13 peter 63
2998 14 Mar 13 peter 64        This analytical approximation of p-value can be used when all
2998 14 Mar 13 peter 65        weight equal unity and sample size \a n is large. The p-value
2998 14 Mar 13 peter 66        is calcuated as \f$ P = \displaystyle - 2 \sum_{k=1}^{\infty}
3001 19 Mar 13 peter 67        (-1)^ke^{-2k^2s^2n}\f$, where s is the score and n is the sum
3001 19 Mar 13 peter 68        of weights.
2998 14 Mar 13 peter 69     */
2998 14 Mar 13 peter 70     double p_value(void) const;
2998 14 Mar 13 peter 71
2998 14 Mar 13 peter 72     /**
2998 14 Mar 13 peter 73        \brief Remove a data point
2998 14 Mar 13 peter 74
2998 14 Mar 13 peter 75        \throw utility::runtime_error if no data point exist with \a
2998 14 Mar 13 peter 76        value and \a weight.
2998 14 Mar 13 peter 77      */
2998 14 Mar 13 peter 78     void remove(double value, double weight=1.0);
2998 14 Mar 13 peter 79
2998 14 Mar 13 peter 80     /**
2998 14 Mar 13 peter 81        \brief resets everything to zero
2998 14 Mar 13 peter 82     */
2998 14 Mar 13 peter 83     void reset(void);
2998 14 Mar 13 peter 84
2998 14 Mar 13 peter 85     /**
2998 14 Mar 13 peter 86        \brief Kolmogorov Smirnov statistic
2998 14 Mar 13 peter 87
2998 14 Mar 13 peter 88        \f$ sup_x | F(x) - x | \f$ where is the empirical cumulative
2998 14 Mar 13 peter 89        distribution \f$ F(x) = \frac{\sum_{i:x_i\le x}w_i}{ \sum w_i}
2998 14 Mar 13 peter 90        \f$
2998 14 Mar 13 peter 91     */
2998 14 Mar 13 peter 92     double score(void) const;
2998 14 Mar 13 peter 93
2998 14 Mar 13 peter 94     /**
2998 14 Mar 13 peter 95        Same as score() but keeping the sign, in other words,
2998 14 Mar 13 peter 96        abs(signed_score())==score()
2998 14 Mar 13 peter 97
2998 14 Mar 13 peter 98        A positive score implies that values \em on \em average are
2998 14 Mar 13 peter 99        smaller 0.5.
2998 14 Mar 13 peter 100      */
2998 14 Mar 13 peter 101     double signed_score(void) const;
2998 14 Mar 13 peter 102
2998 14 Mar 13 peter 103   private:
2998 14 Mar 13 peter 104     mutable double score_;
2998 14 Mar 13 peter 105     mutable bool cached_;
2998 14 Mar 13 peter 106     std::multimap<double, double> data_;
2998 14 Mar 13 peter 107     double sum_w_;
2998 14 Mar 13 peter 108
2998 14 Mar 13 peter 109     friend std::ostream& operator<<(std::ostream&,
2998 14 Mar 13 peter 110                                     const KolmogorovSmirnovOneSample&);
2998 14 Mar 13 peter 111
2998 14 Mar 13 peter 112     // using compiler generated copy and assignment
2998 14 Mar 13 peter 113     //KolmogorovSmirnovOneSample(const KolmogorovSmirnovOneSample&);
2998 14 Mar 13 peter 114     //KolmogorovSmirnovOneSample& operator=(const KolmogorovSmirnovOneSample&);
2998 14 Mar 13 peter 115   };
2998 14 Mar 13 peter 116
2998 14 Mar 13 peter 117 }}} // of namespace theplu yat statistics
2998 14 Mar 13 peter 118
2998 14 Mar 13 peter 119 #endif