yat/statistics/KaplanMeier.cc

Code
Comments
Other
Rev Date Author Line
4255 16 Dec 22 peter 1 // $Id$
4255 16 Dec 22 peter 2
4255 16 Dec 22 peter 3 /*
4255 16 Dec 22 peter 4   Copyright (C) 2022 Peter Johansson
4255 16 Dec 22 peter 5
4255 16 Dec 22 peter 6   This file is part of the yat library, https://dev.thep.lu.se/yat
4255 16 Dec 22 peter 7
4255 16 Dec 22 peter 8   The yat library is free software; you can redistribute it and/or
4255 16 Dec 22 peter 9   modify it under the terms of the GNU General Public License as
4255 16 Dec 22 peter 10   published by the Free Software Foundation; either version 3 of the
4255 16 Dec 22 peter 11   License, or (at your option) any later version.
4255 16 Dec 22 peter 12
4255 16 Dec 22 peter 13   The yat library is distributed in the hope that it will be useful,
4255 16 Dec 22 peter 14   but WITHOUT ANY WARRANTY; without even the implied warranty of
4255 16 Dec 22 peter 15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4255 16 Dec 22 peter 16   General Public License for more details.
4255 16 Dec 22 peter 17
4255 16 Dec 22 peter 18   You should have received a copy of the GNU General Public License
4255 16 Dec 22 peter 19   along with yat. If not, see <https://www.gnu.org/licenses/>.
4255 16 Dec 22 peter 20 */
4255 16 Dec 22 peter 21
4255 16 Dec 22 peter 22 #include <config.h>
4255 16 Dec 22 peter 23
4255 16 Dec 22 peter 24 #include "KaplanMeier.h"
4255 16 Dec 22 peter 25
4255 16 Dec 22 peter 26 #include <cassert>
4255 16 Dec 22 peter 27
4255 16 Dec 22 peter 28 namespace theplu {
4255 16 Dec 22 peter 29 namespace yat {
4255 16 Dec 22 peter 30 namespace statistics {
4255 16 Dec 22 peter 31
4255 16 Dec 22 peter 32   KaplanMeier::KaplanMeier(void)
4255 16 Dec 22 peter 33     : updated_(false), n_(0)
4255 16 Dec 22 peter 34   {}
4255 16 Dec 22 peter 35
4255 16 Dec 22 peter 36
4255 16 Dec 22 peter 37   void KaplanMeier::add(double time, bool event)
4255 16 Dec 22 peter 38   {
4255 16 Dec 22 peter 39     if (event)
4255 16 Dec 22 peter 40       add(time, 1, 0);
4255 16 Dec 22 peter 41     else
4255 16 Dec 22 peter 42       add(time, 0, 1);
4255 16 Dec 22 peter 43   }
4255 16 Dec 22 peter 44
4255 16 Dec 22 peter 45
4255 16 Dec 22 peter 46   void KaplanMeier::add(double time, unsigned int event, unsigned int censored)
4255 16 Dec 22 peter 47   {
4255 16 Dec 22 peter 48     auto it = data_.lower_bound(time);
4255 16 Dec 22 peter 49     if (it == data_.end() || time < it->first)
4255 16 Dec 22 peter 50       data_.insert(it, std::make_pair(time, TimePoint(event, censored)));
4255 16 Dec 22 peter 51     else {
4255 16 Dec 22 peter 52       it->second.event_ += event;
4255 16 Dec 22 peter 53       it->second.censored_ += censored;
4255 16 Dec 22 peter 54     }
4255 16 Dec 22 peter 55     n_ += event + censored;
4255 16 Dec 22 peter 56     updated_ = false;
4255 16 Dec 22 peter 57   }
4255 16 Dec 22 peter 58
4255 16 Dec 22 peter 59
4255 16 Dec 22 peter 60   KaplanMeier::const_iterator KaplanMeier::begin(void) const
4255 16 Dec 22 peter 61   {
4255 16 Dec 22 peter 62     update();
4255 16 Dec 22 peter 63     return data_.begin();
4255 16 Dec 22 peter 64   }
4255 16 Dec 22 peter 65
4255 16 Dec 22 peter 66
4255 16 Dec 22 peter 67   void KaplanMeier::clear(void)
4255 16 Dec 22 peter 68   {
4255 16 Dec 22 peter 69     KaplanMeier tmp;
4255 16 Dec 22 peter 70     *this = std::move(tmp);
4255 16 Dec 22 peter 71   }
4255 16 Dec 22 peter 72
4255 16 Dec 22 peter 73
4255 16 Dec 22 peter 74   KaplanMeier::const_iterator KaplanMeier::end(void) const
4255 16 Dec 22 peter 75   {
4255 16 Dec 22 peter 76     // Although end() is not referencable, user might decrement it
4255 16 Dec 22 peter 77     // e.g. through a reverse_iterator and access data_.
4255 16 Dec 22 peter 78     update();
4255 16 Dec 22 peter 79     return data_.end();
4255 16 Dec 22 peter 80   }
4255 16 Dec 22 peter 81
4255 16 Dec 22 peter 82
4255 16 Dec 22 peter 83   KaplanMeier::const_iterator KaplanMeier::find(double time) const
4255 16 Dec 22 peter 84   {
4255 16 Dec 22 peter 85     update();
4255 16 Dec 22 peter 86     return data_.find(time);
4255 16 Dec 22 peter 87   }
4255 16 Dec 22 peter 88
4255 16 Dec 22 peter 89
4255 16 Dec 22 peter 90   KaplanMeier::const_iterator KaplanMeier::lower_bound(double time) const
4255 16 Dec 22 peter 91   {
4255 16 Dec 22 peter 92     update();
4255 16 Dec 22 peter 93     return data_.lower_bound(time);
4255 16 Dec 22 peter 94   }
4255 16 Dec 22 peter 95
4255 16 Dec 22 peter 96
4255 16 Dec 22 peter 97   void KaplanMeier::update(void) const
4255 16 Dec 22 peter 98   {
4255 16 Dec 22 peter 99     if (updated_)
4255 16 Dec 22 peter 100       return;
4255 16 Dec 22 peter 101
4255 16 Dec 22 peter 102     unsigned int n = n_;
4255 16 Dec 22 peter 103     double s = 1.0;
4255 16 Dec 22 peter 104     for (auto& x : data_) {
4255 16 Dec 22 peter 105       TimePoint& tp = x.second;
4255 16 Dec 22 peter 106       s *= 1.0 - static_cast<double>(tp.event()) / n;
4255 16 Dec 22 peter 107       tp.s_ = s;
4255 16 Dec 22 peter 108       tp.n_ = n;
4255 16 Dec 22 peter 109       n -= tp.event() + tp.censored();
4255 16 Dec 22 peter 110     }
4255 16 Dec 22 peter 111
4255 16 Dec 22 peter 112     updated_ = true;
4255 16 Dec 22 peter 113   }
4255 16 Dec 22 peter 114
4255 16 Dec 22 peter 115
4255 16 Dec 22 peter 116   KaplanMeier::const_iterator KaplanMeier::upper_bound(double time) const
4255 16 Dec 22 peter 117   {
4255 16 Dec 22 peter 118     update();
4255 16 Dec 22 peter 119     return data_.upper_bound(time);
4255 16 Dec 22 peter 120   }
4255 16 Dec 22 peter 121
4255 16 Dec 22 peter 122
4255 16 Dec 22 peter 123   KaplanMeier::TimePoint::TimePoint(void)
4255 16 Dec 22 peter 124     : censored_(0), event_(0)
4255 16 Dec 22 peter 125   {}
4255 16 Dec 22 peter 126
4255 16 Dec 22 peter 127
4255 16 Dec 22 peter 128   KaplanMeier::TimePoint::TimePoint(unsigned int event, unsigned int censored)
4255 16 Dec 22 peter 129     : censored_(censored), event_(event)
4255 16 Dec 22 peter 130   {}
4255 16 Dec 22 peter 131
4255 16 Dec 22 peter 132
4255 16 Dec 22 peter 133   unsigned int KaplanMeier::TimePoint::at_risk(void) const
4255 16 Dec 22 peter 134   {
4255 16 Dec 22 peter 135     return n_;
4255 16 Dec 22 peter 136   }
4255 16 Dec 22 peter 137
4255 16 Dec 22 peter 138
4255 16 Dec 22 peter 139   unsigned int KaplanMeier::TimePoint::censored(void) const
4255 16 Dec 22 peter 140   {
4255 16 Dec 22 peter 141     return censored_;
4255 16 Dec 22 peter 142   }
4255 16 Dec 22 peter 143
4255 16 Dec 22 peter 144
4255 16 Dec 22 peter 145   unsigned int KaplanMeier::TimePoint::event(void) const
4255 16 Dec 22 peter 146   {
4255 16 Dec 22 peter 147     return event_;
4255 16 Dec 22 peter 148   }
4255 16 Dec 22 peter 149
4255 16 Dec 22 peter 150
4255 16 Dec 22 peter 151   double KaplanMeier::TimePoint::survival_proportion(void) const
4255 16 Dec 22 peter 152   {
4255 16 Dec 22 peter 153     return s_;
4255 16 Dec 22 peter 154   }
4255 16 Dec 22 peter 155
4255 16 Dec 22 peter 156 }}} // of namespace statistics, yat, and theplu