*! version 1.0.0 JPR 16-Sep-94. (sg26.3: STB-25) program define fpplot version 3.1 #delimit ; local options "FRom(string) TO(string) OBs(int 100) Connect(string) L1title(string) Symbol(string) POwers(string) COEffs(string) CONStant(string) EXPx(string) GENerat(string) LOG SCAle noGRaph *" ; #delimit cr parse "`*'" if "`from'`to'"=="" { if "$S_E_x"!="" { qui sum $S_E_x local from=_result(5) local to=_result(6) } else { di in red "you must supply from and to" exit 198 } } else { confirm number `from' confirm number `to' if `from'>=`to' { di in red /* */ "upper limit of X-range must exceed lower limit" exit 198 } } if `obs'<2 | `obs'>500 { di in red "obs must be between 2 and 500" exit 198 } tempvar p b x lnx y local oldobs=_N if `obs'>`oldobs' { qui set obs `obs' } qui gen `p' = . qui gen `b' = . local fp "$S_E_fp" if "`fp'"=="fp" { if "`powers'`coeffs'`constan'`expx'"!="" { di in blue "[ignoring current fractional polynomial model]" local fp } } if "`fp'"=="fp" { local expx $S_E_xpx cap local b0=_b[_cons] if _rc { local b0 0 } _jprfppp `p' "$S_E_pwrs" 1 0 local np $S_1 local pwrs "$S_3" local i 1 while `i'<=`np' { qui replace `b'=_b[${S_E_x}_`i'] in `i' local i = `i'+1 } } else { if "`powers'"=="" { di in red "no powers given" exit 198 } if "`coeffs'"=="" { di in red "no model coefficients given" exit 198 } if "`expx'"!="" { confirm number `expx' } if "`constan'"!="" { confirm number `constan' local b0 `constan' } else local b0 0 _jprfppp `p' "`powers'" 0 0 /* powers must be sorted */ if $S_2 { di in red "powers must be in increasing order" exit 198 } local np $S_1 local pwrs "$S_3" _jprfppp `b' "`coeffs'" 0 0 /* coeffs not to be sorted */ if $S_1!=`np' { di in red "numbers of powers and coefficients differ" exit 198 } } quietly { local m = (`to'-`from')/(`obs'-1) local a = `from'-`m' if "`expx'"!="" { gen `x' = exp(`expx'*(`m'*_n+`a')) in 1/`obs' } else if "`log'"!="" { local m = log(`to'/`from')/(`obs'-1) local a = log(`from')-`m' gen `x' = exp(`m'*_n+`a') in 1/`obs' } else gen `x' = `m'*_n+`a' in 1/`obs' gen `lnx'=log(`x') if "`fp'"=="fp" { _crcslbl `x' $S_E_rhs } else lab var `x' "X" local i 1 local h while `i'<=`np' { local hi "h`i'" tempvar `hi' gen ``hi''=. local h "`h' ``hi''" local i=`i'+1 } _jprfpgn `x' `lnx' `p' `np' `h' gen `y'=`b0' local i 1 while `i'<=`np' { replace `y'=`y'+`b'[`i']*`h`i'' local i = `i'+1 } sum `y' if "`scale'"!="" { /* transform Y to [0,1] */ replace `y'=(`y'-_result(5))/(_result(6)-_result(5)) } /* Determine local monotonicity status */ if (_result(5)==`y'[1] & _result(6)==`y'[`obs']) | /* */ (_result(6)==`y'[1] & _result(5)==`y'[`obs']) { global S_1 1 local mono "monotonic" } else { global S_1 0 local mono "non-monotonic" } } if "`symbol'"!="" { local symbol "symbol(`symbol')" } else local symbol "symbol(i)" if "`connect'"=="" { local connect "connect(l)" } else local connect "connect(`connect')" local progttl "Frac. poly. function (`pwrs')" if "`l1title'"=="" { local l1title "`progttl'" } label var `y' "`progttl'" if "`t1title'"=="" { local t1title /* */ "t1title(Locally `mono' on interval X = [`from', `to'])" } if "`expx'"!="" { qui replace `x' = `m'*_n+`a' in 1/`obs' } if "`graph'"=="" { graph `y' `x', `symbol' `connect' l1("`l1title'") /* */ `t1title' `options' if "`expx'"!="" { di in bl _n "Note: X transformed to exp(" /* */ %7.0g `expx' "*X), but X plotted untransformed." } } if "`generat'"!="" { local varlist "req new min(2) max(2)" parse "`generat'", parse(" ") rename `x' `1' rename `y' `2' } else if `obs'>`oldobs' { local o=`oldobs'+1 qui drop in `o'/l qui set obs `oldobs' } global S_1 `mono' end