source: trunk/yat/statistics/AveragerPair.h @ 1122

Last change on this file since 1122 was 1122, checked in by Peter, 14 years ago

refs #335 - Changed so Averager classes are consistently returning NaN when Averager is empty or for some other reason the estimation ends up with things like zero by zero division. Previously zero was returned from some functions and Nan from some functions. I did not change anythuing in NCC.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.1 KB
Line 
1#ifndef _theplu_yat_statistics_averagerpair_
2#define _theplu_yat_statistics_averagerpair_
3
4// $Id: AveragerPair.h 1122 2008-02-22 17:01:15Z peter $
5
6/*
7  Copyright (C) 2004, 2005 Jari Häkkinen, Peter Johansson
8  Copyright (C) 2006 Jari Häkkinen, Markus Ringnér, Peter Johansson
9  Copyright (C) 2007 Jari Häkkinen, Peter Johansson
10
11  This file is part of the yat library, http://trac.thep.lu.se/yat
12
13  The yat library is free software; you can redistribute it and/or
14  modify it under the terms of the GNU General Public License as
15  published by the Free Software Foundation; either version 2 of the
16  License, or (at your option) any later version.
17
18  The yat library is distributed in the hope that it will be useful,
19  but WITHOUT ANY WARRANTY; without even the implied warranty of
20  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21  General Public License for more details.
22
23  You should have received a copy of the GNU General Public License
24  along with this program; if not, write to the Free Software
25  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26  02111-1307, USA.
27*/
28
29#include "Averager.h"
30
31#include "yat/utility/iterator_traits.h"
32
33#include <cmath>
34#include <utility>
35
36namespace theplu{
37namespace yat{
38namespace statistics{
39
40  ///
41  /// @brief Class for taking care of mean and covariance of two variables.
42  ///
43  /// @see Averager AveragerWeighted AveragerPairWeighted
44  ///
45  class AveragerPair
46  {
47  public:
48
49    ///
50    /// @brief The default constructor
51    ///
52    AveragerPair(void);
53
54    ///
55    /// Constructor taking sum of \a x , \a xx , \a y , \a yy , xy and
56    /// number of pair of values \a n
57    ///
58    //AveragerPair(const double x, const double xx, const double y,
59    //                    const double yy, const double xy, const unsigned long n)
60    //  : x_(Averager(x,xx,n)), y_(Averager(y,yy,n)), xy_(xy) {}
61
62    ///
63    /// The copy constructor
64    ///
65    AveragerPair(const AveragerPair&);
66
67    ///
68    /// Adding \a n pairs of data points with value \a x and \a y.
69    ///
70    void add(const double x, const double y, const unsigned long n=1);
71
72    /**
73       \f$ \frac{\sum_i (x_i-m_x)(y_i-m_y)}{\sum_i
74       (x_i-m_x)^2+\sum_i (y_i-m_y)^2 + n(m_x-m_y)^2} \f$
75       
76       @return Concordence correlation coefficient.
77    */
78    double ccc(void) const;
79
80    ///
81    /// \f$ \frac{\sum_i (x_i-m_x)(y_i-m_y)}{\sqrt{\sum_i
82    /// (x_i-m_x)^2\sum_i (y_i-m_y)^2}} \f$
83    ///
84    /// @return Pearson correlation coefficient.
85    ///
86    double correlation(void) const;
87 
88    ///
89    /// Calculating covariance using
90    /// \f$ \frac{1}{N}\sum_i (x_i-m_x)(y_i-m_y) \f$,
91    /// where \f$ m \f$ is the mean.
92    ///
93    /// @return The covariance.
94    ///
95    double covariance(void) const;
96 
97    ///
98    /// @return The mean of xy.
99    ///
100    double mean_xy(void) const;
101
102    ///
103    /// @return Average squared deviation between x and y \f$
104    /// \frac{1}{N} \sum (x-y)^2 \f$
105    ///
106    double msd(void) const;
107
108    ///
109    /// @return The number of pair of data points.
110    ///
111    unsigned long n(void) const;
112
113    ///
114    /// @brief Reset everything to zero
115    ///
116    void reset(void);
117
118    ///
119    /// @return The sum of xy.
120    ///
121    double sum_xy(void) const;
122
123    ///
124    /// @return Sum of squared deviation between x and y \f$
125    /// \sum (x-y)^2 \f$
126    ///
127    double sum_squared_deviation(void) const;
128
129    ///
130    /// @return \f$ \sum_i (x_i-m_x)(y_i-m_y) \f$
131    ///
132    double sum_xy_centered(void) const;
133
134    ///
135    /// @return A const refencer to the averager object for x.
136    ///
137    const Averager& x_averager(void) const;
138
139    ///
140    /// @return A const reference to the averager object for y
141    ///
142    const Averager& y_averager(void) const;
143
144    ///
145    /// @brief The assigment operator
146    ///
147    const AveragerPair& operator=(const AveragerPair& a);
148
149    ///
150    /// Operator to add another Averager
151    ///
152    const AveragerPair& operator+=(const AveragerPair&);
153
154  private:
155    Averager x_;
156    Averager y_;
157    double  xy_;
158
159  };
160
161  /**
162     \brief adding data from two ranges to AveragerPair \a ap
163   */
164  template <class Iter1, class Iter2>
165  void add(AveragerPair& ap, Iter1 first1, Iter1 last1, Iter2 first2)
166  {
167    utility::check_iterator_is_unweighted(first1);
168    utility::check_iterator_is_unweighted(first2);
169    for ( ; first1 != last1; ++first1, ++first2)
170      ap.add(*first1, *first2);
171  }
172
173
174}}} // of namespace statistics, yat, and theplu
175
176#endif
Note: See TracBrowser for help on using the repository browser.