You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Brent Worden (JIRA)" <ji...@apache.org> on 2016/06/19 04:23:05 UTC

[jira] [Comment Edited] (MATH-1373) In LogNormalDistribution.java, it appears shape & scale are reversed/mis-labelled.

    [ https://issues.apache.org/jira/browse/MATH-1373?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15338359#comment-15338359 ] 

Brent Worden edited comment on MATH-1373 at 6/19/16 4:22 AM:
-------------------------------------------------------------

I am not completely convinced this change is correct.

Referencing on of the citations, http://mathworld.wolfram.com/LogNormalDistribution.html, the density function is parameterized the same way LogNormalDistribution is parameterized with
* MathWorld's M being equivalent to Commons Math's scale
* MathWorld's S being equivalent to Commons Math's shape

The distribution mean according to MathWorld is Exp(M + S^2 / 2) which corresponds to Exp(scale + shape^2 / 2) and is how it is coded in LogNormalDistribution.

Likewise, MathWorld states the distribution variance Exp(S^2 + 2 M) * (Exp(S^2 - 1) which is Exp(shape^2 + 2 scale) * (Exp(shape^2 - 1).  Again, this matches the implementation.

Furthermore, generating a large sample from the distribution results in sample means and variances that are pretty close to the population values returned from the getNumericalMean and getNumericalVariance methods.  Here is the code I am using to make that claim:

{code}
    @Test
    public void testMeanAndVariance() {
        LogNormalDistribution dist = new LogNormalDistribution(5.375, 1.125);
        double[] x = new double[100000];
        for (int i = 0; i < x.length; ++i) {
            x[i] = dist.inverseCumulativeProbability(Math.random());
        }
        double actualMean = new Mean().evaluate(x);
        double actualVariance = new Variance().evaluate(x);

        double expectedMean = dist.getNumericalMean();
        double expectedVariance = dist.getNumericalVariance();

        System.out.println(String.format("Mean: %f vs %f (actual vs expected)", actualMean, expectedMean));
        System.out.println(String.format("Variance: %f vs %f (actual vs expected)", actualVariance, expectedVariance));
    }
{code}



was (Author: brentworden):
I am not completely convinced this change is correct.

Referencing on of the citations, http://mathworld.wolfram.com/LogNormalDistribution.html, the density function is parameterized the same way LogNormalDistribution is parameterized with
* MathWorld's M being equivalent to Commons Math's scale
* MathWorld's S being equivalent to Commons Math's shape

The distribution mean according to MathWorld is Exp(M + S^2 / 2) which corresponds to Exp(scale + shape^2 / 2) and is how it is coded in LogNormalDistribution.

Likewise, MathWorld states the distribution variance Exp(S^2 + 2 M) * (Exp(S^2 - 1) which is Exp(shape^2 + 2 scale) * (Exp(shape^2 - 1).  Again, this matches the implementation.

Furthermore, generating a large sample from the distribution results in sample means and variances that are pretty close to the expected values returned from the getNumericalMean and getNumericalVariance methods.  Here is the code I am using to make that claim:

{code}
    @Test
    public void testMeanAndVariance() {
        LogNormalDistribution dist = new LogNormalDistribution(5.375, 1.125);
        double[] x = new double[100000];
        for (int i = 0; i < x.length; ++i) {
            x[i] = dist.inverseCumulativeProbability(Math.random());
        }
        double actualMean = new Mean().evaluate(x);
        double actualVariance = new Variance().evaluate(x);

        double expectedMean = dist.getNumericalMean();
        double expectedVariance = dist.getNumericalVariance();

        System.out.println(String.format("Mean: %f vs %f (actual vs expected)", actualMean, expectedMean));
        System.out.println(String.format("Variance: %f vs %f (actual vs expected)", actualVariance, expectedVariance));
    }
{code}


> In LogNormalDistribution.java, it appears shape & scale are reversed/mis-labelled.
> ----------------------------------------------------------------------------------
>
>                 Key: MATH-1373
>                 URL: https://issues.apache.org/jira/browse/MATH-1373
>             Project: Commons Math
>          Issue Type: Bug
>    Affects Versions: 3.6.1
>            Reporter: Karl D. Gierach
>            Priority: Minor
>         Attachments: MATH-1373.patch
>
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> When I compute the logshape and log scale based on the formulas on wikipedia's lognormal distribution page that use empirical mean and variance, I found that the getNumericalMean() method was not returning the empirical mean.
> However, upon just trying to reverse the shape and scale parameters in the constructor proved to fix the problem, and the object then returns the correct empirical mean.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)