* Bug #11891 fixed - Inaccurate Fisher ratio for one-way ANOVA 79/11179/8
Paul BIGNIER [Tue, 2 Apr 2013 08:34:24 +0000 (10:34 +0200)]
Using cdff's internal calculation of '1-cdff()', as return, instead of writing 'p=1-cdff()'.
Improves precision when cdff()'s value is close to 1.

Provided tests

test_run("statistics",["ftest","ftuneq"])

Change-Id: I24210afb5891ae555086fe8523d3089db8b7a3b6

scilab/CHANGES_5.5.X
scilab/modules/statistics/macros/ftest.sci
scilab/modules/statistics/macros/ftuneq.sci
scilab/modules/statistics/tests/unit_tests/ftest.dia.ref [new file with mode: 0644]
scilab/modules/statistics/tests/unit_tests/ftest.tst [new file with mode: 0644]
scilab/modules/statistics/tests/unit_tests/ftuneq.dia.ref [new file with mode: 0644]
scilab/modules/statistics/tests/unit_tests/ftuneq.tst [new file with mode: 0644]

index 60c2ebc..c28c817 100644 (file)
@@ -107,6 +107,8 @@ Bug fixes
 * Bug #11343 fixed - The "isoview" figure property did not work when the axes
                      margins had been modified.
 
+* Bug #11891 fixed - Fisher ratio could be inaccurate for one-way ANOVA.
+
 * Bug #12163 fixed - unzoom did not work with a single input argument.
 
 * Bug #12415 fixed - PATH environment variable grew when using call_scilab in a loop.
index 29cad24..fd38dbc 100644 (file)
@@ -1,5 +1,6 @@
 
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - Michael Baudin
 // Copyright (C) 2000 - INRIA - Carlos Klimann
 //
 // This file must be used under the terms of the CeCILL.
@@ -28,5 +29,5 @@ function [f,p]=ftest(samples)
     sx2=sum((xbar-xbarbar).^2)/(nc-1)
     sp2=(sum(sum((samples-ones(nr,1)*xbar).^2),"r"))/(nc*(nr-1))
     f=(nr*sx2)/sp2
-    p=1-cdff("PQ",f,(nc-1),(nc*(nr-1)))
+    [ignored,p]=cdff("PQ",f,(nc-1),(nc*(nr-1)))
 endfunction
index d6ef333..089cfc4 100644 (file)
@@ -1,5 +1,6 @@
 
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - Michael Baudin
 // Copyright (C) 2000 - INRIA - Carlos Klimann
 //
 // This file must be used under the terms of the CeCILL.
@@ -51,5 +52,5 @@ function [f,p]=ftuneq(varargin)
     deglib=sum(len-1)
     mse=sse/deglib
     f=msa/mse
-    p=1-cdff("PQ",f,(rhs-1),deglib)
+    [ignored,p]=cdff("PQ",f,(rhs-1),deglib)
 endfunction
diff --git a/scilab/modules/statistics/tests/unit_tests/ftest.dia.ref b/scilab/modules/statistics/tests/unit_tests/ftest.dia.ref
new file mode 100644 (file)
index 0000000..9acccb2
--- /dev/null
@@ -0,0 +1,50 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+// Copyright (C) ????-2008 - INRIA
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// =============================================================================
+// Tests for ftest() function
+// =============================================================================
+// Run with test_run('statistics', 'ftest', ['no_check_error_output']);
+prec = 1.e-5;
+samples = [46 55 54;
+         53 54 50;
+         49 58 51;
+         50 61 51;
+         46 52 49];
+[f, p] = ftest(samples);
+expected_p = 0.0055319;
+assert_checktrue(norm(p-expected_p) < prec);
+prec = 1.e-32;
+T = [
+107.8681568
+107.8681465
+107.8681572
+107.8681785
+107.8681446
+107.8681903
+107.8681526
+107.8681494
+107.8681616
+107.8681587
+107.8681519
+107.8681486
+107.8681419
+107.8681569
+107.8681508
+107.8681672
+107.8681385
+107.8681518
+107.8681662
+107.8681424
+107.8681360
+107.8681333
+107.8681610
+107.8681477
+];
+[f,p]=ftest([T,T*(1+1.e-6)]);
+expected_p = 6.033347845799172588D-31;
+assert_checktrue(norm(p-expected_p) < prec);
diff --git a/scilab/modules/statistics/tests/unit_tests/ftest.tst b/scilab/modules/statistics/tests/unit_tests/ftest.tst
new file mode 100644 (file)
index 0000000..c4b9fc0
--- /dev/null
@@ -0,0 +1,61 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+// Copyright (C) ????-2008 - INRIA
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// =============================================================================
+// Tests for ftest() function
+// =============================================================================
+
+// Run with test_run('statistics', 'ftest', ['no_check_error_output']);
+
+prec = 1.e-5;
+
+samples = [46 55 54;
+         53 54 50;
+         49 58 51;
+         50 61 51;
+         46 52 49];
+
+[f, p] = ftest(samples);
+
+expected_p = 0.0055319;
+
+assert_checktrue(norm(p-expected_p) < prec);
+
+prec = 1.e-32;
+
+T = [
+107.8681568
+107.8681465
+107.8681572
+107.8681785
+107.8681446
+107.8681903
+107.8681526
+107.8681494
+107.8681616
+107.8681587
+107.8681519
+107.8681486
+107.8681419
+107.8681569
+107.8681508
+107.8681672
+107.8681385
+107.8681518
+107.8681662
+107.8681424
+107.8681360
+107.8681333
+107.8681610
+107.8681477
+];
+
+[f,p]=ftest([T,T*(1+1.e-6)]);
+expected_p = 6.033347845799172588D-31;
+
+assert_checktrue(norm(p-expected_p) < prec);
diff --git a/scilab/modules/statistics/tests/unit_tests/ftuneq.dia.ref b/scilab/modules/statistics/tests/unit_tests/ftuneq.dia.ref
new file mode 100644 (file)
index 0000000..73cd195
--- /dev/null
@@ -0,0 +1,49 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+// Copyright (C) ????-2008 - INRIA
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// =============================================================================
+// Tests for ftuneq() function
+// =============================================================================
+// Run with test_run('statistics', 'ftuneq', ['no_check_error_output']);
+prec = 1.e-5;
+sample1 = [46 55 54];
+sample2 = [53 54];
+sample3 = [50 49 58 51 50];
+sample4 = [61 51 46 52];
+[f, p] = ftuneq(sample1, sample2, sample3, sample4);
+expected_p = 0.9602320;
+assert_checktrue(norm(p-expected_p) < prec);
+prec = 1.e-32;
+T = [
+107.8681568
+107.8681465
+107.8681572
+107.8681785
+107.8681446
+107.8681903
+107.8681526
+107.8681494
+107.8681616
+107.8681587
+107.8681519
+107.8681486
+107.8681419
+107.8681569
+107.8681508
+107.8681672
+107.8681385
+107.8681518
+107.8681662
+107.8681424
+107.8681360
+107.8681333
+107.8681610
+107.8681477
+];
+[f,p]=ftuneq(T,T*(1+1.e-6));
+expected_p = 6.033347845799172588D-31;
+assert_checktrue(norm(p-expected_p) < prec);
diff --git a/scilab/modules/statistics/tests/unit_tests/ftuneq.tst b/scilab/modules/statistics/tests/unit_tests/ftuneq.tst
new file mode 100644 (file)
index 0000000..aecbabe
--- /dev/null
@@ -0,0 +1,60 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+// Copyright (C) ????-2008 - INRIA
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// =============================================================================
+// Tests for ftuneq() function
+// =============================================================================
+
+// Run with test_run('statistics', 'ftuneq', ['no_check_error_output']);
+
+prec = 1.e-5;
+
+sample1 = [46 55 54];
+sample2 = [53 54];
+sample3 = [50 49 58 51 50];
+sample4 = [61 51 46 52];
+
+[f, p] = ftuneq(sample1, sample2, sample3, sample4);
+
+expected_p = 0.9602320;
+
+assert_checktrue(norm(p-expected_p) < prec);
+
+prec = 1.e-32;
+
+T = [
+107.8681568
+107.8681465
+107.8681572
+107.8681785
+107.8681446
+107.8681903
+107.8681526
+107.8681494
+107.8681616
+107.8681587
+107.8681519
+107.8681486
+107.8681419
+107.8681569
+107.8681508
+107.8681672
+107.8681385
+107.8681518
+107.8681662
+107.8681424
+107.8681360
+107.8681333
+107.8681610
+107.8681477
+];
+
+[f,p]=ftuneq(T,T*(1+1.e-6));
+expected_p = 6.033347845799172588D-31;
+
+assert_checktrue(norm(p-expected_p) < prec);