1%% Copyright (C) 1995, 1996, 1997 Kurt Hornik 2%% 3%% This file is part of Octave. 4%% 5%% Octave is free software; you can redistribute it and/or modify it 6%% under the terms of the GNU General Public License as published by 7%% the Free Software Foundation; either version 2, or (at your option) 8%% any later version. 9%% 10%% Octave is distributed in the hope that it will be useful, but 11%% WITHOUT ANY WARRANTY; without even the implied warranty of 12%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13%% General Public License for more details. 14%% 15%% You should have received a copy of the GNU General Public License 16%% along with Octave; see the file COPYING. If not, write to the Free 17%% Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 18%% 02110-1301, USA. 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%% Adapted for the use with M*tlab by AS <alois.schloegl@gmail.com> Dec 2006 47 48function [pval, z] = u_test (x, y, alt) 49 50 if ((nargin < 2) || (nargin > 3)) 51 print_usage (); 52 end 53 54 if (~ (isvector (x) && isvector (y))) 55 error ('u_test: both x and y must be vectors'); 56 end 57 58 n_x = length (x); 59 n_y = length (y); 60 r = ranks ([(reshape (x, 1, n_x)), (reshape (y, 1, n_y))]); 61 z = (sum (r(1 : n_x)) - n_x * (n_x + n_y + 1) / 2) ... 62 / sqrt (n_x * n_y * (n_x + n_y + 1) / 12); 63 64 cdf = normcdf (z); 65 66 if (nargin == 2) 67 alt = '~='; 68 end 69 70 if (~ ischar (alt)) 71 error('u_test: alt must be a string'); 72 end 73 if (strcmp (alt, '~=') || strcmp (alt, '<>')) 74 pval = 2 * min (cdf, 1 - cdf); 75 elseif (strcmp (alt, '>')) 76 pval = cdf; 77 elseif (strcmp (alt, '<')) 78 pval = 1 - cdf; 79 else 80 error ('u_test: option %s not recognized', alt); 81 end 82 83 if (nargout == 0) 84 printf (' pval: %g\n', pval); 85 end 86 87end 88