*! v 1.0.0 PR 20Feb99. STB-50 sg81.2 program define frac_ord, sclass version 6 sret clear syntax varlist(min=2) [if] [in] [aw fw pw iw] [, /* */ CMd(string) ORDer(string) FP01 * ] if "`cmd'"=="" { local cmd "regress" } if "`order'"=="" { di in red "order() must be specified" exit 198 } local order=substr("`order'",1,1) if "`order'"!="+" &"`order'"!="-" &"`order'"!="r" &"`order'"!="n" { di in red "invalid order()" exit 198 } tokenize `varlist' local lhs `1' mac shift local rhs `*' quietly { local Rhs tokenize `rhs' local i 1 while "``i''"!="" { local x`i' ``i'' if "`order'"=="+" | "`order'"=="-" { if "`fp01'"!="" { /* Allow log transformation if >2 distinct values */ inspect ``i'' `if' `in' if r(N_unique)>2 { tempvar lx`i' fracgen ``i'' 0 `if' `in' rename `r(names)' `lx`i'' local x`i' `x`i'' `lx`i'' } } } local Rhs `Rhs' `x`i'' /* `x`i'' has 1-2 vars */ local i=`i'+1 } if "`order'"=="+" | "`order'"=="-" { `cmd' `lhs' `Rhs' `if' `in' [`weight' `exp'], `options' } tempvar c n tempname p dfnum dfres stat gen `c'=. gen str8 `n'="" tokenize `rhs' local nx 0 while "`1'"!="" { local nx=`nx'+1 if "`order'"=="+" | "`order'"=="-" { capture test `x`nx'' /* linear or FP (0,1) */ local rc=_rc capture local se=_se[`1'] if `rc'!=0 | "`se'"=="0" { noi di in red /* */ "`1' not fitted so could not be tested" /* */ "---collinearity?" exit 1001 } scalar `dfnum'=_result(3) scalar `dfres'=_result(5) scalar `stat'=_result(6) if `dfres'==. { scalar `p'=chiprob(`dfnum',`stat') } else scalar `p' = fprob(`dfnum',`dfres',`stat') if "`order'"=="-" { /* reducing P-value */ replace `c'=-`p' in `nx' } else replace `c'=`p' in `nx' } replace `n'="`1'" in `nx' local n`nx' `1' mac shift } if "`order'"=="r" { replace `c'=uniform() in 1/`nx' } } if "`order'"!="n" { sort `c' } local names `lhs' local i 0 while `i'<`nx' { local i=`i'+1 local v=`n'[`i'] local names `names' `v' /* Store original position of variable i in list of RHS variables */ local j 0 while `j'<`nx' { local j=`j'+1 if "`v'"=="`n`j''" { local o`j' `i' local j `nx' } } } /* Store original positions of variables in pos1, pos2, ... */ local i 1 while `i'<=`nx' { sret local pos`i' `o`i'' local i=`i'+1 } sret local names `names' end