program doseresponse_model, rclass
version 10.0

#delimit ;
syntax varlist(min=2 max=2) [if] [in] [fweight iweight pweight],
outcome(string)
[
cmd(string)
reg_type_t(string)
reg_type_gps(string)
interaction(int 1)
]
;
#delimit cr

if "`weight'" != ""{
tempvar wei
qui gen double `wei' `exp'
local w [`weight' = `wei']
}

tokenize `varlist'
marksample touse

local t:       word 1 of `varlist'
local gpscore: word 2 of `varlist'


#delimit ;
	if !("`cmd'"=="" | "`cmd'"=="regress" | "`cmd'"=="logit" | "`cmd'"=="probit" |
	     "`cmd'"=="ologit" | "`cmd'"=="oprobit"| "`cmd'"=="mlogit" | "`cmd'"=="mprobit") {;
#delimit cr
		di as error "The cmd of the outcome variable ''`cmd''' is not recognized"
		exit 198
	}


/*
	Assign default cmd for vars not so far accounted for.
	cmd is relevant only for vars requiring imputation, i.e. with >=1 missing values.
	Use logit if 2 distinct values, mlogit if 3-5, otherwise regress.
*/

	if ("`cmd'"==""){
				qui inspect `outcome' if `touse'
				local nuniq=r(N_unique)
				if `nuniq'==1 {
					noi di as err "only 1 distinct value of `outcome' found"
					exit 2000
				}
				if `nuniq'==2 {
					count if `outcome'==0 & `touse'==1
					if r(N)==0 | r(N)== _N{
						noi di as err "Binary variables must include at least one 0 and one 1"
						exit 198
					}
					local cmd logit
				}
				else if `nuniq'<=5 {
					local cmd mlogit
				}
				else local cmd regress
			}
			if "`cmd'"=="mlogit" {
				* With mlogit, if outcome  carries a score label,
				* drop it since it causes prediction problems
				local outcome_lab: value label `outcome'
				capture label drop `outcome_lab'
			}


if ("`cmd'"=="regress"){
di in green _newline(1)  "The outcome variable ''`outcome''' is a continuous variable"
}


if ("`cmd'"=="logit" | "`cmd'"=="probit"){
di in green _newline(1)  "The outcome variable ''`outcome''' is a binary variable"
}

if ("`cmd'"=="mlogit" | "`cmd'"=="mprobit"){
di in green _newline(1)  "The outcome variable ''`outcome''' is a categorical variable (Multinomial - polytomous)"
}

if ("`cmd'"=="ologit" | "`cmd'"=="oprobit"){
di in green _newline(1)  "The outcome variable ''`outcome''' is an ordinal variable"
}

qui gen `t'_sq = `t'^2
qui gen `gpscore'_sq = `gpscore'^2
qui gen `t'_`gpscore'  = `t'*`gpscore'
qui gen `t'_3 = `t'^3
qui gen `gpscore'_3 = `gpscore'^3


/* check reg_type & interaction*/

if !("`reg_type_t'"=="" | "`reg_type_t'"=="linear" | "`reg_type_t'"=="quadratic" | "`reg_type_t'"=="cubic") {
		di as error "Regression model `reg_type_t' is not recognized"
		exit 198
	}

if !("`reg_type_gps'"=="" | "`reg_type_gps'"=="linear" | "`reg_type_gps'"=="quadratic" | "`reg_type_gps'"=="cubic") {
		di as error "Regression model `reg_type_gps' is not recognized"
		exit 198
	}

if !(`interaction'== 1 | `interaction'==0){
		di as error "Interaction `interaction' not recognized"
		exit 198
	}

tempvar flag_model
qui gen `flag_model' = .

if ("`reg_type_t'"=="" | "`reg_type_t'"=="linear") {

if ("`reg_type_gps'"=="" | "`reg_type_gps'"=="linear") {
if (`interaction'== 0){
di in ye _newline(1)  "The regression model is: Y = T + GPS"
`cmd' `outcome' `t' `gpscore' [`weight'`exp']
qui replace `flag_model' = 1
}

if (`interaction'== 1){
di in ye _newline(1)  "The regression model is: Y = T + GPS + T*GPS"
`cmd' `outcome' `t' `gpscore' `t'_`gpscore' [`weight'`exp']
qui replace `flag_model' = 2
	}
}

if ("`reg_type_gps'"=="quadratic") {
if (`interaction'== 0){
di in ye _newline(1)  "The regression model is: Y = T + GPS + GPS^2"
`cmd' `outcome' `t' `gpscore' `gpscore'_sq  [`weight'`exp']
qui replace `flag_model' = 3
}

if (`interaction'== 1){
di in ye _newline(1)  "The regression model is: Y = T + GPS +  GPS^2 + T*GPS"
 `cmd' `outcome' `t' `gpscore' `gpscore'_sq  `t'_`gpscore' [`weight'`exp']
qui replace `flag_model' = 4
}
}

if ("`reg_type_gps'"=="cubic") {
if (`interaction'== 0){
di in ye _newline(1)  "The regression model is: Y = T + GPS + GPS^2 + GPS^3"
 `cmd' `outcome' `t' `gpscore' `gpscore'_sq  `gpscore'_3  [`weight'`exp']
qui replace `flag_model' = 5
}

if (`interaction'== 1){
di in ye _newline(1)  "The regression model is: Y = T + GPS +  GPS^2 + GPS^3 + T*GPS"
 `cmd' `outcome' `t' `gpscore' `gpscore'_sq   `gpscore'_3  `t'_`gpscore' [`weight'`exp']
qui replace `flag_model' = 6
}
}
}

if ("`reg_type_t'"=="quadratic") {

if ("`reg_type_gps'"=="" | "`reg_type_gps'"=="linear") {
if (`interaction'== 0){
di in ye _newline(1)  "The regression model is: Y = T + T^2 + GPS"
`cmd' `outcome' `t' `t'_sq `gpscore'  [`weight'`exp']
qui replace `flag_model' = 7
}

if (`interaction'== 1){
di in ye _newline(1)  "The regression model is: Y = T +  T^2 + GPS + T*GPS"
`cmd' `outcome' `t' `t'_sq `gpscore' `t'_`gpscore' [`weight'`exp']
qui replace `flag_model' = 8
}
}

if ("`reg_type_gps'"=="quadratic") {
if (`interaction'== 0){
di in ye _newline(1)  "The regression model is: Y = T +  T^2  + GPS + GPS^2"
`cmd' `outcome' `t' `t'_sq `gpscore' `gpscore'_sq [`weight'`exp']
qui replace `flag_model' = 9
}

if (`interaction'== 1){
di in ye _newline(1)  "The regression model is: Y = T + T^2 + GPS +  GPS^2 + T*GPS"
`cmd' `outcome' `t' `t'_sq `gpscore' `gpscore'_sq  `t'_`gpscore' [`weight'`exp']
qui replace `flag_model' = 10
}
}

if ("`reg_type_gps'"=="cubic") {
if (`interaction'== 0){
di in ye _newline(1)  "The regression model is: Y = T + T^2 + GPS + GPS^2 + GPS^3"
`cmd' `outcome' `t' `t'_sq `gpscore' `gpscore'_sq  `gpscore'_3 [`weight'`exp']
qui replace `flag_model' = 11
}

if (`interaction'== 1){
di in ye _newline(1)  "The regression model is: Y = T + T^2 + GPS +  GPS^2 + GPS^3 + T*GPS"
`cmd' `outcome' `t' `t'_sq `gpscore' `gpscore'_sq  `gpscore'_3  `t'_`gpscore' [`weight'`exp']
qui replace `flag_model' = 12
}
}
}

if ("`reg_type_t'"=="cubic") {

if ("`reg_type_gps'"=="" | "`reg_type_gps'"=="linear") {
if (`interaction'== 0){
di in ye _newline(1)  "The regression model is: Y = T + T^2 + T^3 + GPS"
`cmd' `outcome' `t' `t'_sq `t'_3 `gpscore' [`weight'`exp']
qui replace `flag_model' = 13
}

if (`interaction'== 1){
di in ye _newline(1)  "The regression model is: Y = T +  T^2 + T^3 + GPS + T*GPS"
`cmd' `outcome' `t' `t'_sq `t'_3 `gpscore' `t'_`gpscore' [`weight'`exp']
qui replace `flag_model' = 14
}
}

if ("`reg_type_gps'"=="quadratic") {
if (`interaction'== 0){
di in ye _newline(1)  "The regression model is: Y = T +  T^2 + T^3 + GPS + GPS^2"
`cmd' `outcome' `t' `t'_sq `t'_3 `gpscore' `gpscore'_sq  [`weight'`exp']
qui replace `flag_model' = 15
}

if (`interaction'== 1){
di in ye _newline(1)  "The regression model is: Y = T + T^2 + T^3 + GPS +  GPS^2 + T*GPS"
`cmd' `outcome' `t' `t'_sq `t'_3 `gpscore' `gpscore'_sq  `t'_`gpscore' [`weight'`exp']
qui replace `flag_model' = 16
	}
}

if ("`reg_type_gps'"=="cubic") {
if (`interaction'== 0){
di in ye _newline(1)  "The regression model is: Y = T + T^2 + T^3 + GPS + GPS^2 + GPS^3"
`cmd' `outcome' `t' `t'_sq `t'_3 `gpscore' `gpscore'_sq  `gpscore'_3 [`weight'`exp']
qui replace `flag_model' = 17
}

if (`interaction'== 1){
di in ye _newline(1)  "The regression model is: Y = T + T^2 + T^3 + GPS +  GPS^2 + GPS^3 + T*GPS"
`cmd' `outcome' `t' `t'_sq `t'_3 `gpscore' `gpscore'_sq  `gpscore'_3  `t'_`gpscore' [`weight'`exp']
qui replace `flag_model' = 18
}
}
}

return scalar flag_model = `flag_model'
drop `t'_sq `gpscore'_sq `t'_3 `gpscore'_3 `t'_`gpscore'

end