The getSecondMoment does not return the real second central moment which should be equal to variance. I think it is confusing and should be stressed in the document.
On 10/17/2011 1:23 AM, Warren Tang wrote: > Thanks for the workaround. I've reported the bug here: > https://issues.apache.org/jira/browse/MATH-691 > > Regards, > Warren Tang <http://blog.tangcs.com> > > > On Sunday, October 16, 2011 11:24:26 PM, Mikkel Meyer Andersen wrote: >> Dear Warren, >> >> This is probably a bug. Sorry for this. Would you be so kind to report >> it as described on http://commons.apache.org/math/issue-tracking.html >> . >> >> What you can do instead is this: >> int[] scores = {1, 2, 3, 4}; >> >> SummaryStatistics stats = new SummaryStatistics(); >> for(int i : scores) { >> stats.addValue(i); >> } >> double sd = FastMath.sqrt(stats.getSecondMoment() / stats.getN()); >> >> System.out.println(sd); >> >> So, calculating sd as: >> double sd = FastMath.sqrt(stats.getSecondMoment() / stats.getN()); >> >> And then there is no need to stats.setVarianceImpl(new Variance(false)). >> >> Cheers, Mikkel. >> >> 2011/10/16 Warren Tang <[email protected]>: >>> Hi, Mikkel >>> >>> I'm using commons-math 2.2. The code to reproduce the issue. >>> >>> import org.apache.commons.math.stat.descriptive.SummaryStatistics; >>> import org.apache.commons.math.stat.descriptive.moment.Variance; >>> >>> @Test public void testStandardDeviation() { >>> 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); >>> } >>> >>> Regards, >>> Warren Tang <http://blog.tangcs.com> >>> >>> On 10/16/2011 10:43 PM, Mikkel Meyer Andersen wrote: >>>> >>>> Dear Warren, >>>> >>>> Could you provide values for the scores-variable in the current >>>> example making it possible to reproduce? >>>> >>>> Are you in fact using version 1.2 as reflected by the link you gave? >>>> Or which version are you using? >>>> >>>> Cheers, Mikkel. >>>> >>>> 2011/10/16 Warren Tang<[email protected]>: >>>>> >>>>> Hello, everyone >>>>> >>>>> I'm trying to get a "population standard deviation >>>>> >>>>> <http://commons.apache.org/math/api-1.2/org/apache/commons/math/stat/descriptive/moment/StandardDeviation.html>" >>>>> >>>>> (non-bias-corrected) from SummaryStatistics. >>>>> >>>>> This is what I did: >>>>> >>>>> SummaryStatistics stats = new SummaryStatistics(); >>>>> stats.setVarianceImpl(new Variance(false)); //use "population >>>>> variance" >>>>> ( sum((x_i - mean)^2) / n ) >>>>> for(int i : scores) { >>>>> stats.addValue(i); >>>>> } >>>>> double sd = stats.getStandardDeviation(); >>>>> >>>>> However, the value of "sd" is "NaN". How can I do it correctly? >>>>> >>>>> -- >>>>> Regards, >>>>> Warren Tang<http://blog.tangcs.com> >>>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: [email protected] >>>> For additional commands, e-mail: [email protected] >>>> >>> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [email protected] >> For additional commands, e-mail: [email protected] >> --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
