How to generate a distribution with a given mean, variance, skew and kurtosis in Python?
Asked Answered
T

2

22

random.gauss(mu, sigma)

Above is a function allowing to randomly draw a number from a normal distribution with a given mean and variance. But how can we draw values from a normal distribution defined by more than only the two first moments?

something like:

random.gauss(mu, sigma, skew, kurtosis)

Tug answered 26/10, 2013 at 7:59 Comment(4)
Any normal distribution has skew 0 and kurtosis 0. Use a different family of distributions.Choir
Beware, there are several ways to define the calculation for skew and kurtosis. Moments are not equivalent to mean, variance, skew, and kurtosis, though they have the same gist.Choir
Also, the moments do not specify a unique distribution. See [this similar question but asking about R: #4807898Choir
I would suggest to have a look at ThisGobbledygook
C
11

How about using scipy? You can pick the distribution you want from continuous distributions in the scipy.stats library.

The generalized gamma function has non-zero skew and kurtosis, but you'll have a little work to do to figure out what parameters to use to specify the distribution to get a particular mean, variance, skew and kurtosis. Here's some code to get you started.

import scipy.stats
import matplotlib.pyplot as plt
distribution = scipy.stats.norm(loc=100,scale=5)
sample = distribution.rvs(size=10000)
plt.hist(sample)
plt.show()
print distribution.stats('mvsk')

This displays a histogram of a 10,000 element sample from a normal distribution with mean 100 and variance 25, and prints the distribution's statistics:

(array(100.0), array(25.0), array(0.0), array(0.0))

Replacing the normal distribution with the generalized gamma distribution,

distribution = scipy.stats.gengamma(100, 70, loc=50, scale=10)

you get the statistics [mean, variance, skew, kurtosis] (array(60.67925117494595), array(0.00023388203873597746), array(-0.09588807605341435), array(-0.028177799805207737)).

Choir answered 26/10, 2013 at 9:57 Comment(0)
G
5

Try to use this:

http://statsmodels.sourceforge.net/devel/generated/statsmodels.sandbox.distributions.extras.pdf_mvsk.html#statsmodels.sandbox.distributions.extras.pdf_mvsk

Return the Gaussian expanded pdf function given the list of 1st, 2nd moment and skew and Fisher (excess) kurtosis.

Parameters : mvsk : list of mu, mc2, skew, kurt

Looks good to me. There's a link to the source on that page.

Oh, and here's the other StackOverflow question that pointed me there: Apply kurtosis to a distribution in python

Ga answered 26/10, 2013 at 8:5 Comment(3)
Is there a convenient way to draw values from this distribution, rather than just compute the density?Melena
what is meant by mc2 here? i anticipate variance, but just want to be sure.Bravar
"In the Gram-Charlier distribution, it is possible that the density becomes negative. This is when the deviation from the normal distribution is too large." So far I found this method the best in respect to accepting all 4 moments, and the worst in convergence.Hansel

© 2022 - 2024 — McMap. All rights reserved.