Skip to content
/ Lmo Public

Trimmed L-moments and L-comoments for robust statistics.

License

Notifications You must be signed in to change notification settings

jorenham/Lmo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

664e6c2 · Mar 6, 2025
Feb 10, 2025
Oct 15, 2024
Mar 6, 2025
Jan 12, 2025
Jan 12, 2025
Jan 2, 2025
Aug 25, 2024
Aug 24, 2024
Oct 15, 2024
Jan 5, 2024
Apr 29, 2023
Mar 6, 2025
Dec 2, 2024
Jan 12, 2025
Mar 6, 2025
Mar 6, 2025

Lmo - Trimmed L-moments and L-comoments

Lmo - PyPI Lmo - Python versions Lmo - SPEC 0 Lmo - BSD License Lmo - CI Lmo - ruff Lmo - bassedpyright PyPI - Types

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).

Key Features

  • Calculates trimmed L-moments and L-comoments, from samples or any scipy.stats distribution.
  • Full support for trimmed L-moment (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 T E X definitions.
  • Clean Pythonic syntax for ease of use.
  • Vectorized functions for very fast fitting.
  • Fully typed, tested, and tickled.
  • Optional Pandas integration.

Quick example

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 amount 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 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 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.

Installation

Lmo is available on PyPI, and can be installed with:

pip install lmo

Roadmap

  • Automatic trim-length selection.
  • Plotting utilities (deps optional), e.g. for L-moment ratio diagrams.

Dependencies

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.

Foundational Literature