*! v1.0.0 PR 09-Aug-94. (sg26.3: STB-25) program define _jprfpxo /* transform x if necessary. Deal with zeroes. */ version 3.1 local x `1' local lnx `2' local lin `3' /* 1 for m=1, powers=1 */ local expx "`4'" local origin "`5'" if "`6'"!="" & !`lin' { replace `x'=0 if `x'<=0 local ifxpos "if `x'>0" } if "`origin'"!="" { confirm num `origin' if `origin'<=0 | `origin'>=1 { noi di in red "origin must be between 0 and 1" exit 198 } } global S_2 global S_3 0 global S_4 quietly { count if `x'!=. global S_1 = _result(1) sum `x' `ifxpos' local xmin = _result(5) local xmax = _result(6) if "`expx'"!="" { if "`origin'"!="" { /* If origin is set, determine k from xmin and xmax */ local k=-log(`origin')/(`xmax'-`xmin') if "`expx'"=="-" { local expx=-`k' } else if "`expx'"=="+" { local expx `k' } else { di in red "invalid expx with origin" exit 198 } } else if "`expx'"=="sd" { local expx=-1/sqrt(_result(4)) } else { conf num `expx' } replace `x'=exp(`expx'*`x') `ifxpos' global S_4 `expx' } else if "`origin'"!="" { /* Transform X to set scaled origin to `origin'. */ loc zeta=(`xmin'-`origin'*`xmax')/(1-`origin') replace `x'=(`x'-`zeta')/(`xmax'-`zeta') `ifxpos' global S_2 `zeta' } if "`expx'"=="" & "`origin'"=="" & `xmin'<=0 & !`lin' { /* Shift x by rounding interval (min spacing) minus min of x. Note: this CANNOT HAPPEN if `zero' (`ifxpos') option is used, as any x <= 0 are mapped to 0 and remain 0 during FP operations; `xmin' is the min of the positive values of x. */ tempvar diff ord gen `ord' = _n /* save original order */ sort `x' gen `diff' = `x'-`x'[_n-1] sum `diff' if `diff'>0 local shift = _result(5)-`xmin' replace `x' = `x'+`shift' global S_2 `shift' global S_3 1 sort `ord' } if !`lin' { replace `lnx' = cond(`x'==0,0,log(`x')) } } end