📄 mess_g2.m
字号:
TIc = TI*c;cc=0.2; % initial metropolis valuecntr = 0; iter = 1;alpha = astart;rho = 1;in = ones(n,1);sige = sig0;% storage for draws bsave = zeros(ndraw-nomit,kk); asave = zeros(ndraw-nomit,1); ssave = zeros(ndraw-nomit,1); rsave = zeros(ndraw-nomit,1); lsave = 0; rtmp = zeros(nomit,1);hwait = waitbar(0,'MCMC sampling ...');t0 = clock; iter = 1; while (iter <= ndraw); % start sampling; gsize = rmat(2,1) - rmat(1,1); i1 = find(rmat <= rho + gsize); i2 = find(rmat <= rho - gsize); i1 = max(i1); i2 = max(i2); indexr = round((i1+i2)/2); if isempty(indexr) indexr = 1; end; xmat = squeeze(Sxmat(:,:,indexr)); % get Sy for free Ycap = squeeze(Symat(:,:,indexr)); % construct Sy based on look up values [junk nq] = size(Ycap); nq1 = nq-1; v = ones(nq,1); for i=2:nq; v(i,1) = alpha.^(i-1); end; W = (1./[1 cumprod(1:nq1)]); Sy = Ycap*diag(W)*v; % update beta AI = inv(xmat'*xmat + sige*TI); b = xmat'*Sy + sige*TIc; b0 = AI*b; bhat = norm_rnd(sige*AI) + b0; % update sige nu1 = n + 2*nu; e = (Sy - xmat*bhat); d1 = 2*d0 + e'*e; chi = chis_rnd(1,nu1); sige = d1/chi; % metropolis step to get alpha update if pflag == 0 alphax = c_mess2(alpha,y,xmat,Symat,bhat,sige,rho,rmat); elseif pflag == 1 alphax = c_mess2(alpha,y,xmat,Symat,bhat,sige,rho,rmat,palpha,S); end; accept = 0; alpha2 = alpha + cc*randn(1,1); while accept == 0 if alpha2 <= 0 accept = 1; else alpha2 = alpha + cc*randn(1,1); cntr = cntr+1; % counts accept rate end; end; if pflag == 0 alphay = c_mess2(alpha2,y,xmat,Symat,bhat,sige,rho,rmat); elseif pflag == 1 alphay = c_mess2(alpha2,y,xmat,Symat,bhat,sige,rho,rmat,palpha,S); end; ru = unif_rnd(1,0,1); if ((alphay - alphax) > exp(1)), p = 1; else, ratio = exp(alphay-alphax); p = min(1,ratio); end; if (ru < p) alpha = alpha2; end; rtmp(iter,1) = alpha;% update rho using metroplis-hastings step rhox = r_mess2(rho,y,xmat,Symat,bhat,alpha,rmat); rho2 = unif_rnd(1,rmin,rmax); rhoy = r_mess2(rho2,y,xmat,Symat,bhat,alpha,rmat); ru = unif_rnd(1,0,1); if ((rhoy - rhox) > exp(1)), p = 1; else, ratio = exp(rhoy-rhox); p = min(1,ratio); end; if (ru < p) rho = rho2; end; % evaulate the likelihood using current draws if lflag == 0 like = -(n/2)*log(2*pi*sige) - (e'*e)/(2*sige); end; % update rval if mm ~= 0 rval = gamm_rnd(1,1,mm,kk); end; if iter > nomit % if we are past burn-in, save the draws bsave(iter-nomit,:) = bhat'; ssave(iter-nomit,1) = sige; asave(iter-nomit,1) = alpha; rsave(iter-nomit,1) = rho; if lflag == 0 lsave = lsave + like; else lsave = lsave + 0; end; end; if iter == nomit % update cc based on initial draws tst = 2*std(rtmp(1:nomit,1)); if tst > 0.1 cc = tst; end; end; iter = iter + 1; waitbar(iter/ndraw); end; % end of sampling loopclose(hwait);stime = etime(clock,t0);% compute posterior meansif lflag == 0lmean = lsave/(ndraw-nomit);else lmean = 0;end;amean = mean(asave);bmean = mean(bsave);astd = std(asave);bstd = std(bsave);smean = mean(ssave);rmean = mean(rsave);rstd = std(rsave);% find acceptance rateresults.accept = 1 - cntr/(iter+cntr);tmp = rmean.^(0:neigh-1);tmp = tmp/sum(tmp);% construct Sy, Sx based on posterior meanswy = y;Y = y(:,ones(1,q));for i=2:q;wy = wy(nnlist)*tmp';Y(:,i) = wy;end;[junk nq] = size(Y);nq1 = nq-1;v = ones(nq,1);for i=2:nq;v(i,1) = amean.^(i-1);end;W = (1./[1 cumprod(1:nq1)]);sy = Y*diag(W)*v;% create Sx based on posterior mean of rhoxmat = x;for i=1:nk;xi = xsub(:,i);tmpp = xi(nnlist)*tmp';xmat = [xmat tmpp];end;e = Sy - xmat*bmean';yhat = y - e;sigu = e'*e;ym = y - mean(y);rsqr1 = sigu;rsqr2 = ym'*ym;rsqr = 1.0 - rsqr1/rsqr2; % r-squaredrsqr1 = rsqr1/(n-k);rsqr2 = rsqr2/(n-1.0);rbar = 1 - (rsqr1/rsqr2); % rbar-squaredtime = etime(clock,timet);results.meth = 'mess_g2';results.bdraw = bsave;results.adraw = asave;results.bmean = bmean';results.bstd = bstd';results.amean = amean;results.astd = astd;results.smean = smean;results.sdraw = ssave;results.lmean = lmean;results.rmean = rmean;results.rstd = rstd;results.rdraw = rsave;results.bprior = c;results.bpstd = sqrt(diag(Tnew));results.nobs = n;results.nvar = k;results.ndraw = ndraw;results.nomit = nomit;results.time = time;results.stime = stime;results.nu = nu;results.d0 = d0;results.tflag = 'plevel';results.aflag = aflag;results.palpha = palpha;results.acov = S;results.y = y;results.yhat = yhat;results.resid = e;results.rsqr = rsqr;results.rbar = rbar;results.neigh = neigh;results.q = q;results.ntime = gtime;results.nobs = n;results.nvar = k;results.xflag = xflag;results.nflag = nflag;otherwise end; % end of switchfunction cout = c_mess2(alpha,ys,xs,Symat,beta,sige,rho,rmat,a,B);% PURPOSE: evaluate the conditional distribution of alpha % for the Bayesian mess_g2 model% ---------------------------------------------------% USAGE: cout = c_mess1(alpha,y,x,Symat,beta,sige,rho,rmat,a,B)% where: alpha = matrix exponential alpha spatial parameter% y = dependent variable vector% x = explanatory variables matrix% Symat = matrix from mess_g1 % containing a mesh of Sy for rho values% beta = kx1 current bhat vector% sige = 1x1 current sige value% rho = current neigh value (for lookup)% rmat = matrix of rho values in the mesh% a = prior mean for alpha (optional input)% B = prior variance for alpha (optional input)% ---------------------------------------------------% RETURNS: a conditional used in Metropolis-Hastings sampling% NOTE: called only by mess_g2% --------------------------------------------------% SEE ALSO: mess_g2, mess_g2d% ---------------------------------------------------% written by: James P. LeSage 1/2000% University of Toledo% Department of Economics% Toledo, OH 43606% jlesage@spatial-econometrics.comn = length(ys);gsize = rmat(2,1) - rmat(1,1);i1 = find(rmat <= rho + gsize);i2 = find(rmat <= rho - gsize);i1 = max(i1);i2 = max(i2);indexr = round((i1+i2)/2);if isempty(indexr)indexr = 1;end;Ycap = squeeze(Symat(:,:,indexr));[junk nq] = size(Ycap);nq1 = nq-1;v = ones(nq,1);for i=2:nq;v(i,1) = alpha.^(i-1);end;W = (1./[1 cumprod(1:nq1)]);Sy = Ycap*diag(W)*v;e = Sy - xs*beta;epe = e'*e;if nargin == 8cout = -epe/(2*sige);elseif nargin == 10B = B*sige;cout = -epe/(2*sige) - 0.5*(((alpha-a)^2)/B);elseerror('c_mess2: Wrong # of inputs arguments');end; function cout = r_mess2(rho,ys,xs,Symat,beta,alpha,rmat);% PURPOSE: evaluate the conditional distribution of rho % for the Bayesian mess_g2 model% ---------------------------------------------------% USAGE: cout = m_mess1(neigh,y,x,Symat,beta,alpha,rmat)% where: rho = neighbors% y = dependent variable vector% x = explanatory variables matrix% Symat = matrix from mess_g2 % containing a mesh of Sy for rho values% beta = kx1 current bhat vector% alpha = current alpha value % rmat = matrix of rho values in the mesh% ---------------------------------------------------% RETURNS: a conditional used in Metropolis-Hastings sampling% NOTE: called only by mess_g2% --------------------------------------------------% SEE ALSO: mess_g2, mess_g2d% ---------------------------------------------------% written by: James P. LeSage 1/2000% University of Toledo% Department of Economics% Toledo, OH 43606% jlesage@spatial-econometrics.comn = length(ys);gsize = rmat(2,1) - rmat(1,1);i1 = find(rmat <= rho + gsize);i2 = find(rmat <= rho - gsize);i1 = max(i1);i2 = max(i2);indexr = round((i1+i2)/2);if isempty(indexr)indexr = 1;end;Ycap = squeeze(Symat(:,:,indexr));[junk nq] = size(Ycap);nq1 = nq-1;v = ones(nq,1);for i=2:nq;v(i,1) = alpha.^(i-1);end;W = (1./[1 cumprod(1:nq1)]);Sy = Ycap*diag(W)*v;e = Sy - xs*beta;epe = e'*e;cout = -(n/2)*log(epe);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -