tatami_stats
Matrix statistics for tatami
Loading...
Searching...
No Matches
group_variance.hpp
Go to the documentation of this file.
1#ifndef TATAMI_STATS_GROUP_VARIANCE_HPP
2#define TATAMI_STATS_GROUP_VARIANCE_HPP
3
4#include <vector>
5#include <algorithm>
6#include <cstddef>
7#include <optional>
8#include <cassert>
9#include <limits>
10#include <cmath>
11
12#include "tatami/tatami.hpp"
13#include "sanisizer/sanisizer.hpp"
14
15#include "group_rss.hpp"
17#include "utils.hpp"
18
25namespace tatami_stats {
26
35 bool skip_nan = false;
36
41 int num_threads = 1;
42};
43
50template<typename Output_>
57 std::vector<Output_*> mean;
58
64 std::vector<Output_*> variance;
65};
66
86template<typename Value_, typename Index_, typename Group_, typename Output_>
88 bool row,
90 const Group_* const group,
91 const std::size_t num_groups,
93 const GroupVarianceOptions& opt
94) {
95 assert(sanisizer::is_equal(num_groups, output.mean.size()));
96 assert(sanisizer::is_equal(num_groups, output.variance.size()));
97 const auto dim = (row ? mat.nrow() : mat.ncol());
98
99 nanable_ifelse<Value_>(
100 opt.skip_nan,
101 [&]() -> void {
102 skip_nan::GroupRssBuffers<Output_, Index_> tmp;
103 tmp.mean = output.mean;
104 tmp.rss = output.variance;
105
106 auto count = sanisizer::create<std::vector<std::vector<Index_> > >(num_groups);
107 tmp.count.reserve(num_groups);
108 for (std::size_t g = 0; g < num_groups; ++g) {
109 tatami::resize_container_to_Index_size(count[g], dim);
110 tmp.count.push_back(count[g].data());
111 }
112
114 ropt.num_threads = opt.num_threads;
115 skip_nan::group_rss(row, mat, group, num_groups, tmp, ropt);
116 for (std::size_t g = 0; g < num_groups; ++g) {
117 quickstats::rss_to_variance(dim, count[g].data(), output.variance[g]);
118 }
119 },
120 [&]() -> void {
121 GroupRssBuffers<Output_, Index_> tmp;
122 tmp.mean = output.mean;
123 tmp.rss = output.variance;
124 auto group_sizes = sanisizer::create<std::vector<Index_> >(num_groups);
125 tmp.count = group_sizes.data();
126
127 GroupRssOptions ropt;
128 ropt.num_threads = opt.num_threads;
129 group_rss(row, mat, group, num_groups, tmp, ropt);
130 for (std::size_t g = 0; g < num_groups; ++g) {
131 quickstats::rss_to_variance(dim, group_sizes[g], output.variance[g]);
132 }
133 }
134 );
135}
136
143template<typename Output_>
150 std::vector<std::vector<Output_> > mean;
151
157 std::vector<std::vector<Output_> > variance;
158};
159
179template<typename Output_ = double, typename Value_, typename Index_, typename Group_>
181 bool row,
183 const Group_* const group,
184 const std::size_t num_groups,
185 const GroupVarianceOptions& opt
186) {
188 sanisizer::resize(output.mean, num_groups);
189 sanisizer::resize(output.variance, num_groups);
190
192 sanisizer::resize(buffers.mean, num_groups);
193 sanisizer::resize(buffers.variance, num_groups);
194 const auto dim = (row ? mat.nrow() : mat.ncol());
195
196 for (std::size_t g = 0; g < num_groups; ++g) {
198#ifdef TATAMI_STATS_TEST_DIRTY
199 , -1
200#endif
201 );
202 buffers.mean[g] = output.mean[g].data();
204#ifdef TATAMI_STATS_TEST_DIRTY
205 , -1
206#endif
207 );
208 buffers.variance[g] = output.variance[g].data();
209 }
210
211 group_variance(row, mat, group, num_groups, buffers, opt);
212 return output;
213}
214
215}
216
217#endif
virtual Index_ ncol() const=0
virtual Index_ nrow() const=0
Compute group-wise residual sum of squares from a tatami::Matrix.
void group_rss(bool row, const tatami::Matrix< Value_, Index_ > &mat, const Group_ *const group, const std::size_t num_groups, GroupRssBuffers< Output_, Count_ > &output, const GroupRssOptions &opt)
Definition group_rss.hpp:428
Functions to compute statistics from a tatami::Matrix.
Definition count.hpp:20
void count(const bool row, const tatami::Matrix< Value_, Index_ > &mat, Output_ *const output, Condition_ condition, const CountOptions &opt)
Definition count.hpp:188
void group_variance(bool row, const tatami::Matrix< Value_, Index_ > &mat, const Group_ *const group, const std::size_t num_groups, GroupVarianceBuffers< Output_ > &output, const GroupVarianceOptions &opt)
Definition group_variance.hpp:87
void group_rss(bool row, const tatami::Matrix< Value_, Index_ > &mat, const Group_ *const group, const std::size_t num_groups, GroupRssBuffers< Output_, Count_ > &output, const GroupRssOptions &opt)
Definition group_rss.hpp:397
void resize_container_to_Index_size(Container_ &container, const Index_ x, Args_ &&... args)
Compute group-wise residual sum of squares while skipping NaNs.
Result buffers for group_variance().
Definition group_variance.hpp:51
std::vector< Output_ * > mean
Definition group_variance.hpp:57
std::vector< Output_ * > variance
Definition group_variance.hpp:64
Options for group_variance().
Definition group_variance.hpp:30
bool skip_nan
Definition group_variance.hpp:35
int num_threads
Definition group_variance.hpp:41
Results of group_variance().
Definition group_variance.hpp:144
std::vector< std::vector< Output_ > > mean
Definition group_variance.hpp:150
std::vector< std::vector< Output_ > > variance
Definition group_variance.hpp:157
Options for skip_nan::group_rss().
Definition group_rss.hpp:32
int num_threads
Definition group_rss.hpp:37