6

I am running some goodness of fit tests using scipy.stats in Python 2.7.10.

for distrName in distrNameList:
    distr = getattr(distributions, distrName)
    param = distr.fit(sample)
    pdf   = distr.pdf(???)

What do I pass into distr.pdf() to get the values of the best-fit pdf on the list of sample points of interest, called abscissas?

gt6989b
  • 3,737
  • 7
  • 37
  • 56
  • [Here are all the scipy.stats distributions PDFs with example code.](http://stackoverflow.com/a/37559471/2087463) – tmthydvnprt Jun 01 '16 at 05:00

2 Answers2

7

From the documentation, the .fit() method returns:

shape, loc, scale : tuple of floats MLEs for any shape statistics, followed by those for location and scale.

and the .pdf() method accepts:

x : array_like quantiles

arg1, arg2, arg3,... : array_like The shape parameter(s) for the distribution (see docstring of the instance object for more information)

loc : array_like, optional location parameter (default=0)

scale : array_like, optional

So essentially you would do something like this:

import numpy as np
from scipy import stats
from matplotlib import pyplot as plt


# some random variates drawn from a beta distribution
rvs = stats.beta.rvs(2, 5, loc=0, scale=1, size=1000)

# estimate distribution parameters, in this case (a, b, loc, scale)
params = stats.beta.fit(rvs)

# evaluate PDF
x = np.linspace(0, 1, 1000)
pdf = stats.beta.pdf(x, *params)

# plot
fig, ax = plt.subplots(1, 1)
ax.hold(True)
ax.hist(rvs, normed=True)
ax.plot(x, pdf, '--r')

enter image description here

ali_m
  • 62,795
  • 16
  • 193
  • 270
6

To evaluate the pdf at abscissas, you would pass abcissas as the first argument to pdf. To specify the parameters, use the * operator to unpack the param tuple and pass those values to distr.pdf:

pdf = distr.pdf(abscissas, *param)

For example,

import numpy as np
import scipy.stats as stats

distrNameList = ['beta', 'expon', 'gamma']
sample = stats.norm(0, 1).rvs(1000)
abscissas = np.linspace(0,1, 10)
for distrName in distrNameList:
    distr = getattr(stats.distributions, distrName)
    param = distr.fit(sample)
    pdf = distr.pdf(abscissas, *param)
    print(pdf)
Community
  • 1
  • 1
unutbu
  • 711,858
  • 148
  • 1,594
  • 1,547