program define r2c, eclass //history and version information at end of file

version 11

syntax [, noDp noOffsetadj DEVonly ESTDisp GNBCons]

preserve

local cmnds poisson zip tpoisson nbreg gnbreg zinb tnbreg glm

local cmnd "`e(cmd)'"

if ("`e(mi)'"=="mi") local cmnd "`e(ecmd_mi)'"

/*exit/stop program conditions*/

if `:list posof "`cmnd'" in cmnds'==0 {

	di "{err}{cmd:r2c} only works as a postestimation command for {cmd:poisson}, {cmd:nbreg}, {cmd:zip}, {cmd:zinb}, " ///
	"{cmd:tpoisson}, {cmd:tnbreg}, {cmd:gnbreg}, and {cmd:glm}."

	exit
}

if `:list posof "`cmnd'" in cmnds'==8 & "`e(varfunct)'"!="Poisson" & "`e(varfunct)'"!="Neg. Binomial" {

	di "{err}{cmd:r2c} only works as a postestimation command for {cmd:glm} with count variance functions (i.e., Poisson and Neg. Binomial)."

	exit
}

if "`e(prefix)'"=="svy" & "`e(subpop)'"=="" & regexm("`e(cmdline)'"," if ")==1 {

	di "{err}{cmd:r2c} only allows {it:if} statements with the {cmd:svy} prefix within the {opt subpop(varname)} option (see {manhelp svy R})."

	exit

}

if "`estdisp'"!="" & "`gnbcons'"!="" {

	di "{err}Only one of {opt estdisp} or {opt gnbcons} can be selected with {cmd:gnbreg}."

	exit

}


local dp dp

if("`nodp'"!="") local dp ""

local offadj offadj

if("`offsetadj'"!="") local offadj ""

local POI="no"

if(`:list posof "`cmnd'" in cmnds'<4) local POI="yes"

if(`:list posof "`cmnd'" in cmnds'==8 & "`e(varfunct)'"=="Poisson") local POI="yes"

/*MI-based r2c computation*/

if "`e(mi)'"=="mi" {

	tempname combine idsum extra dps

	local devs r(constdev) r(modeldev) r(McF) r(dev_r2a) r(dev_r2)

	if("`devonly'"=="") local extras r(expvar) r(constpear) r(modelpear)  r(exp_r2) r(cor_r2) r(pear_r2)

	if("`nodp'"=="" & "`POI'"=="no") local dpnm r(constdp) r(modeldp) r(dp_r2)

	matrix `combine'=vecdiag(I(5))

	matrix `extra'=vecdiag(I(6))

	matrix `dps'=vecdiag(I(3))

	matrix colnames `combine'=`devs'

	if("`devonly'"=="") matrix colnames `extra'=`extras'

	if("`nodp'"=="" & "`POI'"=="no") matrix colnames `dps'=`dpnm'

	tokenize `devs'

	local numbs `e(m_est_mi)'

	qui mi describe

	local repl `r(ivars)'

	if "`e(prefix)'"=="svy" {

		qui mi svyset

		local svysets `r(settings)'

		qui mi unset

		qui svyset `r(settings)'

	}

	else {

		qui mi unset

	}

	local origcmdline `e(cmdline)'

	foreach x of local numbs {

		qui {

			local cmdadj`x' `origcmdline'

			foreach y of local repl {

				local cmdadj`x'=regexr("`cmdadj`x''"," `y' "," `y'_`x'_ ")

			}

			`cmdadj`x''

			r2c_est, `dp' `offadj' `devonly' `estdisp' `gnbcons'

			tempname combine`x'

			matrix `combine`x''=vecdiag(I(5))

			matrix `combine'=(`combine' \ `combine`x'')

			foreach y of local devs {

				matrix `combine'[`=`x'+1',`:list posof "`y'" in devs']=`y'
			}
			if "`devonly'"=="" {

				tempname extra`x'

				matrix `extra`x''=vecdiag(I(6))

				matrix `extra'=(`extra' \ `extra`x'')

				foreach y of local extras {

					matrix `extra'[`=`x'+1',`:list posof "`y'" in extras']=`y'

				}

			}

			if "`nodp'"=="" & "`POI'"=="no" {

				tempname dps`x'

				matrix `dps`x''=vecdiag(I(3))

				matrix `dps'=(`dps' \ `dps`x'')

				foreach y of local dpnm {

					matrix `dps'[`=`x'+1',`:list posof "`y'" in dpnm']=`y'

				}

			}

		}

	}

	matrix `combine'=`combine'[2...,1...]

	matrix `idsum'=vecdiag(I(`:list sizeof numbs'))

	matrix `combine'=`idsum'*`combine'*(1/`:list sizeof numbs')

	if "`devonly'"=="" {

		matrix `extra'=`extra'[2...,1...]

		matrix `extra'=`idsum'*`extra'*(1/`:list sizeof numbs')

	}

	if "`nodp'"!="" & "`POI'"=="no" {

		matrix `dps'=`dps'[2...,1...]

		matrix `dps'=`idsum'*`dps'*(1/`:list sizeof numbs')

	}

	ereturn scalar dev_r2=`combine'[1,5]

	ereturn scalar dev_r2a=`combine'[1,4]

	ereturn scalar McF=`combine'[1,3]

	if "`devonly'"=="" {

		ereturn scalar pear_r2=`extra'[1,6]

		ereturn scalar cor_r2=`extra'[1,5]

		ereturn scalar exp_r2=`extra'[1,4]

	}

	ereturn scalar constdev=`combine'[1,1]

	ereturn scalar modeldev=`combine'[1,2]

	if "`devonly'"=="" {

		ereturn scalar modelpear=`extra'[1,3]

		ereturn scalar constpear=`extra'[1,2]

		ereturn scalar expvar=`extra'[1,1]

	}

	if "`nodp'"=="" & "`POI'"=="no" {

		ereturn scalar dp_r2=`dps'[1,3]

		ereturn scalar modeldp=`dps'[1,2]

		ereturn scalar constdp=`dps'[1,1]

	}

}

/*regular r2c computation*/

else {

	r2c_est, `dp' `offadj' `devonly' `estdisp' `gnbcons'

	ereturn scalar McF=r(McF)

	ereturn scalar dev_r2a=r(dev_r2a)

	ereturn scalar dev_r2=r(dev_r2)

	if "`devonly'"=="" {

		ereturn scalar pear_r2=r(pear_r2)

		ereturn scalar cor_r2=r(cor_r2)

		ereturn scalar exp_r2=r(exp_r2)

	}

	ereturn scalar modeldev=r(modeldev)

	ereturn scalar constdev=r(constdev)

	if "`devonly'"=="" {

		ereturn scalar modelpear=r(modelpear)

		ereturn scalar constpear=r(constpear)

		ereturn scalar expvar=r(expvar)

	}

	if "`nodp'"=="" & "`POI'"=="no" {

		ereturn scalar dp_r2=r(dp_r2)

		ereturn scalar modeldp=r(modeldp)

		ereturn scalar constdp=r(constdp)

	}

}

return clear

Replay, `devonly' `dp'

restore

end

/*r2c computation command*/

program define r2c_est, rclass

syntax [, dp offadj devonly estdisp gnbcons]

estimates store full_r2c

tempvar llmxi predp overallp diff mudiff mu mumean wt alpha keeper dv

local cmnds poisson zip tpoisson nbreg gnbreg zinb tnbreg glm

local cmnd "`e(cmd)'"

if ("`e(mi)'"=="mi") local cmnd "`e(ecmd_mi)'"

qui gen `dv'=`e(depvar)'

/*generate adjusted "keeper" indicator for estimation sample that can be adjusted for "subpop()" option*/

qui gen `keeper'=e(sample)

/*macros to guide r2c program to appropriate computation*/

local POI="no"

if(`:list posof "`cmnd'" in cmnds'<4) local POI="yes"

if(`:list posof "`cmnd'" in cmnds'==8 & "`e(varfunct)'"=="Poisson") local POI="yes"

local GLM="no"

if(`:list posof "`cmnd'" in cmnds'==8) local GLM="yes"

local NB1="no"

if(`:list posof "`cmnd'" in cmnds'==4 & "`e(dispers)'"=="constant") local NB1="yes"

if(`:list posof "`cmnd'" in cmnds'==7 & "`e(dispers)'"=="constant") local NB1="yes"

local GNB="no"

if(`:list posof "`cmnd'" in cmnds'==5) local GNB="yes"

local ZI="no"

if(`:list posof "`cmnd'" in cmnds'==2 | `:list posof "`cmnd'" in cmnds'==6) local ZI="yes"

local OFST="no"

if("`offadj'"!="" & "`e(offset)'"!="") local OFST="yes"

if("`offadj'"!="" & "`e(offset1)'"!="") local OFST="yes"

local TNC="no"

if(`:list posof "`cmnd'" in cmnds'==3 | `:list posof "`cmnd'" in cmnds'==7) local TNC="yes"

/*incorporate weights*/

qui gen `wt'=1 if `keeper'

if "`e(wexp)'"!="" {

	local wexp "`e(wexp)'"

	gettoken eq wgt: wexp, parse(=)

	qui replace `wt'= `wgt' if `keeper'

	local wtype "`e(wtype)'"

	/*generate aweight macro for summing*/

	if("`wtype'"=="pweight") local wtype "aweight"

}

/*generate aweight macro for summing*/

if("`e(wtype)'"=="") local wtype "aweight"

/*adjust "keeper" for "svy, subpop():" syntax*/

if "`e(prefix)'"=="svy" & "`e(subpop)'"!="" {

	if (regexm("`e(subpop)'","if ")==0) replace `keeper'=`e(subpop)' & e(sample)

	if regexm("`e(subpop)'","if ")==1 {

		local sub=regexr("`e(subpop)'","if ","")

		qui replace `keeper'=`sub' & e(sample)

	}

}

/*end setup - begin computations of R2 indexes*/

qui {

	/*generalized negative binomial syntax to extract lnalpha() equation for lnalph macro and generate constraints
	to hold alpha constant*/

	if "`GNB'"=="yes" {

		local fulls: colfullnames e(b)

		local eqs: coleq e(b)

		local names: colnames e(b)

		tokenize `names'

		if `: list sizeof eqs'>`:list posof "lnalpha" in eqs' {

			forval x=`:list posof "lnalpha" in eqs'/`=`:list sizeof eqs'-1' {

				local coeff`x': word `x' of `fulls'

				local var`x': word `x' of `names'

				local part`x' _b[`coeff`x'']*`var`x''

				if("`estdisp'"=="") constraint `=`x'+900' _b[`coeff`x'']=`=_b[`coeff`x'']'

			}

		}

		if "`:word `:list sizeof eqs' of `names''"=="_cons" {

			local part`:list sizeof eqs' _b[`:word `:list sizeof eqs' of `fulls'']

			if("`estdisp'"=="") constraint `=`:list sizeof eqs'+900' _b[lnalpha:_cons]=`=_b[lnalpha:_cons]'

		}

		else if "`:word `:list sizeof eqs' of `names''"!="_cons" {

			local part`:list sizeof eqs' _b[`:word `:list sizeof eqs' of `fulls'']*`:word `:list sizeof eqs' of `names''

		}

		gen `alpha'=0 if `keeper'

		forval x=`:list posof "lnalpha" in eqs'/`:list sizeof eqs' {

			tempvar piece`x'

			gen `piece`x''=`part`x'' if `keeper'

			replace `alpha'=`alpha'+`piece`x''

		}

		replace `alpha'=exp(`alpha') if `keeper'

		replace `alpha'=exp(-13) if `=ln(`alpha')'<-13 & `keeper'

		replace `alpha'=exp(23) if `=ln(`alpha')'>23 & `keeper'

		local spot `:list posof "lnalpha" in eqs'

		if(`=`spot'-`:list sizeof eqs'-1'<1) local constr " constraints( `=`spot'+900'/`=`:list sizeof eqs'+900' )"

		if(`=`spot'-`:list sizeof eqs'-1'==1) local constr " constraints( `=`spot'+900' )"

		if("`gnbcons'"!="") local constr ""

		local lneq ``spot''

		if `spot'!=`:list sizeof eqs' {

			forval x=`=`spot'+1'/`=`:list sizeof eqs'-1' {

				local lneq: list lneq | `x'

			}

		}

		local remove "_cons"

		local lneq: list lneq-remove

		local lnalph " lnalpha(`lneq')"

		if("`gnbcons'"!="") local lnalph ""

		local DRP `=`:list posof "lnalpha" in eqs'+900'/`=`:list sizeof eqs'+900'

	}

	/*negative binomial options macros*/

	if "`POI'"=="no" & "`GNB'"=="no" & "`GLM'"=="no" {

		if "`NB1'"=="no" & "`estdisp'"=="" {

			constraint 973 _b[lnalpha:_cons]=`=_b[lnalpha:_cons]'

		}

		if "`NB1'"=="yes" & "`estdisp'"=="" {

			constraint 973 _b[lndelta:_cons]=`=_b[lndelta:_cons]'

		}

		local constr " constraints(973)"

		if ("`e(cmd)'"=="nbreg" | "`e(cmd)'"=="tnbreg") local nbdisp " d(`e(dispers)')"

	}

	/*generate zero-inflated macro*/

	if "`ZI'"=="yes" {

		local inflate " inflate( _cons )"

		if("`e(offset2)'"!="" & "`offadj'"!="") local inflate " inflate( _cons , offset( `e(offset2)') )"

		if("`e(inflate)'"=="probit") local inflate " `inflate' probit"

	}

	/*generate lower limit/truncation point macro*/

	if ("`TNC'"=="yes") local ll " ll(`e(llopt)')"

	/*generate offset variable and macro*/

	if "`OFST'"=="yes" {

		tempvar offsetvar

		if "`GNB'"=="yes" | "`ZI'"=="yes" {

			gen `offsetvar'=`e(offset1)' if `keeper'

			local offset " offset(`offsetvar')"

		}

		else {

			gen `offsetvar'=`e(offset)' if `keeper'

			local offset " offset(`offsetvar')"

		}

	}

	/*generate glm command macros*/

	if "`GLM'"=="yes" {

		if("`POI'"=="yes") local glmfam " family(poisson) link(log)"

		if("`POI'"=="no") local glmfam " family(nbinomial `e(a)') link(log)"

		if("`POI'"=="no" & "`estdisp'"!="") local glmfam " family(nbinomial ml) link(log)"

	}

	/*compute constant-only log-likelihood and mean estimate*/

	`e(cmd)' `dv' [`e(wtype)'`e(wexp)'] if `keeper', `offset' `ll' `constr' `lnalph' `nbdisp' `inflate' `glmfam'

	if("`offadj'"=="") local nooffset " nooffset"

	local kind " n"

	if("`GLM'"=="yes") local kind " mu"

	predict `mumean' if `keeper', `kind' `nooffset'

	local llmu=e(ll)

	estimates restore full_r2c

	/*model log likelihood*/

	local llmod=e(ll)

	/*obtain model log likelihood when svy: prefix used*/

	if "`e(prefix)'"=="svy" & "`GLM'"=="no" {

		local cmdline `e(command)'

		gettoken cmdlinens away: cmdline, parse(",")

		if "`ZI'"=="yes" {

			local fullsvy: coleq e(b)

			local namesvy: colnames e(b)

			local numlist ""

			forval x=1/`:list sizeof fullsvy' {

				if word("`fullsvy'",`x')=="inflate" {

					local numlist "`numlist' `x'"

				}

				local inflatesvy ""

				foreach x of local numlist {

					local inflatesvy "`inflatesvy' `:word `x' of `namesvy''"

				}

				local inflatesvy `=regexr("`inflate'","_cons","`inflatesvy'")'

			}

		}

		`cmdlinens' [`e(wtype)'`e(wexp)'] if `keeper', `offset' `ll' `constr' `lnalph' `nbdisp' `inflatesvy'

		local llmod=e(ll)

		estimates restore full_r2c
	}

	/*compute Poisson saturated log-likelihoods*/

	if "`POI'"=="yes" {

		gen `llmxi'= -`dv'+`dv'*ln(`dv')-lnfactorial(`dv') if `keeper'

		if("`TNC'"=="yes") replace `llmxi'= -`dv'+`dv'*ln(`dv')-lnfactorial(`dv') ///
		-ln(poissontail(`dv',`=`e(llopt)'+1')) if `keeper'

		replace `llmxi'=0 if `dv'==0 & missing(`llmxi') & `keeper'
	}

	/*compute negative Binomial saturated log-likelihoods*/

	if "`POI'"=="no" {

		if "`GNB'"=="no" &  "`NB1'"=="no" {

			if "`GLM'"=="no" {

				gen `alpha'=exp(_b[lnalpha:_cons]) if `keeper'

			}

			if "`GLM'"=="yes" {

				gen `alpha'=`e(a)'

			}

			replace `alpha'=exp(-13) if ln(`alpha')<-13

		}

		if "`NB1'"=="no" {

			gen `llmxi'= ln(nbinomialp(`alpha'^-1,`dv',1/(1+`dv'*`alpha'))) if `keeper'

			if("`TNC'"=="yes") replace `llmxi'= ln(nbinomialp(`alpha'^-1,`dv',1/(1+`dv'*`alpha'))) ///
			-ln(nbinomialtail(`alpha'^-1,`=`e(llopt)'+1',1/(1+`dv'*`alpha'))) if `keeper'

		}

		else if "`NB1'"=="yes" {

			gen `alpha'=exp(_b[lndelta:_cons]) if `keeper'

			replace `alpha'=exp(-13) if ln(`alpha')<-13

			gen `llmxi'= ln(nbinomialp(`dv'/`alpha',`dv',1/(1+`alpha'))) if `keeper'

			if("`TNC'"=="yes") replace `llmxi'= ln(nbinomialp(`dv'/`alpha',`dv',1/(1+`alpha'))) ///
			-ln(nbinomialtail(`dv'/`alpha',`=`e(llopt)'+1',1/(1+`alpha'))) if `keeper'
		}

		replace `llmxi'=0 if `dv'==0 & `keeper' & missing(`llmxi')

	}

	sum `llmxi' [`wtype'=`wt'], meanonly

	local llmx=`r(sum)'

	if("`GLM'"=="no") local numerd=-2*(`llmod'-`llmx')

	if("`GLM'"=="yes") local numerd=`e(deviance)'

	local denomd=-2*(`llmu'-`llmx')

	/*compute DP R2 comparing negative Binomial and Poisson deviances*/

	if "`dp'"=="dp" & "`POI'"=="no" {

		tempvar llmxpoii

		gen `llmxpoii'=-`dv'+ln(`dv')*`dv'-lnfactorial(`dv') if `keeper'

		if("`TNC'"=="yes") replace `llmxpoii'=-`dv'+ln(`dv')*`dv'-lnfactorial(`dv') ///
		-ln(poissontail(`dv',`=`e(llopt)'+1')) if `keeper'

		replace `llmxpoii'=0 if `dv'==0 & `keeper' & missing(`llmxpoii')

		sum `llmxpoii' [`wtype'=`wt'] if `keeper', meanonly

		local llmxpoi=`r(sum)'

		local cmd "poisson"

		if "`GLM'"=="yes" {

			local glmfam " family(poisson) link(log)"

			local cmd "glm"

		}

		if("`ZI'"=="yes") local cmd "zip"

		if("`TNC'"=="yes") local cmd "tpoisson"

		`cmd' `dv' [`e(wtype)'`e(wexp)'] if `keeper', `offset' `ll' `inflate' `glmfam'

		local llmupoi=e(ll)

		estimates restore full_r2c

		local dpnum=-2*(`llmod'-`llmxpoi')

		local dpdenom=-2*(`llmupoi'-`llmxpoi')

		local dp_r2=1-`dpnum'/`dpdenom'

	}

	local dev_r2=`=1-`numerd'/`denomd''

	/*compute adjusted deviance R2*/

	local npred = `=`e(k)'-`e(k_eq)''

	if "`POI'"=="yes" {

		local dev_r2a=`=1-(`numerd'+`npred'/2)/`denomd''

	}

	if "`POI'"=="no" {

		local chi2=-2*(`llmu'-`llmod')

		local dev_r2a=`=1-(`numerd'+`npred'*(`chi2'/(`e(N)'-`npred'-1)))/`denomd''

	}

	local McF=`=1-`llmod'/`llmu''

	/*begin computation of Pearson R2*/

	if "`devonly'"=="" {

		tempvar predp overallp

		predict `mu' if `keeper', `kind' `nooffset'

		if "`POI'"=="yes" {

			gen `predp'=(`dv'-`mu')^2/`mu' if `keeper'

			gen `overallp'=(`dv'-`mumean')^2/`mumean' if `keeper'

		}

		if "`POI'"=="no" {

			if "`NB1'"=="no" {

				gen `predp'=(`dv'-`mu')^2/(`mu'+`alpha'*`mu'^2) if `keeper'

				gen `overallp'=(`dv'-`mumean')^2/(`mumean'+`alpha'*`mumean'^2) if `keeper'

			}

			if "`NB1'"=="yes" {

				gen `predp'=(`dv'-`mu')^2/`mu'	if `keeper'

				gen `overallp'=(`dv'-`mumean')^2/`mumean' if `keeper'

			}

		}

		replace `predp'=0 if `dv'==0 & missing(`predp') & `keeper'

		replace `overallp'=0 if `dv'==0 & missing(`overallp') & `keeper'

		sum `predp' [`wtype'=`wt'] if `keeper', meanonly

		local numerp=`r(sum)'

		sum `overallp' [`wtype'=`wt'] if `keeper', meanonly

		local denomp=`r(sum)'

		local pear_r2=`=1-`numerp'/`denomp''

		corr `dv' `mu' [`wtype'=`wt'] if `keeper'

		local correl=`=`r(rho)'^2'

		gen `mudiff'= (`mu'-`mumean')^2 if `keeper'

		gen `diff' = (`dv'-`mumean')^2 if `keeper'

		sum `mudiff' [`wtype'=`wt'] if `keeper', meanonly

		local expd=`r(sum)'

		sum `diff' [`wtype'=`wt'] if `keeper', meanonly

		local exp_r2=`=`expd'/(`r(sum)')'

	}

}

return clear

if "`dp'"=="dp" & "`POI'"=="no" {

	return scalar constdp=`dpdenom'

	return scalar modeldp=`dpnum'

	return scalar dp_r2=`dp_r2'

}

if "`devonly'"=="" {

	return scalar expvar=`expd'

	return scalar constpear=`denomp'

	return scalar modelpear=`numerp'

}
return scalar constdev=`denomd'

return scalar modeldev=`numerd'

if "`devonly'"=="" {

	return scalar exp_r2=`exp_r2'

	return scalar cor_r2=`correl'

	return scalar pear_r2=`pear_r2'
}

return scalar McF=`McF'

return scalar dev_r2a=`dev_r2a'

return scalar dev_r2=`dev_r2'

constraint drop 973 `DRP'

end

/*display results*/

program define Replay

syntax[, devonly dp]

local cmnds poisson zip tpoisson nbreg gnbreg zinb tnbreg glm

local POI="no"

if(`:list posof "`e(cmd)'" in cmnds'<4) local POI="yes"

if(`:list posof "`e(cmd)'" in cmnds'==8 & "`e(varfunct)'"=="Poisson") local POI="yes"

local ZI="no"

if(`:list posof "`e(cmd)'" in cmnds'==2 | `:list posof "`e(cmd)'" in cmnds'==6) local ZI="yes"

local TNC="no"

if(`:list posof "`e(cmd)'" in cmnds'==3 | `:list posof "`e(cmd)'" in cmnds'==7) local TNC="yes"

di "{txt}"
di "{c TLC}{hline 70}{c TRC}"
di "{txt}{c |}Deviance{col 15}Adj. Dev.{col 30}Model{col 45}Cons. Only{col 60}McFadden's{col 72}{c |}"
di "{txt}{c |}R2{col 15}R2{col 30}Deviance{col 45}Deviance{col 60}R2{col 72}{c |}"
di "{c LT}{hline 70}{c RT}"
di "{c |}{res}" %-6.5g e(dev_r2) "{col 15}" %-6.5g e(dev_r2a)  "{col 30}" %-10.0gc e(modeldev) "{col 45}" %-10.0gc e(constdev) ///
"{col 60}" %-6.5g e(McF) "{txt}{col 72}{c |}"

if "`devonly'"=="" {

	di "{c LT}{hline 70}{c RT}"
	di "{txt}{c |}Pearson{col 15}Model{col 30}Cons. Only{col 45}Correlation{col 60}Explained{col 72}{c |}"
	di "{txt}{c |}R2{col 15}Pearson Dev.{col 30}Pearson Dev.{col 45}R2{col 60}Variance R2{col 72}{c |}"
	di "{c LT}{hline 70}{c RT}"
	di "{c |}{res}" %-6.5g e(pear_r2) "{col 15}" %-10.0gc e(modelpear)  "{col 30}" %-10.0gc e(constpear) "{col 45}" ///
	%-6.5g e(cor_r2) "{col 60}" %-6.5g e(exp_r2) "{txt}{col 72}{c |}"

}

if "`dp'"=="dp" & "`POI'"=="no" {

	di "{txt}{c LT}{hline 70}{c RT}"
	di "{txt}{c |}DP{col 15}DP Model{col 30}DP Cons. Only{col 72}{c |}"
	di "{txt}{c |}R2{col 15}Deviance{col 30}Deviance{col 72}{c |}"
	di "{c LT}{hline 70}{c RT}"
	di "{c |}{res}" %-6.5g e(dp_r2) "{col 15}" %-10.0gc e(modeldp) "{col 30}" %-10.0gc e(constdp) "{txt}{col 72}{c |}"

}

if("`ZI'"=="yes") local adj " Zero-inflated"

if("`TNC'"=="yes") local adj " Truncated (at `e(llopt)')"

di "{c BLC}{hline 70}{c BRC}"

if "`dp'"=="dp" & "`POI'"=="no" {

	di "{txt}Note: The DP R2 can be compared with a Deviance R2 from a`adj' Poisson regression."
}

end

/* programming notes and history

- r2c version 1.1 - date - Jan. 31, 2013

basic version

- r2c version 1.2 - date - Apr. 3, 2013

//notable changes\\
a] estimation combined into single program (no sub-programs r2c.devcompute or r2c.pearcompute); all global macros changed to locals
; all "sum" commands changed to "sum, meanonly" when r(sum) sought - simplified constant-only log likelihood computation syntax
b] fixed incompatability with "svy:" prefix and incorporates subpops
c] incorporates multiple imputation estimates - r2c_est and Replay command added to facilitate
d] removed summarize option - added "devonly" option
e] backwards compatable to Stata 11 (when tpoisson and tnbreg introduced)
f] added McFadden's R2 (not automatically computed in many models)
g] added estdisp option to obtain neg. Binomial constant-only model with overdispersion parameter estimated from data
h] added gnbcons option to compare full negative binomial model to estimated constant-only lnalpha, constant-only model
(as opposed to full specification lnalpha, constant-only model)
i] adds computed fit indexes into e() as opposed to r() - eclass program

*/