*! version 2.9.0 28mar2017
program define fisid
	syntax varlist [if] [in], [Missok Show]
	loc show = ("`show'" != "")
	loc missok = ("`missok'" != "")

	marksample touse, novar

	if (!`missok') {
		qui cou if `touse'
		loc N = r(N)
		markout `touse' `varlist', strok
		qui cou if `touse'
		if r(N) < `N' {
			local n : word count `varlist'
			local var = cond(`n'==1, "variable", "variables")
			di as err "`var' `varlist' should never be missing"
			exit 459
		}
	}

	mata: fisid("`varlist'", "`touse'", `missok')

	if (!`ok') {
	        loc n : word count `varlist'
	        loc var  = cond(`n'==1, "variable", "variables")
	        loc does = cond(`n'==1, "does", "do")
	        loc msg `var' `varlist' `does' not ///
	        	uniquely identify the observations
	        di as err "`msg'"
	        exit 459
	}
end

mata:
void fisid(string rowvector varnames,
         | string scalar touse,
           real scalar show)
{
	class Factor scalar		F
	real scalar				ok

	F = factor(varnames, touse, 0, "", 0, 1, ., 0)
	ok = F.is_id()
	st_local("ok", strofreal(ok))
}
end


findfile "ftools.mata"
include "`r(fn)'"
exit