4255 |
16 Dec 22 |
peter |
// $Id$ |
4255 |
16 Dec 22 |
peter |
2 |
|
4255 |
16 Dec 22 |
peter |
3 |
/* |
4255 |
16 Dec 22 |
peter |
Copyright (C) 2022 Peter Johansson |
4255 |
16 Dec 22 |
peter |
5 |
|
4255 |
16 Dec 22 |
peter |
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 |
The yat library is free software; you can redistribute it and/or |
4255 |
16 Dec 22 |
peter |
modify it under the terms of the GNU General Public License as |
4255 |
16 Dec 22 |
peter |
published by the Free Software Foundation; either version 3 of the |
4255 |
16 Dec 22 |
peter |
License, or (at your option) any later version. |
4255 |
16 Dec 22 |
peter |
12 |
|
4255 |
16 Dec 22 |
peter |
The yat library is distributed in the hope that it will be useful, |
4255 |
16 Dec 22 |
peter |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
4255 |
16 Dec 22 |
peter |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
4255 |
16 Dec 22 |
peter |
General Public License for more details. |
4255 |
16 Dec 22 |
peter |
17 |
|
4255 |
16 Dec 22 |
peter |
You should have received a copy of the GNU General Public License |
4255 |
16 Dec 22 |
peter |
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 |
// Although end() is not referencable, user might decrement it |
4255 |
16 Dec 22 |
peter |
// 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 |