8#include <RcppArmadillo.h>
18 return X.each_col() % w;
25 for(
size_t i=0; i<X.n_cols; i++){
33 return w.t() % X.each_row();
40 for(
size_t i=0; i<X.n_cols; i++){
52 for(
size_t i=0; i<X.n_cols; i++){
73static void rows_to_zero( mat &X,
const uvec &idx ){
77static void rows_to_zero( sp_mat &X,
const uvec &idx ){
80 for (
auto it = X.begin_row(j); it != X.end_row(j); ++it) {
89static uvec rows_with_nan(
const mat& M) {
90 std::vector<uword> nan_rows;
92 for (uword i = 0; i < M.n_rows; ++i) {
96 for (mat::const_row_iterator it = M.begin_row(i);
97 it != M.end_row(i); ++it) {
98 if (std::isnan(*it)) {
105 nan_rows.push_back(i);
109 return conv_to<uvec>::from(nan_rows);
114static uvec rows_with_nan(
const sp_mat& M) {
116 std::vector<uword> nan_rows;
118 for (uword i = 0; i < M.n_rows; ++i) {
119 bool has_nan =
false;
122 for (sp_mat::const_row_iterator it = M.begin_row(i);
123 it != M.end_row(i); ++it){
124 if (std::isnan(*it)) {
131 nan_rows.push_back(i);
134 return conv_to<uvec>::from(nan_rows);
148static vec pmax(
const vec &v,
const double &value){
151 for(
int i=0; i<tmp.n_elem; i++){
152 tmp[i] = std::max(tmp[i], value);
158static vec pmin(
const vec &v,
const double &value){
161 for(
int i=0; i<tmp.n_elem; i++){
162 tmp[i] = std::min(tmp[i], value);
169static vec qnorm(
const vec & v,
const double &mean=0,
const double &sd=1 ){
171 for(
int i=0; i<tmp.n_elem; i++){
182static vec y_log_y(
const vec & y,
const vec & mu){
186 vec ret(y.n_elem, fill::zeros);
188 for(
int i=0; i<y.n_elem; i++){
190 ret[i] = y[i] * log(y[i]/mu[i]);
198static double wvar(
const vec & x,
const vec & w) {
200 if (x.n_elem != w.n_elem) {
201 throw invalid_argument(
"Data and weights vectors must have the same number of elements.");
208 double sum_weights = sum(w);
210 if (sum_weights == 0) {
211 throw runtime_error(
"Sum of weights cannot be zero.");
215 double weighted_mean = sum(x % w) / sum_weights;
218 vec diff_sq = square(x - weighted_mean);
219 double numerator = sum(w % diff_sq);
221 double denominator = sum_weights - (sum(square(w)) / sum_weights);
223 if (denominator == 0) {
227 return numerator / denominator;
238 begin_value(
begin), end_value(
end) {}
242 T
end(){
return end_value; }
244 T begin_value, end_value;
249static void disable_parallel_blas(){
253 omp_set_num_threads(1);
255 omp_set_max_active_levels(0);
260static void match_NAN_zeros(
const mat &Y, mat &W){
261 for (arma::uword r = 0; r < Y.n_rows; ++r) {
262 for (arma::uword c = 0; c < Y.n_cols; ++c) {
263 if (std::isnan(Y(r, c))) {
270static int count_nan(
const vec &v){
272 for (arma::uword i = 0; i < v.n_elem; ++i) {
273 if (std::isnan(v(i))) {
281static uvec countResponseFilter(
const mat &Y,
int n0,
int n1){
286 uvec keep1 = find(sum(Y > 0, 0) > max(2, n0));
287 uvec keep2 = find(sum(Y > 1, 0) > max(2, n1));
289 return intersect(keep1, keep2);
295static vector<T> subset(
const vector<T> &v,
const uvec &idx){
298 res.reserve(idx.n_elem);
300 for (uword i = 0; i < idx.n_elem; ++i) {
301 res.push_back( v[idx[i]] );
309static double robust_mean(
const vec &x,
const double &z_cutoff){
312 vec x1 = x.elem(find_finite(x));
321 vec z = (x1 - mean(x1)) / (stddev(x1) + 1e-15);
324 uvec idx = find(abs(z) < z_cutoff);
327 return mean(x1.elem(idx));
333static bool all_integer_valued(
const vec &x,
double tol = 1e-12) {
334 return all(abs(x - round(x)) < tol);
blocked_range(T begin, T end)
Definition misc.h:237
T end()
Definition misc.h:242
T begin()
Definition misc.h:241
mat scaleEachCol(const mat &X, const vec &w)
Definition misc.h:17
mat scaleEachRow(const mat &X, const vec &w)
Definition misc.h:32
bool isSpMatrix(const T &t)
Definition misc.h:65
T scaleRowsCols(const T &X, const vec &w1, const vec &w2)
Definition misc.h:49
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