Mercurial > hg > ltpda
diff m-toolbox/classes/+utils/@math/spcorr.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/+utils/@math/spcorr.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,101 @@ +% SPCORR calculate Spearman Rank-Order Correlation Coefficient +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Description: +% +% SPCORR calculates Spearman Rank-Order Correlation Coefficient +% +% CALL: +% [rs,pValue,TestRes] = spcorr(y1,y2,alpha) +% +% INPUT: +% - y1 and y2 are data series +% - alpha is the significance level. Default 0.05 +% +% OUTPUT: +% - rs: Spearman rank-order correlation coefficient +% - pValue: Probability associated with the calculated rs in the +% hypothesis that the correlation between y1 and y2 is zero +% - TestRes: True or false on the basis of the test results. The null +% hypothesis for the test is that the two series y1 and y2 are +% uncorrelated. +% TestRes = 0 => Do not reject the null hypothesis at significance +% level alpha. (pValue >= alpha) +% TestRes = 1 => Reject the null hypothesis at significance level +% alpha. (pValue < alpha) +% +% NOTE: +% The statistic of Spearman rank-order correlation coefficient is +% well approximated by a Student t distribution. Hypothesis test is +% then based on such statistic. +% +% References: +% [1] W. H. Press, S. A. Teukolsky, W. T. Vetterling, B. P. Flannery, +% Numerical Recipes 3rd Edition: The Art of Scientific Computing, +% Cambridge University Press; 3 edition (September 10, 2007) +% +% +% L Ferraioli 06-12-2010 +% +% $Id: spcorr.m,v 1.2 2011/07/06 14:42:26 luigi Exp $ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function [rs,pValue,TestRes] = spcorr(y1,y2,alpha) + + % check size + if size(y1)~=size(y2) + error('y1 and y2 must have the same size') + end + + % check input + if isempty(alpha) + alpha = 0.05; + elseif alpha > 1 + alpha = alpha/100; + end + + + % calculate rank for y1 and y2 + [r1,s1] = utils.math.crank(y1); + [r2,s2] = utils.math.crank(y2); + + n = numel(y1); + + dv = (r1-r2).^2; + + dd = sum(dv); + + en = n*n*n-n; + + sq1 = sqrt(1-s1/en); + sq2 = sqrt(1-s2/en); + + % calculate Spearman rank-order correlation coefficient + rs = (1 - 6*(dd + s1/12 + s2/12)/en)/(sq1*sq2); + + % transform rs in t which is according Student's distribution with n-2 + % degrees of freedom + t = rs*sqrt((n-2)/(1-rs^2)); + + % Indicated with f(x) the prob. distribution function (Student's t in the + % present caase). The probability Pr(k <= t) is proportional to the + % integral Int_(-t,t)[f(x)dx]. For a Student's distribution such integral + % is represeted by the Beta incomplete function + % Pr(k <= t) = betainc(df/(df+t^2),df/2,1/2,'upper') + % As a consequence Pr(k > t) = 1 - Pr(k <= t) which in Matlab can be + % effectively calculated as + % Pr(k > t) = betainc(df/(df+t^2),df/2,1/2,'lower') + % Which provides the probability of finding a value grater than t if our + % variable k is distributed according to a Student's distribution with df + % degrees of freedom. Such a value represent the required pValue for the + % test in the hypothesis that the two input data series are uncorrelated + fac = (rs+1)*(1-rs); + if fac>0 + df = n-2; + pValue = betainc(df/(df+t*t),0.5*df,0.5,'lower'); + else + pValue = 0; + end + + TestRes = (pValue < alpha); + + +end \ No newline at end of file