*! version 2.1 abuxton 23sep2007. 23Oct2013
*! _cureregr8_gen, version 8.2 cure model regression or parametric cure model PCM
* version 1 abuxton based on post cureregr 'postcureregtask2'
* test 15sep2007 _cureregr_gen 16jan2005, draft
* post cureregr8 calculate hazard estimate and fail density for
* any model fit by cureregr8,
*! main program cureregr8.ado, called by _cureregr8.ado which is run via predict switch

program define _cureregr8_gen
version 8.2

		syntax [if] [in] , 						///
			[Survival]  ///
			[SEs]		///
			[Ucs]		///
			[Lcs]		///
			[Hazard] 	///
			[FD]		///
			[ALL]		///
			[Gen(string)] ///
			[LEVELopt0(string)]
			tempvar touse
			mark `touse' `if' `in' `e(sample)'
			qui count if `touse'
			if r(N)==0 {
				error 2000 			/* no observations */
				}
			local svopt `"`survival'"'
			local alopt `"`all'"'
			local hzopt `"`hazard'"'
			local fdopt `"`fd'"'
			local sesopt `"`ses'"'
			local ucsopt `"`ucs'"'
			local lcsopt `"`lcs'"'
			local levelopt `"level(`levelopt0')"'
			local genopt  `"`gen'"'

tokenize 'genopt'
	local gen_n : word count `genopt'
	if `gen_n' == 0 {
	}
	else if `gen_n' == 1 {
	}
	else if `gen_n' == 6 {
	}
	else {
	di `"{err}the number of gen variables must be 1 or 6{txt}"'
	exit
	}

tokenize 'levelopt0'
	local level_n : word count `levelopt0'
	if `level_n' == 0 {
		local levelopt `"level(95)"'
	}
	else if `level_n' == 1 {
		local levelopt `"level(`levelopt0')"'
	}

	if lower(substr(`"`svopt'"',1,1))==`"s"'  {
		local fnopt0 `"survival"'
		}
	else if lower(substr(`"`sesopt'"',1,2))==`"se"' {
		local fnopt0 `"ses"'
		}
	else if lower(substr(`"`lcsopt'"',1,1))==`"l"' {
		local fnopt0 `"lcs"'
		}
	else if lower(substr(`"`ucsopt'"',1,1))==`"u"' {
		local fnopt0 `"ucs"'
		}
	else if lower(substr(`"`alopt'"',1,3))==`"all"'  {
		local fnopt0 `"est_all"'
		}
	else if lower(substr(`"`hzopt'"',1,1))==`"h"' {
		local fnopt0 `"hazard"'
		}
	else if lower(substr(`"`fdopt'"',1,2))==`"fd"' {
		local fnopt0 `"faildensity"'
		}
	else {
		di `"{err}please, check _cureregr8_gen {S, ses, lcs, ucs, h, fd, or all} only {txt}"'
		exit
	}
		*di `"display fnopt0:"' `"`fnopt0'"'
		*di `"display gen_n: `gen_n'"'

	if `"`fnopt0'"' == `"est_all"' {
		if `gen_n' == 0 /* default variable names */ {
			foreach Varx in S seS lciS uciS haz fd {
			confirm new var `Varx'
			}
		}
		else if `gen_n' == 6 {
			foreach Varx in `genopt' {
			confirm new var `Varx'
			}
		}
	}
	else if `gen_n' == 1 {
			confirm new var `gen'
	}
	else {
		if `"`fnopt0'"' == `"survival"' {
		confirm new var S
		}
		else if `"`fnopt0'"' == `"ses"' {
		confirm new var ses
		}
		else if `"`fnopt0'"' == `"lcs"' {
		confirm new var lcs
		}
		else if `"`fnopt0'"' == `"ucs"' {
		confirm new var ucs
		}
		else if `"`fnopt0'"' == `"hazard"' {
		confirm new var haz
		}
		else if `"`fnopt0'"' == `"faildensity"' {
		confirm new var fd
		}
	}


/* calculate the fail density */
			local pi `"(exp(-1*exp((xb(#1)))))"'
			local ttfunction `"((exp(xb(#2)) * _t)^exp(xb(#3)))"'
			local dtt = `"((`ttfunction')*exp(xb(#3))/_t)"'

		local lnl  = lower(substr(`"`e(user)'"',4,2))
		local krn = lower(substr(`"`e(user)'"',6,2))
		local cfl  = lower(substr(`"`e(user)'"',8,2))
	*cure fraction link
		if `"`cfl'"' == `"01"' {
			local pi `"(1/(1+exp(-1*(xb(#1)))))"'
			}
		else if `"`cfl'"' == `"02"' {
			local pi `"(exp(-1*exp((xb(#1)))))"'
			}
		else if `"`cfl'"' == `"03"' {
			local pi `"((xb(#1)))"'
			}
	*kernal, distribution function
		if `"`krn'"' == `"01"' {					// weibull, exponential in tt,  dist
			local kr `"(1-exp(-1*(`ttfunction')))"'
			local dk `"((exp(-1*(`ttfunction')))*(`dtt'))"'
			}
		else if `"`krn'"' == `"02"' {				// ln-normal dist
			local kr `"(norm(ln(`ttfunction')))"'
			local dk `"(normden(ln(`ttfunction'))*exp(xb(#3))/_t)"'
			}
		else if `"`krn'"' == `"03"' {				// logistic dist
			local kr `"(`ttfunction'/(1 + `ttfunction'))"'
			local dk `"((1/(1+`ttfunction')^2)*(`dtt'))"'
			}
		else if `"`krn'"' == `"04"' {				// gamma dist
			local tt `"((_t)/exp(xb(#2)))"'
			local kr `"(gammap(exp(xb(#3)),`tt'))"'
			local dk `"(gammaden(exp(xb(#3)),exp(xb(#2)),0,_t))"'
			}
		else if `"`krn'"' == `"05"' {				// exponential dist gamma shape==1
			local tt `"((_t)/exp(xb(#2)))"'
			local kr `"(gammap(1,`tt'))"'
			local dk `"(gammaden(1,exp(xb(#2)),0,_t))"'
			}
	*model mixture or non-mixture, survival
		if `"`lnl'"' == `"00"'	{
			local function_s `"(1+((`pi'-1)*`kr'))"'
			}
		else if `"`lnl'"' == `"01"'	{
			local function_s `"((`pi')^(`kr'))"'
			}
	*hazard function
		if `"`lnl'"' == `"00"'	{
			local function_h `"(((1-`pi')*`dk')/(`function_s'))"'
			}
		else if `"`lnl'"' == `"01"'	{
			local function_h `"(-ln(`pi')*(`dk'))"'
			}
	*failure density
			local function_fd `"`dk'"'

*set trace on
tempvar S seS lciS uciS haz fd
*if `"`fnopt0'"' == `"est_all"' {
			local function `"`function_s'"'
			local lmlfunction `"ln(-1*ln(`function_s'))"'
			tempvar lmlS lmllci lmluci
			qui predictnl double `S' = `function' if `touse', se(`seS') `levelopt' force iter(100)
			qui predictnl double `lmlS' = `lmlfunction' if `touse', ci(`lmllci' `lmluci') `levelopt' force iter(100)
			qui gen double `lciS'  = exp(-exp(`lmluci')) if `touse'
			qui gen double `uciS'  = exp(-exp(`lmllci')) if `touse'
		*this is code for the text dfn of function for hazard
			local function `"`function_h'"'
			qui predictnl double `haz' = `function' if `touse', force iter(100)
		*this is the fail density
			local function `"`function_fd'"'
			qui predictnl double `fd' = `function' if `touse', force iter(100)
*}

	if `"`fnopt0'"' == `"est_all"' {
		if `gen_n' == 0 		/* default variable names */ {
			tokenize `"S seS lciS uciS haz fd"'
			forvalues i = 1/6 {
				local tname`i' ``i''
				gen double `tname`i'' = ``tname`i'''
			}
			}
		else if `gen_n' == 6 { 	/* six command given names in order */
			tokenize `"S seS lciS uciS haz fd"'
			*set trace on
			forvalues i = 1/6 {
				local tname`i' ``i''
			}
			tokenize `"`genopt'"'
			forvalues i = 1/6 {
				local gname`i' ``i''
			}
			forvalues i = 1/6 {
			gen double `gname`i'' = ``tname`i'''
			}
			*set trace off
		}
	}
	else if `gen_n' == 1 {		/* one of six command given names */
		if `"`fnopt0'"' == `"survival"' {
		gen double `genopt'=`S'
		}
		else if `"`fnopt0'"' == `"ses"' {
		gen double `genopt'=`seS'
		}
		else if `"`fnopt0'"' == `"lcs"' {
		gen double `genopt'=`lciS'
		}
		else if `"`fnopt0'"' == `"ucs"' {
		gen double `genopt'=`uciS'
		}
		else if `"`fnopt0'"' == `"hazard"' {
		gen double `genopt'=`haz'
		}
		else if `"`fnopt0'"' == `"faildensity"' {
		gen double `genopt'=`fd'
		}
	}
	else {
		if `"`fnopt0'"' == `"survival"' {
		gen double S=`S'
		}
		else if `"`fnopt0'"' == `"ses"' {
		gen double seS=`ses'
		}
		else if `"`fnopt0'"' == `"lcs"' {
		gen double lciS=`lciS'
		}
		else if `"`fnopt0'"' == `"ucs"' {
		gen double uciS=`uciS'
		}
		else if `"`fnopt0'"' == `"hazard"' {
		gen double haz=`haz'
		}
		else if `"`fnopt0'"' == `"faildensity"' {
		gen double fd=`fd'
		}
	}

end /* _cureregr8_gen */