yat/statistics/Kendall.h

Code
Comments
Other
Rev Date Author Line
2649 14 Nov 11 peter 1 #ifndef _theplu_yat_statistics_kendall_
2649 14 Nov 11 peter 2 #define _theplu_yat_statistics_kendall_
2649 14 Nov 11 peter 3
2649 14 Nov 11 peter 4 // $Id$
2649 14 Nov 11 peter 5
2649 14 Nov 11 peter 6 /*
4089 07 Sep 21 peter 7   Copyright (C) 2011, 2012, 2021 Peter Johansson
2649 14 Nov 11 peter 8
2649 14 Nov 11 peter 9   This file is part of the yat library, http://dev.thep.lu.se/yat
2649 14 Nov 11 peter 10
2649 14 Nov 11 peter 11   The yat library is free software; you can redistribute it and/or
2649 14 Nov 11 peter 12   modify it under the terms of the GNU General Public License as
2649 14 Nov 11 peter 13   published by the Free Software Foundation; either version 3 of the
2649 14 Nov 11 peter 14   License, or (at your option) any later version.
2649 14 Nov 11 peter 15
2649 14 Nov 11 peter 16   The yat library is distributed in the hope that it will be useful,
2649 14 Nov 11 peter 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
2649 14 Nov 11 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2649 14 Nov 11 peter 19   General Public License for more details.
2649 14 Nov 11 peter 20
2649 14 Nov 11 peter 21   You should have received a copy of the GNU General Public License
2649 14 Nov 11 peter 22   along with yat. If not, see <http://www.gnu.org/licenses/>.
2649 14 Nov 11 peter 23 */
2649 14 Nov 11 peter 24
2649 14 Nov 11 peter 25 #include <cstddef>
2649 14 Nov 11 peter 26
2649 14 Nov 11 peter 27 namespace theplu {
2649 14 Nov 11 peter 28 namespace yat {
2649 14 Nov 11 peter 29 namespace statistics {
2649 14 Nov 11 peter 30
2649 14 Nov 11 peter 31   /**
2766 10 Jul 12 peter 32      \brief Kendall's tau rank coefficient
2649 14 Nov 11 peter 33    */
2649 14 Nov 11 peter 34   class Kendall
2649 14 Nov 11 peter 35   {
2649 14 Nov 11 peter 36   public:
2649 14 Nov 11 peter 37     /**
2649 14 Nov 11 peter 38        \brief Constructor
2649 14 Nov 11 peter 39     */
2649 14 Nov 11 peter 40     Kendall(void);
2649 14 Nov 11 peter 41
2649 14 Nov 11 peter 42     /**
2760 08 Jul 12 peter 43        \brief Copy constructor
2760 08 Jul 12 peter 44      */
2760 08 Jul 12 peter 45     Kendall(const Kendall& other);
2760 08 Jul 12 peter 46
2760 08 Jul 12 peter 47     /**
4083 27 Aug 21 peter 48        \brief Move constructor
4083 27 Aug 21 peter 49      */
4083 27 Aug 21 peter 50     Kendall(Kendall&& other);
4083 27 Aug 21 peter 51
4083 27 Aug 21 peter 52     /**
2649 14 Nov 11 peter 53        \brief Destructor
2649 14 Nov 11 peter 54     */
2649 14 Nov 11 peter 55     virtual ~Kendall(void);
2649 14 Nov 11 peter 56
2649 14 Nov 11 peter 57     /**
2649 14 Nov 11 peter 58        \brief add pair of data
2649 14 Nov 11 peter 59      */
2649 14 Nov 11 peter 60     void add(double x, double y);
2649 14 Nov 11 peter 61
2649 14 Nov 11 peter 62     /**
2649 14 Nov 11 peter 63        \return Number of data points
2649 14 Nov 11 peter 64      */
2649 14 Nov 11 peter 65     size_t n(void) const;
2649 14 Nov 11 peter 66
2649 14 Nov 11 peter 67     /**
2649 14 Nov 11 peter 68        \brief Lower one-sided p-value
2766 10 Jul 12 peter 69
2766 10 Jul 12 peter 70        P-value is calculates in same fashion as p_right(), but
2766 10 Jul 12 peter 71        calculating when score from permuted data is smaller than score
2766 10 Jul 12 peter 72        (rather than greater).
2766 10 Jul 12 peter 73
2766 10 Jul 12 peter 74        \see p_right()
2649 14 Nov 11 peter 75     */
2649 14 Nov 11 peter 76     double p_left(bool exact=false) const;
2649 14 Nov 11 peter 77
2649 14 Nov 11 peter 78     /**
2649 14 Nov 11 peter 79        \brief Upper one-sided p-value
2758 08 Jul 12 peter 80
2766 10 Jul 12 peter 81        If \c exact function permutaes the data and counts fraction of
2766 10 Jul 12 peter 82        permutations that result in a larger tau coefficient.
2758 08 Jul 12 peter 83
2766 10 Jul 12 peter 84        If not \c exact a Gaussian approximation by transforming the
2766 10 Jul 12 peter 85        score to a variable a z is approximately stardard normal, where
2766 10 Jul 12 peter 86        \f{eqnarray*}{
2766 10 Jul 12 peter 87        z &=& \frac{n_c - n_d}{\sqrt{v}} \\
2758 08 Jul 12 peter 88        v &=& (v_0-v_t-v_u)/18+v_1+v_2 \\
2758 08 Jul 12 peter 89        v_0 &=& n(n-1)(2n+5) \\
2758 08 Jul 12 peter 90        v_t &=& \sum_i t_i(t_i-1)(2t_i+5) \\
2758 08 Jul 12 peter 91        v_u &=& \sum_j u_j(u_j-1)(2u_j+5) \\
2758 08 Jul 12 peter 92        v_1 &=& \sum_i t_i(t_i-1)\sum_j u_j(u_j-1)/(2n(n-1)) \\
2758 08 Jul 12 peter 93        v_2 &=& \sum_i t_i(t_i-1)(t_i-2)\sum_j u_j(u_j-1)(u_j-2)
2758 08 Jul 12 peter 94        \f}
2766 10 Jul 12 peter 95        (see function score() for explanation of variables).
2766 10 Jul 12 peter 96
2766 10 Jul 12 peter 97        and p-value is calculates as \f$ p = \frac{1}{\sqrt{2\pi}}
2766 10 Jul 12 peter 98        \int_z^{\infty} \exp(-s^2/2) ds\f$
2649 14 Nov 11 peter 99      */
2649 14 Nov 11 peter 100     double p_right(bool exact=false) const;
2649 14 Nov 11 peter 101
2649 14 Nov 11 peter 102     /**
2649 14 Nov 11 peter 103        \brief Two-sided p-value
2649 14 Nov 11 peter 104      */
2649 14 Nov 11 peter 105     double p_value(bool exact=false) const;
2649 14 Nov 11 peter 106
2649 14 Nov 11 peter 107     /**
2649 14 Nov 11 peter 108        \brief reset
2649 14 Nov 11 peter 109      */
2649 14 Nov 11 peter 110     void reset(void);
2649 14 Nov 11 peter 111
2649 14 Nov 11 peter 112     /**
2686 25 Feb 12 peter 113        \brief Kendall's tau
2757 08 Jul 12 peter 114
2757 08 Jul 12 peter 115        \f$ \tau = \frac{n_c - n_d}{\sqrt{n(n-1)/2-\sum
2757 08 Jul 12 peter 116        t_i(t_i-1)/2}\sqrt{n(n-1)/2-\sum u_j(u_j-1)/2}} \f$ where \f$
2757 08 Jul 12 peter 117        n_c \f$ is number concordant pairs, \f$ n_d \f$ number of
2757 08 Jul 12 peter 118        disconcordant pairs, \f$ n(n-1)/2 \f$ total number of pairs,
2757 08 Jul 12 peter 119        \f$ t_i \f$ number of data points in ties group \c i, and \f$
2757 08 Jul 12 peter 120        u_i \f$ number of data points in tied group \c j
2649 14 Nov 11 peter 121      */
2649 14 Nov 11 peter 122     double score(void) const;
2649 14 Nov 11 peter 123
2760 08 Jul 12 peter 124     /**
2760 08 Jul 12 peter 125        \brief assignment operator
2760 08 Jul 12 peter 126      */
2760 08 Jul 12 peter 127     Kendall& operator=(const Kendall& rhs);
4083 27 Aug 21 peter 128
4083 27 Aug 21 peter 129     /**
4083 27 Aug 21 peter 130        \brief move assignment operator
4083 27 Aug 21 peter 131      */
4083 27 Aug 21 peter 132     Kendall& operator=(Kendall&& rhs);
2649 14 Nov 11 peter 133   private:
2649 14 Nov 11 peter 134     class Pimpl;
2649 14 Nov 11 peter 135     Pimpl* pimpl_;
2649 14 Nov 11 peter 136    };
2649 14 Nov 11 peter 137
2649 14 Nov 11 peter 138 }}} // of namespace statistics, yat, and theplu
2649 14 Nov 11 peter 139 #endif