]> Creatis software - CreaPhase.git/blobdiff - octave_packages/m/statistics/tests/cor_test.m
update packages
[CreaPhase.git] / octave_packages / m / statistics / tests / cor_test.m
diff --git a/octave_packages/m/statistics/tests/cor_test.m b/octave_packages/m/statistics/tests/cor_test.m
new file mode 100644 (file)
index 0000000..f275147
--- /dev/null
@@ -0,0 +1,135 @@
+## Copyright (C) 1995-2012 Kurt Hornik
+##
+## This file is part of Octave.
+##
+## Octave is free software; you can redistribute it and/or modify it
+## under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or (at
+## your option) any later version.
+##
+## Octave is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with Octave; see the file COPYING.  If not, see
+## <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {} cor_test (@var{x}, @var{y}, @var{alt}, @var{method})
+## Test whether two samples @var{x} and @var{y} come from uncorrelated
+## populations.
+##
+## The optional argument string @var{alt} describes the alternative
+## hypothesis, and can be @code{"!="} or @code{"<>"} (non-zero),
+## @code{">"} (greater than 0), or @code{"<"} (less than 0).  The
+## default is the two-sided case.
+##
+## The optional argument string @var{method} specifies which
+## correlation coefficient to use for testing.  If @var{method} is
+## @code{"pearson"} (default), the (usual) Pearson's product moment
+## correlation coefficient is used.  In this case, the data should come
+## from a bivariate normal distribution.  Otherwise, the other two
+## methods offer nonparametric alternatives.  If @var{method} is
+## @code{"kendall"}, then Kendall's rank correlation tau is used.  If
+## @var{method} is @code{"spearman"}, then Spearman's rank correlation
+## rho is used.  Only the first character is necessary.
+##
+## The output is a structure with the following elements:
+##
+## @table @var
+## @item pval
+## The p-value of the test.
+##
+## @item stat
+## The value of the test statistic.
+##
+## @item dist
+## The distribution of the test statistic.
+##
+## @item params
+## The parameters of the null distribution of the test statistic.
+##
+## @item alternative
+## The alternative hypothesis.
+##
+## @item method
+## The method used for testing.
+## @end table
+##
+## If no output argument is given, the p-value is displayed.
+## @end deftypefn
+
+## Author: FL <Friedrich.Leisch@ci.tuwien.ac.at>
+## Adapted-by: KH <Kurt.Hornik@wu-wien.ac.at>
+## Description: Test for zero correlation
+
+function t = cor_test (x, y, alt, method)
+
+  if ((nargin < 2) || (nargin > 4))
+    print_usage ();
+  endif
+
+  if (!isvector (x) || !isvector (y) || length (x) != length (y))
+    error ("cor_test: X and Y must be vectors of the same length");
+  endif
+
+  if (nargin < 3)
+    alt = "!=";
+  elseif (! ischar (alt))
+    error ("cor_test: ALT must be a string");
+  endif
+
+  if (nargin < 4)
+    method = "pearson";
+  elseif (! ischar (method))
+    error ("cor_test: METHOD must be a string");
+  endif
+
+  n = length (x);
+  m = method (1);
+
+  if (m == "p")
+    r = corr (x, y);
+    df = n - 2;
+    t.method = "Pearson's product moment correlation";
+    t.params = df;
+    t.stat = sqrt (df) .* r / sqrt (1 - r.^2);
+    t.dist = "t";
+    cdf  = tcdf (t.stat, df);
+  elseif (m == "k")
+    tau = kendall (x, y);
+    t.method = "Kendall's rank correlation tau";
+    t.params = [];
+    t.stat = tau / sqrt ((2 * (2*n+5)) / (9*n*(n-1)));
+    t.dist = "stdnormal";
+    cdf = stdnormal_cdf (t.stat);
+  elseif (m == "s")
+    rho = spearman (x, y);
+    t.method = "Spearman's rank correlation rho";
+    t.params = [];
+    t.stat = sqrt (n-1) * (rho - 6/(n^3-n));
+    t.dist = "stdnormal";
+    cdf = stdnormal_cdf (t.stat);
+  else
+    error ("cor_test: METHOD `%s' not recognized", method);
+  endif
+
+  if (strcmp (alt, "!=") || strcmp (alt, "<>"))
+    t.pval = 2 * min (cdf, 1 - cdf);
+  elseif (strcmp (alt, ">"))
+    t.pval = 1 - cdf;
+  elseif (strcmp (alt, "<"))
+    t.pval = cdf;
+  else
+    error ("cor_test: alternative `%s' not recognized", alt);
+  endif
+
+  t.alternative = alt;
+
+  if (nargout == 0)
+    printf ("pval: %g\n", t.pval);
+  endif
+
+endfunction