How do I get a lognormal distribution in Python with Mu and Sigma?

后端 未结 6 659
-上瘾入骨i
-上瘾入骨i 2020-12-23 10:45

I have been trying to get the result of a lognormal distribution using Scipy. I already have the Mu and Sigma, so I don\'t need to do any other prep work. If I need to be

6条回答
  •  执笔经年
    2020-12-23 10:58

    from math import exp
    from scipy import stats
    
    def lognorm_cdf(x, mu, sigma):
        shape  = sigma
        loc    = 0
        scale  = exp(mu)
        return stats.lognorm.cdf(x, shape, loc, scale)
    
    x      = 25
    mu     = 2.0785
    sigma  = 1.744
    p      = lognorm_cdf(x, mu, sigma)  #yields the expected 0.74341
    

    Similar to Excel and R, The lognorm_cdf function above parameterizes the CDF for the log-normal distribution using mu and sigma.

    Although SciPy uses shape, loc and scale parameters to characterize its probability distributions, for the log-normal distribution I find it slightly easier to think of these parameters at the variable level rather than at the distribution level. Here's what I mean...

    A log-normal variable X is related to a normal variable Z as follows:

    X = exp(mu + sigma * Z)              #Equation 1
    

    which is the same as:

    X = exp(mu) * exp(Z)**sigma          #Equation 2
    

    This can be sneakily re-written as follows:

    X = exp(mu) * exp(Z-Z0)**sigma       #Equation 3
    

    where Z0 = 0. This equation is of the form:

    f(x) = a * ( (x-x0) ** b )           #Equation 4
    

    If you can visualize equations in your head it should be clear that the scale, shape and location parameters in Equation 4 are: a, b and x0, respectively. This means that in Equation 3 the scale, shape and location parameters are: exp(mu), sigma and zero, respectfully.

    If you can't visualize that very clearly, let's rewrite Equation 2 as a function:

    f(Z) = exp(mu) * exp(Z)**sigma      #(same as Equation 2)
    

    and then look at the effects of mu and sigma on f(Z). The figure below holds sigma constant and varies mu. You should see that mu vertically scales f(Z). However, it does so in a nonlinear manner; the effect of changing mu from 0 to 1 is smaller than the effect of changing mu from 1 to 2. From Equation 2 we see that exp(mu) is actually the linear scaling factor. Hence SciPy's "scale" is exp(mu).

    The next figure holds mu constant and varies sigma. You should see that the shape of f(Z) changes. That is, f(Z) has a constant value when Z=0 and sigma affects how quickly f(Z) curves away from the horizontal axis. Hence SciPy's "shape" is sigma.

提交回复
热议问题