*! nnest.ado version 3.0 Gregorio Impavido (gimpavido@imf.org) 08Nov2011 *! nnest.ado version 2.0 Gregorio Impavido (gimpavido@worldbank.org) 15Aug2001 *! nnest.ado version 1.0 Gregorio Impavido (gimpavido@worldbank.org) 29June1998 * Now for version 9 * prog drop _all * Description : This program performs the Davidson and MacKinnon (1981) J test * and the [[xxxx]] after an ols regression program define nnest, rclass version 9 syntax varlist(min=1 numeric ts) // check that regress has been inputted if "`e(cmd)'" != "regress" { display in red /// "You can only run nnest after an OLS regression" error 301 } // check that the depvar exists capture confirm variable `e(depvar)' if _rc { display in red /// "Rerun original regression before nnest" confirm variable `e(depvar)' } ********************************* * The ingredients for the tests * ********************************* local depvar "`e(depvar)'" // identify the right sample tempvar es1 gen byte `es1' = e(sample) // find the common obs with the regressors in model 2 markout `es1' `varlist' // ingredients from model 1 // estract wights from command line in model 1 (if any) local m1 "`e(cmdline)'" // this saves model 1 gettoken left right : m1, parse("[") // di "`left'" // di "`right'" gettoken wgts right : right, parse("]") // this saves 1st part of the weights // di "`wgts'" // di "`right'" gettoken brkt right : right, parse("]") // this saves the weights // di "`brkt'" local wgts `wgts'`brkt' gettoken left optsm1 : m1, parse(",") // gen the list of regressors from m1 (with no const and not omitted) matrix B = e(b) // put in `1' the column names of e(b) tokenize "`: colnames e(b)'" local xm1 forval j = 1/`= colsof(B)' { if B[1, `j'] != 0 & "``j''" != "_cons" { local xm1 `xm1' ``j'' // di "`xm1'" } } quietly { // reestimate model 1 taking any unavailable obs into account regress `depvar' `xm1' if `es1' `wgts' `optsm1' tempvar yhatm1 // fitted values for model 1 predict double `yhatm1' if `es1', xb // rss/N from model 1 (Cox is an asymptitic test, so don't divide by n-k) local s2m1 = e(rss)/e(N) // ingredients from model 2 local xm2 "`varlist'" regress `depvar' `xm2' if `es1' `wgts' `optsm1' // this is model 2 tempvar yhatm2 predict double `yhatm2' if `es1' , xb // fitted values for model 2 // rss/N from model 2 (Cox is an asymptitic test, so don't divide by n-k) local s2m2 = e(rss)/e(N) **************************************** * Davidson and MacKinnon (1981) J test * **************************************** // aux regression from model 2 regress `depvar' `xm2' `yhatm1' if `es1' `wgts' `optsm1' local obsm2 = e(N) // t coeff in the aux regression local tcm2 = _b[`yhatm1']/_se[`yhatm1'] // d.f. from aux regression of model 2 local dfm2 = e(df_r) // p value from aux regression of model 2 local tsigm2 = tprob(`dfm2', `tcm2') // aux regression for model 1 regress `depvar' `xm1' `yhatm2' if `es1' `wgts' `optsm1' local obsm1 = e(N) // t coeff in the aux regression local tcm1 = _b[`yhatm2']/_se[`yhatm2'] // d.f. from aux regression for model 1 local dfm1 = e(df_r) // p value from aux regression of model 1 local tsigm1 = tprob(`dfm1', `tcm1') ****************** * Cox Statistics * ****************** // aux regression from model 1 regress `yhatm1' `xm2' if `es1' // `wgts' `optsm1' local s2m2m1 = `s2m1' + e(rss)/e(N) tempvar uhatm2aux predict double `uhatm2aux' if `es1', resid regress `uhatm2aux' `xm1' if `es1' // `wgts' `optsm1' local c12 = (e(N)/2)*ln(`s2m2'/`s2m2m1') local vc12 = `s2m1'*e(rss)/(`s2m2m1'^2) local qm1 = `c12'/sqrt(`vc12') local qsigm1 = 1 - normal(abs(`qm1')) regress `yhatm2' `xm1' if `es1' // `wgts' `optsm1' local s2m1m2 = `s2m2' + e(rss)/e(N) tempvar uhatm1aux predict double `uhatm1aux' if `es1', resid regress `uhatm1aux' `xm2' if `es1' // `wgts' `optsm1' local c21 = (e(N)/2)*ln(`s2m1'/`s2m1m2') local vc21 = `s2m2'*e(rss)/(`s2m1m2'^2) local qm2 = `c21'/sqrt(`vc21') local qsigm2 = 1 - normal(abs(`qm2')) } // to force to rerun M1 before you can change M2 in nnest ereturn clear **************** * show results * **************** di _n _skip(2) %~50s "Competing Models" di _skip(2) _dup(50) "-" di _skip(2) "M1 : Y = [`depvar']" di _skip(2) " X = [`xm1']" di _skip(2) "M2 : Y = [`depvar']" di _skip(2) " Z = [`xm2']" di _skip(2) _dup(50) "-" di _skip(2) %~50s "J test for non-nested models" di _skip(2) _dup(50) "-" di _skip(2) _col(21) "Dist" _col(34) "Stat" /// _col(44) "P>|Stat|" di _skip(2) "H0:M1 / H1:M2" _col(20) "t(`dfm1')" /// _col(30) %8.2f `tcm1' _col(45) %4.3f `tsigm1' di _skip(2) "H0:M2 / H1:M1" _col(20) "t(`dfm2')" /// _col(30) %8.2f `tcm2' _col(45) %4.3f `tsigm2' di _skip(2) _dup(50) "-" di _skip(2) %~50s "Cox-Pesaran test for non-nested models" di _skip(2) _dup(50) "-" di _skip(2) _col(21) "Dist" _col(34) "Stat" /// _col(44) "P>|Stat|" di _skip(2) "H0:M1 / H1:M2" _col(20) "N(0,1)" /// _col(30) %8.2f `qm1' _col(45) %4.3f `qsigm1' di _skip(2) "H0:M2 / H1:M1" _col(20) "N(0,1)" /// _col(30) %8.2f `qm2' _col(45) %4.3f `qsigm2' di _skip(2) _dup(50) "-" ************************************** * return information for further use * ************************************** // scalars in J test and Cox stat ret scalar nobsm1 = `obsm1' ret scalar nobsm2 = `obsm2' // scalars in J test ret scalar tcm1 = `tcm1' ret scalar tcm2 = `tcm2' ret scalar tsigm1 = `tsigm1' ret scalar tsigm2 = `tsigm2' // scalars in Cox stat ret scalar qm1 = `qm1' ret scalar qm2 = `qm2' ret scalar qsigm1 = `qsigm1' ret scalar qsigm2 = `qsigm2' // locals for J and Cox ret local optsm1 `optsm1' ret local wgts `wgts' ret local regm2 `xm2' ret local regm1 `xm1' ret local depvar `depvar' ret local cmd nnest end