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

Phil Steitz commented on MATH-691:
----------------------------------

Warren reported that the second workaround above does not work.  He is correct. 
 That is the result of yet another problem in this class.
{code}
public double getVariance() {
    if (varianceImpl == variance) {
        return new Variance(secondMoment).getResult();
    } else {
        return varianceImpl.getResult();
    }
}
{code}

In the first case, varianceImpl is not used, so setting its properties has no 
effect.  The mean has a similar problem.  The root cause of all of these 
problems is the reuse of momemts (i.e., just incrementing the moments instead 
of both them and the Mean and Variance instances).  We could either toss this 
(slight loss in performance, but likely trivial) or expose or allow moments to 
be attached to Mean, Variance instances.


                
> Statistics.setVarianceImpl makes getStandardDeviation produce NaN
> -----------------------------------------------------------------
>
>                 Key: MATH-691
>                 URL: https://issues.apache.org/jira/browse/MATH-691
>             Project: Commons Math
>          Issue Type: Bug
>    Affects Versions: 2.2
>         Environment: Windows 7 64-bit, java version 1.6.0_23
>            Reporter: Warren Tang
>            Priority: Minor
>   Original Estimate: 5h
>  Remaining Estimate: 5h
>
> Invoking SummaryStatistics.setVarianceImpl(new Variance(true/false) makes 
> getStandardDeviation produce NaN. The code to reproduce it:
> {code:java}
> int[] scores = {1, 2, 3, 4};
> SummaryStatistics stats = new SummaryStatistics();
> stats.setVarianceImpl(new Variance(false)); //use "population variance"
> for(int i : scores) {
>   stats.addValue(i);
> }
> double sd = stats.getStandardDeviation();
> System.out.println(sd);
> {code}
> A workaround suggested by Mikkel is:
> {code:java}
>   double sd = FastMath.sqrt(stats.getSecondMoment() / stats.getN());
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to