yat/statistics/KaplanMeier.h

Code
Comments
Other
Rev Date Author Line
4255 16 Dec 22 peter 1 #ifndef _theplu_yat_statistics_kaplan_meier
4255 16 Dec 22 peter 2 #define _theplu_yat_statistics_kaplan_meier
4255 16 Dec 22 peter 3
4255 16 Dec 22 peter 4 // $Id$
4255 16 Dec 22 peter 5
4255 16 Dec 22 peter 6 /*
4255 16 Dec 22 peter 7   Copyright (C) 2022 Peter Johansson
4255 16 Dec 22 peter 8
4255 16 Dec 22 peter 9   This file is part of the yat library, https://dev.thep.lu.se/yat
4255 16 Dec 22 peter 10
4255 16 Dec 22 peter 11   The yat library is free software; you can redistribute it and/or
4255 16 Dec 22 peter 12   modify it under the terms of the GNU General Public License as
4255 16 Dec 22 peter 13   published by the Free Software Foundation; either version 3 of the
4255 16 Dec 22 peter 14   License, or (at your option) any later version.
4255 16 Dec 22 peter 15
4255 16 Dec 22 peter 16   The yat library is distributed in the hope that it will be useful,
4255 16 Dec 22 peter 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
4255 16 Dec 22 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4255 16 Dec 22 peter 19   General Public License for more details.
4255 16 Dec 22 peter 20
4255 16 Dec 22 peter 21   You should have received a copy of the GNU General Public License
4255 16 Dec 22 peter 22   along with yat. If not, see <https://www.gnu.org/licenses/>.
4255 16 Dec 22 peter 23 */
4255 16 Dec 22 peter 24
4255 16 Dec 22 peter 25 #include <map>
4255 16 Dec 22 peter 26
4255 16 Dec 22 peter 27 namespace theplu {
4255 16 Dec 22 peter 28 namespace yat {
4255 16 Dec 22 peter 29 namespace statistics {
4255 16 Dec 22 peter 30
4255 16 Dec 22 peter 31   /**
4255 16 Dec 22 peter 32      \brief Kaplan-Meier estimator
4255 16 Dec 22 peter 33
4255 16 Dec 22 peter 34      Data is evaluated lazily, i.e., data is not computed when added
4255 16 Dec 22 peter 35      but when data is accessed through the functions returning
4255 16 Dec 22 peter 36      iterators to the underlying data structure. Since computing teh
4255 16 Dec 22 peter 37      data is linear in number of time points, the typical use case is
4255 16 Dec 22 peter 38      to first add all the data and then access the estimated values.
4255 16 Dec 22 peter 39
4255 16 Dec 22 peter 40      \since New in yat 0.21
4255 16 Dec 22 peter 41   */
4255 16 Dec 22 peter 42   class KaplanMeier
4255 16 Dec 22 peter 43   {
4255 16 Dec 22 peter 44   public:
4255 16 Dec 22 peter 45     /**
4255 16 Dec 22 peter 46        Class representing a time point in a kaplan-meier estimator
4255 16 Dec 22 peter 47      */
4255 16 Dec 22 peter 48     class TimePoint
4255 16 Dec 22 peter 49     {
4255 16 Dec 22 peter 50     public:
4255 16 Dec 22 peter 51       /**
4255 16 Dec 22 peter 52          Default constructor
4255 16 Dec 22 peter 53        */
4255 16 Dec 22 peter 54       TimePoint(void);
4255 16 Dec 22 peter 55
4255 16 Dec 22 peter 56       /**
4255 16 Dec 22 peter 57          \param event number of events occuring at this time point
4255 16 Dec 22 peter 58          \param censored number of data points being censored at this
4255 16 Dec 22 peter 59          time point.
4255 16 Dec 22 peter 60        */
4255 16 Dec 22 peter 61       TimePoint(unsigned int event, unsigned int censored);
4255 16 Dec 22 peter 62
4255 16 Dec 22 peter 63       /**
4255 16 Dec 22 peter 64          Number of subjects being at risk at this point in time, i.e.,
4255 16 Dec 22 peter 65          number of data points that occur or are being censored at
4255 16 Dec 22 peter 66          this time point or later.
4255 16 Dec 22 peter 67        */
4255 16 Dec 22 peter 68       unsigned int at_risk(void) const;
4255 16 Dec 22 peter 69
4255 16 Dec 22 peter 70       /**
4255 16 Dec 22 peter 71          Number of data points being censored at this time point
4255 16 Dec 22 peter 72        */
4255 16 Dec 22 peter 73       unsigned int censored(void) const;
4255 16 Dec 22 peter 74
4255 16 Dec 22 peter 75       /**
4255 16 Dec 22 peter 76          Number of events occurring
4255 16 Dec 22 peter 77        */
4255 16 Dec 22 peter 78       unsigned int event(void) const;
4255 16 Dec 22 peter 79
4255 16 Dec 22 peter 80       /**
4255 16 Dec 22 peter 81          \return an estimate of proportions of samples alive.
4255 16 Dec 22 peter 82
4255 16 Dec 22 peter 83          The proportion is estimated as \f$ s(t) \prod_{i:t_i\le t}
4255 16 Dec 22 peter 84          \left( 1 - \frac{x_i}{n_i} \right) \f$, where \f$d_i\f$ is
4255 16 Dec 22 peter 85          number of events at time \f$t_i\f$ and \f$ n_i \f$ is subjects
4255 16 Dec 22 peter 86          at risk at time \f$ t_i\f$ (see at_risk()).
4255 16 Dec 22 peter 87        */
4255 16 Dec 22 peter 88       double survival_proportion(void) const;
4255 16 Dec 22 peter 89     private:
4255 16 Dec 22 peter 90       friend class KaplanMeier;
4255 16 Dec 22 peter 91       unsigned int censored_;
4255 16 Dec 22 peter 92       unsigned int event_;
4255 16 Dec 22 peter 93       unsigned int n_;
4255 16 Dec 22 peter 94       double s_;
4255 16 Dec 22 peter 95     };
4255 16 Dec 22 peter 96
4255 16 Dec 22 peter 97     /**
4255 16 Dec 22 peter 98        Const iterator used to iterate through the underlying data
4255 16 Dec 22 peter 99        structure.
4255 16 Dec 22 peter 100      */
4255 16 Dec 22 peter 101     typedef std::map<double, TimePoint>::const_iterator const_iterator;
4255 16 Dec 22 peter 102
4255 16 Dec 22 peter 103     /**
4255 16 Dec 22 peter 104        Default constructor
4255 16 Dec 22 peter 105      */
4255 16 Dec 22 peter 106     KaplanMeier(void);
4255 16 Dec 22 peter 107
4255 16 Dec 22 peter 108     /**
4255 16 Dec 22 peter 109        Add a data point at time \c time. If \c event is true, counted
4255 16 Dec 22 peter 110        as an event (e.g. death); otherwise counted as sample being
4255 16 Dec 22 peter 111        censored at time \c time.
4255 16 Dec 22 peter 112
4255 16 Dec 22 peter 113        Takes logarithmic time in terms of already added time points.
4255 16 Dec 22 peter 114      */
4255 16 Dec 22 peter 115     void add(double time, bool event);
4255 16 Dec 22 peter 116
4255 16 Dec 22 peter 117     /**
4255 16 Dec 22 peter 118        Add \c event events and \c censored censored data points at
4255 16 Dec 22 peter 119        time \c time.
4255 16 Dec 22 peter 120
4255 16 Dec 22 peter 121        Takes logarithmic time in terms of already added time points.
4255 16 Dec 22 peter 122      */
4255 16 Dec 22 peter 123     void add(double time, unsigned int event, unsigned int censored);
4255 16 Dec 22 peter 124
4255 16 Dec 22 peter 125     /**
4255 16 Dec 22 peter 126        \return an iterator to the earliest data point with data
4255 16 Dec 22 peter 127      */
4255 16 Dec 22 peter 128     const_iterator begin(void) const;
4255 16 Dec 22 peter 129
4255 16 Dec 22 peter 130     /**
4255 16 Dec 22 peter 131        Clear all data.
4255 16 Dec 22 peter 132      */
4255 16 Dec 22 peter 133     void clear(void);
4255 16 Dec 22 peter 134
4255 16 Dec 22 peter 135     /**
4255 16 Dec 22 peter 136        \return past last iterator
4255 16 Dec 22 peter 137      */
4255 16 Dec 22 peter 138     const_iterator end(void) const;
4255 16 Dec 22 peter 139
4255 16 Dec 22 peter 140     /**
4255 16 Dec 22 peter 141        \return If there is any data at time \c time, return an
4255 16 Dec 22 peter 142        iterator pointing to it. Otherwise, end() is returned.
4255 16 Dec 22 peter 143      */
4255 16 Dec 22 peter 144     const_iterator find(double time) const;
4255 16 Dec 22 peter 145
4255 16 Dec 22 peter 146     /**
4255 16 Dec 22 peter 147        \return first time point that is not earlier than \c time
4255 16 Dec 22 peter 148      */
4255 16 Dec 22 peter 149     const_iterator lower_bound(double time) const;
4255 16 Dec 22 peter 150
4255 16 Dec 22 peter 151     /**
4255 16 Dec 22 peter 152        \return first time point that is later than \c time
4255 16 Dec 22 peter 153      */
4255 16 Dec 22 peter 154     const_iterator upper_bound(double time) const;
4255 16 Dec 22 peter 155   private:
4255 16 Dec 22 peter 156     // Calculated data in data_ is not calculated every time data is
4255 16 Dec 22 peter 157     // added, but calculated lazily first when needed, i.e., when user
4255 16 Dec 22 peter 158     // is accessing the data.
4255 16 Dec 22 peter 159     mutable bool updated_;
4255 16 Dec 22 peter 160     mutable std::map<double, TimePoint> data_;
4255 16 Dec 22 peter 161     void update(void) const;
4255 16 Dec 22 peter 162     unsigned int n_;
4255 16 Dec 22 peter 163   };
4255 16 Dec 22 peter 164
4255 16 Dec 22 peter 165 }}} // of namespace statistics, yat, and theplu
4255 16 Dec 22 peter 166
4255 16 Dec 22 peter 167 #endif