~ubuntu-branches/debian/lenny/octave3.0/lenny

« back to all changes in this revision

Viewing changes to scripts/statistics/tests/u_test.m

  • Committer: Bazaar Package Importer
  • Author(s): Rafael Laboissiere
  • Date: 2007-12-23 16:04:15 UTC
  • Revision ID: james.westby@ubuntu.com-20071223160415-n4gk468dihy22e9v
Tags: upstream-3.0.0
ImportĀ upstreamĀ versionĀ 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
## Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2005, 2006,
 
2
##               2007 Kurt Hornik
 
3
##
 
4
## This file is part of Octave.
 
5
##
 
6
## Octave is free software; you can redistribute it and/or modify it
 
7
## under the terms of the GNU General Public License as published by
 
8
## the Free Software Foundation; either version 3 of the License, or (at
 
9
## your option) any later version.
 
10
##
 
11
## Octave is distributed in the hope that it will be useful, but
 
12
## WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
14
## General Public License for more details.
 
15
##
 
16
## You should have received a copy of the GNU General Public License
 
17
## along with Octave; see the file COPYING.  If not, see
 
18
## <http://www.gnu.org/licenses/>.
 
19
 
 
20
## -*- texinfo -*-
 
21
## @deftypefn {Function File} {[@var{pval}, @var{z}] =} u_test (@var{x}, @var{y}, @var{alt})
 
22
## For two samples @var{x} and @var{y}, perform a Mann-Whitney U-test of
 
23
## the null hypothesis PROB (@var{x} > @var{y}) == 1/2 == PROB (@var{x}
 
24
## < @var{y}).  Under the null, the test statistic @var{z} approximately
 
25
## follows a standard normal distribution.  Note that this test is
 
26
## equivalent to the Wilcoxon rank-sum test.
 
27
##
 
28
## With the optional argument string @var{alt}, the alternative of
 
29
## interest can be selected.  If @var{alt} is @code{"!="} or
 
30
## @code{"<>"}, the null is tested against the two-sided alternative
 
31
## PROB (@var{x} > @var{y}) != 1/2.  If @var{alt} is @code{">"}, the
 
32
## one-sided alternative PROB (@var{x} > @var{y}) > 1/2 is considered.
 
33
## Similarly for @code{"<"}, the one-sided alternative PROB (@var{x} >
 
34
## @var{y}) < 1/2 is considered.  The default is the two-sided case.
 
35
##
 
36
## The p-value of the test is returned in @var{pval}.
 
37
##
 
38
## If no output argument is given, the p-value of the test is displayed.
 
39
## @end deftypefn
 
40
 
 
41
## This implementation is still incomplete---for small sample sizes,
 
42
## the normal approximation is rather bad ...
 
43
 
 
44
## Author: KH <Kurt.Hornik@wu-wien.ac.at>
 
45
## Description: Mann-Whitney U-test
 
46
 
 
47
function [pval, z] = u_test (x, y, alt)
 
48
 
 
49
  if ((nargin < 2) || (nargin > 3))
 
50
    print_usage ();
 
51
  endif
 
52
 
 
53
  if (! (isvector (x) && isvector (y)))
 
54
    error ("u_test: both x and y must be vectors");
 
55
  endif
 
56
 
 
57
  n_x  = length (x);
 
58
  n_y  = length (y);
 
59
  r    = ranks ([(reshape (x, 1, n_x)), (reshape (y, 1, n_y))]);
 
60
  z    = (sum (r(1 : n_x)) - n_x * (n_x + n_y + 1) / 2) ...
 
61
           / sqrt (n_x * n_y * (n_x + n_y + 1) / 12);
 
62
 
 
63
  cdf  = stdnormal_cdf (z);
 
64
 
 
65
  if (nargin == 2)
 
66
    alt  = "!=";
 
67
  endif
 
68
 
 
69
  if (! ischar (alt))
 
70
    error("u_test: alt must be a string");
 
71
  endif
 
72
  if (strcmp (alt, "!=") || strcmp (alt, "<>"))
 
73
    pval = 2 * min (cdf, 1 - cdf);
 
74
  elseif (strcmp (alt, ">"))
 
75
    pval = cdf;
 
76
  elseif (strcmp (alt, "<"))
 
77
    pval = 1 - cdf;
 
78
  else
 
79
    error ("u_test: option %s not recognized", alt);
 
80
  endif
 
81
 
 
82
  if (nargout == 0)
 
83
    printf ("  pval: %g\n", pval);
 
84
  endif
 
85
 
 
86
endfunction