function npar_main(method,data,data2,testmedian) % npar_main is the main program for Erik's Matlab nonparametric statistical toolbox %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Nonparametric Statistical Tests in Matlab % % Author: % Erik B. Erhardt erike@wpi.edu % Statistics Graduate Student and Teaching Assistant % Dept. of Mathematical Sciences (508) 831-5546 % Worcester Polytechnic Institute SH 204 % 100 Institute Rd. % Worcester, MA 01609-2280 % % Date: 2/6/2003 1:30PM % % Program: npar_main.m % Includes: % Main % Calls: % npar_pitman.m Pitman % npar_pitmanmc.m Pitman Monte Carlo % npar_vdwaerden.m Van Der Waerden normal scores test % npar_wilcoxsr.m Wilcoxon signed-rank (convert to ranks only) % npar_wilcoxsr_ci.m Wilcoxon signed-rank Confidence Intervals % npar_sign.m Sign and Sign Confidence Intervals % npar_runsrandom.m Runs test for randomness % % % Called by: % command line % % Use: % npar_main(method,data,testmedian) % method = % pitman Pitman test % pitmanmc Pitman Monte Carlo test (using Pitman_MC Matlab function) % vdwaerden Van Der Waerden normal scores test % wilcoxsr Wilcoxon signed-rank test % sign Sign test % runsrandom Runs test for randomness % % data = % vector of data % data2 = % second vector of data for two-sample tests % if not being used, assign data2=0 % testmedian = % median you want to test % % Enjoy the EXACT results. % % Note: A convienient way to run this is to create a file % npar_data.m % to define your data, testmedian and method and run that file. % % % Maintenance: % % npar_wilcoxsr_ci.m: % this statement corrects the subscripts, but the CIs are not exact when ties occur. % walshind=fix(walshind); % in case of tie this will not be integer % % npar_pitmanind.m: % not sure if cont correction is appropriate in using normal approximation % % npar_wmwrsum.m: % no normal approximation yet. % Un stat seems to match StatXact value in S&S book, Um does not. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Known limitations of Matlab: % There is a memory limit of k=21 when we store all the S+ values (2^k). [comptype,nmax] = computer; %nmax is the maximum number of elements allowed in an array %%% Output file (appended to) diary('npar_out.txt'); currenttime=clock; fprintf('Time Started: %i-%i-%i %i:%i:%3.1f\n',currenttime(1),currenttime(2),currenttime(3),currenttime(4),currenttime(5),currenttime(6)); format compact; % begin timer tic; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Switch section BEGIN % NOTE: If wilcoxsrtest=1, the pitman test will NOT be performed on the original data % Switch Initialization BEGIN pitmantest=0; pitmantestprint=0; pitmanmctest=0; pitmanmctestprint=0; wilcoxsrtest=0; wilcoxsrtestprint=0; vdwaerdentest=0; vdwaerdentestprint=0; signtest=0; signtestprint=0; runsrandomtest=0; runsrandomtestprint=0; % two-sample pitmanindtest=0; pitmanindtestprint=0; wilcoxrsumtest=0; wilcoxrsumtestprint=0; wmwrsumtest=0; wmwrsumtestprint=0; kendallranktest=0; kendallranktestprint=0; normalciprint=0; histogramsw=0; pairedsamplesw=0; independentsw=0; % Switch Initialization END if strcmp('pitman',method)==1; % Pitman test switch (1=on) pitmantest=1; pitmantestprint=1; end; if strcmp('pitmanmc',method)==1; % Pitman Monte Carlo test switch (1=on) pitmanmctest=1; pitmanmctestprint=1; end; if strcmp('wilcoxsr',method)==1; % Wilcoxon signed-rank test switch (1=on) wilcoxsrtest=1; wilcoxsrtestprint=1; end; if strcmp('vdwaerden',method)==1; % Van Der Waerden normal scores test switch (1=on) vdwaerdentest=1; wilcoxsrtest=1; vdwaerdentestprint=1; end; if strcmp('sign',method)==1; % Sign test switch (1=on) signtest=1; signtestprint=1; end; if strcmp('runsrandom',method)==1; % Runs test for randomness switch (1=on) runsrandomtest=1; runsrandomtestprint=1; end; if strcmp('pitmanind',method)==1; % Wilcoxon rank-sum test switch (1=on) pitmanindtest=1; pitmanindtestprint=1; independentsw=1; end; if strcmp('wilcoxrsum',method)==1; % Wilcoxon rank-sum test switch (1=on) wilcoxrsumtest=1; wilcoxrsumtestprint=1; independentsw=1; end; if strcmp('wmwrsum',method)==1; % rank-sum test switch (1=on) wmwrsumtest=1; wmwrsumtestprint=1; independentsw=1; end; if strcmp('kendallrank',method)==1; % Kendall Rank Correlation Coefficient (1=on) kendallranktest=1; kendallranktestprint=1; independentsw=1; end; %%% Switch section END %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Data section BEGIN %%% vector data [numrowdata,numcoldata]=size(data); % make column vectors if numcoldata>numrowdata; data=data'; [numrowdata,numcoldata]=size(data); end; %%% vector data2 [numrowdata2,numcoldata2]=size(data2); % make column vectors if numcoldata2>numrowdata2; data2=data2'; [numrowdata2,numcoldata2]=size(data2); end; if min(numrowdata,numcoldata) > 1 | min(numrowdata2,numcoldata2) > 1; data error('Data must be vector data (not matrix data).'); end; if max(numrowdata,numcoldata) == 1; data error('Data must be vector data (one value is meaningless).'); end; if numrowdata2 == 1; singlesamplesw=1; % single sample statistics only else; singlesamplesw=0; end; if independentsw == 0; if numrowdata2 == numrowdata; pairedsamplesw=1; % paired sample statistics available else; pairedsamplesw=0; if numrowdata2 ~= 1; error('Paired tests require the data vectors to have the same number of elements.'); end; end; end; dataorg=data; % Retain original values of data data2org=data2; % Retain original values of data runsrandomdataorg=data; % Retain original values of data if independentsw==0; if pairedsamplesw==1; % two sample case data=data2-data; % Compute difference datadiff=data-testmedian; end; data=data-testmedian; % Compute difference end; k=length(data); % k = number of var k2=length(data2); % k2 = number of var %%% Runs Random BEGIN if runsrandomtest==1; %%% this must be done before sorting occurs [runsrandompval,runsrandompval1,runsrandompval2,runsrandomnormalpval,numruns]=npar_runsrandom(data,k); end; %%% Runs Random END data=sort(data); % Sort data data2=sort(data2); % Sort data %%% Data section END %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Histogram section BEGIN if histogramsw==1; figure; hist(dataorg); title('Histogram of vector dataorg'); %print fig1 %print -depsc fig1 if pairedsamplesw==1; figure; hist(data2org); title('Histogram of vector data2org'); figure; hist(data); title('Histogram of vector data'); end; end; %%% Histogram section END %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Print the results section BEGIN fprintf('================================================================================\n'); fprintf('Nonparametric Statistics Toolbox for Matlab by Erik Erhardt\n\n'); fprintf('Note: All p-values are one-tailed (unless stated otherwise).\n') fprintf(' Multiply by 2 for two-tailed test p-value.\n'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Wilcox signed-rank if wilcoxsrtest==1; [data,k]=npar_wilcoxsr(data,k); pitmantest=1; % turn on pitman test switch now that the data have been converted to ranks end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Van Der Waerden normal scores if vdwaerdentest==1; [data,k]=npar_vdwaerden(data,k); end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Sign if signtest==1; [datasign,signs,signpval,signnormalpval]=npar_sign(data,k,dataorg); end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Pitman if pitmantest==1; printn=2^k; nmaxcompare=k*2^k; if nmaxcompare>nmax; % if k too large for exact results, normal approximation only exact=0; else; exact=1; fprintf('\nNote: 2^%i=%i combinations will be performed, patience may be needed.',k,printn); end; [spit,statm,sminus,pval1,statp,splus,pval2,n,pitmannormalpval]=npar_pitman(data,k,exact); end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Pitman Monte Carlo if pitmanmctest==1; [mcpval,mcsplus]=npar_pitmanmc(data,k); end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Wilcox rank-sum (independent samples) if wilcoxrsumtest==1; [data,data2,k,k2]=npar_wilcoxrsum(data,data2,k,k2); pitmanindtest=1; % turn on pitmanind test switch now that the data have been converted to ranks end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Pitman (independent samples) if pitmanindtest==1; printn=nchoosek(k+k2,k); nmaxcompare=k*nchoosek(k+k2,k); if nmaxcompare>nmax; % if k too large for exact results, normal approximation only exact=0; else; exact=1; fprintf('\nNote: %i choose %i=%i combinations will be performed, patience may be needed.',k+k2,k,printn); [pitind,meansmall,datasmallsum,u1,pval1,datalargesum,u2,pval2,pitmanindnormalpval]=npar_pitmanind(data,data2,k,k2,exact); end; end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Wilcoxon-Mann-Whitney rank-sum (independent samples) if wmwrsumtest==1; printn=nchoosek(k+k2,k); nmaxcompare=k*nchoosek(k+k2,k); if nmaxcompare>nmax; % if k too large for exact results, normal approximation only exact=0; [unstat,umstat,u1,pval1,u2,pval2,wmwnormalpval]=npar_wmwrsum(data,data2,k,k2,exact); else; exact=1; fprintf('\nNote: %i choose %i=%i combinations will be performed, patience may be needed.',k+k2,k,printn); [unstat,umstat,u1,pval1,u2,pval2,wmwnormalpval]=npar_wmwrsum(data,data2,k,k2,exact); end; end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Kendall Rank Correlation Coefficient (dependent samples) if kendallranktest==1; data=dataorg; % Use unsorted original values of data data2=data2org; % Use unsorted original values of data printn=factorial(k); nmaxcompare=factorial(k); if nmaxcompare>nmax; % if k too large for exact results, normal approximation only exact=0; [tkstat,pval2,pval1,tknormalpval]=npar_kendallrank(data,data2,k,k2,exact); else; exact=1; fprintf('\nNote: %i!=%i permutations will be performed, patience may be needed.',k,printn); [tkstat,pval2,pval1,tknormalpval]=npar_kendallrank(data,data2,k,k2,exact); end; end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if pitmantestprint==1; fprintf('\n================================================================================\n'); fprintf('Pitman Test Results: \n'); if pairedsamplesw==1; printdatadiff=datadiff'; printdatadiff else; printdataorg=dataorg'; printdataorg end; printdata=data'; printdata if exact==0; fprintf('n=%i gives %i comparisions with array size %i which is > %i is max elements in array. \n',k,printn,nmaxcompare,nmax); fprintf('Exact results not available, Normal approximation only. \n\n'); else; fprintf('Median %5.2f \n\n',testmedian); fprintf('n=%i \n\n',k); fprintf('Order stat: %i , S-: %i , p-value: %10.9f \n',statm,sminus,pval1); fprintf('Order stat: %i , S+: %i , p-value: %10.9f \n',statp,splus ,pval2); end; fprintf('Normal approximation with continuity correction p-value: %10.9f \n',pitmannormalpval); end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if pitmanmctestprint==1; fprintf('\n================================================================================\n'); fprintf('Pitman Monte Carlo Test Results: \n'); if pairedsamplesw==1; printdatadiff=datadiff'; printdatadiff else; printdataorg=dataorg'; printdataorg end; %printdata=data'; %printdata fprintf('Median %5.2f \n\n',testmedian); fprintf('n=%i \n\n',k); fprintf('Right-tail p-value: %10.9f \n',mcpval); end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if wilcoxsrtestprint==1; fprintf('\n================================================================================\n'); fprintf('Wilcoxon Signed-Rank Test Results: \n'); if pairedsamplesw==1; printdatadiff=datadiff'; printdatadiff else; printdataorg=dataorg'; printdataorg end; printdata=data'; printdata fprintf('Median %5.2f \n\n',testmedian); fprintf('n=%i \n\n',k); fprintf('Order stat: %i , S-: %i , p-value: %10.9f \n',statm,sminus,pval1); fprintf('Order stat: %i , S+: %i , p-value: %10.9f \n',statp,splus ,pval2); fprintf('Normal approximation with continuity correction p-value: %10.9f \n',pitmannormalpval); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Wilcoxon Confidence Intervals based on Walsh Averages fprintf('\n========================================\n'); fprintf('Wilcoxon Signed-Rank Confidence Intervals using Walsh averages: \n'); if pairedsamplesw==1; dataorg=datadiff; end; npar_wilcoxsr_ci(dataorg,k,n,spit) end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if vdwaerdentestprint==1; fprintf('\n================================================================================\n'); fprintf('Van Der Waerden normal scores Test Results: \n'); if pairedsamplesw==1; printdatadiff=datadiff'; printdatadiff else; printdataorg=dataorg'; printdataorg end; printdata=data'; printdata fprintf('Median %5.2f \n\n',testmedian); fprintf('n=%i \n\n',k); fprintf('Order stat: %i , S-: %i , p-value: %10.9f \n',statm,sminus,pval1); fprintf('Order stat: %i , S+: %i , p-value: %10.9f \n',statp,splus ,pval2); end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if signtestprint==1; fprintf('\n================================================================================\n'); fprintf('Sign Test Results: \n'); if pairedsamplesw==1; printdatadiff=datadiff'; printdatadiff else; printdataorg=dataorg'; printdataorg end; printsign=datasign(:,2)'; printsign fprintf('Median %5.2f \n\n',testmedian); fprintf('n=%i \n\n',k); fprintf('Number of signs: %i , p-value: %10.9f \n',signs,signpval); fprintf('Normal approximation with continuity correction p-value: %10.9f \n',signnormalpval); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Sign Confidence Intervals fprintf('\n========================================\n'); fprintf('Sign Confidence Intervals: \n'); if pairedsamplesw==1; % two sample case dataorg=datadiff; end; npar_sign_ci(data,k,dataorg); end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if runsrandomtestprint==1; fprintf('\n================================================================================\n'); fprintf('Runs Test for Randomness Results: \n'); printdataorg=runsrandomdataorg'; printnumruns=numruns; printdataorg printnumruns fprintf('%i runs in %i dichotomous data p-value: %10.9f \n',numruns,k,runsrandompval); fprintf('Left-tail p-value: %10.9f \n',runsrandompval1); fprintf('Right-tail p-value: %10.9f \n',runsrandompval2); fprintf('Using Normal approximation with continuity correction.\n'); fprintf('n=%i , runs=%i , p-value: %10.9f \n',k,numruns,runsrandomnormalpval); end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if pitmanindtestprint==1; fprintf('\n================================================================================\n'); fprintf('Pitman Test (Independent Samples) Results: \n'); printdataorg=dataorg'; printdata2org=data2org'; printdataorg printdata2org if exact==0; fprintf('n=%i gives %i comparisions with array size %i which is > %i is max elements in array. \n',k,printn,nmaxcompare,nmax); fprintf('No results are available. \n\n'); else; fprintf('Mean of %i values chosen %i at a time: %5.2f \n\n',k+k2,k,meansmall); fprintf('Sum of smaller data set: %5.2f , larger data set: %5.2f \n\n',datasmallsum,datalargesum); fprintf(' Left tail has %i at least as extreme, p-value: %10.9f \n',u1,pval1); fprintf('Right tail has %i at least as extreme, p-value: %10.9f \n',u2,pval2); fprintf('Norm cont corr may not be appropriate -- need to check\n'); fprintf('Normal approximation with continuity correction p-value: %10.9f \n',pitmanindnormalpval); end; end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if wilcoxrsumtestprint==1; fprintf('\n================================================================================\n'); fprintf('Wilcoxon Rank-Sum Test (Independent Samples) Results: \n'); printdataorg=dataorg'; printdata2org=data2org'; printdataorg printdata2org fprintf('Mean of %i values chosen %i at a time: %5.2f \n\n',k+k2,k,meansmall); fprintf('Sum of smaller data set: %5.2f , larger data set: %5.2f \n\n',datasmallsum,datalargesum); fprintf(' Left tail has %i at least as extreme, p-value: %10.9f \n',u1,pval1); fprintf('Right tail has %i at least as extreme, p-value: %10.9f \n',u2,pval2); fprintf('Norm cont corr may not be appropriate -- need to check\n'); fprintf('Normal approximation with continuity correction p-value: %10.9f \n',pitmanindnormalpval); % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %%% Wilcoxon Confidence Intervals based on Walsh Averages % fprintf('\n========================================\n'); % fprintf('Wilcoxon Signed-Rank Confidence Intervals using Walsh averages: \n'); % if pairedsamplesw==1; % dataorg=datadiff; % end; % npar_wilcoxsr_ci(dataorg,k,n,pitind); end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if wmwrsumtestprint==1; fprintf('\n================================================================================\n'); fprintf('Wilcoxon-Mann-Whitney Rank-Sum Test (Independent Samples) Results: \n'); printdataorg=dataorg'; printdata2org=data2org'; printdataorg printdata2org if exact==0; fprintf('n=%i gives %i comparisions with array size %i which is > %i is max elements in array. \n',k+k2,printn,nmaxcompare,nmax); fprintf('Normal approximation available. \n\n'); fprintf('Normal approximation with continuity correction p-value: %10.9f \n',wmwnormalpval); else; fprintf('Um stat: %5.2f , has %i at least as extreme, p-value: %10.9f \n',umstat,u1,pval1); fprintf('Un stat: %5.2f , has %i at least as extreme, p-value: %10.9f \n',unstat,u2,pval2); fprintf('Un stat seems to match StatXact value in S&S book, Um does not.\n'); %fprintf('Un stat: %5.2f , Um stat: %5.2f \n\n',unstat,umstat); %fprintf(' Left tail has %i at least as extreme, p-value: %10.9f \n',u1,pval1); %fprintf('Right tail has %i at least as extreme, p-value: %10.9f \n',u2,pval2); %fprintf('Norm cont corr may not be appropriate -- need to check\n'); fprintf('Normal approximation with continuity correction p-value: %10.9f \n',wmwnormalpval); end; end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if kendallranktest==1; fprintf('\n================================================================================\n'); fprintf('Kendall Rank Correlation Coefficient Test Results: \n'); printdataorg=dataorg'; printdata2org=data2org'; printdataorg printdata2org if exact==0; fprintf('n=%i gives %i comparisions with array size %i which is > %i is max elements in array. \n',k,printn,nmaxcompare,nmax); fprintf('Exact results not available, Normal approximation only. \n\n'); else; fprintf('t_k: %10.9f \n',tkstat); fprintf(' Left tail (positive correlation) p-value: %10.9f \n',pval1); fprintf('Right tail (negative correlation) p-value: %10.9f \n',pval2); end; %fprintf('Normal approximation with continuity correction p-value: %10.9f \n',pitmannormalpval); end; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if normalciprint==1; %%% Normal Confidence Intervals fprintf('\n========================================\n'); fprintf('Normal Confidence Intervals (inappropriate for nonnormal data): \n'); normalmean=mean(dataorg); normalstd=std(dataorg)/sqrt(k); for i=1:10; siglevel=(i/100); normerror=norminv(1-siglevel/2,0,1); normalcil = normalmean-normalstd*normerror; normalciu = normalmean+normalstd*normerror; fprintf('%6.5f Confidence Limit on the Mean %6.5f: (%6.5f,%6.5f) \n',1-siglevel,normalmean,normalcil,normalciu); end; %%% Normal Confidence Intervals (t-distribution) fprintf('\n========================================\n'); fprintf('t-distribution Confidence Intervals (inappropriate for nonnormal data): \n'); for i=1:10; siglevel=(i/100); normerror=tinv(1-siglevel/2,k-1); normalcil = normalmean-normalstd*normerror; normalciu = normalmean+normalstd*normerror; fprintf('%6.5f Confidence Limit on the Mean %6.5f: (%6.5f,%6.5f) \n',1-siglevel,normalmean,normalcil,normalciu); end; end; fprintf('================================================================================\n'); % Print the results section END %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % end timer timeelapsed=toc; fprintf('Time elapsed: %8.2f seconds.\n',timeelapsed); diary('off'); fprintf('Results appended to file: npar_out.txt\n'); % end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%