1#ifndef SCRAN_FIT_TREND_VAR_H
2#define SCRAN_FIT_TREND_VAR_H
4#include "../utils/macros.hpp"
8#include "WeightedLowess/WeightedLowess.hpp"
58 static constexpr double span = 0.3;
166 minimum_window_count = c;
180 static double quad(
double x) {
195 void run(
size_t n,
const double* mean,
const double* variance,
double* fitted,
double* residuals)
const {
196 std::vector<double> xbuffer(n), ybuffer(n);
199 for (
size_t i = 0; i < n; ++i) {
200 if (!filter || mean[i] >= min_mean) {
201 xbuffer[counter] = mean[i];
203 ybuffer[counter] = std::pow(variance[i], 0.25);
205 ybuffer[counter] = variance[i];
212 throw std::runtime_error(
"not enough observations above the minimum mean");
217 size_t left_index = std::min_element(xbuffer.begin(), xbuffer.begin() + counter) - xbuffer.begin();
218 double left_x = xbuffer[left_index];
220 WeightedLowess::WeightedLowess<> smoother;
221 if (use_fixed_width) {
222 smoother.set_span(minimum_window_count);
223 smoother.set_span_as_proportion(
false);
224 smoother.set_min_width(fixed_width);
226 smoother.set_span(span);
229 std::vector<double> fbuffer(counter), rbuffer(counter);
230 smoother.run(counter, xbuffer.data(), ybuffer.data(), NULL, fbuffer.data(), rbuffer.data());
233 double left_fitted = (transform ? quad(fbuffer[left_index]) : fbuffer[left_index]);
236 for (
size_t i = 0; i < n; ++i) {
237 if (!filter || mean[i] >= min_mean) {
238 fitted[i] = (transform ? quad(fbuffer[counter]) : fbuffer[counter]);
241 fitted[i] = mean[i] / left_x * left_fitted;
243 residuals[i] = variance[i] - fitted[i];
286 Results run(
size_t n,
const double* mean,
const double* variance)
const {
Fit a mean-variance trend to log-count data.
Definition FitVarianceTrend.hpp:34
FitVarianceTrend & set_minimum_window_count(int c=Defaults::minimum_window_count)
Definition FitVarianceTrend.hpp:165
Results run(size_t n, const double *mean, const double *variance) const
Definition FitVarianceTrend.hpp:286
void run(size_t n, const double *mean, const double *variance, double *fitted, double *residuals) const
Definition FitVarianceTrend.hpp:195
FitVarianceTrend & set_transform(bool t=Defaults::transform)
Definition FitVarianceTrend.hpp:123
FitVarianceTrend & set_minimum_mean(double m=Defaults::minimum_mean)
Definition FitVarianceTrend.hpp:97
FitVarianceTrend & set_fixed_width(double f=Defaults::fixed_width)
Definition FitVarianceTrend.hpp:151
FitVarianceTrend & set_filter(bool f=Defaults::filter)
Definition FitVarianceTrend.hpp:110
FitVarianceTrend & set_span(double s=Defaults::span)
Definition FitVarianceTrend.hpp:85
FitVarianceTrend & set_use_fixed_width(bool u=Defaults::use_fixed_width)
Definition FitVarianceTrend.hpp:137
Functions for single-cell RNA-seq analyses.
Definition AggregateAcrossCells.hpp:18
Parameter defaults for trend fitting.
Definition FitVarianceTrend.hpp:39
static constexpr int minimum_window_count
Definition FitVarianceTrend.hpp:73
static constexpr double span
Definition FitVarianceTrend.hpp:58
static constexpr bool filter
Definition FitVarianceTrend.hpp:48
static constexpr double minimum_mean
Definition FitVarianceTrend.hpp:43
static constexpr bool use_fixed_width
Definition FitVarianceTrend.hpp:63
static constexpr bool transform
Definition FitVarianceTrend.hpp:53
static constexpr double fixed_width
Definition FitVarianceTrend.hpp:68
Results of the trend fit.
Definition FitVarianceTrend.hpp:255
std::vector< double > fitted
Definition FitVarianceTrend.hpp:269
std::vector< double > residuals
Definition FitVarianceTrend.hpp:274