*! NJGW 09jun2005
*! syntax:  [by varlist:] egen newvar = var1 var2 [if exp] [in exp]
*!           [ , covariance spearman taua taub ]
*! computes correlation (or covariance, or spearman correlation) between var1 and var2, optionally by: varlist
*!    and stores the result in newvar.
program define _gcorr
	version 8

	gettoken type 0 : 0
	gettoken g    0 : 0
	gettoken eqs  0 : 0
	syntax varlist(min=2 max=2) [if] [in] [, BY(string) Covariance Spearman taua taub ]

	if "`taua'`taub'`spearman'"!="" & "`covariance'"!="" {
		di as error "`taua'`taub'`spearman' and covariance are mutually exclusive"
		exit 198
	}

	local x : word count `taua' `taub' `spearman'
	if `x'> 1 {
		di as error "may only specify one of `taua' `taub' `spearman'"
		exit 198
	}

	if `"`by'"'!="" {
		local by `"by `by':"'
	}

	quietly {
		gen `type' `g' = .
		`by' GenCorr `varlist' `if' `in', thevar(`g') `covariance' `spearman' `taua' `taub'
	}

	if "`spearman'"!="" {
		local lab "Spearman Correlation"
	}
	else if "`taua'"!="" {
		local lab "Tau-A Correlation"
	}
	else if "`taub'"!="" {
		local lab "Tau-B Correlation"
	}
	else if "`covariance'" != "" {
		local lab "Covariance"
	}
	else {
		local lab "Correlation"
	}

	capture label var `g' "`lab' of `varlist'"
end

program define GenCorr, byable(recall)
	syntax varlist [if] [in] , thevar(string) [ covariance spearman taua taub ]
	marksample touse
	if "`covariance'"!="" {
		local stat "r(cov_12)"
	}
	else if "`taua'"!="" {
		local stat "r(tau_a)"
	}
	else if "`taub'"!="" {
		local stat "r(tau_b)"
	}
	else {					/* correlation and spearman */
		local stat "r(rho)"
	}

	if "`spearman'"!="" {
		local cmd spearman
	}
	else if "`taua'`taub'"!="" {
		local cmd ktau
	}
	else {
		local cmd corr			/* correlation and covariance */
	}

	cap `cmd' `varlist' if `touse' , `covariance'
	if !_rc {
		qui replace `thevar'=``stat'' if `touse'
	}
end