*** start the program here capture program drop greedy program define greedy *! v1.1 gmh mar 04 syntax varname, Pscore(varname numeric) [Radius(real 1.0)] local treat `varlist' di " treat = |`treat'|" sort `pscore' *for priority in matching tempvar u order qui gen `u' = uniform() gsort - `treat' `u' qui gen `order' = _n if `treat' tempfile base matched global matched "`matched'" qui save `base', replace qui count if `treat'==1 di "Searching for matches for `r(N)' treated..." global N2match = r(N) sort `pscore' tempvar dif absdif thisp keepme qui gen `dif' = . qui gen `absdif' = . qui gen `thisp' = . qui gen `keepme'=. forvalues i = 1 / $N2match { qui sum `pscore' if `order'==`i' qui replace `dif' = (`pscore' - `r(mean)') qui replace `absdif' = abs(`dif') sort `treat' `absdif' if `absdif'[1]<`radius' { qui replace `keepme'= (`order' == `i') qui replace `keepme' = 1 in 1 preserve qui keep if `keepme' sort `treat' qui replace `dif' = - `dif'[1] in 2 gen _difference = `dif' egen matchedto = max(`order') drop `order' capture append using `matched' qui save `matched', replace restore qui drop if `keepme' } else { di " LOOP `i' DID NOT MATCH" } } use `matched', clear end