/************************************************************ Finite-sample Adjustment for standard error estimates for ordinary least square regression
data: the input data set cluster: cluster variable dep : outcome variable indvars : variable list of all the independent variables
Example: %reg_cluster(auto, rep78, dep=price, indvars=mpg weight) ************************************************************/ %macro reg_cluster(data, cluster, dep =, indvars = ); data &data._1; set &data; array all(*) &dep &indvars; do _i = 1 to dim(all); if all(_i) = . then delete; end; drop _i; run;
proc genmod data = &data._1; class &cluster; model &dep = &indvars /dist=normal; repeated subject = &cluster /type = ind covb; ods output geercov = gcov; ods output GEEEmpPEst = parms; run; quit; proc sql; select count(&cluster),count(distinct &cluster) into :n, :m from &data._1; quit; proc sql; select count(prm1) into :k from gcov; quit; data gcov_ad; set gcov; array all(*) _numeric_; do i = 1 to dim(all); all(i) = all(i)*((&n-1)/(&n-&k))*(&m/(&m-1)); if i = _n_ then std_ad = sqrt(all(i)); end; drop i; keep std_ad; run; data all; merge parms gcov_ad; run; proc print data = all noobs; run; %mend;