program define friedman version 2.1 *! version 1.01 17 July 1991 (now works with > 43 variables if "%_*"=="" { di in red "invalid syntax -- see help friedman" exit 198 } mac def _varlist "req ex min(2)" mac def _if "opt" mac def _in "opt" parse "%_*" parse "%_varlist", parse(" ") qui count %_if %_in mac def _obs=_result(1) mac def _sor="%_1" while ("%_1"!="") { mac def _it=%_it + 1 genrank r%_it=%_1 %_if %_in qui sort %_sor qui summ r%_it %_if %_in if (_result(1)<%_obs) { di in red "missing values not allowed -- see help friedman" drop r* exit } mac shift } genvsum r*, gen(sum_rs) gen sum_rssq=sum_rs^2 qui gen _rsq=cond(_n==_N,sum(sum_rssq),.) mac def _k=%_it mac def _S=_rsq[_N]-(((%_k^2)*%_obs*(%_obs+1)^2)/4) mac def _F=(12*%_S)/(%_k*%_obs*(%_obs+1)) mac def _W=(12*%_S)/((%_k^2)*%_obs*(%_obs^2-1)) mac def _prob=%_k*(%_obs-1)*%_W di "Friedman = "%8.4f %_F di "Kendall = "%8.4f %_W di "p-value = "%8.4f chiprob(%_obs-1,%_prob) drop r* sum_r* _rsq end