Skip to main content

# Goftests

[![Build Status](https://travis-ci.org/posterior/goftests.svg?branch=master)](https://travis-ci.org/posterior/goftests) [![Code Quality](http://img.shields.io/scrutinizer/g/posterior/goftests.svg)](https://scrutinizer-ci.com/g/posterior/goftests/code-structure/master/hot-spots) [![PyPI Version](https://badge.fury.io/py/goftests.svg)](https://pypi.python.org/pypi/goftests) [![Anaconda Version](https://anaconda.org/conda-forge/goftests/badges/version.svg)](https://anaconda.org/conda-forge/goftests) [![DOI](https://zenodo.org/badge/30935971.svg)](https://zenodo.org/badge/latestdoi/30935971)

Generic goodness of fit tests for random plain old data.

Goftests is intended for unit testing random samplers that generate arbitrary plain-old-data, and focuses on robustness rather than statistical efficiency. In contrast to [scipy.stats][] and [statsmodels][], goftests does not make assumptions on the distribution being tested, and requires only a simple (sample, prob) interface provided by MCMC samplers.

## Installing

pip install goftests

## Using goodness of fit tests

Goftests implements generic statistical tests for Monte Carlo samplers that generate (sample, probability) pairs. The four basic generic tests are

  • discrete_goodness_of_fit(samples, probs_dict, …) - for discrete-valued data with most of the mass on a few values.

  • density_goodness_of_fit(samples, probs, …) - for continuously distributed univariate data with no discrete component.

  • vector_density_goodness_of_fit(samples, probs, …) - for continuously distributed multivariate data with no discrete component.

  • mixed_density_goodness_of_fit(samples, probs, …) - for discretely-indexed continuously distributed data, subsuming the all the other tests.

Each test outputs a goodness of fit number, say gof, which should be uniformly distributed in the interval [0,1], and which tends to fail with numbers close to zero. Thus to test a sampler we usually write

TEST_FAILURE_RATE = 1e-3

def test_my_sampler(count=100):

seed_all(0) samples = [my_sampler.rvs() for _ in xrange(count)] probs = [my_sampler.pdf(x) for x in samples] gof = mixed_density_goodness_of_fit(samples, probs) assert gof > TEST_FAILURE_RATE

By specifying a global TEST_FAILURE_RATE for a suite of tests, we can tune the number of tests expected to fail. In a large suite of tests, some may fail at the specified seeds despite the distribution being correct, typically with gof just below the threshold. In this case we usually increment the seed on those tests. In a suite of 1000 tests with TEST_FAILURE_RATE = 1e-3, we should expect to have to increment the seed on 1 test, on average.

### Diagnosing common errors

#### Too few samples

The discrete tests only look at the most-likely few values, and requires enough samples in the top few values to be able to use Pearson’s &chi;<sup>2</sup> test. This is typically at least 100 samples.

The univariate tests require around 100 samples, and the multivariate require at least 1000 per dimension.

#### Too many samples

When testing for millions of samples or more, tests can fail due to numeric imprecision rather than poor distribution. We have had success testing with 10<sup>2</sup>-10<sup>5</sup> samples.

#### Poorly mixing Markov chains

When testing samples generated by MCMC, the samples are often correlated so that testing the entire chain fails. In this case, try running the chain for longer and subsampling only every k<sup>th</sup> step in the chain.

#### Sticky Markov chains

The density tests are sensitive to Sticky Markov chains. As with poorly mixing chains, try running for longer.

#### Spuriously failing tests

Be sure to set a deterministic seed via seed_all(…) before generating each dataset. In particular, some test runners run tests in a nondeterministic order, so setting the seed before generating each sample ensures deterministic behavior.

## Implementing new tests

The goodness of fit tests are mostly implemented by reduction to other tests, eventually reducing to the multinomial goodness of fit test which uses Pearson’s &chi;<sup>2</sup> test on each of the multinomial’s bins.

![Reductions](/doc/reductions.png)

To implement a new test, you can implement from scratch, reduce to another test in goftests, or reduce to standard tests in another package like [scipy.stats][] or [statsmodels][].

[scipy.stats]: http://docs.scipy.org/doc/scipy/reference/stats.html#statistical-functions [statsmodels]: http://statsmodels.sourceforge.net/stable/stats.html#goodness-of-fit-tests-and-measures

## References

## License

Copyright (c) 2014 Salesforce.com, Inc. All rights reserved. <br/> Copyright (c) 2015 Gamelan Labs, Inc. <br/> Copyright (c) 2016 Google, Inc. <br/> Copyright (c) 2019 Gamalon, Inc. <br/> Licensed under the Revised BSD License. See [LICENSE.txt](LICENSE.txt) for details.

Release files for goftests 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for goftests 0.3.0
File Size Uploaded
goftests-0.3.0.tar.gz 14.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for goftests 0.3.0
File Interpreter ABI Platform
goftests-0.3.0-py2.py3-none-any.whl Python 3, Python 2 none any Details

Total release size: 29.4 kB

Release files / goftests-0.3.0.tar.gz

Download URL goftests-0.3.0.tar.gz
Size 14.4 kB
Tags Source
SHA-256 checksum
How to use checksums
aebe27a1a722cc3093ef9a695d2cc4e7b32f28d54792c077e4d23c24009cf57a
BLAKE2b-256 checksum
How to use checksums
2fcd67ac73e9fe81e46fb6e93031a515e7c02ef13adc2a14bb8d7a39eed4062c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.11.8

Release files / goftests-0.3.0-py2.py3-none-any.whl

Download URL goftests-0.3.0-py2.py3-none-any.whl
Size 15.1 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
0dcdac5ec27a74fb2efc7fe2bc307e05289054fc9e8b15aaa3668910372a105a
BLAKE2b-256 checksum
How to use checksums
15a30f30f1513880e0aae9b36cca72a60406311979f4656244441f793da854fc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.11.8

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.7

1 release file

0.2.6

1 release file

0.2.5

1 release file

0.2.4

1 release file

0.2.3

1 release file

0.2.2

1 release file

0.2.1

1 release file

0.2.0

1 release file

0.1.8

1 release file

0.1.7

1 release file

0.1.6

1 release file

0.1.5

1 release file

0.1.3

1 release file

0.1.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page