*! 1.0.1 NJC 15 February 2002 
* 1.0.0 NJC 12 February 2001 
* version 1.0.7  14jan2000
program define xttrans2, rclass sort
	version 6
	syntax varname [if] [in] /*
	*/ [, Freq I(varname) T(varname) matcell(str) matrow(str) matcol(str) prob * ]

	if "`prob'" != "" & "`matcell'" == "" { 
		di in r "matcell() required" 
		exit 198 
	} 
	
	if "`matcell'" != "" { 
		if "`matrow'" == "" { tempname matrow } 
		if "`matcol'" == "" { tempname matcol } 
		local names "matrow(`matrow') matcol(`matcol')"  
		local mc "matcell(`matcell')" 
	} 	
	
	xt_iis `i'
	local ivar "`s(ivar)'"

	xt_tis `t'
	local tvar "`s(timevar)'"

	if "`freq'"!="" {
		local opts "row freq `mc' `names' `options'"
	}
	else	local opts "row nofreq `mc' `names' `options'"

	tempvar touse
	mark `touse' `if' `in'
	markout `touse' `varlist' `ivar' `tvar'

	tempvar was is
	quietly { 
		sort `ivar' `tvar' 
		by `ivar': gen float `was' = `varlist' if _n<_N
		by `ivar': gen float `is'  = `varlist'[_n+1] if _n<_N
		local lbl : var label `varlist'
		if "`lbl'"=="" { 
			local lbl "`varlist'"
		}
		label var `was' "`lbl'"  
		label var `is' "`lbl'"
		by `ivar': replace `touse'=0 if `touse'[_n+1]==0 & _n<_N
	}
	tabulate `was' `is' if `touse', `opts'

	if "`matcell'" != "" { 
		local rows = rowsof(`matcell')
		local cols = colsof(`matcell')
		local i = 1
		while `i' <= `rows' {
		        local thisr = `matrow'[`i',1]
		        local r "`r' `thisr'"
		        local i = `i' + 1
		}
		
		local i = 1
		while `i' <= `cols' {
		        local thisc = `matcol'[1,`i']
		        local c "`c' `thisc'"
		        local i = `i' + 1
		}

		mat rownames `matcell' = `r'
		mat colnames `matcell' = `c'
	} 	

	if "`prob'" != "" { 
		mat `matcell' = /*
		*/ inv(diag(`matcell' * J(`cols',1,1))) * `matcell'
	} 	
 
	ret add
end
exit