* Version 1.1 - 8 Feb 2014
* By J.M.C. Santos Silva, Silvana Tenreyro, Frank Windmeijer
* Please email jmcss@essex.ac.uk for help and support

* The software is provided as is, without warranty of any kind, express or implied, including 
* but not limited to the warranties of merchantability, fitness for a particular purpose and 
* noninfringement. In no event shall the authors be liable for any claim, damages or other 
* liability, whether in an action of contract, tort or otherwise, arising from, out of or in 
* connection with the software or the use or other dealings in the software.

program define hpc, rclass
version 11.1
syntax varlist(numeric min=1) [if] [in], a(string) b(string) [ Cluster(string)]
     
marksample touse 
tempname  _rhs _y oldest resh resp pch pcp cl
gettoken _y _rhs: varlist
unab _rhs :  `_rhs'

capture: _est hold `oldest'

qui gen double `resh'=(`_y'-`a')/`a' if `touse'
qui gen double `resp'=(`_y'-`b')/`b' if `touse'
qui gen double `pch'=(`b'-`a')/`a' if `touse'
qui gen double `pcp'=(`a'-`b')/`b' if `touse'

if "`cluster'"=="" qui g `cl'=_n if `touse'
else               qui g `cl'=`cluster' if `touse'

qui reg  `resp' `pcp' `_rhs' [aw=`b'] if `touse', cluster(`cl')
qui local t_b=_b[`pcp']/_se[`pcp']
qui local enneb=e(N)
qui reg  `resh' `pch' `_rhs' [aw=`a'] if `touse', cluster(`cl')
qui local t_a=_b[`pch']/_se[`pch']
qui local ennea=e(N)

capture: _est unhold `oldest' 

di 
di as txt "         HPC test"
di
di as txt "         Ho: Model A is valid"
di as txt "         t  = " _continue
di %6.3f as result `t_a'
di as txt "         Prob > t  = " _continue
di %6.3f as result 1-normal(`t_a')  
di as txt "         Number of obs = " _continue      
di as result `ennea'

di
di as txt "         Ho: Model B is valid"
di as txt "         t  = " _continue
di %6.3f as result `t_b'
di as txt "         Prob > t  = " _continue
di %6.3f as result 1-normal(`t_b')  
di as txt "         Number of obs = " _continue      
di as result `enneb'

qui return scalar t_b=`t_b'
qui return scalar p_b = 1-normal(`t_b') 
qui cor `_y' `b' if `touse'
qui return scalar R2_b = r(rho)^2
qui return scalar N_b = `ennea'

qui return scalar t_a=`t_a'
qui return scalar p_a = 1-normal(`t_a') 
qui cor `_y' `a' if `touse'
qui return scalar R2_a = r(rho)^2
qui return scalar N_a = `enneb'


end