Distributions
Distributions is a Nim library for distributions and their functions.
Supported Distributions
Distribution | Nim Command |
---|---|
Bernoulli | initBernoulliDistribution(p: FractionPositiveFloat) |
Beta | initBetaDistribution(alpha, beta: PositiveFloat) |
Binomial | initBinomialDistribution(n: Positive, p: FractionPositiveFloat) |
Chisquare | initChi2Distribution(df: int) |
F | initFDistribution(df_1, df_2: Positive) |
Gamma | initGammaDistribution(k, theta: PositiveFloat) |
Negative Binomial | initNegativeBinomialDistribution(r: Positive, p: FractionPositiveFloat) |
Normal | initNormalDistribution(mu: float = 0.0, sigma: PositiveFloat = 1.0) |
Poisson | initPoissonDistribution(lambda: Natural) |
t | initTDistribution(df: Natural) |
Uniform Continuous | initUniformContinuousDistribution(a, b: float) |
Uniform Discrete | initUniformDiscreteDistribution(a, b: int) |
Supported Functions
Please note these functions are available for all distributions, except for the t and gamma distributions which lack the point prevalence (ppf) function. Also note: all these functions return a float.
let normal_dist = initNormalDistribution(0.0, 1.0)
discard normal_dist.mean() # Mean
discard normal_dist.median() # Median
discard normal_dist.mode() # Mode
discard normal_dist.pdf() # Probability density function (use .pmf() for discrete distributions)
discard normal_dist.cdf() # Cumulative density function
discard normal_dist.sf() # Survival function (1 - cdf)
discard normal_dist.ppf() # Point prevalence function
Future Directions:
There are really two directions this library can grow.
- Write more distributions in Nim.
- Pros: Library is in Nim.
- Cons: Longer dev time, calculations are more error prone.
- Implement all functions using a C-wrapper around the Rmath library.
- Pros: Reduced dev time, calculations are less error prone.
- Cons: Library is written in C and hard to read (its filled with macros).
I don't have a preferred direction and I prefer to leave the answer for the Nim scientific community to answer.
Accuracy
All functions in this library are accurate up-to 14 decimal places (float64).
Performance
This library was written with accuracy as a top priority as opposed to performance, however almost all implementations here are faster than SciPy's implementations and equal to, slower, or faster than Julia's distributions implementations.
TODO
List is organized from most important to least important:
- Add ppf for T-distribution and Gamma-distributions
- Add more functions for each distribution (in this order: random, fit, CF, skewness, etc...)
- Add more univariate distributions on an as-need-bases
- Bonus: Add multivariate distributions on an as-need-bases
Performance, feature, and documentation PR's are always welcome.
Contact
I can be reached at aymanalbaz98@gmail.com