*! version 1.1.1 01/08/94 program define nptri version 3.1 parse "`*'", parse(",\ ") local r 1 local c 1 local cols . while ("`1'"!="" & "`1'"!=",") { if "`1'"=="\" { local r = `r' + 1 if `cols'==. { if (`c'<=2) { di in red "too few columns" exit 198 } local cols `c' } else { if (`c'!=`cols') { error 198 } } local c 1 } else { conf integer num `1' if `1'<0 { error 411 } local n`r'`c' `1' local c = `c' + 1 } mac shift } if (`c'!=`cols') { error 198 } local cols = `cols' - 1 local rows = `r' local options "REPLACE Midrank *" parse "`*'" if "`replace'"=="" & _N!=0 { preserve } capture { drop _all local obs 1 set obs 1 gen byte row = . gen byte col = . gen long pop = . local r 1 while (`r'<=`rows') { local c 1 while (`c'<=`cols') { set obs `obs' replace row = `r' in l replace col = `c' in l replace pop = `n`r'`c'' in l local obs = `obs' + 1 local c = `c' + 1 } local r = `r' + 1 } sort row tempvar rtot srt v egen `rtot'=sum(pop),by(row) sort row gen rank=row!=row[_n-1] gen `srt'=sum(`rtot'*rank) local N = `srt'[_N] by row:replace rank=`srt'[1]-(`rtot'-1)/2 if "`midrank'"!="" { sort col tempvar ctot sct egen `ctot'=sum(pop),by(col) sort col gen z=col!=col[_n-1] gen `sct'=sum(`ctot'*z) by col:replace z=`sct'[1]-(`ctot'-1)/2 replace z=z/`N' } else gen z = col gen `v'=sum(z*pop) local v1 = `v'[_N] replace `v'=sum(z^2*pop) local v2 = `v'[_N] replace `v'=sum(pop*(`rtot'^2-1)) local corr = `v'[_N] replace `v'=sum(z*pop*(rank-(`N'+1)/2)) local T_ET = `v'[_N] local V = (`N'+1)*(`N'*`v2'-(`v1'^2))/12 local adj = (1-`corr'/(`N'*(`N'^2-1))) local zstat = `T_ET'/sqrt(`V'*`adj') local pval = 2*( 1-normprob(abs(`zstat'))) noisily di in gr " z = " in ye %5.2f `zstat' in gr ", chi-squared(1) = " in ye %6.2f `zstat'^2 noisily di in gr " P>|z| = " in ye %6.4f `pval' global S_1 = `N' global S_3 = `zstat' global S_4 = `pval' } if _rc { drop _all exit `rc' } end