7#include <RcppArmadillo.h>
17 return X.each_col() % w;
24 for(
size_t i=0; i<X.n_cols; i++){
32 return w.t() % X.each_row();
39 for(
size_t i=0; i<X.n_cols; i++){
51 for(
size_t i=0; i<X.n_cols; i++){
72static void rows_to_zero( mat &X,
const uvec &idx ){
76static void rows_to_zero( sp_mat &X,
const uvec &idx ){
79 for (
auto it = X.begin_row(j); it != X.end_row(j); ++it) {
88static uvec rows_with_nan(
const mat& M) {
89 std::vector<uword> nan_rows;
91 for (uword i = 0; i < M.n_rows; ++i) {
95 for (mat::const_row_iterator it = M.begin_row(i);
96 it != M.end_row(i); ++it) {
97 if (std::isnan(*it)) {
104 nan_rows.push_back(i);
108 return conv_to<uvec>::from(nan_rows);
113static uvec rows_with_nan(
const sp_mat& M) {
115 std::vector<uword> nan_rows;
117 for (uword i = 0; i < M.n_rows; ++i) {
118 bool has_nan =
false;
121 for (sp_mat::const_row_iterator it = M.begin_row(i);
122 it != M.end_row(i); ++it){
123 if (std::isnan(*it)) {
130 nan_rows.push_back(i);
133 return conv_to<uvec>::from(nan_rows);
147static vec pmax(
const vec &v,
const double &value){
150 for(
int i=0; i<tmp.n_elem; i++){
151 tmp[i] = std::max(tmp[i], value);
157static vec pmin(
const vec &v,
const double &value){
160 for(
int i=0; i<tmp.n_elem; i++){
161 tmp[i] = std::min(tmp[i], value);
168static vec qnorm(
const vec & v,
const double &mean=0,
const double &sd=1 ){
170 for(
int i=0; i<tmp.n_elem; i++){
181static vec y_log_y(
const vec & y,
const vec & mu){
185 vec ret(y.n_elem, fill::zeros);
187 for(
int i=0; i<y.n_elem; i++){
189 ret[i] = y[i] * log(y[i]/mu[i]);
197static double wvar(
const vec & x,
const vec & w) {
199 if (x.n_elem != w.n_elem) {
200 throw invalid_argument(
"Data and weights vectors must have the same number of elements.");
207 double sum_weights = sum(w);
209 if (sum_weights == 0) {
210 throw runtime_error(
"Sum of weights cannot be zero.");
214 double weighted_mean = sum(x % w) / sum_weights;
217 vec diff_sq = square(x - weighted_mean);
218 double numerator = sum(w % diff_sq);
220 double denominator = sum_weights - (sum(square(w)) / sum_weights);
222 if (denominator == 0) {
226 return numerator / denominator;
237 begin_value(
begin), end_value(
end) {}
241 T
end(){
return end_value; }
243 T begin_value, end_value;
248static void disable_parallel_blas(){
252 omp_set_num_threads(1);
254 omp_set_max_active_levels(0);
259static void match_NAN_zeros(
const mat &Y, mat &W){
260 for (arma::uword r = 0; r < Y.n_rows; ++r) {
261 for (arma::uword c = 0; c < Y.n_cols; ++c) {
262 if (std::isnan(Y(r, c))) {
269static int count_nan(
const vec &v){
271 for (arma::uword i = 0; i < v.n_elem; ++i) {
272 if (std::isnan(v(i))) {
280static uvec countResponseFilter(
const mat &Y){
289 uvec keep1 = find(sum(Y > 0, 0) > max(2, (
int) 0.1*nr));
290 uvec keep2 = find(sum(Y > 1, 0) > max(2, (
int) 0.01*nr));
292 return intersect(keep1, keep2);
298static vector<T> subset(
const vector<T> &v,
const uvec &idx){
301 res.reserve(idx.n_elem);
303 for (uword i = 0; i < idx.n_elem; ++i) {
304 res.push_back( v[idx[i]] );
312static double robust_mean(
const vec &x,
const double &z_cutoff){
315 vec x1 = x.elem(find_finite(x));
324 vec z = (x1 - mean(x1)) / (stddev(x1) + 1e-15);
327 uvec idx = find(abs(z) < z_cutoff);
330 return mean(x1.elem(idx));
blocked_range(T begin, T end)
Definition misc.h:236
T end()
Definition misc.h:241
T begin()
Definition misc.h:240
mat scaleEachCol(const mat &X, const vec &w)
Definition misc.h:16
mat scaleEachRow(const mat &X, const vec &w)
Definition misc.h:31
bool isSpMatrix(const T &t)
Definition misc.h:64
T scaleRowsCols(const T &X, const vec &w1, const vec &w2)
Definition misc.h:48
double qnorm_as241(double p, double mean=0.0, double sd=1.0, bool lower_tail=true, bool log_p=false)
Definition qnorm.h:9