*! version 3.1.0 03-Aug-94. (sg26.3: STB-25) program define fpgen version 3.1 local varlist "req ex max(1)" local if "opt" local in "opt" #delimit ; local options "POwers(string) NAme(string) Index(integer 1) EXPx(string) ORIgin(string) REPLACE Zero *" ; #delimit cr parse "`*'" if "`powers'"=="" { di in red "no powers given" exit 198 } tempvar p qui gen `p' = . _jprfppp `p' "`powers'" 1 0 local np $S_1 parse "`varlist'", parse(" ") if "`name'"=="" { local name = substr("`varlist'", 1, 6) /* 6 chars max */ } tempvar x lnx local small 1e-6 quietly { gen `x' = `varlist' `if' `in' gen `lnx' = . local lin = (`np'==1 & `p'[1]==1) if `lin' { local zero } /* don't map <=0 to 0 */ _jprfpxo `x' `lnx' `lin' "`expx'" "`origin'" "`zero'" local nobs $S_1 local zeta $S_2 local shift $S_3 local h0 1 local plast 0 local hlast "h0" 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' { if abs(`pj')<`small' { gen ``hj'' = `lnx' local `nj' "ln(`varlist')" } else if abs(`pj'-1)<`small' { gen ``hj'' = `x' local `nj' `varlist' } else { gen ``hj''=cond(`x'==0,0,`x'^`pj') local `nj' "`varlist'^`pj'" } } else { gen ``hj'' = `lnx'*``hlast'' if `j'==1 { local `nj' "ln(`varlist')" } else local `nj' "`nlast'*ln(`varlist')" } local hlast `hj' local plast `pj' local nlast ``nj'' local h "`h' ``hj''" local j = `j'+1 } } local j 0 if `index'+`np'>99 { local index = 99-`np' } global S_1 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' } rename ``hj'' `xj' lab var `xj' "``nj''" global S_1 "$S_1 `xj'" } if `shift' { di "`varlist' transformed to `varlist' + (" %9.0g `zeta' "). } end