123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- function[H,P,M1,M2,N1,N2] = countsig(data1,data2,T1,T2,parametric,p,quiet)
- % Give the program two spike data sets and one
- % or two time intervals and it will decide if
- % the counts are significantly different.
- % this is either with a non-parametric method
- % or with a sqrt transformation followed by a
- % t-test
- % Usage: [H,P,M1,M2,N1,N2] = countsig(data1,data2,T1,T2,parametric,p,quiet)
- %
- % Input:
- % Note that all times have to be consistent. If data
- % is in seconds, so must be sig and t. If data is in
- % samples, so must sig and t. The default is seconds.
- %
- % data1 - structure array of spike times (required)
- % data2 - structure array of spike times (required)
- % T1 - time interval (default all)
- % T2 - time interval (default T1)
- % parametric - 0 = non-parametric (Wilcoxon)
- % - 1 = ttest on sqrt of counts
- % - 2 = Poisson assumption
- % (default = 0)
- % p - significance level (0.05)
- % quiet - 1 = no display 0 = display
- %
- % Output:
- %
- % H - 1 if different 0 if not
- % P - prob of result if same
- % M1 - mean count for data1
- % M2 - mean count for data2
- % N1 - counts for data1
- % N2 - counts for data2
- if nargin < 2;error('I need 2 sets of spike data');end
- data1=padNaN(data1); % create a zero padded data matrix from input structural array
- data2=padNaN(data2); % create a zero padded data matrix from input structural array
- data1=data1'; data2=data2'; % transpose data to get it into a form acceptable to Murray's routine
- if nargin < 3,
- T1 = [min(data1(:,1)) max(max(data1))];
- end
- if nargin < 4,
- T2 = T1;
- end
- if nargin < 5,
- parametric = 0;
- end
- if nargin < 6; p = 0.05;end
- if nargin < 7; quiet = 0; end
- if isempty(T1),
- T1 = [min(data1(:,1)) max(max(data1))];
- end
- if isempty(T2)
- T2 = T1;
- end
- if isempty(parametric),
- parametric = 0;
- end
- if isempty(p)
- p = 0.05;
- end
- if isempty(quiet),
- quiet = 0;
- end
- NT1 = length(data1(:,1));
- NT2 = length(data2(:,2));
- if (NT1 < 4 || NT2 < 4) && parametric ~= 2,
- disp('Low number of trials : switch to Poisson test')
- parametric = 2;
- end
- if abs((T1(2)-T1(1)) - (T1(2)-T1(1))) > 10.^-6
- error('Time intervals for analysis are different')
- end
- % get counts...
- N1=zeros(1,NT1);
- for n=1:NT1
- N1(n) = length(find(data1(n,:) >= T1(1) & ...
- data1(n,:) <= T1(2) & ~isnan(data1(n,:))));
- end
- N2=zeros(1,NT2);
- for n=1:NT2
- N2(n) = length(find(data2(n,:) >= T2(1) & ...
- data2(n,:) <= T2(2) & ~isnan(data1(n,:))));
- end
- M1 = mean(N1);
- M2 = mean(N2);
- % do non parametric test...
- if parametric == 0
- [P H] = ranksum(N1,N2,p);
- end
- % parametric test (with stabilizing transform)...
- % use sqrt transformation from
- % Cox and Lewis to make data more Gaussian
- % the statistical analysis of series of events pg 44
- if parametric == 1
- X = sqrt(N1 +0.25);
- Y = sqrt(N2 +0.25);
- [H,P] = ttest2(X,Y,p,0);
- end
- % Poisson test. Use method from Zar
- % pg 580 Ed 3. Z bahaves as a normal variate under
- % null of same process mean and Poisson processes
- if parametric == 2
- X = sum(N1);
- Y = sum(N2);
- Z = abs(X-Y)./sqrt(X+Y);
- P = 2*(1-normcdf(Z));
- if P < p; H = 1;else H = 0;end
- end
- if quiet == 0
- if H == 1
- disp('Counts are signifcantly different')
- else
- disp('Counts are not signifcantly different')
- end
- disp(['Mean count for data1 = ' num2str(M1)])
- disp(['Mean count for data2 = ' num2str(M2)])
- disp(['P value = ' num2str(P)])
- end
|