Unlike the legacy product-moments, the L-moments uniquely describe a probability distribution, and are more robust and efficient.
The "L" stands for Linear; it is a linear combination of order statistics. So Lmo is as fast as sorting your samples (in terms of time-complexity).
- Calculates trimmed L-moments and L-comoments, from samples or any
scipy.stats
distribution. - Full support for trimmed L-moments (TL-moments), e.g.
lmo.l_moment(..., trim=(1/137, 3.1416))
. - Generalized Method of L-moments: robust distribution fitting that beats MLE.
- Fast estimation of L-comoment matrices from your multidimensional data or multivariate distribution.
- Goodness-of-fit test, using L-moment or L-moment ratio's.
- Exact (co)variance structure of the sample- and population L-moments.
- Theoretical & empirical influence functions of L-moments & L-ratio's.
- Complete docs, including detailed API
reference with usage examples and with mathematical
$\TeX$ definitions. - Clean Pythonic syntax for ease of use.
- Vectorized functions for very fast fitting.
- Fully typed, tested, and tickled.
- Optional Pandas integration.
Even if your data is pathological like Cauchy, and the L-moments are not defined, the trimmed L-moments (TL-moments) can be used instead.
Let's calculate the first two TL-moments (the TL-location and the TL-scale) of a small number of samples drawn from the standard Cauchy distribution:
>>> import numpy as np
>>> import lmo
>>> rng = np.random.default_rng(1980)
>>> data = rng.standard_cauchy(96)
>>> lmo.l_moment(data, [1, 2], trim=1)
array([-0.17937038, 0.68287665])
Compared with the theoretical standard Cauchy TL-moments, that's pretty close!
>>> from scipy.stats import cauchy
>>> cauchy.l_moment([1, 2], trim=1)
array([0. , 0.69782723])
Now let's try this again using the first two conventional moments, i.e. the mean and the standard deviation:
>>> from scipy.stats import moment
>>> np.r_[data.mean(), data.std()]
array([-1.7113441 , 19.57350731])
So even though the data
was drawn from the standard Cauchy distribution, we can
immediately see that this doesn't look standard at all.
The reason is that the Cauchy distribution doesn't have a mean or standard deviation:
>>> np.r_[cauchy.mean(), cauchy.std()]
array([nan, nan])
See the documentation for more examples and the API reference.
Lmo is available on PyPI, and can be installed with:
pip install lmo
- Automatic trim-length selection.
- Plotting utilities (deps optional), e.g. for L-moment ratio diagrams.
These are automatically installed by your package manager when installing Lmo.
version | |
---|---|
python |
>=3.11 |
numpy |
>=1.25.2 |
scipy |
>=1.11.4 |
Additionally, Lmo supports the following optional packages:
version | pip install _ |
|
---|---|---|
pandas |
>=2.0 |
Lmo[pandas] |
See SPEC 0 for more information.
- J.R.M. Hosking (1990) – L-moments: Analysis and Estimation of Distributions using Linear Combinations of Order Statistics
- E.A.H. Elamir & A.H. Seheult (2003) – Trimmed L-moments
- J.R.M. Hosking (2007) – Some theory and practical uses of trimmed L-moments
- R. Serfling & P. Xiao (2007) – A contribution to multivariate L-moments: L-comoment matrices