📄 messv_g3.m
字号:
iter = 1;in = ones(n,1);sige = sig0;V = ones(n,1);% storage for draws bsave = zeros(ndraw-nomit,k); asave = zeros(ndraw-nomit,1); ssave = zeros(ndraw-nomit,1); rsave = zeros(ndraw-nomit,1); msave = zeros(ndraw-nomit,1); if mm ~= 0 rdraw = zeros(ndraw-nomit,1); else rdraw = 0; end; vmean = zeros(n,1); lsave = 0; rtmp = zeros(nomit,1);hwait = waitbar(0,'MCMC sampling ...');t0 = clock; iter = 1; while (iter <= ndraw); % start sampling; % lookup Ymat based on alpha, rho, neigh values 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; gsize = mmat(2,1) - mmat(1,1); i1 = find(mmat <= neigh + gsize); i2 = find(mmat <= neigh - gsize); i1 = max(i1); i2 = max(i2); indexm = round((i1+i2)/2); if isempty(indexm) indexm = 1; end; Ycap = squeeze(Ymat(:,:,indexr,indexm)); Ycaps = matmul(Ycap,sqrt(V)); % create Sy based on Y [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; Sys = Ycaps*diag(W)*v; xs = matmul(x,sqrt(V)); % update beta AI = inv(xs'*xs + sige*TI); b = x'*Sys + sige*TIc; b0 = AI*b; bhat = norm_rnd(sige*AI) + b0; % update sige nu1 = n + 2*nu; e = (Sys - xs*bhat); d1 = 2*d0 + e'*e; chi = chis_rnd(1,nu1); sige = d1/chi; % update vi e = Sy - x*bhat; chiv = chis_rnd(n,rval+1); vi = ((e.*e./sige) + in*rval)./chiv; V = in./vi; % update rval if mm ~= 0 rval = gamm_rnd(1,1,mm,kk); end; % metropolis step to get alpha update if pflag == 0 alphax = cn_mess3(alpha,y,x,Ymat,bhat,sige,rho,neigh,rmat,mmat); elseif pflag == 1 alphax = cn_mess3(alpha,y,x,Ymat,bhat,sige,rho,neigh,rmat,mmat,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); cnta = cnta+1; % counts accept rate for alpha end; end; if pflag == 0 alphay = cn_mess3(alpha2,y,x,Ymat,bhat,sige,rho,neigh,rmat,mmat); elseif pflag == 1 alphay = cn_mess3(alpha2,y,x,Ymat,bhat,sige,rho,neigh,rmat,mmat,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 = rn_mess3(rho,y,x,Ymat,bhat,alpha,neigh,rmat,mmat); rho2 = unif_rnd(1,rmin,rmax); rhoy = rn_mess3(rho2,y,x,Ymat,bhat,alpha,neigh,rmat,mmat); 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; % update neigh using metroplis-hastings step neighx = nn_mess3(neigh,y,x,Ymat,bhat,alpha,rho,rmat,mmat); neigh2 = round(unif_rnd(1,mmin,mmax)); neighy = nn_mess3(neigh2,y,x,Ymat,bhat,alpha,rho,rmat,mmat); ru = unif_rnd(1,0,1); if ((neighy - neighx) > exp(1)), p = 1; else, ratio = exp(neighy-neighx); p = min(1,ratio); end; if (ru < p) neigh = neigh2; 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; msave(iter-nomit,1) = neigh; vmean = vmean + vi; if mm~= 0 rdraw(iter-nomit) = rval; end; 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.05 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;vmean = vmean/(iter-nomit);amean = mean(asave);bmean = mean(bsave);astd = std(asave);bstd = std(bsave);smean = mean(ssave);rmean = mean(rsave);rstd = std(rsave);mmean = mean(msave);mstd = std(msave);% find acceptance rateresults.accept = 1 - cnta/(iter+cnta);% NOTE: this could be interpreted as the% probability that alpha is in the mesh grid% compute Sy based on posterior means for rho, neigh, alphamround = round(mmean);tmp = rmean.^(0:mround-1);tmp = tmp/sum(tmp);% find index into nearest neighborsnnlist = nnlistall(:,1:mround);wy = y;Y = y(:,ones(1,q));for i=2:q;wy = wy(nnlist)*tmp';Y(:,i) = wy;end;Ys = matmul(Y,sqrt(vmean));[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;sys = Ys*diag(W)*v;e = sy - x*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 = 'messv_g3';results.bdraw = bsave;results.rdraw = rsave;results.adraw = asave;results.bmean = bmean';results.bstd = bstd';results.amean = amean;results.astd = astd;results.smean = smean;results.sdraw = ssave;results.rmean = rmean;results.rstd = rstd;results.rdraw = rsave;results.mmean = mmean;results.mstd = mstd;results.mdraw = msave;results.lmean = lmean;results.vmean = vmean;results.rvdraw = rdraw;results.bprior = c;results.bpstd = sqrt(diag(T));results.nobs = n;results.nvar = k;results.ndraw = ndraw;results.nomit = nomit;results.time = time;results.stime = stime;results.ntime = gtime;results.nu = nu;results.d0 = d0;if mm~= 0results.m = m;results.k = k;elseresults.rval = rval;end;results.tflag = 'plevel';results.pflag = pflag;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.nobs = n;results.nvar = k;results.xflag = xflag;results.nflag = nflag;case{1} % case of x-variables transformed xone = x(:,1); if all(xone == 1) xsub = x(:,2:k); else xsub = x; end;results.rmin = rmin;results.rmax = rmax;results.mmin = mmin;results.mmax = mmax;rgrid = rmin:0.01:rmax;mgrid = mmin:1:mmax;nrho = length(rgrid);nneigh = length(mgrid);t1 = clock; % time this operation% storage for Y,X over the gridYmat = zeros(n,q,nrho,nneigh); % vectors of Sy for various alpha,rho,neigh valuesXmat = zeros(n,2*k-1,nrho,nneigh); % matrices of Sx for various alpha,rho,neigh valuesrmat = zeros(nrho,1); % save rho valuesmmat = zeros(nneigh,1); % save neigh values% we have to construct the weight matrix using neighborsif nflag == 0nnlistall = find_nn(latt,long,mmax);elseif nflag == 1nnlistall = find_nn(latt,long,mmax,3);elseerror('messv_g3: bad nflag option');end;% check for empty nnlist columnschk = find(nnlistall == 0);if length(chk) > 0; if nflag == 1 % no saving the user here error('messv_g3: trying too many neighbors, some do not exist'); else % we save the user here nnlistall = find_nn(latt,long,mmax,4); end;end;% do grid over rho, neigh valueshwait = waitbar(0,'computing grid over rho and neighbors ...');ngrid = nneigh*nrho;iter = 1;for kk=1:nneigh;neigh = mgrid(kk);nnlist = nnlistall(:,1:neigh);for jj=1:nrho;rho = rgrid(jj);tmp = rho.^(0:neigh-1);tmp = tmp/sum(tmp);% construct and save Ywy = y;Y = y(:,ones(1,q));for i=2:q;wy = wy(nnlist)*tmp';Y(:,i) = wy;end;Ymat(:,:,jj,kk) = Y;% create and save X[junk nk] = size(xsub);xout = x;for i=1:nk;xi = xsub(:,i);tmpp = xi(nnlist)*tmp';xout = [xout tmpp];end;Xmat(:,:,jj,kk) = xout;% save rhormat(jj,1) = rho;end; % end of loop over rho values mmat(kk,1) = neigh;iter = iter + nrho; waitbar(iter/ngrid); end; % end of loop over neighborsclose(hwait);% end of up front stuff with Sy saved in Symatgtime = etime(clock,t1);% ====== initializations% compute this stuff once to save time[junk kk] = size([x xsub]); % need to add diffuse priors % to the spatial lags of x-variablesTnew = eye(kk)*1e+12;Tnew(1:k,1:k) = T;TI = inv(Tnew);tmp = zeros(kk,1);tmp(1:k,1) = c;c = tmp;TIc = TI*c;cc=0.2; % initial metropolis valuecntr = 0; iter = 1;alpha = astart;rho = 1;in = ones(n,1);sige = sig0;V = ones(n,1);% storage for draws bsave = zeros(ndraw-nomit,kk); asave = zeros(ndraw-nomit,1); ssave = zeros(ndraw-nomit,1); rsave = zeros(ndraw-nomit,1); msave = zeros(ndraw-nomit,1); if mm ~= 0 rdraw = zeros(ndraw-nomit,1); else rdraw = 0; end; vmean = zeros(n,1); lsave = 0; rtmp = zeros(nomit,1);hwait = waitbar(0,'MCMC sampling ...');t0 = clock; iter = 1; while (iter <= ndraw); % start sampling; % lookup Sx based on rho values 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; gsize = mmat(2,1) - mmat(1,1); i1 = find(mmat <= neigh + gsize); i2 = find(mmat <= neigh - gsize); i1 = max(i1); i2 = max(i2); indexm = round((i1+i2)/2); if isempty(indexm) indexm = 1; end; Ycap = squeeze(Ymat(:,:,indexr,indexm)); Ycaps = matmul(Ycap,sqrt(V)); Xcap= squeeze(Xmat(:,:,indexr,indexm)); Xcaps = matmul(Xcap,sqrt(V)); % construct Sy based on look up values [junk nq] = size(Ycap); nq1 = nq-1; v = ones(nq,1); for i=2:nq;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -