********************************************************************************
* ratio_plot
********************************************************************************

program ratio_plot

version 11

syntax varlist(min=1 numeric)    	/// 
       [if]                      	/// 
	   [in],                    	///
	    Base(varname)    			///
	   [Over(varname)]    			///
	   [Title(string)]				///
	   [Sort]						///
	   [SCale]						///
	   [Graphopts(string asis)]  	

qui {	   
	   
	cap which coefplot
	if _rc == 111{
			
	display as err "	Sorry, this wrapper function requires the 'coefplot' package"
	display as err "	Prior to running this command, you need to run:" 
	display as err "	ssc install coefplot, replace"
	exit 198
}
	      	   	
* 	Temp files

	tempfile main
	save     `main', replace

* 	Sample indicator for mapping the [IF] [IN] conditions

	marksample touse, strok
	keep if `touse' == 1
	
	drop if missing(`varlist') | missing(`base')
	
* 	Locals	

	local p_title 	"Ratio graph" 
	local p_lab 	"#5"

	if "`title'" != "" {
   local p_title "`title'"
}

	if "`scale'" != "" {
   local p_lab "0(.2)1" 
}

	if "`over'" == "" {

	ratio `varlist'/ `base'

	scalar myratio = 			e(b)[1,1]
	scalar variance = 			e(V)[1,1]
	scalar st_error = 			sqrt(variance)
	scalar dof = 				e(df_r) 

	matrix R = 				(myratio, st_error, dof)
	mat  R = R'
	matrix colnames R = "Estimated Ratio"

	global call "(matrix(R), se(2) df(R[3,.]))"

}

	if "`over'" != "" {
	
	decode `over', 			gen(ratio_temp_var)
	encode ratio_temp_var, 	gen(ratio_temp_var2)

	global call
	
	ratio `varlist'/ `base', over(ratio_temp_var2)
	
	levelsof ratio_temp_var2, local(levels)

	foreach l of local levels {

	scalar myratio = 			e(b)[1,`l']
	scalar variance = 			e(V)[`l',`l']
	scalar st_error = 			sqrt(variance)
	scalar dof = 				e(df_r)
	
	local cat_obs = 			e(_N)[1,`l']

	matrix R`l' = 				(myratio, st_error, dof)
	mat  R`l' = R`l''    

    local c_label: label (ratio_temp_var2) `l'		
	local n_label = "`c_label' (n = `cat_obs')"

	matrix colnames R`l' = "`n_label'"
	
	global call "$call (matrix(R`l'), se(2) df(R[3,.]))"

}

}
	
	ratio `varlist'/ `base'
	scalar overall_ratio = 		e(b)[1,1]
	local rounded_ratio = 		round(overall_ratio, 0.01) 
	local obs =  				e(N)
	
	coefplot $call,   `sort'         		///
	ciopts(recast(rcap))                 	///
	title("`p_title'",  size(medium)) 		///
	subtitle("Overall ratio = `rounded_ratio', N = `obs'", size(small))    ///
	xlab(`p_lab')                      		///
	mlabel                              	///
	format(%9.2f)                       	///
	mlabposition(12)                    	///
	legend(off)								///
	`graphopts'     

	macro drop call

	use `main', clear
}	
end