*! version 1.0.0  Philip Ryan  09 Dec 2000
*! extension to egen
*! calculate the row product of observations

program define _grprod
version 6
gettoken type 0 : 0
gettoken g    0 : 0
gettoken eqs  0 : 0
syntax varlist(min=2) [if] [in] [, PMiss(string)]
tempvar touse
mark `touse' `if' `in'
#delimit ;
if "`pmiss'" == "" {;
 local pmiss "ignore";
};
if "`pmiss'" != "missing" & "`pmiss'" != "1" & "`pmiss'" != "ignore" {;
displ in re "Syntax error: specify " in wh "pmiss(missing)" in re " or "
in wh "pmiss(1)"  in re " or " in wh "pmiss(ignore)";
 exit 198;
};
#delimit cr
quietly {
tokenize `varlist'
local nvar : word count of `varlist'
local nvar = `nvar' - 1
tempvar nmiss zflag sign
egen `nmiss' = rmiss(`varlist') if `touse'
gen `zflag' = cond(`1'==0,1,0) if `touse'
gen `sign' = cond(`1' != ., sign(`1'),1) if `touse'
gen double `g' = cond(`1'==.|`1'==0,0,log(abs(`1'))) if `touse'
mac shift
while "`1'"!="" {
replace `zflag' = `zflag' + cond(`1'==0,1,0) if `touse'
replace `g' = `g' + cond(`1'==.|`1'==0,0,log(abs(`1'))) if `touse'
replace `sign' = `sign' * cond(`1' != ., sign(`1'), 1) if `touse'
mac shift
}
replace `g' = exp(`g') * `sign' if `touse'
replace `g' = . if `nmiss' == `nvar' & `touse'
replace `g' = 0 if `zflag' & `touse'
if "`pmiss'" == "missing" {
replace `g' = cond(`nmiss' > 0, ., `g') if `touse'
}
else if  "`pmiss'" == "1" {
replace `g' = cond(`nmiss' == `nvar', 1, `g') if `touse'
}
}
end