*! 1.0.1 NJC 14 Nov 2002
program define cij, rclass byable(recall)
	version 7
	global S_1		/* # obs	*/
	global S_3		/* mean		*/
	global S_4		/* se of mean	*/
	global S_5		/* lower bound	*/
	global S_6		/* upper bound	*/

	syntax [varlist] [if] [in] [fw] [, Level(integer $S_level)  /*
	*/ BY(varlist) beta(numlist min=2 max=2 >0) Total ]

	if "`by'"!="" {		/* backwards compatibility */
		if _by() {
			di in red /*
			*/ "by() option may not be combined with by prefix"
			exit 190
		}
		if "`weight'" != "" {
			local wgt `"[`weight'`exp']"'
		}
		if "`level'" != "" {
			local level "level(`level')"
		}
		by `by': cij `varlist' `if' `in' `wgt', `level' `total'
		exit
	}

	if "`total'" != "" & !_by() {
		di in red "option total may only be specified with by"
		exit 198
	}

	if `level'<10 | `level'>99 {
		di in red "level() invalid"
		exit 198
	}

	tempvar touse
	mark `touse' [`weight'`exp'] `if' `in'

	if _by() & _bylastcall() & "`total'"!="" {
				/* set alluse for later use */
		tempvar alluse
		mark `alluse' [`weight'`exp'] `if' `in', noby
	}

	local weight "[`weight'`exp']"
	tempvar BYGRP
	if "`beta'" == "" {
		local beta "0.5 0.5"
	}
	else local supplied "supplied"

	di
	Ci `varlist' `weight' if `touse', level(`level') beta(`beta') `supplied'
	ret add  /* add return values from Ci */

	if _by() & _bylastcall() & "`total'"!="" {
		di _n in gr _dup(79) "_" _n "-> Total"
		if "`level'"!="" {
			local level "level(`level')"
		}
		cij `varlist' if `alluse' `weight', `level'
		return clear
		ret add
	}
end

/*
	In program Ci, we know the `if' is resolved to a touse variable
	and marks out everything except the missing values of the
	variables.  Therefore, we do not reduce it again but just use `if'
*/

program define Ci, rclass
	version 7
	syntax varlist [fw] [if] [, Level(integer $S_level) beta(string) supplied]

	local a : word 1 of `beta'
	local b : word 2 of `beta'

	tempname lb ub
	tempvar tousex
	local ttl "    Mean"
	local tl1 "    Obs "
	local txt = cond("`supplied'" != "", "Supplied", "Jeffreys")
	di in smcl in gr _col(56) "{hline 2} `txt' Prior {hline 2}"

	#delimit ;
	di in smcl in gr
"    Variable {c |} `tl1'    `ttl'    Std. Err.       [`level'% Conf. Interval]"
	_n "{hline 13}{c +}{hline 61}" ;
	#delimit cr
	global S_1 0
	global S_2 .
	global S_3 .
	global S_4 .
	global S_5 .
	global S_6 .

	tokenize `varlist'
        while ("`1'"!="") {
		local toprt 1
		capture confirm string var `1'
		if _rc==0 {
			local toprt 0
		}
		else {
			capture assert `1'==0 | `1'==1 | `1'==. `if'
			if _rc {
				local toprt 0
			}
			else {
				sum `1' [`weight'`exp'] `if', meanonly
				local n = r(N)
				local k = r(sum)
				ret scalar N = `n'
				ret scalar mean = `k'/`n'
				ret scalar se=sqrt((return(mean)* /*
					*/ (1-return(mean)))/`n')
				if `k' == 0 {
					scalar `lb' = 0
				}
				else {
				        scalar `lb' = /*
*/ invFtail(2 * (`k' + `a'), 2 * (`n' - `k' + `b'), (100 + `level') / 200)
			        	scalar `lb' = /*
*/ ((`k' + `a') * `lb') / (`n' - `k' + `b' + ((`k' + `a') * `lb'))
				}
				if `k' == `n' {
					scalar `ub' = 1
				}
				else {
				        scalar `ub' = /*
*/ invFtail(2 * (`k' + `a'), 2 * (`n' - `k' + `b'), (100 - `level') / 200)
			        	scalar `ub' = /*
*/ ((`k' + `a') * `ub') / (`n' - `k' + `b' + ((`k' + `a') * `ub'))
				}
				ret scalar lb = `lb'
				ret scalar ub = `ub'
				/* double save in S_# and r() */
				global S_1 `return(N)'
				global S_3 `return(mean)'
				global S_4 `return(se)'
				global S_5 `return(lb)'
				global S_6 `return(ub)'
			}
			if `toprt' {
				local fmt : format `1'
				if substr("`fmt'",-1,1)=="f" {
					local ofmt="%9."+substr("`fmt'",-2,2)
				}
				else if substr("`fmt'",-2,2)=="fc" {
					local ofmt="%9."+substr("`fmt'",-3,3)
				}
				else	local ofmt "%9.0g"
				di in smcl in gr /*
				*/ %12s abbrev("`1'",12) " {c |}" _col(14) /*
				*/ in yel %8.0f return(N) /*
		 		*/ _col(27) `ofmt' return(mean) /*
		 		*/ _col(39) `ofmt' return(se) /*
		 		*/ _col(55) `ofmt' return(lb) /*
		 		*/ _col(67) `ofmt' return(ub) in gr "`mark'"
			}
		}
		mac shift
	}
end
exit