41template <
typename Iterator>
44 auto n =
static_cast<std::size_t
>(std::distance(first, last));
46 throw std::invalid_argument(
"statcpp::population_skewness: empty range");
50 double sum_cubed = 0.0;
53 for (
auto it = first; it != last; ++it) {
54 double diff =
static_cast<double>(*it) - m;
59 double var = sum_sq /
static_cast<double>(n);
61 throw std::invalid_argument(
"statcpp::population_skewness: zero variance");
80template <
typename Iterator>
83 auto n =
static_cast<std::size_t
>(std::distance(first, last));
85 throw std::invalid_argument(
"statcpp::population_skewness: empty range");
88 double sum_cubed = 0.0;
91 for (
auto it = first; it != last; ++it) {
92 double diff =
static_cast<double>(*it) - precomputed_mean;
97 double var = sum_sq /
static_cast<double>(n);
99 throw std::invalid_argument(
"statcpp::population_skewness: zero variance");
119template <
typename Iterator,
typename Projection,
120 typename = std::enable_if_t<
121 std::is_invocable_v<Projection,
122 typename std::iterator_traits<Iterator>::value_type>>>
125 auto n =
static_cast<std::size_t
>(std::distance(first, last));
127 throw std::invalid_argument(
"statcpp::population_skewness: empty range");
131 double sum_cubed = 0.0;
134 for (
auto it = first; it != last; ++it) {
135 double diff =
static_cast<double>(std::invoke(proj, *it)) - m;
140 double var = sum_sq /
static_cast<double>(n);
142 throw std::invalid_argument(
"statcpp::population_skewness: zero variance");
161template <
typename Iterator,
typename Projection>
164 auto n =
static_cast<std::size_t
>(std::distance(first, last));
166 throw std::invalid_argument(
"statcpp::population_skewness: empty range");
169 double sum_cubed = 0.0;
172 for (
auto it = first; it != last; ++it) {
173 double diff =
static_cast<double>(std::invoke(proj, *it)) - precomputed_mean;
178 double var = sum_sq /
static_cast<double>(n);
180 throw std::invalid_argument(
"statcpp::population_skewness: zero variance");
201template <
typename Iterator>
204 auto n =
static_cast<std::size_t
>(std::distance(first, last));
206 throw std::invalid_argument(
"statcpp::sample_skewness: need at least 3 elements");
210 double correction = std::sqrt(
static_cast<double>(n * (n - 1))) /
static_cast<double>(n - 2);
211 return correction * g1;
224template <
typename Iterator>
227 auto n =
static_cast<std::size_t
>(std::distance(first, last));
229 throw std::invalid_argument(
"statcpp::sample_skewness: need at least 3 elements");
233 double correction = std::sqrt(
static_cast<double>(n * (n - 1))) /
static_cast<double>(n - 2);
234 return correction * g1;
248template <
typename Iterator,
typename Projection,
249 typename = std::enable_if_t<
250 std::is_invocable_v<Projection,
251 typename std::iterator_traits<Iterator>::value_type>>>
254 auto n =
static_cast<std::size_t
>(std::distance(first, last));
256 throw std::invalid_argument(
"statcpp::sample_skewness: need at least 3 elements");
260 double correction = std::sqrt(
static_cast<double>(n * (n - 1))) /
static_cast<double>(n - 2);
261 return correction * g1;
276template <
typename Iterator,
typename Projection>
277double sample_skewness(Iterator first, Iterator last, Projection proj,
double precomputed_mean)
279 auto n =
static_cast<std::size_t
>(std::distance(first, last));
281 throw std::invalid_argument(
"statcpp::sample_skewness: need at least 3 elements");
285 double correction = std::sqrt(
static_cast<double>(n * (n - 1))) /
static_cast<double>(n - 2);
286 return correction * g1;
297template <
typename Iterator>
312template <
typename Iterator>
313double skewness(Iterator first, Iterator last,
double precomputed_mean)
328template <
typename Iterator,
typename Projection,
329 typename = std::enable_if_t<
330 std::is_invocable_v<Projection,
331 typename std::iterator_traits<Iterator>::value_type>>>
332double skewness(Iterator first, Iterator last, Projection proj)
348template <
typename Iterator,
typename Projection>
349double skewness(Iterator first, Iterator last, Projection proj,
double precomputed_mean)
374template <
typename Iterator>
377 auto n =
static_cast<std::size_t
>(std::distance(first, last));
379 throw std::invalid_argument(
"statcpp::population_kurtosis: empty range");
383 double sum_fourth = 0.0;
386 for (
auto it = first; it != last; ++it) {
387 double diff =
static_cast<double>(*it) - m;
390 sum_fourth += diff_sq * diff_sq;
393 double var = sum_sq /
static_cast<double>(n);
395 throw std::invalid_argument(
"statcpp::population_kurtosis: zero variance");
398 double fourth_moment = sum_fourth /
static_cast<double>(n);
399 return (fourth_moment / (
var *
var)) - 3.0;
412template <
typename Iterator>
415 auto n =
static_cast<std::size_t
>(std::distance(first, last));
417 throw std::invalid_argument(
"statcpp::population_kurtosis: empty range");
420 double sum_fourth = 0.0;
423 for (
auto it = first; it != last; ++it) {
424 double diff =
static_cast<double>(*it) - precomputed_mean;
427 sum_fourth += diff_sq * diff_sq;
430 double var = sum_sq /
static_cast<double>(n);
432 throw std::invalid_argument(
"statcpp::population_kurtosis: zero variance");
435 double fourth_moment = sum_fourth /
static_cast<double>(n);
436 return (fourth_moment / (
var *
var)) - 3.0;
450template <
typename Iterator,
typename Projection,
451 typename = std::enable_if_t<
452 std::is_invocable_v<Projection,
453 typename std::iterator_traits<Iterator>::value_type>>>
456 auto n =
static_cast<std::size_t
>(std::distance(first, last));
458 throw std::invalid_argument(
"statcpp::population_kurtosis: empty range");
462 double sum_fourth = 0.0;
465 for (
auto it = first; it != last; ++it) {
466 double diff =
static_cast<double>(std::invoke(proj, *it)) - m;
469 sum_fourth += diff_sq * diff_sq;
472 double var = sum_sq /
static_cast<double>(n);
474 throw std::invalid_argument(
"statcpp::population_kurtosis: zero variance");
477 double fourth_moment = sum_fourth /
static_cast<double>(n);
478 return (fourth_moment / (
var *
var)) - 3.0;
493template <
typename Iterator,
typename Projection>
496 auto n =
static_cast<std::size_t
>(std::distance(first, last));
498 throw std::invalid_argument(
"statcpp::population_kurtosis: empty range");
501 double sum_fourth = 0.0;
504 for (
auto it = first; it != last; ++it) {
505 double diff =
static_cast<double>(std::invoke(proj, *it)) - precomputed_mean;
508 sum_fourth += diff_sq * diff_sq;
511 double var = sum_sq /
static_cast<double>(n);
513 throw std::invalid_argument(
"statcpp::population_kurtosis: zero variance");
516 double fourth_moment = sum_fourth /
static_cast<double>(n);
517 return (fourth_moment / (
var *
var)) - 3.0;
534template <
typename Iterator>
537 auto n =
static_cast<std::size_t
>(std::distance(first, last));
539 throw std::invalid_argument(
"statcpp::sample_kurtosis: need at least 4 elements");
543 double nd =
static_cast<double>(n);
544 double correction = ((nd + 1.0) * g2 + 6.0) * (nd - 1.0) / ((nd - 2.0) * (nd - 3.0));
558template <
typename Iterator>
561 auto n =
static_cast<std::size_t
>(std::distance(first, last));
563 throw std::invalid_argument(
"statcpp::sample_kurtosis: need at least 4 elements");
567 double nd =
static_cast<double>(n);
568 double correction = ((nd + 1.0) * g2 + 6.0) * (nd - 1.0) / ((nd - 2.0) * (nd - 3.0));
583template <
typename Iterator,
typename Projection,
584 typename = std::enable_if_t<
585 std::is_invocable_v<Projection,
586 typename std::iterator_traits<Iterator>::value_type>>>
589 auto n =
static_cast<std::size_t
>(std::distance(first, last));
591 throw std::invalid_argument(
"statcpp::sample_kurtosis: need at least 4 elements");
595 double nd =
static_cast<double>(n);
596 double correction = ((nd + 1.0) * g2 + 6.0) * (nd - 1.0) / ((nd - 2.0) * (nd - 3.0));
612template <
typename Iterator,
typename Projection>
613double sample_kurtosis(Iterator first, Iterator last, Projection proj,
double precomputed_mean)
615 auto n =
static_cast<std::size_t
>(std::distance(first, last));
617 throw std::invalid_argument(
"statcpp::sample_kurtosis: need at least 4 elements");
621 double nd =
static_cast<double>(n);
622 double correction = ((nd + 1.0) * g2 + 6.0) * (nd - 1.0) / ((nd - 2.0) * (nd - 3.0));
634template <
typename Iterator>
649template <
typename Iterator>
650double kurtosis(Iterator first, Iterator last,
double precomputed_mean)
665template <
typename Iterator,
typename Projection,
666 typename = std::enable_if_t<
667 std::is_invocable_v<Projection,
668 typename std::iterator_traits<Iterator>::value_type>>>
669double kurtosis(Iterator first, Iterator last, Projection proj)
685template <
typename Iterator,
typename Projection>
686double kurtosis(Iterator first, Iterator last, Projection proj,
double precomputed_mean)
Basic statistical computation functions.
double stddev(Iterator first, Iterator last)
Standard deviation (alias for sample_stddev)
double skewness(Iterator first, Iterator last)
Calculate skewness (alias for sample_skewness)
double kurtosis(Iterator first, Iterator last)
Calculate kurtosis (alias for sample_kurtosis)
double var(Iterator first, Iterator last, std::size_t ddof=0)
Variance (ddof = Delta Degrees of Freedom)
double population_skewness(Iterator first, Iterator last)
Calculate population skewness (Fisher's definition)
double population_kurtosis(Iterator first, Iterator last)
Calculate population kurtosis (Excess Kurtosis)
double mean(Iterator first, Iterator last)
Arithmetic mean.
std::vector< double > diff(Iterator first, Iterator last, std::size_t order=1)
Difference series (first-order or d-th order differencing)
double sample_kurtosis(Iterator first, Iterator last)
Calculate sample kurtosis (bias-corrected version)
double sample_skewness(Iterator first, Iterator last)
Calculate sample skewness (bias-corrected version)