?? hbmreg3.gss
字號:
@ extract xi @
xi = xdata[.,bot:top];
resid[.,j] = ydata[.,j] - xi*(beta[j,.]');
bot = top + 1; top = top + rankx;
endfor;
/*
***************************************************************
* Generate sigma
*
* sn = s0 + sum_{i=1}^{nsub} (Y_i - X*beta_i)'(Y_i - X*beta_i)
****************************************************************
*/
sgni = sg0i + resid'resid;
sgn = invpd(sgni);
{sigmai, sigma} = wishart(npop,sfn,sgn);
retp(beta,sigma,sigmai);
endp;
/*
****************************************************************
* GETMULREG
* Generate multivariate regression parameters.
* Yd = Xd*parmat + epsilon
*
* INPUT
* yd = dependent variables
* xd = independet variables
* xdtxd = xd'xd
*
* parmat = current value of coefficient matrix
* var = current value of covariance matrix
* vari = its inverse
* v0i = prior precisions for bmat
* v0iu0 = prior precision*prior mean for bmat
* f0n = posterior df for sigma
* g0i = prior scaling matrix inverse for sigma
*
* OUTPUT
* parmat = updated rankx x mvar coefficient matrix
* var = updated variance
* vari = updated inverse of sigma
*
* Calling Statement:
{parmat, var, vari} = getmulreg(yd,xd,xdtxd,parmat,var,vari,v0i,v0iu0,f0n,g0i);
****************************************************************
*/
PROC (3) = getmulreg(yd,xd,xdtxd,parmat,var,vari,v0i,v0iu0,f0n,g0i);
local vb12, ubn, par, pdim, resid, gni, gn, rp, cp;
rp = rows(parmat);
cp = cols(parmat);
pdim = rp*cp;
/*
***********************************************************
* Generate parmat from N_{rp x cp}(M,v)
* par = vecr(parmat)
* par is N(u,V) whee u = vec(M');
* V = (Xd'Xd.*.Var^{-1} + V_0^{-1})^{-1}
* u = V*( (Xd'.*.Var^{-1})*vec(Yd') + V_0^{-1}u_0 )
*************************************************************
*/
vb12 = chol(xdtxd.*.vari + v0i);
ubn = ( (xd').*.vari )*vecr(yd) + v0iu0;
par = cholsol(ubn + vb12'rndn(pdim,1), vb12);
parmat = reshape(par,rp,cp);
/*
*********************************************************
* Generate Var
* Var^{-1} is Wishart df = f0n, scale matrix = gn
*********************************************************
*/
resid = yd - xd*parmat;
gni = g0i + resid'resid;
gn = invpd(gni);
{vari, var} = wishart(cp,f0n,gn);
retp(parmat,var,vari);
endp;
/*
*****************************************************************************************************
* OUTPUTANAL
* Does analysis of output and save some results
****************************************************************************************************
*/
PROC (0) = outputanal;
local
bout, sout, ebeta, sbeta, cb, fmtn1, fmtn2, fmts1, fmts2, a, b,
betat, bstart, sigmat, omegat, lambdat, i0, i, j0, j, ic ;
if flagtrue == 1; @ Did a simulation @
load betat = betat;
load sigmat = sigmat;
load omegat = omegat;
load lambdat = lambdat;
endif;
@ Define formats for fancy printing @
@ Used to print a matrix of alpha & numeric variables @
format 10,5; @ Default pring format @
let fmtn1[1,3] = "*.*lf" 10 5; @ Format for printing numeric variable @
let fmtn2[1,3] = "*.*lf" 10 0; @ Format for numeric variable, no decimal @
let fmts1[1,3] = "-*.*s" 10 9; @ Format for alpha, left justify @
let fmts2[1,3] = "*.*s" 10 9; @ Format for alpha, right justify @
output file = ^outfile reset; @ outfile is the file handle for the output file @
@ Route printed output to the defined by outfile @
print "Results from HBMReg3.GSS";
print "Hierarchical Bayesian Multivariate Regression Model using MCMC.";
print "Different design matrices for each population, but same number of obserations";
print "Y_j = X_j*beta_j + epsilon_j for j = 1, ..., m";
print "Within population, epsilon_j are independent";
print "Between population error covarariance is Sigma";
print;
print "B = Z*Thete + Delta";
print;
print "Ouput file: " getpath(outfile); @ File assigned to file handle outfile @
datestr(date); @ Print the current data @
print;
print;
print "-----------------------------------------------------------------------------------";
print;
print "MCMC Analysis";
print;
print "Total number of MCMC iterations = " nmcmc;
print "Number of iterations used in the analysis = " smcmc;
print "Number in transition period = " nblow;
print "Number of iterations between saved iterations = " skip-1;
print;
print "Number of populations = " npop;
print "Mean # of observations per population = " nobs;
print;
print;
print "Variables in first level equation: Y_j = X_j*beta_j + epsilon_j";
print;
print " Summary Statistics for X and Y";
call sumstats(xynames,xydata,fmts1,fmts2,fmtn1);
print;
print "Variables in second level equation: beta_i = Theta*z_i + delta_i";
print;
print " Summary Statistics for Z";
print sumstats(znames,zdata,fmts1,fmts2,fmtn1);
print;
print "-----------------------------------------------------------------------------------";
print;
print "Statistics of Fit Measures for each Y";
sout = {"Variable" "Mult-R" "R-Square" "RMSE"};
print outitle(sout,fmts1,fmts2);
bout = ynames~multr~rsquare~rmse;
print outmat(bout,fmts1,fmtn1);
print;
print;
print "-----------------------------------------------------------------------------------";
print "Estimation of the error covariance Sigma";
sout = "Variable"~(ynames');
if flagtrue == 1;
print "True Sigma";
call outitle(sout,fmts1,fmts2);
bout = ynames~sigmat;
call outmat(bout,fmts1,fmtn1);
print;
endif;
print "Posterior Mean of Sigma ";
call outitle(sout,fmts1,fmts2);
bout = ynames~sigmam;
call outmat(bout,fmts1,fmtn1);
print "Posterior STD of Sigma";
call outitle(sout,fmts1,fmts2);
bout = ynames~sigmas;
call outmat(bout,fmts1,fmtn1);
print;
print "-----------------------------------------------------------------------------------";
print;
print "Statistics for Individual-Level Regression Coefficients";
if flagtrue == 1;
ebeta = vecr(betam);
sbeta = vecr(betas);
bstart = vecr(betat);
sout = {"Variable" "True" "P.Mean" "P.STD"};
call outitle(sout,fmts1,fmts2);
bout = xnames~bstart~ebeta~sbeta;
call outmat(bout,fmts1,fmtn1);
print;
else;
ebeta = vecr(betam);
sbeta = vecr(betas);
sout = {"Variable" "P.Mean" "P.STD"};
call outitle(sout,fmts1,fmts2);
bout = xnames~ebeta~sbeta;
call outmat(bout,fmts1,fmtn1);
print;
endif;
print;
print "-----------------------------------------------------------------------------------";
print;
print "HB Estimates of Theta";
sout = " "~(bnames');
if flagtrue == 1;
print "True Theta";
call outitle(sout,fmts1,fmts2);
bout = znames~omegat;
call outmat(bout,fmts1,fmtn1);
print;
endif;
print "Posterior Mean of Theta";
print outitle(sout,fmts1,fmts2);
bout = znames~omegam;
call outmat(bout,fmts1,fmtn1);
print;
print "Posterior STD of Theta";
call outitle(sout,fmts1,fmts2);
bout = znames~omegas;
call outmat(bout,fmts1,fmtn1);
print;
print "Posterior Mean/Posterior STD";
call outitle(sout,fmts1,fmts2);
bout = znames~(omegam./omegas);
call outmat(bout,fmts1,fmtn1);
print;
print;
print "-----------------------------------------------------------------------------------";
print;
sout = " "~(bnames');
print "HB Estimate of Lambda";
if flagtrue == 1;
print "True Lambda";
call outitle(sout,fmts1,fmts2);
bout = bnames~lambdat;
call outmat(bout,fmts1,fmtn1);
print;
endif;
print "Posterior Mean of Lambda";
call outitle(sout,fmts1,fmts2);
bout = bnames~lambdam;
call outmat(bout,fmts1,fmtn1);
print;
print "Posterior STD of Lambda";
call outitle(sout,fmts1,fmts2);
bout = bnames~lambdas;
call outmat(bout,fmts1,fmtn1);
print;
print "==============================================================================";
output off;
closeall;
endp;
/*
*****************************************************************************************
* OUTITLE
* Prints header for columns of numbers.
* INPUT
* a = character row vector of column names
* fmts1 = format for first column
* fmts2 = format for second column
* OUTPUT
* None
******************************************************************************************
*/
PROC (0) = outitle(a,fmt1,fmt2);
local mask, fmt, flag, ncols;
ncols = cols(a);
mask = zeros(1,ncols);
fmt = fmt1|(ones(ncols-1,1).*.fmt2);
flag = printfm(a,mask,fmt);
print;
endp;
/*
***************************************************************************************
* OUTMAT
* Outputs a matrix:
* (Character Vector)~(Numeric matrix);
* The entries in the numeric matrix have the same format
* INPUT
* bout = matrix to be printed
* fmts = format for string
* fmtn = format for numeric matrix
* OUTPUT
* None
******************************************************************************************
*/
PROC (0) = outmat(bout,fmts,fmtn);
local fmt,mask,flag,ncols, nrows;
ncols = cols(bout);
nrows = rows(bout);
fmt = fmts|(ones(ncols-1,1).*.fmtn);
mask = zeros(nrows,1)~ones(nrows,ncols-1);
flag = printfm(bout,mask,fmt);
print;
endp;
/*
*****************************************************************************************
* SUMSTATS
* Prints summary statistics for a data matrix
* INPUT
* names = charater vector of names
* data = data matrix
* fmts1 = format for string
* fmts2 = format for string
* fmtn = format for numbers
* OUTPUT
* None
********************************************************************************************
*/
PROC (0) = sumstats(names,data,fmts1,fmts2,fmtn);
local a, bout;
a = {"Variable" "Mean" "STD" "MIN" "MAX"};
call outitle(a,fmts1,fmts2);
bout = names~meanc(data)~stdc(data)~minc(data)~maxc(data);
call outmat(bout,fmts1,fmtn);
endp;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -