本文章參考文獻
Newey, W. and West, K. (1987) A Simple, Positive Semi-Definite, Heteroscedastic and Autocorrelation Consistent Covariance Matrix. Econometric, 55, 703-708.
在Newey and West (1987) 的文章中,提出了當數據存在自相關時,需要進行殘差的調整,這個調整的方程式如下式
其中,
由該定義來看,其實這表示原來數值的方差不能夠精準計算出t統計量,要加入自相關的修正項,就是原來數值的方法,則是自相關的修正像(協方差),我們可以將這個式子逐漸拓展,以便更好了解它的意義
假設數列Y_t,存在一階自相關(m=1),則他的一階修正的Newey and West的方差可以表示為
存在二階自相關(m=2),則他的二階修正的Newey and West的方差可以表示為
存在三階自相關(m=3),則他的三階修正的Newey and West的方差可以表示為
藉由這樣的反覆循環,我們只要使用
proc means 可以算出y的方差
以及lag函數求出Y的滯後期數數值,就能夠利用proc corr可以算出他們的協方差
最終算出Newey and West修正後的標準偏誤
以下為我們開發出來的宏語法使用代碼
data a; do i=1 to 10000; a=rannor(1); b=rannor(2); output; end;run;
%let lag=4;
proc model data=a; parms aa; exogenous a ;instruments / intonly; a =aa;fit a / gmm kernel=(bart, %eval(&lag+1), 0); quit;
proc model data=a; parms aa; exogenous b ;instruments / intonly; b =aa;fit b / gmm kernel=(bart, %eval(&lag+1), 0); quit;
為了先檢驗算出的調整後標準誤與GMM一致,我們先檢驗滯後4期的結果,首先給出變量a的Newey and West調整四期的結果
接下來為變量b的結果
/*
file 要進行檢定的文件time 時間變量很重要nwvar 要進行檢定的變量nwlag 要調整的期數生成的文件為stderr
*/%newey_west(file=a,time=i,nwvar=a b,nwlag=4);
proc print data=stderr noobs;run;
結果可以發現,修正四期的結果與proc model運行的結果一致,接下來測試3期的結果
%let lag=3;
proc model data=a; parms aa; exogenous a ;instruments / intonly; a =aa;fit a / gmm kernel=(bart, %eval(&lag+1), 0); quit;proc model data=a; parms aa; exogenous b ;instruments / intonly; b =aa;fit b / gmm kernel=(bart, %eval(&lag+1), 0); quit;%newey_west(file=a,time=i,nwvar=a b,nwlag=3);
proc print data=stderr noobs;run;
這些結果也是完全相同的,我們重複測試了20期,結果都是與proc model計算出來的數值一致,而且該宏語法可以同時針對多個變量一同檢定,以下為我們宏語法的完整文件。
%macro newey_west(file,time,nwvar,nwlag);proc sort data=&file(keep=&time &nwvar) out=nw(keep=&nwvar);by &time;run;proc means data=nw noprint; var &nwvar; output out=nw00 var=&nwvar;run;
data _null_; b=countc("&nwvar",' ')+1; call symputx('iannwn',b);run;%do nwn=1 %to &iannwn;data _null_; call symputx('nwnw',scan("&nwvar",&nwn));run; %if &nwn=1 %then %do; proc delete data=nw0; run; %end; %else %do; proc delete data=nw1; run; %end; %do nnlag=1 %to &nwlag; data nwnw; set nw(keep=&nwnw); nwnw=lag&nnlag(&nwnw); run; proc corr data=nwnw cov outp=nwnw(keep=_type_ &nwnw where=(_type_='COV')) noprint; var &nwnw nwnw; run; data nwnw; set nwnw(drop=_type_); &nwnw=&nwnw*2*(1+&nwlag-&nnlag)/(1+&nwlag); if _n_=2; run; %if &nwn=1 %then %do; proc append base=nw0 data=nwnw force; quit; %end; %else %do; proc append base=nw1 data=nwnw force; quit; %end; %end; %if &nwn>1 %then %do; data nw0; merge nw0 nw1; run; %end;%end; data nw00; set nw00 nw0; run; proc delete data=nw0 nw1 nwnw nw; run; proc means data=nw00 noprint; var _freq_ &nwvar; output out=nw00(drop=_type_ _freq_) sum=NW_TTT &nwvar; run; %do nwn=1 %to &iannwn;data _null_; call symputx('nwnw',scan("&nwvar",&nwn));run;data nw00; set nw00; &nwnw=(&nwnw/nw_TTT)**0.5; run; %end; data stderr; set nw00; drop nw_ttt; run;proc delete data=nw00;run;%mend;如果喜歡我們的介紹,還請多多支持。
[小天使專區] 有需要SAS之家協助,歡迎在小天使專區留言。
SAS大學版安裝包-->"大學版"
SAS之家群助手-->"群小助手"
本人兩本著作代碼-->"作品代碼"