1 #include "running_stats.hpp" 7 RunningStats::RunningStats() { clear(); }
9 void RunningStats::clear() {
11 M1 = M2 = M3 = M4 = 0.0;
15 double delta, delta_n, delta_n2, term1;
21 delta_n2 = delta_n * delta_n;
22 term1 = delta * delta_n * n1;
24 M4 += term1 * delta_n2 * (n * n - 3 * n + 3) + 6 * delta_n2 * M2 -
26 M3 += term1 * delta_n * (n - 2) - 3 * delta_n * M2;
32 double RunningStats::mean()
const {
return M1; }
34 double RunningStats::variance()
const {
return M2 / (n - 1.0); }
36 double RunningStats::standard_deviation()
const {
return sqrt(variance()); }
38 double RunningStats::skewness()
const {
39 return sqrt(
double(n)) * M3 / pow(M2, 1.5);
42 double RunningStats::kurtosis()
const {
43 return double(n) * M4 / (M2 * M2) - 3.0;
46 RunningStats operator+(
const RunningStats a,
const RunningStats b) {
47 RunningStats combined;
49 combined.n += a.n + b.n;
51 double delta = b.M1 - a.M1;
52 double delta2 = delta * delta;
53 double delta3 = delta * delta2;
54 double delta4 = delta2 * delta2;
56 combined.M1 = (a.n * a.M1 + b.n * b.M1) / combined.n;
58 combined.M2 = a.M2 + b.M2 + delta2 * a.n * b.n / combined.n;
60 combined.M3 = a.M3 + b.M3 +
61 delta3 * a.n * b.n * (a.n - b.n) / (combined.n * combined.n);
62 combined.M3 += 3.0 * delta * (a.n * b.M2 - b.n * a.M2) / combined.n;
64 combined.M4 = a.M4 + b.M4 + delta4 * a.n * b.n *
65 (a.n * a.n - a.n * b.n + b.n * b.n) /
66 (combined.n * combined.n * combined.n);
67 combined.M4 += 6.0 * delta2 * (a.n * a.n * b.M2 + b.n * b.n * a.M2) /
68 (combined.n * combined.n) +
69 4.0 * delta * (a.n * b.M3 - b.n * a.M3) / combined.n;
74 RunningStats &RunningStats::operator+=(
const RunningStats &rhs) {
75 RunningStats combined = *
this + rhs;
void push(const double &x)
add a new value to the object
long long num_data_values() const
number of samples from which mean etc are calculated