program def avplot3, sort
*! avplot3  1.0.0  cfb  2315  
*! from regplot 1.2.0 NJC 19 Sept 2001 
	version 7.0

* use notion that SEP(varname) will be e.g. cat, with dummies labelled cat1,...
* and interactions with VARLIST(varname) being cat1xVAR; assume constant in 
* regression

	syntax varlist(max=1 numeric default=none ts), SEParate(varname) /* 
	*/ [ Connect(str) L1title(str) Symbol(str) XLAbel XLAbel(str) /* 
	*/ YLAbel YLabel(str) TItle(str)  * /* 
	*/ ]

	* initial checking and picking up what -regress- type command 
	* leaves behind

	if "`e(cmd)'" == "anova" { 
		di as err "avplot3 not allowed after anova" 
		exit 498 
	}
	
	if "`e(depvar)'" == "" { 
		di as err "estimates not found" 
		exit 301 
	} 

	local ndepvar : word count `e(depvar)' 
	if `ndepvar' > 1 { 
		di as err "avplot3 not allowed after `e(cmd)'" 
		exit 498 
	} 	

* place interaction variable into xxx
	local xxx `varlist'
* get regressor list 
	tempname b 
	mat `b' = e(b) 
	local x : colnames `b' 
* find all that start with SEPname
	local lsep = length("`separate'")
	foreach v of local x {
		local imatch = match(substr("`v'",1,`lsep'),"`separate'")
		if `imatch' {
* determine whether they are interactions
			local jmatch = index("`v'","`xxx'")
			if `jmatch' {
				local xlist "`xlist' `v'"
				}
			if `imatch'+`jmatch'==1 {
						local seplist "`seplist' `v'"
						}
			}
	}
* create partial predictions: first for interaction terms
	local i 0
	foreach v of local xlist {
		local i = `i'+1
		tempvar yhat`i'
* get pre-interaction component for conditional generate
		local base = subinstr("`v'","x`xxx'","",1)
		qui g `yhat`i'' = _b[_cons] + _b[`v']*`v' if (`base')
		label var `yhat`i'' "`v'"
		local graphlist "`graphlist' `yhat`i''"
		local ell "`ell'l"
		local dot "`dot'."
* look for associated element in seplist to pick up constant
		foreach c of local seplist {
			local cmatch = index("`v'","`c'")
			if `cmatch' {
				qui replace `yhat`i'' = `yhat`i'' + _b[`c'] if (`base')
				}
			}
		}
* turn off dashing, rely on keyplot symbols
	local connect `ell'
	local ny `i'
* logic swiped from tsgraph
    if "`connect'" == "" { 
        if `ny' == 1 { local connect "L" } 
            else if `ny' == 2 { local connect "LL[_]" }
            else if `ny' == 3 { local connect "LL[_]L[-]" } 
            else if `ny' == 4 { local connect "LL[_]L[-]L[.]" } 
            else local connect : di _dup(`ny') "L" 
    }  

* graph the yhats versus the interaction variable
	local y "`e(depvar)'"
	keyplot `graphlist' `xxx', c(`connect')  varlbl ti("Predictions of `y' for categories of `xxx'") `options'
	exit 
end