0001 function [h,p] = ConcentrationTest(angles,group,alpha,nRandomizations)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 global n N r;
0031
0032 if nargin < 3,
0033 alpha = 0.05;
0034 end
0035 if nargin < 4,
0036 nRandomizations = 1000;
0037 end
0038 isradians(angles);
0039
0040
0041 r = max(group);
0042 N = length(angles);
0043 n = zeros(1,max(group));
0044 for i = 1:r,
0045 n(i) = sum(group==i);
0046 end
0047 if min(n) < 10,
0048 error('This test requires a minimum of 10 samples per group.');
0049 end
0050
0051
0052 for i = 1:r,
0053 k(i) = Concentration(angles(group==i));
0054 end
0055 kappa = median(k);
0056
0057
0058 for i = 1:r,
0059 mu(i) = CircularMean(angles(group==i));
0060 end
0061
0062 if kappa >= 1,
0063
0064 fr = ComputeStatistics(angles,group,mu);
0065
0066 p = 1 - fcdf(fr,r-1,N-r);
0067 p = 2 * min(p, 1-p);
0068 else
0069
0070 for i = 1:r,
0071 angles(group==i) = angles(group==i)-mu(i);
0072 end
0073
0074 fr = ComputeStatistics(angles,group,mu);
0075
0076 for i = 1:nRandomizations,
0077 x = randperm(N);
0078 group = group(x);
0079 for j = 1:r,
0080 mu(j) = CircularMean(angles(group==j));
0081 end
0082 fr_rand(i) = ComputeStatistics(angles,group,mu);
0083 end
0084
0085 fr_rand = sort(fr_rand);
0086
0087 m = find(fr_rand>=fr);
0088
0089 if isempty(m),
0090 p = 0;
0091 else
0092 m0 = sum(m==m(1));
0093 m = m(1);
0094 if m0 == 1,
0095 p = (nRandomizations-m+1)/nRandomizations;
0096 else
0097 p = (nRandomizations-m)/nRandomizations+m0/2;
0098 end
0099 end
0100 end
0101
0102 h = p < alpha;
0103
0104 message = ['Concentration test: median kappa = ' num2str(kappa) ' ('];
0105 for i = 1:r,
0106 message = [message num2str(k(i)) ' '];
0107 end
0108 message(end) = ')';
0109 disp(message);
0110
0111 if h,
0112 message = '+++ Two or more concentration parameters are significantly different';
0113 else
0114 message = '--- Concentration parameters are not significantly different';
0115 end
0116 message = ['Concentration test: ' message ' (p=' num2str(p) ', fr=' num2str(fr) ', N=' int2str(N) ')'];
0117 disp(message);
0118
0119
0120 function fr = ComputeStatistics(angles,group,mu)
0121
0122 global n N r;
0123
0124 for i = 1:r,
0125 a = abs(sin(angles(group==i)-mu(i)));
0126 d(i) = sum(a)/n(i);
0127 s(i) = sum((a-d(i)).^2);
0128 end
0129
0130 D = sum(n.*d)/N;
0131
0132 fr = (N-r)*sum(n.*(d-D).^2)/((r-1)*sum(s));