yat/statistics/Spearman.h

Code
Comments
Other
Rev Date Author Line
2642 10 Nov 11 peter 1 #ifndef _theplu_yat_statistics_spearman_
2642 10 Nov 11 peter 2 #define _theplu_yat_statistics_spearman_
2635 09 Nov 11 peter 3
2635 09 Nov 11 peter 4 // $Id$
2635 09 Nov 11 peter 5
2635 09 Nov 11 peter 6 /*
2635 09 Nov 11 peter 7   Copyright (C) 2011 Peter Johansson
2635 09 Nov 11 peter 8
2635 09 Nov 11 peter 9   This file is part of the yat library, http://dev.thep.lu.se/yat
2635 09 Nov 11 peter 10
2635 09 Nov 11 peter 11   The yat library is free software; you can redistribute it and/or
2635 09 Nov 11 peter 12   modify it under the terms of the GNU General Public License as
2635 09 Nov 11 peter 13   published by the Free Software Foundation; either version 3 of the
2635 09 Nov 11 peter 14   License, or (at your option) any later version.
2635 09 Nov 11 peter 15
2635 09 Nov 11 peter 16   The yat library is distributed in the hope that it will be useful,
2635 09 Nov 11 peter 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
2635 09 Nov 11 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2635 09 Nov 11 peter 19   General Public License for more details.
2635 09 Nov 11 peter 20
2635 09 Nov 11 peter 21   You should have received a copy of the GNU General Public License
2635 09 Nov 11 peter 22   along with yat. If not, see <http://www.gnu.org/licenses/>.
2635 09 Nov 11 peter 23 */
2635 09 Nov 11 peter 24
2648 14 Nov 11 peter 25 #include <cstddef>
2648 14 Nov 11 peter 26
2635 09 Nov 11 peter 27 namespace theplu {
2635 09 Nov 11 peter 28 namespace yat {
2642 10 Nov 11 peter 29 namespace statistics {
2635 09 Nov 11 peter 30
2635 09 Nov 11 peter 31   /**
2654 15 Nov 11 peter 32      \brief Spearman rank correlation coefficient
2654 15 Nov 11 peter 33
2654 15 Nov 11 peter 34      Class for Spearman rank correlation coefficient which can be
2654 15 Nov 11 peter 35      understood as Pearson correlation of ranks.
2654 15 Nov 11 peter 36
2654 15 Nov 11 peter 37      \since New in yat 0.9
2635 09 Nov 11 peter 38    */
2635 09 Nov 11 peter 39   class Spearman
2635 09 Nov 11 peter 40   {
2635 09 Nov 11 peter 41   public:
2635 09 Nov 11 peter 42     /**
2638 10 Nov 11 peter 43        \brief Constructor
2638 10 Nov 11 peter 44     */
2638 10 Nov 11 peter 45     Spearman(void);
2638 10 Nov 11 peter 46
2638 10 Nov 11 peter 47     /**
2638 10 Nov 11 peter 48        \brief Destructor
2638 10 Nov 11 peter 49     */
2638 10 Nov 11 peter 50     virtual ~Spearman(void);
2638 10 Nov 11 peter 51
2638 10 Nov 11 peter 52     /**
2635 09 Nov 11 peter 53        \brief add pair of data
2635 09 Nov 11 peter 54      */
2640 10 Nov 11 peter 55     void add(double x, double y);
2637 10 Nov 11 peter 56
2635 09 Nov 11 peter 57     /**
2648 14 Nov 11 peter 58        \brief Number of data points
2654 15 Nov 11 peter 59
2654 15 Nov 11 peter 60        \return Number of pairs of data added to object.
2648 14 Nov 11 peter 61      */
2648 14 Nov 11 peter 62     size_t n(void) const;
2648 14 Nov 11 peter 63
2648 14 Nov 11 peter 64     /**
2635 09 Nov 11 peter 65        \brief Lower one-sided p-value
2654 15 Nov 11 peter 66
2654 15 Nov 11 peter 67        Calculates, \f$ P(R \le r) \f$, the probability to get a score
2654 15 Nov 11 peter 68        less (or equal) than score() given that there is no association
2654 15 Nov 11 peter 69        between two variables.
2654 15 Nov 11 peter 70
2654 15 Nov 11 peter 71        \see p_right()
2635 09 Nov 11 peter 72     */
2637 10 Nov 11 peter 73     double p_left(bool exact=false) const;
2637 10 Nov 11 peter 74
2635 09 Nov 11 peter 75     /**
2635 09 Nov 11 peter 76        \brief Upper one-sided p-value
2654 15 Nov 11 peter 77
2654 15 Nov 11 peter 78        Calculates, \f$ P(R \ge r) \f$, the probability to get a score
2654 15 Nov 11 peter 79        greater (or equal) than score() given that there is no
2654 15 Nov 11 peter 80        association between two variables.
2654 15 Nov 11 peter 81
2654 15 Nov 11 peter 82        In \a exact mode the score is calculated for each permutation
2654 15 Nov 11 peter 83        and compared to the actual score. In each permutation one
2654 15 Nov 11 peter 84        variable, say \a x, is kept fix while the other (\a y) is
2654 15 Nov 11 peter 85        shuffled in determionsitic fashion. Number of permutations
2654 15 Nov 11 peter 86        grows quickly as number of data points grows and with no ties
2654 15 Nov 11 peter 87        there are N! permutations and the exact method gets very
2654 15 Nov 11 peter 88        expensive.
2654 15 Nov 11 peter 89
2654 15 Nov 11 peter 90        In approximative mode P-value is calculated using pearson_p_value().
2635 09 Nov 11 peter 91      */
2637 10 Nov 11 peter 92     double p_right(bool exact=false) const;
2637 10 Nov 11 peter 93
2635 09 Nov 11 peter 94     /**
2635 09 Nov 11 peter 95        \brief Two-sided p-value
2654 15 Nov 11 peter 96
2654 15 Nov 11 peter 97        Calculates, \f$ P(|R| \ge |r|) \f$, the probability to get a
2654 15 Nov 11 peter 98        score more extreme (or equal) than score() given that there is
2654 15 Nov 11 peter 99        no association between two variables. If score(), \a r, is
2654 15 Nov 11 peter 100        greater than zero, this equals 2 * p_right(). Otherwise it
2654 15 Nov 11 peter 101        equals 2 * p_left().
2635 09 Nov 11 peter 102      */
2637 10 Nov 11 peter 103     double p_value(bool exact=false) const;
2637 10 Nov 11 peter 104
2635 09 Nov 11 peter 105     /**
2654 15 Nov 11 peter 106        \brief reset to empty
2637 10 Nov 11 peter 107      */
2637 10 Nov 11 peter 108     void reset(void);
2637 10 Nov 11 peter 109
2637 10 Nov 11 peter 110     /**
2654 15 Nov 11 peter 111        \brief spearman rank correlation coefficient
2654 15 Nov 11 peter 112
2654 15 Nov 11 peter 113        The Spearman rank correlation coeeficient is defined as \f$
2654 15 Nov 11 peter 114        \frac{12\sum (R_i-\frac{n+1}{2})(S_i-\frac{n+1}{2})}{n(n^2-1)}
2654 15 Nov 11 peter 115        \f$ where \f$ R_i \f$ and \f$ S_i \f$ are ranks of \a X and \a
2654 15 Nov 11 peter 116        Y, respectively. In case of ties, the rank is defined as the
2654 15 Nov 11 peter 117        average rank of the ties.
2635 09 Nov 11 peter 118      */
2635 09 Nov 11 peter 119     double score(void) const;
2635 09 Nov 11 peter 120
2635 09 Nov 11 peter 121   private:
2638 10 Nov 11 peter 122     class Pimpl;
2638 10 Nov 11 peter 123     Pimpl* pimpl_;
2635 09 Nov 11 peter 124
2638 10 Nov 11 peter 125     // Copy not allowed
2638 10 Nov 11 peter 126     Spearman(const Spearman& other);
2638 10 Nov 11 peter 127     Spearman& operator=(const Spearman&);
2635 09 Nov 11 peter 128    };
2635 09 Nov 11 peter 129
2635 09 Nov 11 peter 130 }}} // of namespace statistics, yat, and theplu
2635 09 Nov 11 peter 131 #endif