-
Notifications
You must be signed in to change notification settings - Fork 0
/
ZTNB.hpp
104 lines (84 loc) · 3.1 KB
/
ZTNB.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/* ZTNB:
*
* Copyright (C) 2013 University of Southern California and
* Andrew D. Smith
* Timothy Daley
*
* Authors: Andrew D. Smith and Timothy Daley
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef ZTNB_HPP
#define ZTNB_HPP
#include <smithlab_utils.hpp>
#include <gsl/gsl_randist.h>
#include <gsl/gsl_sf_gamma.h>
#include <gsl/gsl_sf_psi.h>
#include <fstream>
#include <iomanip>
#include <vector>
#include <limits>
#include <cmath>
#include <numeric>
class ZTNBD{
public:
ZTNBD(const double m_, const double a_):
mu(m_), alpha(a_) {};
double get_mu() const {return mu;}
double get_alpha() const {return alpha;}
void set_mu(const double m_) {mu = m_;}
void set_alpha(const double a_) {alpha = a_;}
double operator()(int val) const;
void estim_params(const std::vector<double> &vals_hist);
void estim_params(const std::vector<double> &weighted_vals_hist,
const std::vector<double> &probs);
double trunc_log_pdf(const size_t val);
double log_pdf(const size_t val);
double trunc_log_L(const std::vector<double> &vals_hist);
double expected_zeros(const double distinct);
double EM_estim_params(const double tol, const size_t max_iter,
std::vector<double> &vals_hist); //returns log_like
double EM_estim_mu_fixed_alpha(const double tol, const size_t max_iter,
const std::vector<double> &vals_hist);
double trunc_pval(const size_t val);
// take 1- \sum_{X < val} P(X)
double expected_inverse_sum(const double initial_distinct,
const double t);
double expected_distinct(const double initial_distinct,
const double t);
double expected_mincount(const size_t mincount,
const double initial_distinct,
const double t);
double expected_saturation(const double initial_distinct,
const double initial_sample_size,
const double t);
//computes the expected # summands needed to reach a sum of "sum"
private:
static const double max_allowed_alpha;
static const double min_allowed_alpha;
static const double tolerance;
double score_fun_first_term(const std::vector<double> &pseudo_hist,
const double a_mid);
double alpha_score_function(const std::vector<double> &pseudo_hist,
const double mean, const double a_mid,
const double vals_count);
void set_helpers();
double mu;
double alpha;
double n_helper;
double p_helper;
double n_log_p_minus_lngamma_n_helper;
double log_q_helper;
};
#endif