0% found this document useful (0 votes)
253 views7 pages

Egranger Version 1 Code

The document describes an Egranger program for testing for cointegration between time series variables in Stata. It provides a two-step Engle-Granger method and reports test statistics and critical values. Version notes indicate fixes to bugs in previous versions. The program conducts unit root and cointegration tests, stores results, and reports output including test statistics, critical values, and regression tables.

Uploaded by

Aftab Khakwani
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
253 views7 pages

Egranger Version 1 Code

The document describes an Egranger program for testing for cointegration between time series variables in Stata. It provides a two-step Engle-Granger method and reports test statistics and critical values. Version notes indicate fixes to bugs in previous versions. The program conducts unit root and cointegration tests, stores results, and reports output including test statistics, critical values, and regression tables.

Uploaded by

Aftab Khakwani
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 7

*! egranger version 1.0.

5 20Nov2012
*! author Mark Schaffer
* snippets of code used from dfuller.ado for Stata 9
* Version notes
* 1.0.4
Fixed bad bug in 2-step ECM - should have been including _lagged_ difference of x
* 1.0.5
Fixed another bad bag - was undercounting the number of cointegrated series by 1
*
Added saved value of number of series as macro NS
program define egranger, eclass
version 9.0
syntax varlist(ts) [if] [in] [, TRend QTRend Lags(int 0) REGress ecm ]
tempname tempr
capture _return drop `tempr'
_return hold `tempr'
marksample touse
_ts tvar panelvar `if' `in', sort onepanel
markout `touse' `tvar'
tokenize `varlist'
local y `1'
macro shift
local x `*'
local NS : word count `varlist'
if `NS' > 12 {
di as err "Error: critical values not available for more than 12 cointegrated
series"
exit 198
}
if `NS' < 2 {
di as err "too few variables specified"
exit 102
}
sum `tvar' if `touse', meanonly
local min = r(min)
local N = r(N)
* Time variable t=0 in first period (lose this ob in 2nd step)
if "`trend'`qtrend'" != "" {
tempvar t
gen long `t' = `tvar'-`min'
local tv `t'
if "`qtrend'" != "" {
tempvar tsq
gen `tsq' = `t'^2
local qtv `tsq'
local case "ctt"
}
else {
local case "ct"
}
}
else {
local case "c"
}
local k1 : word count `y' `x' `tv' `qtv'
qui _rmcoll `y' `x' `tv' `qtv'
local k2 : word count `r(varlist)'
if `k2' < `k1' {
di as error "Error - perfect collinearity in specified variables"

exit 198
}
if `lags' < 0 {
di as error "Error - negative lags not allowed"
exit 198
}
if `lags' > (`N'-1) {
di as error "Error - number of lags exceeds number of observations"
exit 198
}
* Engle-Granger 1st step and residuals
qui reg `y' `x' `tv' `qtv' if `touse'
local N1 = e(N)
* MacKinnon "T" is number of first-step observations minus 1 (lost first ob in 2nd step)
* Not clear from MacKinnon paper but assumed - additional obs lost because of augmentation
* with lags are not subtracted from T.
local T = `N1'-1
capture confirm variable _egresid
if _rc == 0 {
di in ye "Replacing variable _egresid..."
capture drop _egresid
}
qui predict double _egresid if e(sample), resid
if "`regress'" != "" {
repost "`tv'" "_trend" "`qtv'" "_trend^2"
est store _egranger1
}
* Engle-Granger test
if "`ecm'"=="" {
if `lags' == 0 {
qui reg D._egresid L._egresid if `touse', nocons
}
else {
qui reg D._egresid L._egresid DL(1/`lags')._egresid if `touse', nocons
}
local N2 = e(N)
qui test L._egresid
local Zt = sign(_b[L._egresid])*sqrt(r(F))
if "`regress'" != "" {
est store _egrangert
}
GetCrit `case' `T' `NS'
tempname cv1 cv5 cv10
scalar `cv1'=r(cv1)
scalar `cv5'=r(cv5)
scalar `cv10'=r(cv10)
if `lags' ~=0 {
local aug "Augmented "
}
di in gr _n "`aug'Engle-Granger test for cointegration" /*

*/
in gr _col(55) "N (1st step) =" in ye %9.0f `N1'
if `lags' ~= 0 {
di in gr "Number of lags
= " in ye %2.0f `lags' _c
}
di _col(55) in gr "N (test)
=" in ye %9.0f `N2'
if "`qtrend'" != "" {
di in gr "1st step includes quadratic trend"
}
else if "`trend'" != "" {
di in gr "1st step includes linear trend"
}
di in gr in smcl "{hline 78}"
di in gr _col (19) "Test" /*
*/ _col(32) "1% Critical" /*
*/ _col(50) "5% Critical" /*
*/ _col(67) "10% Critical"
di in gr _col (16) "Statistic" /*
*/ _col(36) "Value" /*
*/ _col(54) "Value" /*
*/ _col(72) "Value"
di in gr in smcl "{hline 78}"
di in gr "
*/
*/
*/
*/

Z(t)" /*
_col(15)
_col(33)
_col(51)
_col(69)

in ye %10.3f `Zt' /*
%10.3f `r(cv1)' /*
%10.3f `r(cv5)' /*
%10.3f `r(cv10)'

di
di in gr "Critical values from MacKinnon (1990, 2010)"
local title "Engle-Granger test regression"
if "`regress'" != "" {
di in gr in smcl "{hline 78}"
qui est restore _egranger1
di in ye "Engle-Granger 1st-step regression"
ereturn display
qui est restore _egrangert
di in ye "`title'"
*
ereturn display
/* fails in Stata 9 and 10 */
regress, noheader
est drop _egranger1
est drop _egrangert
* Oddly, est drop saves the names of dropped results in r(names)
}
eret
eret
eret
eret
eret
eret
eret
eret
eret
eret
}

scalar Zt
= `Zt'
scalar cv1
= `cv1'
scalar cv5
= `cv5'
scalar cv10
= `cv10'
scalar N1
= `N1'
scalar N2
= `N2'
scalar lags
= `lags'
scalar NS
= `NS'
local cmdline
local title "`title'"

* Engle-Granger 2nd step


else {
if `lags' == 0 {
qui regress D.`y' L._egresid LD.(`x')
}
else {
qui regress D.`y' L._egresid L(1/`lags')D.`y' L(1/`lags')D.(`x')
}
local N2 = e(N)
est store _egranger2
di in gr _n "Engle-Granger 2-step ECM estimation" /*
*/
in gr _col(55) "N (1st step) =" in ye %9.0f `N1'
if `lags' ~= 0 {
di in gr "Number of lags
= " in ye %2.0f `lags' _c
}
di _col(55) in gr "N (2nd step) =" in ye %9.0f `N2'
if "`qtrend'" != "" {
di in gr "1st step includes quadratic trend"
}
else if "`trend'" != "" {
di in gr "1st step includes linear trend"
}
if "`regress'" != "" {
qui est restore _egranger1
di _n in ye "Engle-Granger 1st-step regression"
ereturn display
est drop _egranger1
}
local title "Engle-Granger 2-step ECM"

di _n in ye "`title'"
qui est restore _egranger2
ereturn display
/* fails in Stata 9 and 10 */
regress, noheader
est drop _egranger2
eret local cmdline
eret local title "`title'"
}
_return restore `tempr'

end
program define repost, eclass
args vntemp1 vn1 vntemp2 vn2
tempvar esample
tempname b V dof
mat `b'=e(b)
mat `V'=e(V)
local N=e(N)
local dof=e(df_r)
local depname=e(depvar)
if "`vntemp1'" ~= "" {

local names : colnames `b'


local names : subinstr local names "`vntemp1'" "`vn1'", all
mat colnames `b' = `names'
mat colnames `V' = `names'
mat rownames `V' = `names'
}
if "`vntemp2'" ~= "" {
local names : colnames `b'
local names : subinstr local names "`vntemp2'" "`vn2'", all
mat colnames `b' = `names'
mat colnames `V' = `names'
mat rownames `V' = `names'
}
ereturn post `b' `V', depname(`depname') obs(`N') dof(`dof')
ereturn local cmd "repost"
end
program define GetCrit, rclass
version 9.0
args case T NS
*
*
*
*
*

T is number of obs
NS is number of cointegrating series
Matrix columns are:
NS
%sig
binf
b1
CV = binf + b1/T + b2/T^2 + b3/T^3

b2

b3

tempname cv cvtab
if "`case'"=="nc" {
mat `cvtab' = (
*/
1, 1, -2.56574, -2.2358, -3.627, 0 \
*/
1, 5, -1.941, -0.2686, -3.365, 31.223 \
*/
1, 10, -1.61682, 0.2656, -2.714, 25.364
}
if "`case'"=="c" {
mat `cvtab' = (
*/
1, 1, -3.43035, -6.5393, -16.786, -79.433 \
*/
1, 5, -2.86154, -2.8903, -4.234, -40.04 \
*/
1, 10, -2.56677, -1.5384, -2.809, 0 \
*/
2, 1, -3.89644, -10.9519, -22.527, 0 \
*/
2, 5, -3.33613, -6.1101, -6.823, 0 \
*/
2, 10, -3.04445, -4.2412, -2.72, 0 \
*/
3, 1, -4.29374, -14.4354, -33.195, 47.433 \
*/
3, 5, -3.74066, -8.5631, -10.852, 27.982 \
*/
3, 10, -3.45218, -6.2143, -3.718, 0 \
*/
4, 1, -4.64332, -18.1031, -37.972, 0 \
*/
4, 5, -4.096, -11.2349, -11.175, 0 \
*/
4, 10, -3.8102, -8.3931, -4.137, 0 \
*/
5, 1, -4.95756, -21.8883, -45.142, 0 \
*/
5, 5, -4.41519, -14.0406, -12.575, 0 \
*/
5, 10, -4.13157, -10.7417, -3.784, 0 \
*/
6, 1, -5.24568, -25.6688, -57.737, 88.639 \
*/
6, 5, -4.70693, -16.9178, -17.492, 60.007 \
*/
6, 10, -4.42501, -13.1875, -5.104, 27.877 \
*/
7, 1, -5.51233, -29.576, -69.398, 164.295 \
*/
7, 5, -4.97684, -19.9021, -22.045, 110.761 \
*/
7, 10, -4.69648, -15.7315, -6.922, 67.721 \
*/
8, 1, -5.76202, -33.5258, -82.189, 256.289 \
*/
8, 5, -5.22924, -23.0023, -24.646, 144.479 \

/*
/*
)

/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*

*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/

8, 10, -4.95007, -18.3959, -7.344, 94.872 \


9, 1, -5.99742, -37.6572, -87.365, 248.316 \ /*
9, 5, -5.46697, -26.2057, -26.627, 176.382 \ /*
9, 10, -5.18897, -21.1377, -9.484, 172.704 \ /*
10, 1, -6.22103, -41.7154, -102.68, 389.33 \ /*
10, 5, -5.69244, -29.4521, -30.994, 251.016 \ /*
10, 10, -5.41533, -24.0006, -7.514, 163.049 \ /*
11, 1, -6.43377, -46.0084, -106.809, 352.752 \
11, 5, -5.90714, -32.8336, -30.275, 249.994 \ /*
11, 10, -5.63086, -26.9693, -4.083, 151.427 \ /*
12, 1, -6.6379, -50.2095, -124.156, 579.622 \ /*
12, 5, -6.11279, -36.2681, -32.505, 314.802 \ /*
12, 10, -5.83724, -29.9864, -2.686, 184.116
)

/*

/*

/*

}
if "`case'"=="ct" {
mat `cvtab' =
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
}
if "`case'"=="ctt" {
mat `cvtab' =
*/

(
1, 1, -3.95877, -9.0531, -28.428, -134.155 \ /*
1, 5, -3.41049, -4.3904, -9.036, -45.374 \
1, 10, -3.12705, -2.5856, -3.925, -22.38 \
2, 1, -4.32762, -15.4387, -35.679, 0 \
2, 5, -3.78057, -9.5106, -12.074, 0 \
2, 10, -3.49631, -7.0815, -7.538, 21.892 \
3, 1, -4.66305, -18.7688, -49.793, 104.244 \ /*
3, 5, -4.1189, -11.8922, -19.031, 77.332 \
3, 10, -3.83511, -9.0723, -8.504, 35.403 \
4, 1, -4.9694, -22.4694, -52.599, 51.314 \
4, 5, -4.42871, -14.5876, -18.228, 39.647 \
4, 10, -4.14633, -11.25, -9.873, 54.109 \
5, 1, -5.25276, -26.2183, -59.631, 50.646 \
5, 5, -4.71537, -17.3569, -22.66, 91.359 \
5, 10, -4.43422, -13.6078, -10.238, 76.781 \ /*
6, 1, -5.51727, -29.976, -75.222, 202.253 \
6, 5, -4.98228, -20.305, -25.224, 132.03 \
6, 10, -4.70233, -16.1253, -9.836, 94.272 \
7, 1, -5.76537, -33.9165, -84.312, 245.394 \ /*
7, 5, -5.23299, -23.3328, -28.955, 182.342 \ /*
7, 10, -4.95405, -18.7352, -10.168, 120.575 \ /*
8, 1, -6.00003, -37.8892, -96.428, 335.92 \
8, 5, -5.46971, -26.4771, -31.034, 220.165 \ /*
8, 10, -5.19183, -21.4328, -10.726, 157.955 \ /*
9, 1, -6.22288, -41.9496, -109.881, 466.068 \ /*
9, 5, -5.69447, -29.7152, -33.784, 273.002 \ /*
9, 10, -5.41738, -24.2882, -8.584, 169.891 \ /*
10, 1, -6.43551, -46.1151, -120.814, 566.823 \
10, 5, -5.90887, -33.0251, -37.208, 346.189 \ /*
10, 10, -5.63255, -27.2042, -6.792, 177.666 \ /*
11, 1, -6.63894, -50.4287, -128.997, 642.781 \
11, 5, -6.11404, -36.461, -36.246, 348.554 \ /*
11, 10, -5.8385, -30.1995, -5.163, 210.338 \ /*
12, 1, -6.83488, -54.7119, -139.8, 736.376 \ /*
12, 5, -6.31127, -39.9676, -37.021, 406.051 \ /*
12, 10, -6.0365, -33.2381, -6.606, 317.776
)

(
1, 1, -4.37113, -11.5882, -35.819, -334.047 \ /*

/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*

/*

/*
/*

*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/

1, 5, -3.83239, -5.9057, -12.49, -118.284 \


1, 10, -3.55326, -3.6596, -5.293, -63.559 \
2, 1, -4.69276, -20.2284, -64.919, 88.884 \
2, 5, -4.15387, -13.3114, -28.402, 72.741 \
2, 10, -3.87346, -10.4637, -17.408, 66.313 \ /*
3, 1, -4.99071, -23.5873, -76.924, 184.782 \ /*
3, 5, -4.45311, -15.7732, -32.316, 122.705 \ /*
3, 10, -4.1728, -12.4909, -17.912, 83.285 \
4, 1, -5.2678, -27.2836, -78.971, 137.871 \
4, 5, -4.73244, -18.4833, -31.875, 111.817 \ /*
4, 10, -4.45268, -14.7199, -17.969, 101.92 \ /*
5, 1, -5.52826, -30.9051, -92.49, 248.096 \
5, 5, -4.99491, -21.236, -37.685, 194.208 \
5, 10, -4.71587, -17.082, -18.631, 136.672 \ /*
6, 1, -5.77379, -34.701, -105.937, 393.991 \ /*
6, 5, -5.24217, -24.2177, -39.153, 232.528 \ /*
6, 10, -4.96397, -19.6064, -18.858, 174.919 \ /*
7, 1, -6.00609, -38.7383, -108.605, 365.208 \ /*
7, 5, -5.47664, -27.3005, -39.498, 246.918 \ /*
7, 10, -5.19921, -22.2617, -17.91, 208.494 \ /*
8, 1, -6.22758, -42.7154, -119.622, 421.395 \ /*
8, 5, -5.69983, -30.4365, -44.3, 345.48 \
8, 10, -5.4232, -24.9686, -19.688, 274.462 \ /*
9, 1, -6.43933, -46.7581, -136.691, 651.38 \ /*
9, 5, -5.91298, -33.7584, -42.686, 346.629 \ /*
9, 10, -5.63704, -27.8965, -13.88, 236.975 \ /*
10, 1, -6.64235, -50.9783, -145.462, 752.228 \
10, 5, -6.11753, -37.056, -48.719, 473.905 \ /*
10, 10, -5.84215, -30.8119, -14.938, 316.006 \
11, 1, -6.83743, -55.2861, -152.651, 792.577 \
11, 5, -6.31396, -40.5507, -46.771, 487.185 \ /*
11, 10, -6.03921, -33.895, -9.122, 285.164 \ /*
12, 1, -7.02582, -59.6037, -166.368, 989.879 \
12, 5, -6.50353, -44.0797, -47.242, 543.889 \ /*
12, 10, -6.22941, -36.9673, -10.868, 418.414 )

/*
/*
/*
/*

/*
/*
/*
/*

/*

/*
/*
/*
/*

}
return scalar cv1 =

return scalar cv5 =

return scalar cv10 =

end

`cvtab'[(`NS'-1)*3+1,3] +
/*
*/
`cvtab'[(`NS'-1)*3+1,4]/`T' +
*/
`cvtab'[(`NS'-1)*3+1,5]/(`T'^2) +
*/
`cvtab'[(`NS'-1)*3+1,6]/(`T'^3)
`cvtab'[(`NS'-1)*3+2,3] +
/*
*/
`cvtab'[(`NS'-1)*3+2,4]/`T' +
*/
`cvtab'[(`NS'-1)*3+2,5]/(`T'^2) +
*/
`cvtab'[(`NS'-1)*3+2,6]/(`T'^3)
`cvtab'[(`NS'-1)*3+3,3] +
/*
*/
`cvtab'[(`NS'-1)*3+3,4]/`T' +
*/
`cvtab'[(`NS'-1)*3+3,5]/(`T'^2) +
*/
`cvtab'[(`NS'-1)*3+3,6]/(`T'^3)

/*
/*
/*
/*
/*
/*

You might also like