tatami_stats
Matrix statistics for tatami
Loading...
Searching...
No Matches
variance.hpp
Go to the documentation of this file.
1#ifndef TATAMI_STATS_VARIANCE_HPP
2#define TATAMI_STATS_VARIANCE_HPP
3
4#include <vector>
5#include <cmath>
6#include <numeric>
7#include <limits>
8#include <algorithm>
9#include <cstddef>
10#include <optional>
11
12#include "tatami/tatami.hpp"
13#include "sanisizer/sanisizer.hpp"
15
16#include "rss.hpp"
17#include "skip_nan/rss.hpp"
18#include "utils.hpp"
19
26namespace tatami_stats {
27
32template<typename Output_ = double>
58
64template<typename Output_>
70 Output_* mean;
71
76 Output_* variance;
77};
78
95template<typename Value_, typename Index_, typename Output_>
97 const auto dim = (row ? mat.nrow() : mat.ncol());
98 const auto otherdim = (row ? mat.ncol() : mat.nrow());
99
100 nanable_ifelse<Value_>(
101 opt.skip_nan,
102
103 [&]() -> void {
104 skip_nan::RssBuffers<Output_, Index_> tmp;
105 tmp.mean = output.mean;
106 tmp.rss = output.variance;
107 auto count = tatami::create_container_of_Index_size<std::vector<Index_> >(row ? mat.nrow() : mat.ncol());
108 tmp.count = count.data();
109
110 skip_nan::RssOptions ropt;
111 ropt.num_threads = opt.num_threads;
112 ropt.mean_placeholder = opt.mean_placeholder;
113 skip_nan::rss(row, mat, tmp, ropt);
114
115 for (Index_ i = 0; i < dim; ++i) {
116 if (count[i] <= 1) {
117 output.variance[i] = opt.variance_placeholder;
118 } else {
119 output.variance[i] /= count[i] - 1;
120 }
121 }
122 },
123
124 [&]() -> void {
125 RssBuffers<Output_> tmp;
126 tmp.mean = output.mean;
127 tmp.rss = output.variance;
128
129 RssOptions ropt;
130 ropt.num_threads = opt.num_threads;
131 ropt.mean_placeholder = opt.mean_placeholder;
132 rss(row, mat, tmp, ropt);
133
134 if (otherdim <= 1) {
135 std::fill_n(output.variance, dim, opt.variance_placeholder);
136 } else {
137 for (Index_ i = 0; i < dim; ++i) {
138 output.variance[i] /= otherdim - 1;
139 }
140 }
141 }
142 );
143}
144
150template<typename Output_>
156 std::vector<Output_> mean;
157
162 std::vector<Output_> variance;
163};
164
179template<typename Output_ = double, typename Value_, typename Index_>
182 const auto dim = (row ? mat.nrow() : mat.ncol());
184#ifdef TATAMI_STATS_TEST_DIRTY
185 , -1
186#endif
187 );
189#ifdef TATAMI_STATS_TEST_DIRTY
190 , -1
191#endif
192 );
193
195 buffers.mean = output.mean.data();
196 buffers.variance = output.variance.data();
197
198 variance(row, mat, buffers, opt);
199 return output;
200}
201
202}
203
204#endif
virtual Index_ ncol() const=0
virtual Index_ nrow() const=0
constexpr Value_ nan_if_available_else_zero()
Functions to compute statistics from a tatami::Matrix.
Definition count.hpp:20
void variance(bool row, const tatami::Matrix< Value_, Index_ > &mat, VarianceBuffers< Output_ > &output, const VarianceOptions< Output_ > &opt)
Definition variance.hpp:96
void rss(bool row, const tatami::Matrix< Value_, Index_ > &mat, RssBuffers< Output_ > &output, const RssOptions< Output_ > &opt)
Definition rss.hpp:261
void resize_container_to_Index_size(Container_ &container, const Index_ x, Args_ &&... args)
Compute row and column residual sum of squares from a tatami::Matrix.
Compute row and column residual sum of squares after skipping NaNs.
Result buffers for variance().
Definition variance.hpp:65
Output_ * mean
Definition variance.hpp:70
Output_ * variance
Definition variance.hpp:76
Options for variance().
Definition variance.hpp:33
Output_ variance_placeholder
Definition variance.hpp:56
int num_threads
Definition variance.hpp:44
Output_ mean_placeholder
Definition variance.hpp:50
bool skip_nan
Definition variance.hpp:38
Results of variance().
Definition variance.hpp:151
std::vector< Output_ > variance
Definition variance.hpp:162
std::vector< Output_ > mean
Definition variance.hpp:156