⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bgwrv.m

📁 计量工具箱
💻 M
字号:
function results = bgwrv(y,x,east,north,ndraw,nomit,info);% PURPOSE: compute Bayesian robust geographically weighted regression%          Wi*y = Wi*X*bi + ei, ei is N(0,sigi*Vi)%          Vi = diag(v1i,v2i,...vni), %          r/vi = ID chi(r)/r, r = Gamma(m,k) %----------------------------------------------------% USAGE: results = bgwrv(y,x,east,north,ndraw,nomit,info)% where:   y = dependent variable vector%          x = explanatory variable matrix%       east = x-coordinates in space%      north = y-coordinates in space%      ndraw = # of draws%      nomit = # of initial draws omitted for burn-in%       info = a structure variable with fields:%       info.rval, r prior hyperparameter, default=4%       info.bwidth = scalar bandwidth to use or zero %                     for cross-validation estimation (default)%       info.bmin   = minimum bandwidth to use in CV search%       info.bmax   = maximum bandwidth to use in CV search%                     defaults: bmin = 0.1, bmax = 20                         %       info.dtype  = 'gaussian'    for Gaussian weighting (default)%                   = 'exponential' for exponential weighting%                   = 'tricube'     for tri-cube weighting%       info.q      = q-nearest neighbors to use for tri-cube weights%                     (default: CV estimated)  %       info.qmin   = minimum # of neighbors to use in CV search%       info.qmax   = maximum # of neighbors to use in CV search%                     defaults: qmin = nvar+2, qmax = 5*nvar     % ---------------------------------------------------                                    %  NOTE: res = bgwrv(y,x,east,north) does CV estimation of bandwidth% ---------------------------------------------------% RETURNS: a results structure%        results.meth   = 'bgwrv'%        results.bdraw  = beta draws (ndraw-nomit x nobs x nvar) (a 3-d matrix)%        results.smean  = mean of sige draws (nobs x 1)%        results.vmean  = mean of vi draws (nobs x 1)%        results.nobs   = nobs%        results.nvar   = nvars%        results.ndraw  = ndraw%        results.nomit  = nomit        %        results.r      = rval (from input)%        results.bwidth = bandwidth if gaussian or exponential%        results.q      = q nearest neighbors if tri-cube%        results.dtype  = input string for Gaussian,exponential,tricube weights%        results.iter   = # of simplex iterations for cv%        results.ycoord = north (y-coordinates)%        results.xcoord = east  (x-coordinates)%        results.y      = y data vector%        results.x      = x data matrix%        results.time   = time (in seconds) taken%---------------------------------------------------% See also: prt,plt, prt_gwr, plt_gwr to print and plot results%---------------------------------------------------% NOTES: uses auxiliary function scoref for cross-validation%---------------------------------------------------% written by: James P. LeSage 2/98% University of Toledo% Department of Economics% Toledo, OH 43606% jpl@jpl.econ.utoledo.eduif nargin == 7 % user options if ~isstruct(info)    error('bgwrv: must supply the option argument as a structure variable'); else fields = fieldnames(info); nf = length(fields); % set defaults [n k] = size(x); bwidth = 0; dtype = 0; q = 0; qmin = k+2; qmax = 5*k;  rval = 4; bmin = 0.1; bmax = 20;  % default values for CV gaussian and exponential search  for i=1:nf    if strcmp(fields{i},'bwidth')        bwidth = info.bwidth;     elseif strcmp(fields{i},'dtype')        dstring = info.dtype;       if strcmp(dstring,'gaussian')        dtype = 0;       elseif strcmp(dstring,'exponential')        dtype = 1;       elseif strcmp(dstring,'tricube')        dtype = 2;       end;    elseif strcmp(fields{i},'q')       q = info.q;    elseif strcmp(fields{i},'qmax');        qmax = info.qmax;    elseif strcmp(fields{i},'qmin');        qmin = info.qmin;    elseif strcmp(fields{i},'bmin');        bmin = info.bmin;       elseif strcmp(fields{i},'bmax');        bmax = info.bmax;      elseif strcmp(fields{i},'rval');        rval = info.rval;    end;   end; % end of for i end; % end of if elseelseif nargin == 7 bwidth = 0; dtype = 0; dstring = 'gaussian'; rval = 4;else error('Wrong # of arguments to bgwrv');end;% error checking on inputs[nobs nvar] = size(x);[nobs2 junk] = size(y);[nobs3 junk] = size(north);[nobs4 junk] = size(east);results.ycoord = north;results.xcoord = east;if nobs ~= nobs2 error('bgwrv: y and x must contain same # obs');elseif nobs3 ~= nobs error('bgwrv: north coordinates must equal # obs');elseif nobs3 ~= nobs4 error('bgwrv: east coordinates must equal # in north');end;switch dtypecase{0,1} % bandwidth cross-validationif bwidth == 0 % cross-validationoptions = optimset('fminbnd');optimset('MaxIter',500);if dtype == 0     % Gaussian weights[bdwt,junk,exitflag,output] = fminbnd('scoref',bmin,bmax,options,y,x,east,north,dtype);results.bwidth = sqrt(bdwt);elseif dtype == 1 % exponential weights[bdwt,junk,exitflag,output] = fminbnd('scoref',bmin,bmax,options,y,x,east,north,dtype);results.bwidth = sqrt(bdwt);end;         if output.iterations == 500 fprintf(1,'bgwrv: cv convergence not obtained in %4d iterations',output.iterations); else results.iter = output.iterations; end;else bdwt = bwidth*bwidth; % user supplied bandwidth results.bwidth = bwidth;end;case{2} % q-nearest neigbhor cross-validationif q == 0 % cross-validationq = scoreq(qmin,qmax,y,x,east,north);results.q = q;else% use user-supplied q-valueend;otherwiseend;% generate big distance matrixdmat = zeros(nobs,nobs);    for j=1:nobs;        % generate d using GWR distances        easti = east(j,1);        northi = north(j,1);        dx = east - easti;        dy = north - northi;        d = dx.*dx + dy.*dy;            dmat(:,j) = d;    end;    % generate distance decay matrixwt = zeros(nobs,nobs);  if dtype == 1,     % exponential weights        wt = exp(-dmat/bdwt); elseif dtype == 0, % gaussian weights          sd = std(sqrt(dmat));        tmp = matdiv(sqrt(dmat),sd*bdwt);        wt = stdn_pdf(tmp);elseif dtype == 2  % case of tricube weights handled a bit differently   % sort distance to find q nearest neighbors ds = sort(dmat); dmax = ds(q+1,:);        for j=1:nobs; nzip = find(dmat(:,j) <= dmax(1,j));        wt(nzip,j) = (1-(dmat(nzip,j)/dmax(1,j)).^3).^3;        end; % end of j-loopend;  % end of if-else  wt = sqrt(wt);% storage for estimatesbsave = zeros(ndraw-nomit,nobs,nvar);smean = zeros(nobs,1);vmean = ones(nobs,nobs);prior.rval = rval;hwait = waitbar(0,'Gibbs sampling ...');t0 = clock; for i=1:nobs nzip = find(wt(:,i) > 0.01); ys = y(nzip,1).*wt(nzip,i); xs = matmul(x(nzip,:),wt(nzip,i)); res = gwr_g(ys,xs,ndraw,nomit,prior);   bsave(:,i,:) = res.bdraw; vmean(i,nzip) = vmean(i,nzip) + res.vmean'; smean(i,1) = mean(res.sdraw); waitbar(i/nobs);end; % end loop over nobsclose(hwait);gtime = etime(clock,t0);vout = mean(vmean); results.bdraw = bsave;results.meth = 'bgwrv';results.time = gtime;results.smean = smean;results.vmean = vout';results.nobs = nobs;results.nvar = nvar;results.ndraw = ndraw;results.nomit = nomit;if dtype == 0results.dtype = 'gaussian';elseif dtype == 1results.dtype = 'exponential';elseresults.dtype = 'tricube';end;results.xcoord = east;results.ycoord = north;results.r = rval;results.y = y;results.x = x;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -