## SAS Macro for Engle-Granger Co-integration Test

In the coursework of time series analysis, we’ve been taught that a time series regression of Y on X could be valid only when both X and Y are stationary due to the so-call “spurious regression problem”. However, one exception holds that if X and Y, albeit non-stationary, share a common trend such that their trends can be cancelled each other out, then X and Y are co-integrated and the regression of Y on X is valid. As a result, it is important to test the co-integration between X and Y.

Following the definition of co-integration, it is straightforward to formulate a procedure of the co-integration test. First of all, construct a linear combination between Y and X such that e = Y – (a + b * X). Secondly, test if e is stationary with ADF test. If e is stationary, then X and Y are co-integrated. This two-stage procedure is also called Engle-Granger co-integration test.

Below is a SAS macro implementing Engle-Granger co-integration test to show the long-term relationship between GDP and other macro-economic variables, e.g. Personal Consumption and Personal Disposable Income.

**SAS Macro**

%macro eg_coint(data = , y = , xs = ); *********************************************************************; * THIS SAS MACRO IMPLEMENTATION ENGLE-GRANGER COINTEGRATION TEST IN *; * A BATCH MODE TO PROCESS MANY TIME SERIES *; *********************************************************************; * INPUT PARAMETERS: *; * DATA: A INPUT SAS DATASET *; * Y : A DEPENDENT VARIABLE IN THE COINTEGRATION REGRESSION *; * X : A LIST OF INDEPENDENT VARIABLE IN THE COINTEGRATION *; * REGRESSION *; *********************************************************************; * AUTHOR: WENSUI.LIU@53.COM *; *********************************************************************; options nocenter nonumber nodate mprint mlogic symbolgen orientation = landscape ls = 150 formchar = "|----|+|---+=|-/\<>*"; %local sig loop; %let sig = 0.1; %let loop = 1; %do %while (%scan(&xs, &loop) ne %str()); %let x = %scan(&xs, &loop); ods listing close; ods output FitStatistics = _fit; proc reg data = &data; model &y = &x; output out = _1 residual = r; run; quit; proc sql noprint; select cvalue2 into :r2 from _fit where upcase(label2) = "R-SQUARE"; quit; proc arima data = _1; ods output stationaritytests = _adf1 (where = (upcase(type) = "ZERO MEAN" and lags = 1) drop = rho probrho fvalue probf); identify var = r stationarity = (adf = 1); run; quit; ods listing; %if &loop = 1 %then %do; data _adf; format vars $32. lterm_r2 best12. flg_coint $3.; set _adf1 (drop = type lags); vars = upcase("&x"); lterm_r2 = &r2; if probtau < &sig then flg_coint = "YES"; else flg_coint = "NO"; run; %end; %else %do; data _adf; set _adf _adf1 (in = new drop = type lags); if new then do; vars = upcase("&x"); lterm_r2 = &r2; if probtau < &sig then flg_coint = "YES"; else flg_coint = "NO"; end; run; %end; %let loop = %eval(&loop + 1); %end; proc sort data = _last_; by descending flg_coint probtau; run; proc report data = _last_ box spacing = 1 split = "/" nowd; COLUMN("ENGLE-GRANGER COINTEGRATION TEST BETWEEN %UPCASE(&Y) AND EACH VARIABLE BELOW/ " vars lterm_r2 flg_coint tau probtau); define vars / "VARIABLES" width = 35; define lterm_r2 / "LONG-RUN/R-SQUARED" width = 15 format = 9.4 center; define flg_coint / "COINTEGRATION/FLAG" width = 15 center; define tau / "TAU STATISTIC/FOR ADF TEST" width = 20 format = 15.4; define probtau / "P-VALUE FOR/ADF TEST" width = 15 format = 9.4 center; run; %mend eg_coint; %eg_coint(data = sashelp.citiqtr, y = gdp, xs = gyd gc);

**SAS Output**

---------------------------------------------------------------------------------------------------------- | ENGLE-GRANGER COINTEGRATION TEST BETWEEN GDP AND EACH VARIABLE BELOW | | | | LONG-RUN COINTEGRATION TAU STATISTIC P-VALUE FOR | |VARIABLES R-SQUARED FLAG FOR ADF TEST ADF TEST | |--------------------------------------------------------------------------------------------------------| |GC | 0.9985 | YES | -2.8651| 0.0051 | |-----------------------------------+---------------+---------------+--------------------+---------------| |GYD | 0.9976 | YES | -1.7793| 0.0715 | ----------------------------------------------------------------------------------------------------------

From the output, it is interesting to see that GDP in U.S. is driven more by Personal Consumption than by Personal Disposable Income.