📄 bcasetti.m
字号:
function results=bcasetti(y,x,xc,yc,ndraw,nomit,option)% PURPOSE: computes a heteroscedastic Bayesian variant of Casetti's spatial expansion regression% y = X*g + e, e = N(0,sige*V)% g = Zx*b0x + Zy*b0y, for x-y expansion% g = D b0, for distance expansion% V = diag(v1,v2,...vn), r/vi = ID chi(r)/r, %---------------------------------------------------% USAGE: results = bcasetti(y,x,xc,yc,ndraw,nomit,option)% where: y = dependent variable vector% x = independent variables matrix% xc = latittude (or longitude) coordinate% yc = longitude (or latittude) coordinate% ndraw = # of draws% nomit = # of draws to omit for burn-in% option = a structure variable containing options% option.exp = 0 for x-y expansion (default)% = 1 for distance from ctr expansion% option.ctr = central point observation # for distance expansion% option.norm = 1 for isotropic x-y normalization (default=0)% option.rval = rval for prior (r above, default = 4)%---------------------------------------------------% RETURNS:% results.meth = 'bcasetti'% results.b0draw = (underlying b0x, b0y draws) ndraw-nomit x nvar% results.beta = mean of spatially expanded estimates (nobs x nvar)% results.vmean = mean of vi draws (nobs x 1)% results.yhat = mean of posterior predicted values% results.resid = mean of residuals based on predicted values% results.sdraw = sige draws (ndraw-nomit x 1)% results.rsqr = rsquared% results.rbar = rbar-squared% results.rval = rval (from input)% results.nobs = nobs% results.nvar = # of variables in x% results.y = y data vector% results.xc = xc% results.yc = yc% results.ctr = ctr (if input)% results.dist = distance vector (if ctr used)% results.exp = exp input option% results.norm = norm input option% results.time = time taken for sampling % --------------------------------------------------% NOTE: assumes x(:,1) contains a constant term% --------------------------------------------------% SEE ALSO: prt, plt, prt_spat()%---------------------------------------------------%% written by:% James P. LeSage, Dept of Economics% University of Toledo% 2801 W. Bancroft St,% Toledo, OH 43606% jpl@jpl.econ.utoledo.edunflag = 0;if nargin == 7 % user options if ~isstruct(option) error('bcasetti: must supply the option argument as a structure variable'); else fields = fieldnames(option); nf = length(fields); % set defaults exp = 0; ctr = 0; nflag = 0; rval = 4; for i=1:nf if strcmp(fields{i},'exp') exp = option.exp; elseif strcmp(fields{i},'ctr') ctr = option.ctr; elseif strcmp(fields{i},'norm') nflag = option.norm; elseif strcmp(fields{i},'rval') rval = option.rval; end; end; % end of for i end; % end of if elseelseif nargin == 6 % x-y expansionexp = 0; rval = 4;option.exp = 0;elseerror('Wrong # of arguments to bcasetti');end;if exp == 1 if ctr == 0 error('bcasetti: must enter option.ctr for option.exp = 1'); end;end;[nobs nvar] = size(x);if x(:,1) ~= ones(nobs,1) error('bcasetti: first column in x-matrix must be a constant vector');end;if nflag == 1[xc yc] = normxy(xc,yc);end;results.meth = 'bcasetti';results.y = y;results.nobs = nobs;results.nvar = nvar;results.xc = xc;results.yc = yc;results.option = option;results.exp = exp;results.norm = nflag;results.rval = rval;switch expcase {0} % x-y expansionxt = x(:,2:nvar);xx = matmul(xt,xc);xy = matmul(xt,yc);xmat = [x xx xy];[junk nk] = size(xmat);xpxi = inv(xmat'*xmat);V = ones(nobs,1);in = ones(nobs,1);sige = 1;yhmean = zeros(nobs,1);vmean = zeros(nobs,1);bhmean = zeros(nobs,2*(nvar-1));t0 = clock;for iter=1:ndraw; % begin samplingxmatv = matmul(xmat,sqrt(V));yv = y.*sqrt(V);% update b0xpxi = inv(xmatv'*xmatv);xpy = xmatv'*yv;b0 = xpxi*xpy;a = chol(xpxi);b0 = sqrt(sige)*a'*randn(nk,1) + b0;% update sige e = yv - xmatv*b0;chi = chis_rnd(1,nobs);t2 = chi/(e'*e);sige = 1/t2;% update vie = y - xmat*b0;chiv = chis_rnd(nobs,rval+1); vi = ((e.*e./sige) + in*rval)./chiv;V = in./vi; % generate expansion estimates beta = zeros(nobs,2*(nvar-1));yhat = zeros(nobs,1);xx = matmul(ones(nobs,nvar-1),xc);xy = matmul(ones(nobs,nvar-1),yc);xxxy = [x xx xy];tvar = length(b0); yhat(:,1) = xmat(:,1:nvar)*b0(1:nvar,1); for j=nvar+1:tvar beta(:,j-nvar) = xxxy(:,j)*b0(j,1); yhat(:,1) = yhat(:,1) + xmat(:,j)*b0(j,1); end;if iter > nomit, % save draws vmean = vmean + vi; bsave(iter-nomit,:) = b0'; ssave(iter-nomit,1) = sige; yhmean = yhmean + yhat; bhmean = bhmean + beta;end;end; % end of sampling loopgtime = etime(clock,t0);vmean = vmean/(ndraw-nomit);yhat = yhmean/(ndraw-nomit);beta = bhmean/(ndraw-nomit);results.beta = beta; % mean of expansion estimatesresults.yhat = yhat; % mean of yhate = results.y - results.yhat;results.resid = e; % residualsresults.b0draw = bsave;results.sdraw = ssave;results.vmean = vmean;results.time = gtime;results.ndraw = ndraw;results.nomit = nomit;case{1} % distance from the center expansion% compute distance from central pointxi = xc(ctr);yi = yc(ctr);% calculate distance weighting functiond = sqrt((xc-xi).*(xc-xi) + (yc-yi).*(yc-yi));dvec = d;results.dist= dvec;% transform x-variables using distance vectorxt = x(:,2:nvar);xx = matmul(xt,dvec);xmat = [x xx];[junk tvar] = size(xmat);V = ones(nobs,1);in = ones(nobs,1);sige = 1;yhmean = zeros(nobs,1);vmean = zeros(nobs,1);bhmean = zeros(nobs,nvar-1);t0 = clock;for iter=1:ndraw; % begin samplingxmatv = matmul(xmat,sqrt(V));yv = y.*sqrt(V);% update b0xpxi = inv(xmatv'*xmatv);xpy = xmatv'*yv;b0 = xpxi*xpy;a = chol(xpxi);b0 = sqrt(sige)*a'*randn(length(b0),1) + b0;% update sige e = yv - xmatv*b0;chi = chis_rnd(1,nobs);t2 = chi/(e'*e);sige = 1/t2;% update vie = y - xmat*b0;chiv = chis_rnd(nobs,rval+1); vi = ((e.*e./sige) + in*rval)./chiv;V = in./vi; beta = zeros(nobs,(nvar-1));yhat = zeros(nobs,1);xx = matmul(ones(nobs,nvar-1),dvec);xxxy = [x xx];tvar = length(b0); yhat(:,1) = xmat(:,1:nvar)*b0(1:nvar,1); for j=nvar+1:tvar beta(:,j-nvar) = xxxy(:,j)*b0(j,1); yhat(:,1) = yhat(:,1) + xmat(:,j)*b0(j,1); end;if iter > nomit, % save draws vmean = vmean + vi; bsave(iter-nomit,:) = b0'; ssave(iter-nomit,1) = sige; yhmean = yhmean + yhat; bhmean = bhmean + beta;end;end; % end of sampling loopgtime = etime(clock,t0);vmean = vmean/(ndraw-nomit);yhat = yhmean/(ndraw-nomit);beta = bhmean/(ndraw-nomit);results.vmean = vmean;results.beta = beta;results.yhat = yhat;results.resid = y - yhat;results.b0draw = bsave;results.nvar = nvar;results.ctr = ctr;results.sdraw = ssave;results.yhat = yhat;results.rval = rval;results.time = gtime;results.ndraw = ndraw;results.nomit = nomit;otherwiseerror('casetti: check option input argument');end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -