* Bug #11891 fixed - Inaccurate Fisher ratio for one-way ANOVA
[scilab.git] / scilab / modules / statistics / macros / ftuneq.sci
1
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2012 - Michael Baudin
4 // Copyright (C) 2000 - INRIA - Carlos Klimann
5 //
6 // This file must be used under the terms of the CeCILL.
7 // This source file is licensed as described in the file COPYING, which
8 // you should have received as part of this distribution.  The terms
9 // are also available at
10 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11 //
12
13 function [f,p]=ftuneq(varargin)
14     //
15     //This function computes the F ratio for samples of unequal
16     //size.
17     //
18     //"The most  efficient design is  to make all  samples the
19     //same  size n.   However when  this is  nor  feasible, it
20     //still  is possible  to modify  the  ANOVA calculations."
21     //Note  that  the  definition  of  xbarbar  is  no  longer
22     //mean(xbar), but  rather a weighted  average with weights
23     //ni.  Additionnally  it gives (in  p) the p-value  of the
24     //computed Fischer ratio.
25     //
26     //Given a number  a of samples each of  them composed of n_i
27     //(i from 1  to a) observations this fonction  computes in f
28     //the Fischer  ratio (it is  the ratio between nr  times the
29     //variance  of the  means of  samples  and the  mean of  the
30     //variances of each sample).
31     //
32     //References:  Wonacott, T.H. & Wonacott, R.J.; Introductory
33     //Statistics, J.Wiley & Sons, 1990.
34     //
35     //
36     [lhs,rhs]=argn(0)
37     data=[]
38     total=0
39     sse=0
40     for i=1:rhs
41         len(i)=size(varargin(i),"*"),
42         mat=matrix(varargin(i),len(i),1),
43         partial=sum(mat),
44         xbar(i)=partial/len(i),
45         total=total+partial,
46         data=[data; mat]
47         sse=sse+sum((mat-xbar(i)).^2)
48     end
49     xbarbar=total/sum(len)
50     ssa=len'*((xbar-xbarbar).^2)
51     msa=ssa/(rhs-1)
52     deglib=sum(len-1)
53     mse=sse/deglib
54     f=msa/mse
55     [ignored,p]=cdff("PQ",f,(rhs-1),deglib)
56 endfunction