*! version 1.0.3 SV/JBC 17 Sept 1997 after Ramalheira/Gould/Cox
program define gmci
	version 5.0
	local varlist "req ex"
	local if "opt"
	local in "opt"
    	local weight "aweight fweight"
	local options "Level(int $S_level) Add(real 0) Only"
	parse "`*'"

	parse "`varlist'", parse(" ")
	if `add' < 0 { 
	di in r "A negative value cannot be added." 
	exit 198
	}
	if `level'<10 | `level'>99 {
	  dis in red "level() invalid"
	  exit 198
	  }
	tempvar var1 junk

	local i 0
	while "`*'"!="" {
	    qui gen `var1' = `1' + `add'
	    qui su `var1' [`weight' `exp'] `if' `in'
	    local min=_result(5)
	      if `min' <= 0 {
 		  if "`if'"=="" {
		    qui su `1' [`weight' `exp'] `in' if `1'>0
			}
	 	  else {
		    qui su `1' [`weight' `exp'] `if' & `1'>0 `in'
			}
		local minpos=_result(5)
		  if `add' > 0 {
	            di in r "Nonpositive values still encountered in variable `1'." 
		    di in r "Minimum value of (`1'+`add') is " %4.1g `min' /*
		     */", minimum positive value of `1' is " %4.1g `minpos'
		          }
		  if `add' == 0 {
	            di in r "Nonpositive values encountered in variable `1'." 
		    di in r "Minimum value of `1' is " %4.1g `min' /*
		     */", minimum positive value of `1' is " %4.1g `minpos'
		          }
		local i 1
	    	}
	    drop `var1'
	    mac shift
	}

	if `i' == 1 {
		exit 411
	  }

	parse "`varlist'", parse(" ")

	di " "
	di in gr "  Variable  |    Obs     Geometric Mean           [" /*
		*/ `level' "%"   /*
		*/ " Conf. Interval]"
	di in gr "------------+" _dup(59) "-"

	local msg 0

	while "`1'" ~= "" {
	qui su `1' [`weight' `exp'] `if' `in'
	  if _result(5) > 0 & "`only'"~="" {
		qui gen `var1' = `1'
		local star  ""
				}
	  else {	
	   	qui gen `var1' = `1' + `add'
		local msg 1
		local star *
			}
		qui gen `junk' = ln(`var1') `if' `in'
		qui ci `junk' [`weight' `exp'] `if' `in' , /*
			*/ `options' level(`level')
		if `add'==0 { local star = "" } 
		local namelen = 10 - length("`1'") 
		display in ye _dup(`namelen') " " "`1'" _col(13) /*
		*/in gr "|"  in ye _col(16) %5.0f _result(1)  /*
		*/ in ye _col(27) %12.5f exp($S_3) /*
		*/ in ye "      " in ye _col(45) %12.5f exp($S_5) /*
		*/ in ye _col(59) %12.5f exp($S_6) in w " `star'"

	global S_3 = exp($S_3)
    	global S_4 = exp($S_4)
    	global S_5 = exp($S_5)
    	global S_6 = exp($S_6)
	drop `var1' `junk'
	mac shift
	}

di " "
if `msg'~=0 & `add' >0 {
	di in gr "(" in w "*" in gr ") `add' was added to the " /*
		*/ "variable(s) prior to calculating the results" 
	}
	
end