*! version 1.0.0 31May96. STB-34 sbe13 program define fracgen version 4.0 parse "`*'", parse(" ,") unabbrev `1', max(1) local v "$S_1" mac shift local done 0 while ("`1'" != "" & "`1'" != ",") & !`done' { cap confirm number `1' if !_rc { local powers "`powers' `1'" mac shift } else local done 1 } if "`powers'"=="" { di in red "powers required" exit 198 } local if "opt" local in "opt" #delimit ; local hidopts "NAme(string) Index(integer 1) EXPx(string) ORIgin(string) Zero noGEN" ; #delimit cr local options "noSCAling REPLACE `hidopts'" parse "`*'" tempname small scalar `small'=1e-6 tempvar p x lnx quietly gen `p' = . _fracpp `p' "`powers'" 1 0 local np $S_1 local names if "`name'"=="" { local name = substr("`v'", 1, 6) } quietly { gen `x' = `v' `if' `in' gen `lnx' = . local lin = (`np'==1 & `p'[1]==1) if `lin' { local zero } /* don't map <=0 to 0 */ _fracxo `x' `lnx' `lin' "`expx'" "`origin'" "`zero'" "`scaling'" if $S_3==0 { local shift 0 } else local shift $S_2 local expxest $S_4 local scale $S_5 local r `v' if "`expx'"!="" { local e=substr("$S_4",1,8) local r "exp(`e'*`r')" } if `shift'!=0 { local r "(`r'+`shift')" } if "`scaling'"!="noscaling" { if `scale'<1 { local scale=1/`scale' local r "`r'*`scale'" } else if `scale'>1 { local r "`r'/`scale'" } } if "`r'"!="`v'" { local vn x local where ": x = `r'" } else local vn `v' if "`gen'"=="nogen" { exit } local h0 1 local plast 0 local hlast "h0" local k 0 local j 1 while `j'<=`np' { local nj "n`j'" local hj "h`j'" tempvar `hj' local pj = `p'[`j'] if abs(`pj'-`plast')>`small' { /* not a repeated power */ if abs(`pj')<`small' { gen ``hj'' = `lnx' local `nj' "ln(`vn')" local k 1 local nlast } else { if abs(`pj'-1)<`small' { gen ``hj'' = `x' local `nj' `vn' } else { gen ``hj''=cond(`x'==0,0,`x'^`pj') local `nj' "`vn'^`pj'" } local k 0 local nlast "``nj''*" } } else { local k=`k'+1 if `j'==1 { gen ``hj'' = `lnx' } else { gen ``hj'' = `lnx'*``hlast'' } if `k'==1 { local `nj' "`nlast'ln(`vn')" } else { local `nj' "`nlast'ln(`vn')^`k'" } } local hlast `hj' local plast `pj' local j = `j'+1 } } local j 0 if `index'+`np'>99 { local index = 99-`np' } while `j'<`np' { local k = `j'+`index' local j = `j'+1 local hj "h`j'" local nj "n`j'" if `k'<10 { local k "_`k'" } local xj "`name'`k'" if "`replace'"!="" { capture drop `xj' } qui gen `xj'=``hj'' drop ``hj'' di in bl "-> gen `xj' = ``nj'' `if'`in'" lab var `xj' "``nj''`where'" local names "`names' `xj'" } if "`v'"!="`r'" { di in bl "where`where'" } global S_1 `names' global S_2 `shift' global S_3 `scale' global S_4 `expxest' end