/* REG.G: procedure to compute OLS regression from moment matrix m John Rust, University of Wisconsin, February, 1990 Moment matrix is stored in matrix m, with 1st column corresponding to dependent variable, second column a constant, and remaining columns containing other explanatory variables. Arguments: dvar : name of dependent variable dloc : position of dependent variable ivar : names of independent variables iloc : positions of independent variables cloc : position of constant term savname: string containing pathname to save output printout qsav : string containing pathname to save parameter estimates qvar : string containing pathname to save est residual variance m : regression moment matrix */ proc (0)=reg(dvar,dloc,ivar,iloc,cloc,savname,qsav,qvar,m); local nobs,k,df,xx,xy,yy,b,rv,ssq,vc,t,tv,ybar,pvf,pvt, stderr,fstat,rbsq,rsq,i,const,mask,fmt; /* Extract dependent and independent variables from m */ k=rows(iloc); nobs=m[cloc,cloc]; df=nobs-k; xx=m[iloc,iloc]; xy=m[iloc,dloc]; yy=m[dloc,dloc]; /* Compute OLS coefficients and regression-related statistics */ trap 1; b=solpd(xy,xx); if scalmiss(b); "ERROR: There is perfect collinearity among the independent variables, and the moment matrix is singular."; end; endif; rv=yy-b'xy; ssq=rv/df; vc=(ssq)*invpd(xx); stderr=sqrt(diag(vc)); t=b./stderr; ybar=m[dloc,cloc]/nobs; tv=yy-nobs*ybar*ybar; rsq=1-(rv/tv); rbsq=1-(rv/df)/(tv/(nobs-1)); fstat=((tv-rv)/(k-1))/(rv/df); pvf=cdffc(abs(fstat),k,df); pvt=2*cdftc(abs(t),df); /* Print out results */ output file=^savname reset; "===================== OLS REGRESSION RESULTS ======================"; format /rd,8,8; "Dependent variable ";; $dvar;; format 8,2; " Mean ";; ybar; format /rd,10,0; "Observations:" nobs;; " Degrees of freedom:" df; format /rd,10,4; "R-squared :" rsq;; " Rbar-squared :" rbsq; "Residual SS :" rv;; " Std error of est :" sqrt(rv/df); "Total SS :" tv;; format /rd,1,0; " F(" k "," df ")=";; format 6,4; fstat;; format /rd, 4,2; /rd " P-value=" pvf; ""; "Var Mnemonic Estimate Std. Error t-Stat Cell count"; "--------------------------------------------------------------------"; /* mask=0~1~0~0~0~0; fmt=("*.*lf"~3~0)| ("-*.*s"~11~11)| ("*.*lf"~12~2)| ("*.*lf"~12~2)| ("*.*lf"~12~2)| ("*.*lf"~12~0); xx=(seqa(1,1,rows(ivar))~ivar~b~stderr~t~m[cloc,iloc]'); do until key; endo; yy=printfm(xx,mask,fmt); */ i=1; do until i > k; format /rd, 3,0; i;; format /rd, 10,8; $ivar[i];; format /rd, 12,4; b[i];; format /rd 12,4; stderr[i];; format /rd 12,1; t[i];; format /rd 12,0; m[cloc,iloc[i]]; i=i+1; endo; ""; save ^qsav=b; b=rv/df; save ^qvar=b; "parameters saved in ";; qsav; "residual variance in ";; qvar; chrs(175)$+"edit ";; $savname; output off; endp;