资讯动态

空间计量经济学实战指南:从W矩阵到SLM/SDM/GWR的MATLAB实现

发布时间:2026/10/30 1:12:12 来源:尧图企业网站定制
简介面向空间计量实证研究者的资料包聚焦截面数据下常见空间回归模型的估计与检验覆盖空间滞后SLM、空间误差SEM、空间杜宾SDM以及包含部分解释变量空间滞后项、空间杜宾误差等扩展形式并附原始数据与配套工具包。资源内含16个文件以Matlab脚本.m、jplv7和Elhorst_codes工具包及原始数据为主整体约6.15MB采用RAR压缩打包便于直接调用。目前已有2074人学习下载。具体可学习空间滞后、空间误差、拉格朗日乘子检验LM、空间杜宾、自变量空间滞后、一般嵌套空间模型、地理加权回归等模型估计代码同时涵盖Kelejian-Prucha空间模型与空间扩展模型基本覆盖空间计量主流分析路径。配合原始数据与成熟工具包适合经济学、地理学等专业学生或科研人员快速上手用于论文实证或课题建模。1. 空间计量不是给回归加个 W 矩阵先搞清楚这份资源能干什么做截面数据回归时最怕被审稿人问一句「你的误差项存在空间相关性OLS 估计还有效吗」这时候你得拿出 SLM、SEM 或者 SDM 的估计结果来回应。但空间计量的门槛恰恰卡在这里——模型多、函数多、不同工具包的调用方式还不一样新手拿到数据常常不知道从哪个模型开始跑更别提空间权重矩阵该用 queen 还是 k-nearestW 要不要行标准化LM 检验选 SAR 还是 SEM。这份资源解决的就是这个具体问题把空间滞后模型、空间误差模型、空间杜宾模型以及 SAC、SDEM、GWR 等扩展方法全部打包每种模型都有对应的 MATLAB 估计代码、原始数据、以及配套的 jplv7 和 Elhorst_codes 两个工具包适合正在做截面空间计量、需要跑出可发表结果的硕士博士和研究人员。2. 空间权重矩阵先行三种构建方式与标准化细节空间计量和普通 OLS 的本质区别就是引入了空间权重矩阵 W。很多人在这一步就开始翻车——W 矩阵构建不合理后面所有模型的估计结果都会失真。所以拿到这份资源后第一件事不是跑回归而是先把 W 矩阵的构建逻辑搞清楚。2.1 空间权重矩阵的三种常见构建方式常见做法是用地理邻接关系构建 W 矩阵。最简单的是一阶邻接矩阵两个区域有共同边界就记为 1否则为 0。但实际研究里一阶邻接太粗糙——比如岛屿区域和大陆区域可能没有共同边界但经济联系很强。所以一般会用到距离倒数矩阵区域 i 和区域 j 之间的距离越近权重越大通常用1/d_ij表示。还有一种更复杂的是经济距离矩阵基于 GDP 或贸易流量的差异来构建。在 jplv7 工具包里构建 W 矩阵有现成函数。make_neighborsw可以基于坐标生成邻接矩阵make_distancew基于距离生成权重矩阵。如果用的是 Elhorst_codes 工具包通常需要自己手动写 W 矩阵的构建代码因为 Elhorst 的代码更偏向学术复现没有封装成太傻瓜化的函数。2.2 行标准化一个必须做的预处理步骤无论是哪种方式构建的 W 矩阵都建议做行标准化处理。行标准化的含义是让 W 矩阵每一行的元素之和等于 1这样空间滞后项 Wy 的含义就变成「邻居观测值的加权平均」而不是一个随意的数字组合。% 假设 W_raw 是未标准化的原始权重矩阵 % 计算每一行的和 row_sum sum(W_raw, 2); % 防止除零错误 row_sum(row_sum 0) 1; % 行标准化每个元素除以所在行的和 W diag(1 ./ row_sum) * W_raw;这段代码的逻辑很简单先算出每一行所有元素的累计和再把该行的每个元素除以这个累计和。diag(1 ./ row_sum)的作用是构造一个对角矩阵对角元素是每一行和的倒数这样左乘 W_raw 就等于给每一行做了除法。这里要特别提醒如果某一行全是 0比如某个区域没有任何邻居row_sum会是 0直接做除法会得到 NaN。所以提前把它替换成 1保证结果里该行仍然是 0。2.3 空间权重矩阵与数据顺序的对应关系这是最容易踩坑的地方。W 矩阵的行列顺序必须和回归数据中观测值的排列顺序严格一致。比如数据文件里第 10 行是广东省那 W 矩阵的第 10 列对应的也必须是广东省。如果数据做过排序、删减或者合并W 矩阵却没跟着调整估计结果会完全错乱。拿到这份资源时我会先打开原始数据文件确认它是按什么顺序排列的常见的是按省份代码或地区代码升序再去读 W 矩阵文件的维度。一个基本检查方法是W 矩阵应该是 N 乘 N 的方阵N 等于样本量而且对角线元素全是 0——自己不能是自己的邻居。3. 从 SLM 到 SEMMATLAB 代码结构与核心参数解读明确了 W 矩阵之后就可以开始跑模型了。这份资源的核心代码分布在两个工具包里jplv7 是 LeSage 的开源工具包函数命名清晰、封装程度高Elhorst_codes 是 Elhorst 教材的配套代码更偏学术复现风格。两种代码风格差异很大建议先跑通 jplv7 的版本再去对照 Elhorst 的代码理解背后的数学原理。3.1 空间滞后模型 SLM 的估计与结果解读SLM 模型的形式是y ρWy Xβ ερ 是空间自回归系数Wy 是空间滞后项。它描述的是「邻居的因变量会影响本地的因变量」——一个通俗的理解是邻居的房价上涨会推高本地的房价。% 加载 jplv7 工具包 addpath(D:\spatial_econometrics\jplv7); % 读取数据 data xlsread(原始数据.xlsx); y data(:, 1); % 因变量 X data(:, 2:end); % 自变量 [n, k] size(X); % 生成 W 矩阵此处假设已有邻接矩阵文件 W xlsread(W_matrix.xlsx); % 行标准化 row_sum sum(W, 2); W diag(1 ./ row_sum) * W; % 估计空间滞后模型 results sar(y, X, W, 5000, 1); prt(results);sar函数的参数含义逐一说清楚第一个参数y是因变量向量X是自变量矩阵注意不要包含常数项列jplv7 会自动加W是空间权重矩阵。后面两个参数5000和1分别代表马尔可夫链蒙特卡洛模拟的迭代次数和抽样间隔。跑完后prt(results)会打印估计结果重点看三个地方rho的估计值和显著性如果 rho 显著为正说明确实存在正向的空间溢出效应R2和log-likelihood用于衡量整体拟合优度各变量系数的符号和显著性则解释为直接影响。3.2 空间误差模型 SEM 的估计与适用场景SEM 的形式是y Xβ u, u λWu ελ 是空间误差自相关系数。它描述的是「误差项存在空间相关性」常用于处理遗漏变量或测量误差在空间上相关的情况。实际研究中如果 LM 检验指向空间误差而非空间滞后就应该用 SEM。% 估计空间误差模型 results_sem sem(y, X, W, 5000, 1); prt(results_sem);sem函数的参数格式和sar完全一样这算 jplv7 的一个优势——模型切换的成本非常低。跑出来后重点看lambda的估计值它反映的是误差项的空间相关性强度。lambda 显著意味着普通 OLS 的标准误估计不可靠必须用 SEM 重新估计。3.3 拉格朗日乘子检验决定用 SAR 还是 SEM 的依据很多新手拿到数据会直接把 SAR、SEM、SDM 全部跑一遍然后挑显著结果多的写进论文。这种做法并不规范——学术研究中先做 LM 检验、再选模型才是正确路径。% 基于 OLS 残差做 LM 检验 % 先跑 OLS ols_results ols(y, X); prt(ols_results); % 做 LM 检验判断空间滞后还是空间误差 lm_results lmlag(ols_results, W, y, X); prt(lm_results);这里的关键判断逻辑是看LM_lag和LM_error两个统计量的显著性。如果空间滞后的 LM 统计量显著而空间误差的 LM 不显著优先考虑 SLM反过来则优先考虑 SEM如果两个都显著再看稳健形式的Robust LM_lag和Robust LM_error——两者中更显著的那个对应的模型就是更合适的选择。这是 LeSage 在《Introduction to Spatial Econometrics》里明确推荐的做法。3.4 参数解释直接效应、间接效应与总效应跑完模型只是第一步解释结果才是关键。空间计量模型里系数不能像 OLS 那样直接解释为「X 增加一单位y 平均增加多少」。因为空间滞后项的存在一个地区的 X 变化不仅影响本地的 y直接效应还会通过空间传导影响邻居的 y间接效应也叫空间溢出效应。jplv7 里没有直接的函数计算这三种效应但 Elhorst_codes 工具包里的配套代码做了这件事文件名一般是effects相关。我自己的做法是跑完sar或sdm后用蒙特卡洛模拟或者直接展开公式计算直接效应、间接效应和总效应结果放到论文的表格里。这才是审稿人真正想看的内容。4. 从 SDM 到 GWR扩展模型的选择逻辑与实现路径SLM 和 SEM 只是空间计量的基础实际研究里用得最多的反而是空间杜宾模型 SDM——它同时包含自变量的空间滞后项和因变量的空间滞后项可以对溢出效应做更细致的分解。这份资源里同时提供了 SDM 的多个变体包括带部分解释变量空间滞后项的 SDM以及 SDEM空间杜宾误差模型等于给了你一整套可以按需选用的工具。4.1 空间杜宾模型 SDM为什么它是最常用的起点SDM 的形式是y ρWy Xβ WXθ ε。相比 SLMSDM 多了一项WXθ即自变量的空间滞后项。它的优势在于不强制假设溢出效应的形式允许自变量对因变量的影响通过邻居传导。用 jplv7 的sdm函数可以直接估计% 估计空间杜宾模型 results_sdm sdm(y, X, W, 5000, 1); prt(results_sdm); % 检验 SDM 是否可以简化成 SLM 或 SEM % 用 likelihood ratio test LR_test lratios(results_sdm, results_sar);lratios函数用于做似然比检验比较 SDM 与 SLM 的拟合优度差异。如果 LR 统计量显著说明 SDM 相对 SLM 有显著的改进不能简化。很多实证论文的模型选择路径就是这样先跑 OLS再做 LM 检验然后估计 SDM最后用 LR 检验确认 SDM 优于 SLM 或 SEM。4.2 自变量空间滞后模型与 SDEM什么时候用扩展版本资源的第 6、7、8 项分别是带部分解释变量空间滞后项的 SDM、空间杜宾误差模型 SDEM、自变量空间滞后模型。这些模型适合更复杂的实证场景。比如你的核心解释变量只有一个你想单独看它的空间溢出效应这时候就可以用第 6 项——只对这一个变量加空间滞后项而不是对所有 X 都加。SDEM 的用途更特殊它把空间依赖放在误差项里但允许自变量的空间滞后进入回归方程。这种设定在解释变量内生性较强时比较稳健。不过要提醒你SDEM 在 jplv7 里没有一键封装函数需要自己组合sem和sar的代码Elhorst_codes 里反而有完整实现。4.3 一般嵌套空间模型 SAC 与 Kelejian-Prucha 模型第 9、10、11 项是估计一般嵌套空间模型包括 Kelejian-Prucha 模型和sacpaul.m。SAC 模型同时包含因变量空间滞后和误差项空间滞后形式是y ρWy Xβ u, u λWu ε。这是最一般化的设定之一但代价是参数多、估计对 W 矩阵的设定更敏感。sacpaul.m这个文件是 LeSage 提供的另一个 SAC 估计实现采用的是广义矩方法不同于 jplv7 默认的极大似然估计。我的经验是当 MLE 估计不收敛或者样本量较大导致计算过慢时可以切换到 GMM 版本。两者的结果应该有量级上的一致性如果差异很大优先怀疑 W 矩阵设定出了问题。4.4 地理加权回归 GWR局部模型的解读与带宽选择第 13 项是地理加权回归模型。GWR 和前面所有模型都不一样——它不假设空间效应可以用一个全局参数ρ 或 λ来刻画而是允许每个位置有自己独立的回归系数。这在小样本、强空间异质性的研究里很有用。% jplv7 中 GWR 的调用方式 results_gwr gwr(y, X, W, info); % 设置带宽类型 info.bsize 50; % 用于交叉验证的样本数 info.btype variable; % 可变带宽 prt_gwr(results_gwr);GWR 的两个关键参数是核函数类型和带宽。带宽过大会导致局部系数过度平滑掩盖空间差异带宽过小则方差过大估计结果不稳定。我一般会先跑一遍默认设置看诊断信息里的带宽值再手动调整比较不同带宽下的 AICc 或交叉验证误差选择最小的那个。这里有个实用细节info结构体里可以设定info.bwidth直接指定带宽也可以设info.btype为variable表示可变带宽。注意 GWR 的结果输出和其他模型不一样prt_gwr打印的是一大堆局部系数需要写入 Excel 再在地图上可视化。5. 避坑指南空间计量实操中的五个高频翻车点空间计量的坑比普通回归多得多因为多了一个 W 矩阵所有的问题都可能在 W 矩阵和数据匹配环节爆发。以下五条是我自己跑这套资源和教学过程中反复遇到的典型问题。5.1 行列标准化后矩阵不对称现象做完行标准化之后检查 W 矩阵发现它不对称——W_ij 和 W_ji 不再相等觉得结果可能不对。原因这是一个概念误区。行标准化后的 W 矩阵本来就不要求对称。行标准化的操作是每一行除以行和数学上会破坏原始对称性。但空间滞后项 Wy 的实质是「邻居观测值的加权平均」权重只需要对每个「被解释对象」有意义即可并不要求双向相等。所以这不是 bug而是标准做法。解决不需要强制对称化。只要确保每一行的权重之和为 1且对角线为 0 即可。如果此时模型系数出现异常的符号或不收敛再去查数据排序和 W 矩阵的对应关系而不是怀疑不对称的问题。提示在论文方法部分说明你做了行标准化即可不用强调对称性。5.2 W 矩阵与数据顺序不一致导致系数符号反转现象跑出的核心解释变量系数为负预期是正向影响换一个 W 矩阵又变回正值结果对 W 矩阵非常敏感。原因最常见的原因是数据在 Excel 里做过排序操作但 W 矩阵文件没有同步重新排列。比如按省份编码排序的数据和按人均 GDP 排序的数据用同一个 W 矩阵去回归结果肯定不一样。解决把检查顺序做成固定动作。在读取数据后先打印前 10 行的地区标识如果有的话再与 W 矩阵行名对比。如果在 MATLAB 里处理可以用如下代码做验证% 假设 data 第 n1 列存了地区编号 region_id data(:, end); % 检查是否单调递增说明是按地区编号排序 diff_region diff(region_id); if all(diff_region 0) disp(数据按地区编号升序排列W矩阵无需调整); else disp(数据顺序需要检查请对照W矩阵的行顺序); end5.3 jplv7 函数参数顺序传错导致维度不匹配现象调用sar(y, X, W, 5000, 1)时提示Matrix dimensions must agree或Out of memory代码看起来和其他人的示例一模一样。原因jplv7 里不同函数的参数排列并不统一。sar和sem的签名是(y, X, W, ndraw, nomit)但sdm的某些版本参数可能不同。另外X矩阵不能包含常数项列——如果在 Excel 里加了常数列而 jplv7 会再自动加一列就产生多重共线性问题。解决先用size(y)和size(X)检查维度。y 是 n×1 列向量X 是 n×k 矩阵。如果有常数列直接去掉。对于参数顺序不确定的函数在 MATLAB 命令行输入help 函数名查看帮助文档这是最快且最可靠的做法。5.4 GWR 带宽选择依赖默认值结果粗糙现象用默认参数跑 GWR得到一大张局部系数表但不同区域的系数波动极大显著性普遍很差。原因GWR 的带宽选择对结果影响巨大。jplv7 默认的带宽计算可能基于交叉验证但当样本量较少或者空间分布不均匀时默认带宽会偏小造成局部回归的样本量不足、方差剧增。解决手动比较 3 到 5 个不同带宽下的结果。看每个带宽对应的 AICc 值和诊断项w的显著性占比。选择 AICc 最小、且局部系数显著的样本占比最高的那个带宽在论文里报告就是这个带宽是经过比较选择的而不是默认值。5.5 空间矩阵特征值计算问题导致 MLE 不收敛现象sar或sdm函数运行时间极长或者报错maximum likelihood estimation failed to converge。原因极大似然估计需要计算(I - ρW)的行列式或特征值做数值优化。当样本量较大比如 n 2000时特征值分解耗时很长且容易出现数值不稳定。此外如果 W 矩阵没有标准化或包含极端值特征值的范围会异常导致优化器无法收敛。解决先确认 W 已经行标准化对角线为 0。如果样本量大改用 GMM 或者 MCMC 估计方法比如sar_g函数吉布斯抽样。这份资源里的第 9 项 Kelejian-Prucha 模型正是为这种场景准备的——GMM 估计不需要做高维特征值分解计算效率更高数值稳定性也更好。6. GWR 结果解读与地图可视化让局域系数从表格变成可读的发现GWR 跑完之后输出的是每个样本点一套系数。直接看表格没有任何意义——几百个系数怎么读常规做法是把局域系数和对应的地理坐标连接在 ArcGIS 或 MATLAB 里画地图观察系数的空间分布模式。这一节讲的就是如何把 GWR 的结果变成论文里可用的地图和结论。% 提取 GWR 结果中的局域系数 beta_local results_gwr.beta; % n×k 矩阵每一行对应一个观测的系数 t_local results_gwr.tstat; % 对应的 t 统计量 % 将结果导出到 Excel方便导入 ArcGIS 或 GeoDa xlswrite(gwr_coefficients.xlsx, beta_local); xlswrite(gwr_tstats.xlsx, t_local);导出后在 ArcGIS 里按观测点坐标关联用分级色彩渲染核心变量的 beta 值能直观看出系数在空间上的高值区和低值区。一个更严谨的做法是同时检查显著性把abs(t_local) 1.96的区域筛选出来只对显著的系数做空间模式解读否则容易把噪声当成规律。这里补充一个实用的验证技巧。GWR 的局域系数本质上是对「空间异质性」的刻画但如果你发现系数在空间上呈现明显的规律性——比如自西向东逐渐增大——你可以反过来验证这种模式是否真实存在。做法是把 GWR 的局域系数当作因变量重新做一次空间自相关检验用 Morans I如果 Morans I 显著为正说明系数的空间聚集模式不是随机的你的 GWR 结果具有真实的空间结构信息。这一步在审稿时相当加分。我自己的习惯是每跑一个 GWR 模型都会额外记录最优带宽值、AICc 值与 Morans I 检验结果形成一组固定报告项。从早期只跑一次默认 GWR、拿着不显著的结果到处碰运气到后来固定做带宽敏感性分析和显著性筛选中间走了不少弯路——那以后我每次做空间计量都会反过来再检查一遍W 矩阵顺序对不对、常数项有没有多加、行标准化是否有零行三分钟查完才正式回归这份资源里的代码正好能帮你把这条验证链路走完。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑