简介:面向使用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(shpfile="china_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_rook | contiguity W_queen |
2.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/d,d是两个城市之间的地理距离,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取得太大,矩阵太稠密,空间权重矩阵的行标准化之后每个单元受到的影响趋于平均,空间效应就被稀释了。一个实用做法是分别用K=4和K=6跑一遍模型,看结果稳定性,如果系数符号和显著性变化很大,说明你的空间结构假设本身就比较脆弱。
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)和空间误差模型(SEM),SDM的优势在于它不预先假设空间效应只通过被解释变量传导还是只通过误差项传导,而是让数据自己说话。用大白话说:某个城市的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近邻权重矩阵(K=4) 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存好,方便后续反复调用比较。这看起来是小事,但真到写论文的时候,你会在心里感谢自己当初多敲了这行命令。
本文还有配套的精品资源,点击获取