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
//! This crate provides estimators for statistics on a sequence of numbers. The //! typical workflow looks like this: //! //! 1. If necessary, build your custom estimator using [`concatenate`]. //! 2. Initialize the estimator of your choice with `new()`. //! 3. Add some subset (called "sample") of the sequence of numbers (called //! "population") for which you want to estimate the statistic, using `add()` //! or `collect()`. //! 4. Calculate the statistic with `mean()` or similar. //! //! You can run several estimators in parallel and merge them into one with //! `merge()`. //! //! Everything is calculated iteratively in a single pass using constant memory, //! so the sequence of numbers can be an iterator. The used algorithms try to //! avoid numerical instabilities. //! //! //! ### Example //! //! ``` //! use average::MeanWithError; //! //! let mut a: MeanWithError = (1..6).map(Into::into).collect(); //! a.add(42.); //! println!("The mean is {} ± {}.", a.mean(), a.error()); //! ``` //! //! //! ## Estimators //! //! * Mean ([`Mean`]) and its error ([`MeanWithError`]). //! * Weighted mean ([`WeightedMean`]) and its error //! ([`WeightedMeanWithError`]). //! * Variance ([`Variance`]), skewness ([`Skewness`]) and kurtosis //! ([`Kurtosis`]). //! * Quantiles ([`Quantile`]). //! * Minimum ([`Min`]) and maximum ([`Max`]). //! //! ## Estimating several statistics at once //! //! The estimators are designed to have minimal state. The recommended way to //! calculate several of them at once is to create a struct with all the //! estimators you need. You can then implement `add` for your struct by //! forwarding to the underlying estimators. Everything is inlined, so there //! should be no overhead. //! //! You can avoid the boilerplate code by using the [`concatenate`] macro. //! //! Note that calculating moments requires calculating the lower moments, so you //! only need to include the highest moment in your struct. //! //! //! [`Mean`]: ./struct.Mean.html //! [`MeanWithError`]: ./type.MeanWithError.html //! [`WeightedMean`]: ./struct.WeightedMean.html //! [`WeightedMeanWithError`]: ./struct.WeightedMeanWithError.html //! [`Variance`]: ./struct.Variance.html //! [`Skewness`]: ./struct.Skewness.html //! [`Kurtosis`]: ./struct.Kurtosis.html //! [`Quantile`]: ./struct.Quantile.html //! [`Min`]: ./struct.Min.html //! [`Max`]: ./struct.Max.html //! [`concatenate`]: ./macro.concatenate.html #![cfg_attr(feature = "cargo-clippy", allow(float_cmp, map_clone))] #![no_std] extern crate conv; extern crate quickersort; #[macro_use] mod macros; mod moments; mod weighted_mean; mod minmax; mod reduce; mod quantile; pub use moments::{Mean, Variance, Skewness, Kurtosis, MeanWithError}; pub use weighted_mean::{WeightedMean, WeightedMeanWithError}; pub use minmax::{Min, Max}; pub use quantile::Quantile;