
简介面向使用STATA开展空间计量分析的经济学、地理学及社会学研究者这份整理好的Word版操作文档系统梳理了从地图数据导入到空间杜宾模型估计的完整流程。文档从设置默认路径和shp2dta读取中国省级地图开始逐步演示如何生成坐标系数据集、计算各省中心点并通过spmap绘制GDP分布图随后重点解析spmat中idistance与contiguity两种矩阵的构建选项、欧氏/哈弗辛距离函数及行标准化、minmax和谱标准化同时说明spmat save与spmat export等保存转换命令对空间权重矩阵的理解尤为关键。空间杜宾模型部分则介绍命令的基本调用形式结合因变量空间滞后项说明参数含义帮助读者避开常见报错。资源包中仅包含1个docx文档体积23KB便于随身携带。内容密集而完整已有164人学习尤其适合需要速查命令和演练步骤的实证研究者。1. 从零搭建空间权重矩阵别急着跑回归先搞懂邻居是谁做空间计量的人都有一个共同体验真正卡脖子的往往不是模型本身而是最前头那一步——空间权重矩阵怎么建。我见过太多人辛辛苦苦把面板数据收拾得干干净净结果在spmatrix或者wmatrix命令上一卡就是一下午最后随便找了个邻接矩阵糊弄上去回归结果出来自己都不敢信。先说清楚这篇文章要解决什么问题用STATA完整走一遍空间权重矩阵的构建流程再基于这个矩阵跑空间杜宾模型SDM把命令逐条拆开讲连带那些文档里不会写的坑一起说。适合刚开始接触空间计量的研究生、做区域经济或者城市研究的从业者也适合那些已经跑过OLS但想往空间模型进阶的朋友。所谓空间权重矩阵说白了就是回答一个问题在你的研究区域里谁和谁是邻居。这个邻居的定义方式直接决定后面所有估计结果的含义。你用的是地理邻接还是距离衰减是K近邻还是经济距离权重背后对应的经济学假设完全不同。STATA里构建空间权重矩阵主要有两条技术路线一条是spmatrix命令族这是STATA 15以后官方内置的空间计量套件语法统一、和后续的spregress、spset配合得天衣无缝另一条是第三方命令wmatrix很多老代码还在用配合xsmle跑面板空间杜宾模型非常成熟。我自己日常用得最多的是第二条路线因为面板数据的空间杜宾模型目前还是xsmle最顺手。2. 权重矩阵构建实操三种主流矩阵的STATA实现2.1 准备工作数据格式与空间ID的设定不管走哪条路线第一步都是先把数据组织成STATA能识别的格式。空间权重矩阵的本质是一个N×N的方阵N是研究单元的数量矩阵第i行第j列的元素表示单元i和单元j之间的空间关系强度。所以你的数据里必须有一个唯一标识每个空间单元的变量一般是区县代码、地级市代码这类行政编码。我用的是中国地级市面板数据举例数据里有一个city_id变量取值从1到N每个城市对应一个唯一的编号。这个编号的排序不需要跟地理位置的远近有任何关系纯粹是标识作用。但强烈建议用整数且从1开始连续编号因为无论是spmatrix还是wmatrix对ID的连续性都有隐性要求跳号会报错或者生成错误矩阵。另外一个容易被忽略的点数据的排列顺序。如果跑的是面板模型STATA里要先xtset city_id year声明面板结构同时确保数据按照city_id和year排序。xsmle对数据排列顺序非常敏感排序不对出来的结果就是一团乱麻而且报错信息还不太容易看懂。2.2 邻接权重矩阵女王法和车法的选择逻辑邻接权重矩阵是最直观的一种两个区域有共同边界就是邻居元素取1否则取0。在STATA里用spmatrix创建邻接矩阵之前需要先有一份shp格式的地图文件然后用spset命令把地图和数据关联起来。* 声明空间数据 spset city_id, mod(spider) replace * 导入地图文件 spset, modify(shpfilechina_city.shp) * 创建邻接权重矩阵默认是女王法 spmatrix create contiguity W_queen, replace * 创建车法邻接矩阵 spmatrix create contiguity W_rook, replace这里有个关键选择queen和rook的区别在于是否把共点也算作邻接。车法rook只认共边女王法queen连共顶点也算邻居。实际应用中对不规则的行政区划来说queen和rook生成的结果差别往往不大但在地块形状特别诡异的区域会有明显差异。判断标准很简单如果你的研究区域里存在那种四角相交的相邻关系而你又觉得这种关系在经济意义上不成立选rook如果认为只要地理上够近就该算邻居选queen。对比一下两种邻接关系在STATA里的差异我用一个表格列出来维度车法Rook女王法Queen邻接定义共边即邻接共边或共点即邻接邻居数量通常较少通常较多适合场景行政区划规整、期望稀疏矩阵地理单元形态复杂、边界交错明显STATA命令contiguity W_rookcontiguity W_queen2.3 距离权重矩阵与K近邻矩阵用wmatrix命令构建官方spmatrix在地理距离矩阵这一步比较笨拙要先算好每个单元之间的距离存成矩阵再导入。相比之下第三方命令wmatrix就灵活得多它可以直接根据经纬度坐标生成各种距离权重矩阵也正是xsmle面板空间杜宾模型的标准搭档。wmatrix不是STATA官方命令需要先安装ssc install wmatrix用wmatrix之前数据里必须要有每个城市中心的经纬度坐标。生成距离权重矩阵的命令如下* 基于经纬度生成反距离权重矩阵距离衰减参数为1 wmatrix, xcoord(lon) ycoord(lat) type(inverse) power(1) * 基于经纬度生成距离阈值权重矩阵阈值设为500公里 wmatrix, xcoord(lon) ycoord(lat) type(binary) dvar(500)type(inverse)生成的是反距离权重矩阵元素为1/dd是两个城市之间的地理距离power(1)是让距离的幂次为1即不额外放大衰减速度。如果想要更强的空间衰减效应可以把power(2)变成1/d²经济含义是距离的影响快速衰减。K近邻矩阵在区域研究中也非常常用它的思想是不管绝对距离多远每个单元都只跟最近的K个单元产生空间关联。这在处理岛屿型地理单元或者城市样本分布极不均匀的数据时特别好用可以避免距离阈值矩阵带来的孤立单元问题。* 生成K近邻权重矩阵K取4 wmatrix, xcoord(lon) ycoord(lat) type(knn) k(4)K值的选择没有绝对的黄金标准一般建议取2到8之间。K取得太小矩阵太稀疏部分单元可能没有邻居K取得太大矩阵太稠密空间权重矩阵的行标准化之后每个单元受到的影响趋于平均空间效应就被稀释了。一个实用做法是分别用K4和K6跑一遍模型看结果稳定性如果系数符号和显著性变化很大说明你的空间结构假设本身就比较脆弱。2.4 权重矩阵的标准化处理与验证无论用哪种方式生成权重矩阵下一步都是行标准化。行标准化的目的很直白让每一行的权重之和等于1这样空间滞后项在数值上相当于邻居变量的加权平均系数解释起来更自然。spmatrix创建完矩阵之后用下面命令做标准化spmatrix normalize W_queen, normalize(row) replacewmatrix生成的矩阵则需要在生成时指定wmatrix, xcoord(lon) ycoord(lat) type(inverse) power(1) rowstd矩阵生成之后一定要检查这一步很多人跳过结果后面模型估计全是错的。检查的方法很简单matrix list W可以看到完整矩阵但对于N很大的情况直接用matrix dir看矩阵大小再用matrix list W[1..5,1..5]看前五行五列即可。重点检查两个地方一是对角线是否全为0不允许区域自己算自己的邻居二是行和是否为1标准化是否成功。还有一个检查矩阵质量的重要指标空间单元是否全部连通。如果有孤立单元出现在矩阵里那么在后续的空间杜宾模型估计中这个单元的邻居数量为0空间滞后项恒为0这会直接影响估计结果。用wmatrix生成矩阵后可以简单计算一下每个单元的有效邻居数量* 假设生成的权重矩阵存在 W 里 matrix W r(W) svmat W, name(col) egen row_sum rowtotal(col*) sum row_sum如果row_sum的最小值等于0说明存在孤立单元。解决思路只有一个调整权重矩阵的生成方式比如用K近邻替代距离阈值矩阵确保每个单元至少有1个邻居。3. 空间杜宾模型估计从LM检验到xsmle实战3.1 模型选择和检验流程别直接一上来就SDM空间杜宾模型SDM的公式长这样y ρWy Xβ WXθ ε里面同时包含了被解释变量的空间滞后项Wy和解释变量的空间滞后项WXθ。相比于空间滞后模型SAR和空间误差模型SEMSDM的优势在于它不预先假设空间效应只通过被解释变量传导还是只通过误差项传导而是让数据自己说话。用大白话说某个城市的GDP不仅受自己城市的教育投入影响还受周边城市教育投入的影响而SDM能把这两种效应拆开估计。但这不代表你拿到数据就应该直接跑SDM。标准的检验流程是先用LM检验判断空间效应存在与否以及存在形式再通过LR检验或者Wald检验判断SDM是否能简化为SAR或者SEM。STATA里的操作路径我已经整理成一套固定的流程* 第一步估计普通OLS作为基准 reg y x1 x2 x3 * 第二步对OLS残差做空间自相关检验需要先生成权重矩阵 * 假设权重矩阵已经存在名为 W spmatrix create contiguity W, replace * 第三步跑空间滞后模型和空间误差模型的LM检验 reg y x1 x2 x3 spregress y x1 x2 x3, dvarlag(W) // SAR模型 est store sar spregress y x1 x2 x3, error(W) // SEM模型 est store sem不过说实话spregress系列的LM检验输出和传统的xsmle生态衔接有点别扭。我的个人习惯是直接用xsmle快速估计SAR、SEM、SDM三个模型然后通过对比对数似然值Log-likelihood和AIC/BIC来辅助判断传统检验用xsmle运行后的estat命令补充。3.2 xsmle跑SDM的标准命令详解xsmle是跑面板空间杜宾模型的核心命令。它的语法结构不算复杂但参数多而且每个参数的含义必须搞清楚否则结果解读会出大问题。* 安装命令如果还没装 ssc install xsmle * 标准的面板SDM命令 xsmle y x1 x2 x3, wmat(W) model(sdm) fe type(ind) nolog逐项解读一下wmat(W)指定空间权重矩阵这里W是之前wmatrix生成的矩阵对象model(sdm)指定模型类型为空间杜宾模型换成model(sar)就是空间滞后模型model(sem)就是空间误差模型fe固定效应空间面板模型几乎都默认选固定效应而非随机效应原因后面细说type(ind)按个体维度城市固定即个体固定效应模型。如果要加时间固定效应用type(time)两个都要就type(both)跑完之后用estat命令做后续检验* 查看直接效应、间接效应和总效应分解 estat effects * 检验SDM能否退化为SAR检验WX项联合显著性 estat lrtest sar效应分解这块必须多说几句。SDM的回归系数不能直接解释为边际效应因为存在空间溢出。estat effects会输出三行结果直接效应本地区X对本地区Y的影响、间接效应本地区X对其他地区Y的影响即空间溢出效应、总效应两者之和。这才是你论文里真正该报的数字。3.3 固定效应还是随机效应空间面板的Hausman检验陷阱面板模型绕不开固定效应和随机效应的选择问题空间面板也一样。常规面板里用Hausman检验判断但空间面板模型里如果权重矩阵W不随时间变化这是绝大多数研究的情况那么随机效应模型的估计要求个体效应与解释变量不相关这个假设在区域经济研究中几乎不可能成立。所以实务界的主流做法是直接上固定效应不需要纠结。如果你还是想跑一下Hausman检验给自己一个交代xsmle也支持* 估计固定效应和随机效应模型 xsmle y x1 x2 x3, wmat(W) model(sdm) fe type(ind) nolog est store fe_sdm xsmle y x1 x2 x3, wmat(W) model(sdm) re type(ind) nolog est store re_sdm * Hausman检验 hausman fe_sdm re_sdm这里有个实操提醒如果hausman检验的结果是负值别慌这是空间面板模型里非常常见的现象通常意味着随机效应模型的某些假设已经被严重违反而这个检验结果本身已经不重要了。直接报告固定效应模型的结果审稿人一般不会挑这个毛病。4. 实战案例全流程以长三角城市GDP影响因素研究为例4.1 数据准备与权重矩阵生成我拿一个自己跑过的简化案例来演示完整流程方便你直接对照复现。研究对象是长三角41个城市被解释变量是城市GDP取对数记为lngdp核心解释变量是人力资本水平用每万人在校大学生数衡量记为human、产业结构第三产业占比记为industry和外商直接投资实际利用外资取对数记为lnfdi。原始数据已经整理成面板格式变量包括city_id、year、lon、lat。第一步生成权重矩阵use data_changjiang.dta, clear xtset city_id year * 用经纬度生成反距离权重矩阵距离衰减取1 wmatrix, xcoord(lon) ycoord(lat) type(inverse) power(1) rowstd matrix W r(W)这里有一个小技巧wmatrix生成的矩阵默认存放在r(W)里如果后续要反复使用先把矩阵存下来避免每次都要重新算matrix W_inv r(W)4.2 SDM模型估计与效应分解数据就绪后直接跑SDM固定效应模型xsmle lngdp human industry lnfdi, wmat(W_inv) model(sdm) fe type(both) nologtype(both)表示同时控制个体固定效应和时间固定效应。之所以选both而不是纯个体固定效应是因为长三角41个城市2005到2020年之间经历了多次大的宏观政策冲击比如2008年金融危机、2013年自贸区设立等不控制时间固定效应这些共同冲击会被误认为是空间溢出的结果。模型的估计结果落在屏幕上之后先别急着抄系数。按这个顺序做三件事第一看空间自回归系数ρSTATA输出里标注为rho。如果ρ显著为正说明城市之间的GDP存在正向空间溢出一个城市的经济增长会带动周边城市。如果ρ不显著那SDM的适用性就值得怀疑了。第二看W×human、W×industry、W×lnfdi这三个交叉项的系数。它们显著与否决定了空间效应是通过哪个渠道传导的。比如W×human显著为正说明周边城市的人力资本水平对本城市GDP有正向溢出这正好呼应了人才流动和知识溢出的理论。第三做效应分解。这一步输出的是真正写进论文的表格estat effects分解结果里间接效应那一列才是空间溢出效应的核心证据。比如human的间接效应显著为正说明一个城市提升人力资本不仅让自己受益还会带动周围城市这种溢出效应在区域经济学里是非常有价值的发现。4.3 稳健性检验换权重矩阵是必须做的动作空间计量最被人诟病的一点是结果可能对权重矩阵的选择过于敏感。很多实证论文只报告一种权重矩阵的结果审稿人一问就心虚。所以稳健性检验的标准动作是换一种权重矩阵重新跑一遍看核心结论是否变化。我在这个案例里用了两套稳健性检验* 方案一换成K近邻权重矩阵K4 wmatrix, xcoord(lon) ycoord(lat) type(knn) k(4) rowstd matrix W_knn r(W) xsmle lngdp human industry lnfdi, wmat(W_knn) model(sdm) fe type(both) nolog * 方案二换成经济距离权重矩阵用GDP均值差的倒数作为权重 * 先生成经济距离矩阵这里简化为用GDP均值差的倒数 sort city_id bysort city_id: egen avg_gdp mean(lngdp) * 创建城市间GDP差值的绝对值的倒数矩阵需要外部程序或mata实现经济距离权重矩阵的构建逻辑是两个城市之间的空间关联强度不仅取决于地理距离还取决于经济发展水平的接近程度。GDP水平相近的城市之间经济联系更紧密。这个矩阵在计量上更贴近经济现实但构建稍微麻烦一点需要写一段小循环或者用Mata编程。我一般在论文里用K近邻矩阵做主要稳健性检验就够了经济距离矩阵作为辅助证据。判断稳健性通过的标准是核心解释变量比如human的间接效应在替换权重矩阵后符号保持一致显著水平差别不大。如果符号反转或者从显著变不显著那就得认真反思一下是不是模型设定本身有问题了。5. 常见报错与避坑技巧STATA空间计量高频问题实录5.1 matsize too small错误与内存配置跑空间杜宾模型最常遇到的报错之一就是matsize too small。这是因为权重矩阵是N×N的矩阵当城市数量N超过100时矩阵已经有一万个元素而STATA的默认matsize只有400。长江三角洲41个城市一般问题不大但如果你用的是全国地级市数据300多个城市矩阵就有十万个元素不调整matsize根本跑不动。解决方式set matsize 5000这里提醒一句matsize最大可以设置为11000但设置得越大占用的内存越多。如果数据量极大且机器配置不高建议优先用更稀疏的权重矩阵或者考虑用spmatrix自带的稀疏矩阵存储功能比手动扩展matsize更省内存。5.2 数据顺序导致的估计结果不稳定这是最隐蔽的一个坑。用xsmle跑面板模型时如果数据没有按照city_id和year排序模型照样能跑出结果但空间权重矩阵的行列对应关系会错乱估计结果完全不可信而且不会报错。解决办法是每次跑模型之前养成固定习惯sort city_id year xtset city_id yearxtset之后可以用xtdes检查一下面板结构是否正确确认每个城市在每个年份都有观测值。如果数据存在缺失年份空间面板模型的估计会受影响建议先做插补或者明确缺失机制。5.3 权重矩阵行标准化与特征值问题模型估计完成后如果你想自己计算空间乘数效应或者做边际效应可视化需要关注权重矩阵的特征值问题。稳健的估计要求空间自回归系数ρ落在权重矩阵特征值倒数区间之内。xsmle会自己判断但如果结果莫名其妙地不收敛或者出现异常大的系数可以手动检查权重矩阵的特征值范围* 假设权重矩阵存在 W 里 matrix eigenvalues W, eigv(E)特征值的最大模长可以直接反映权重矩阵的谱半径如果谱半径太大说明矩阵行标准化可能没做好或者矩阵本身的连通性过强。这种情况下需要对权重矩阵的构造方法做调整。5.4 中文数据读取乱码问题现在很多数据库导出的数据是GBK编码Stata 15以后默认UTF-8直接打开会出现中文变量名乱码。解决方案有两种* 方案一导入前把数据转换成UTF-8编码 * 在外部使用工具转换后再导入STATA * 方案二用import delimited时指定编码 import delimited data_raw.csv, encoding(GB18030) clear不要用unicode convert命令去硬转编码这在数据量大时容易出错且耗时。直接在import delimited阶段指定编码是最稳的做法。6. 关于空间计量的一点个人体会踩过这么多坑之后我最大的体会是空间权重矩阵是整篇实证论文的地基地基歪了后面的模型再精巧也没用。很多人重模型轻矩阵恨不得用最复杂的贝叶斯空间模型来彰显学术水平却在权重矩阵的选择上一笔带过这是本末倒置。评审人越来越专业他们第一个问题往往就是你的权重矩阵是怎么构建的为什么选这种权重还有一件事值得多提一句空间计量不是万能药。如果你的核心解释变量在普通OLS里不显著别指望换个空间杜宾模型就起死回生。空间模型解决的是空间依赖和空间异质性问题不是变量选择问题的替罪羊。数据本身的质量、变量的选择逻辑、模型设定的理论依据永远比计量方法的炫技程度重要。最后分享一个小技巧每次跑完一组空间模型把xsmle的结果用estout或者outreg2导出成规范的表格之前先est store存好方便后续反复调用比较。这看起来是小事但真到写论文的时候你会在心里感谢自己当初多敲了这行命令。本文还有配套的精品资源点击获取