*! findobs -- find observation number that satisfies if/in conditions *! version 1.0 Sean Becketti October 1995 (STB28: ip10) program define findobs quietly { version 4.0 local if "opt pre" local in "opt pre" local options "Instance(str)" parse "`*'" if "`instanc'"=="" { local instanc 1 } cap conf integer n `instanc' if _rc { noi di in re "instance() must be an integer" error 98 } if "`instanc'"=="-0" { local reverse 1 local i 0 } else { local reverse = `instanc'<0 local i = abs(`instanc') } tempvar event obsnum use mark `use' `if' `in' local prev "_n-1" if `reverse' { local prev "_n+1" local order : sortedby if "`order'"=="" { tempvar j gen long `j' = _n local order "`j'" } local resort "sort `order'" tempvar rev gen long `rev' = - _n sort `rev' } local zero = 0 if `i'==0 { local zero = 1 local i = 1 } gen long `event' = sum(`use') if `event'[_N]<`i' { local Result = . `resort' } else { `resort' gen long `obsnum' = sum(cond(`event'==`i'&`event'[`prev']!=`i',_n,0)) local Result = `obsnum'[_N] if `zero' { local k = `Result' + cond(`reverse',1,-1) local Result = cond((`k'>0) & (`k'<=_N),`k',.) } } } /* end quietly */ if "`Result'"!="." { cap _ts_gdat `Result' if _rc { local d "`Result'" } else { local d "$S_1" } global S_2 global S_3 cap conf integer n `d' if !_rc { di in ye "`d'" } else { di in ye "`d' (`Result')" global S_2 "`d'" } global S_1 "`Result'" } else { global S_1 global S_2 global S_3 } end