I can calculate the motion of heavenly bodies but not the madness of people. -Isaac Newton

## Duplicate Breusch-Godfrey Test Logic in SAS Autoreg Procedure

Since it appears that SAS and R might give slightly different B-G test results, I spent a couple hours on duplicating the logic of B-G test implemented in SAS Autoreg Procedure. The written SAS macro should give my team more flexibility to perform B-G test in CCAR 2017 model developments in cases that models will not be estimated with Autoreg Procedure.

B-G Test with Proc Autoreg

```data one;
do i = 1 to 100;
x1 = uniform(1);
x2 = uniform(2);
r  = normal(3) * 0.5;
y = 10 + 8 * x1 + 6 * x2 + r;
output;
end;
run;

proc autoreg data = one;
model y = x1 x2 / godfrey = 4;
run;
quit;

/*
Godfrey's Serial Correlation Test

Alternative            LM    Pr > LM
AR(1)              0.2976     0.5854
AR(2)              1.5919     0.4512
AR(3)              1.7168     0.6332
AR(4)              1.7839     0.7754
*/
```

Home-brew SAS Macro

```%macro bgtest(data = , r = , x = , order = 4);
options nocenter nonumber nodate mprint mlogic symbolgen
formchar = "|----|+|---+=|-/\<>*";

proc sql noprint;
select
mean(&r) format = 12.8 into :m
from
&data;
quit;

data _1 (drop = _i);
set &data (keep = &r &x);
%do i = 1 %to &order;
_lag&i._&r = lag&i.(&r);
%end;
_i + 1;
_index = _i - &order;
array _l _lag:;
do over _l;
if _l = . then _l = &m;
end;
run;

proc reg data = _last_ noprint;
model &r =  &x _lag:;
output out = _2 p = rhat;
run;

proc sql noprint;
create table
_result as
select
sum((rhat - &m) ** 2) / sum((&r - &m) ** 2)  as _r2,
(select count(*) from _2) * calculated _r2   as _chisq,
1 - probchi(calculated _chisq, &order.)      as _p_chisq,
&order                                       as _df
from
_2;
quit;

title;
proc report data = _last_ spacing = 1 headline nowindows split = "*";
column(" * BREUSCH-GODFREY TEST FOR SERIAL CORRELATION
* H0: THERE IS NO SERIAL CORRELATION OF ANY ORDER UP TO &order * "
_chisq _df _p_chisq);
define _chisq   / "CHI-SQUARE" width = 20 format = 15.10;
define _df      / "DF"         width = 10;
define _p_chisq / "P-VALUE"    width = 20 format = 15.10;
run;
%mend bgtest;

proc reg data = one noprint;
model y = x1 x2;
output out = two r = r2;
run;
quit;

data _null_;
do i = 1 to 4;
call execute('%bgtest(data = two, r = r2, x = x1 x2, order = '||put(i, 2.)||');');
end;
run;

/*
BREUSCH-GODFREY TEST FOR SERIAL CORRELATION
H0: THERE IS NO SERIAL CORRELATION OF ANY ORDER UP TO 1
CHI-SQUARE         DF              P-VALUE
-------------------------------------------------------
0.2976458421          1         0.5853620441

BREUSCH-GODFREY TEST FOR SERIAL CORRELATION
H0: THERE IS NO SERIAL CORRELATION OF ANY ORDER UP TO 2
CHI-SQUARE         DF              P-VALUE
-------------------------------------------------------
1.5918785412          2         0.4511572771

BREUSCH-GODFREY TEST FOR SERIAL CORRELATION
H0: THERE IS NO SERIAL CORRELATION OF ANY ORDER UP TO 3
CHI-SQUARE         DF              P-VALUE
-------------------------------------------------------
1.7167785901          3         0.6332099963

BREUSCH-GODFREY TEST FOR SERIAL CORRELATION
H0: THERE IS NO SERIAL CORRELATION OF ANY ORDER UP TO 4
CHI-SQUARE         DF              P-VALUE
-------------------------------------------------------
1.7839349922          4         0.7754201982
*/
```