[SciPy-User] expectation function for stats.distributions

nicky van foreest vanforeest at gmail.com
Fri Jul 31 15:10:46 EDT 2009


Hi Josef,

I would like such a function. As a matter of fact, just today I needed
the expection of min(X,k), where X is a Poisson RV and k a number. Of
course, this is not particularly difficult, but a function that does
the work for me is better yet. BTW: will integrate.quad also work for
discrete distributions?

Nicky

2009/7/31  <josef.pktd at gmail.com>:
> I just needed to verify an expectation for fixing of the stats.models code.
>
> A while ago a wrote a function that can be attached as method to the
> distributions classes. It's pretty simple, but comes in handy when an
> expectation or conditional expectation has to be checked.
>
> Is there an interest in adding this as a new method to the distributions?
>
> explanations are here
> http://jpktd.blogspot.com/2009/04/having-fun-with-expectations.html
>
> copy of file below
>
> Josef
>
> '''
> copy from webpage, where is the original?
>
> Author jpktd
>
> '''
>
>
> import numpy as np
> from scipy import stats, integrate
>
> def expectedfunc(self, fn=None, args=(), lb=None, ub=None, conditional=False):
>    '''calculate expected value of a function with respect to the distribution
>
>    only for standard version of distribution,
>    location and scale not tested
>
>    Parameters
>    ----------
>        all parameters are keyword parameters
>        fn : function (default: identity mapping)
>           Function for which integral is calculated. Takes only one argument.
>        args : tuple
>           argument (parameters) of the distribution
>        lb, ub : numbers
>           lower and upper bound for integration, default is set to the support
>           of the distribution
>        conditional : boolean (False)
>           If true then the integral is corrected by the conditional probability
>           of the integration interval. The return value is the expectation
>           of the function, conditional on being in the given interval.
>
>    Returns
>    -------
>        expected value : float
>    '''
>    if fn is None:
>        def fun(x, *args):
>            return x*self.pdf(x, *args)
>    else:
>        def fun(x, *args):
>            return fn(x)*self.pdf(x, *args)
>    if lb is None:
>        lb = self.a
>    if ub is None:
>        ub = self.b
>    if conditional:
>        invfac = self.sf(lb,*args) - self.sf(ub,*args)
>    else:
>        invfac = 1.0
>    return integrate.quad(fun, lb, ub,
>                                args=args)[0]/invfac
>
>
> print expectedfunc(stats.norm, lambda(x): (x)**4)
> print expectedfunc(stats.norm, lambda(x): min((x)**2,1.5**2))
>
> #Jonathans version
> from scipy.stats import norm as Gaussian
> c = 1.5 # our "cutoff" point
> c = 0.5 # try another value
> tmp = 2 * Gaussian.cdf(c) - 1
> gamma = tmp + c**2 * (1 - tmp) - 2 * c * Gaussian.pdf(c)
> print gamma
>
> print expectedfunc(stats.norm, lambda(x): min((x)**2,c**2))
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
>



More information about the SciPy-User mailing list