简介:一份面向空间计量经济学学习者与实证研究者的STATA操作命令文档,聚焦空间权重矩阵创建与空间杜宾模型计算,适合经济学、区域科学、地理信息科学等方向需要处理空间面板数据的研究生及科研人员。文档以docx格式提供,整个压缩包仅1个文件,大小43KB,内容紧凑,便于对照执行。目前已有395人学习下载。文档操作主线清晰,从设置默认路径、读取shp地图数据开始,详细演示shp2dta转换地图文件、生成坐标数据集,并通过spmap绘制区域GDP分布图;随后重点讲解利用spmat生成距离矩阵与邻接矩阵、进行行标准化并保存为stata可读格式及txt文本格式,同时给出Moran's I计算的命令线索。对希望快速上手STATA空间计量流程、减少命令语法摸索的使用者而言,内容兼具步骤参考与排错思路,适合作为实证分析中的随用随查手册。 做空间杜宾模型,我见过最多的卡壳点不在模型本身,而在空间权重矩阵。数据排列好了,xsmle也装好了,结果跑命令的时候不是提示matrix not found,就是空间系数rho高得离谱,搞得人一头雾水。这篇文章就把我用STATA从零构建空间权重矩阵、再到跑空间杜宾模型(SDM)计算的全过程整理出来,包括命令写法、数据预处理细节和踩过的坑,给正在做省际面板或城市面板的读者一个可以照着操作的参考。文中涉及的命令都是实际建模时的高频用法,你不需要再翻一堆零散教程拼凑流程。
1. 空间权重矩阵:三类主流构造方式与选型思路
空间权重矩阵是整个空间计量的地基。它定义的是“谁和谁之间存在空间关联”。很多人一上来就纠结选哪种矩阵,其实先想清楚你的研究问题是关键,而不是先找命令。三类主流矩阵各有适用边界,选错权重,后续所有结果都建立在错误假设上。
1.1 0-1邻接矩阵:入门简单但定义必须精确
0-1邻接矩阵的逻辑非常朴素:两个区域只要有公共边界,权重取1,没有边界就取0。STATA里的spwmatrix基于SHP地图文件,可以自动判断区域之间是否共享边界,你不需要手动填表,但需要先想明白一个问题:你的区域单元之间,是否真的只有“相邻”才会产生空间交互?
如果是省级面板,相邻省份之间有明显的贸易往来、技术流动和人员迁徙,用邻接矩阵问题不大。如果研究对象是城市,而城市之间的互动往往跨越数百公里,这时候0-1邻接矩阵就会放过很多不该放过的连接。国内做省际数据时还有一个特殊问题——海南。海南省没有陆地邻接边界,常规定义下它在邻接矩阵中一整行全是0,如果不处理,后面的模型要么直接报错,要么空间系数严重偏移。我的处理办法是把海南与广东、广西手动设为相邻,或者干脆改用K近邻/距离矩阵。
1.2 地理距离矩阵与K近邻矩阵
地理距离矩阵的基本思想是空间相互作用随距离衰减,和手机信号随基站距离衰减是一个逻辑。最常见的形式是w_ij = 1/d_ij^α,d是区域质心之间的欧氏距离(通常用经纬度换算),α是衰减参数,取1或2。α越大,距离衰减越快,远距离区域的权重越小。另一种实用形式是K近邻矩阵,每个区域只连接最近的K个邻居,K的经验取值是4到8。
K近邻最大的好处是天然不会产生零行,海南也能有邻居,不需要手动补边。但K近邻也有代价:它把距离远近差异截断了,所有被选中的邻居权重相等,损失了距离衰减信息。实际写作里,很多论文把两者都做一遍,取结果稳健的组合放主回归和稳健性检验,这是相对稳妥的呈现方式。
1.3 经济距离矩阵与嵌套权重
经济和贸易关联会重构空间格局。两个地理上相隔很远的城市,可能因为处在同一条产业链上而高度关联。更受审稿人认可的通常是一种嵌套思想:以地理距离矩阵为基础,再将经济规模差异或人均GDP差异纳入权重。我常用的简便构造是w_ij = 1/|gdp_i - gdp_j|,gdp取研究期内的人均值。这个构造很直观:经济水平越接近的地区,权重越大,空间关联越强。
需要提醒的是,经济权重矩阵存在一个潜在的内生性问题,因为gdp既是解释变量或被解释变量的一部分,又参与了权重构造。稳健性检验时建议把它和地理权重矩阵互为对照,不要只报经济权重这一套结果。
| 矩阵类型 | 构造逻辑 | 主要优点 | 主要缺点 | 典型场景 |
|---|---|---|---|---|
| 0-1邻接 | 公共边界 | 简单、易解释 | 可能产生零行;无视距离衰减 | 省级面板、行政区划清晰 |
| 地理距离 | 质心距离反比 | 反映距离衰减;无零行 | 需要经纬度;衰减参数需说明 | 城市面板、跨区域溢出 |
| 经济距离 | 经济变量差倒数 | 反映经济亲疏;解释力强 | 内生性风险;构造复杂 | 区域增长、技术溢出研究 |
2. 进入STATA之前:面板数据与经纬度信息的准备细节
权重矩阵是N×N方阵,行列位置必须和面板数据中的区域id完全同序。这一步出错,后面所有命令都是白跑。数据准备阶段的细节往往比估计命令本身更容易决定成败。
2.1 区域唯一标识符:数值化、排序与匹配
权重矩阵的行列顺序必须对应数据里N个区域的排列顺序。我踩过一次坑:数据里有31个省份,但早年的代码把id设为字符串变量,排序时“10”排在“2”前面,权重矩阵的行列顺序和真实省份顺序完全错位,跑出来的直接效应符号都是反的。
后来我强制自己遵守两条规则:第一,所有区域id一律用数值型变量,可以用encode生成;第二,生成权重矩阵之前先sort id,再用xtset id year固定面板结构。这样行列对应关系就锁死了。还有一个细节,如果你用字符串省份名做匹配,数据里是“广西”,地图文件里是“广西壮族自治区”,merge时大概率失败,所以优先用行政区划代码匹配,而不是中文名称。
2.2 经纬度数据从哪里来、怎么整理
经纬度数据一般从公开的地理信息数据库或地图API获取,城市级用质心坐标就可以。注意单位统一为十进制度数,不要用度分秒格式,否则距离计算结果会差到离谱。如果某几个区域没有坐标,宁可删除该样本,也不要用0填充,因为0度0分在赤道附近,会让距离计算出现巨大的伪连接。
我自己的习惯是先把坐标数据单独存一份dta,里面只有id、lon、lat三个变量,和主数据通过id一一对应,再交给spwmatrix生成矩阵。如果读入的csv是gbk编码导致中文乱码,import delimited时可以加encoding(gb18030),这能解决大部分省份名称显示为乱码的问题。
2.3 SHP地图文件与样本id的对齐
如果使用SHP地图文件生成邻接矩阵,最大的坑是属性表里的名称和你的数据变量对不上。地图文件里可能是“广西壮族自治区”,样本里写的是“广西”,直接按名称匹配会失败。最稳妥的办法是使用行政区划代码来匹配。STATA里可以用merge 1:1 code,先看看matched result,别急着跑模型。
另外,SHP文件的坐标系要注意,通常是GCS_WGS_1984(经纬度投影)。如果你拿到了投影坐标(单位是米),需要先用GIS软件转回经纬度,否则spwmatrix一旦把公里数当经纬度处理,生成的距离矩阵就没有意义了。
3. spwmatrix命令实操:从SHP文件、坐标到经济权重矩阵
数据准备好之后,就可以正式构建空间权重矩阵了。这一节覆盖三种最常用的构建路径:SHP文件生成邻接矩阵、经纬度生成反距离矩阵、以及手工构造经济权重矩阵。命令不难,但参数的含义必须搞清楚。
3.1 安装spwmatrix并生成0-1邻接矩阵
外部命令spwmatrix需要先安装:
ssc install spwmatrix, replace安装完成后,基于SHP文件的0-1邻接矩阵,一个最基础的命令如下:
spwmatrix using chinaprov.shp, wname(W) rowstd代码里的wname(W)是给生成的矩阵命名,rowstd表示按行标准化,让每一行权重之和等于1。按行标准化是后续xsmle估计时比较常用的处理方式,它对应着“邻居影响的加权平均”这个解释,空间系数rho也更容易落在(-1,1)区间。生成后可以用matrix list W查看矩阵,确认对角线为0、行和为1。
3.2 基于经纬度坐标生成反距离矩阵
很多时候你没有SHP文件,只有一张坐标表。基于坐标生成反距离矩阵的命令逻辑是:
spwmatrix using coord.dta, xcoord(lon) ycoord(lat) wname(Wdist) dalpha(1) rowstd其中coord.dta就是坐标表,xcoord和ycoord指定经纬度变量名,dalpha(1)表示衰减参数等于1。如果你的理论认为距离衰减更强,可以改用dalpha(2)。生成之后建议把矩阵保存下来,避免每次重算。我一般会先把矩阵以dta文件导出存档,再在跑模型前重新载入。不同STATA版本对spwmatrix的选项名略有差异,如果命令报unrecognized option,先help spwmatrix,对照手册微调。
3.3 官方spmatrix体系的替代路径
STATA 15之后自带了一套空间计量命令体系,不装外部包也能生成权重矩阵。先定义空间数据:
spset province spmatrix create contiguity Wspset会告诉STATA哪个变量是区域id,spmatrix create contiguity用于生成0-1邻接矩阵。这套官方体系的优点在于和spxtregress、estat impact完全兼容,不需要在外部矩阵和估计命令之间手动转换。缺点是官方命令对经济权重矩阵这类自定义矩阵的支持不够直接,需要配合spmatrix import等操作,稍显繁琐。我的建议是两套都掌握,按场景选择。
3.4 经济权重矩阵的手工构造
经济权重矩阵没有现成命令,最通用的做法是手工构造。下面的Mata代码是构造截面经济距离矩阵的骨架:
mata: gdp = st_data(., "gdp_mean") n = rows(gdp) W = J(n, n, 0) for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { if (i != j & abs(gdp[i]-gdp[j]) > 1e-8) { W[i,j] = 1 / abs(gdp[i]-gdp[j]) } } } st_matrix("W_econ", W) end这里gdp_mean应该是你事先算好的研究期均值变量,数据顺序必须已经sort id。如果要嵌套地理距离,可以在循环里再乘以一个距离权重项。生成后同样可以做行标准化,然后用matrix list W_econ检查。注意这段代码在面板数据里只能生成不随时间变化的权重矩阵,这也是实证论文里最常规的设定;想用随时间变化的权重,理论可行,但会让模型估计和结果解释复杂许多,新手初期不必强求。
4. 空间杜宾模型估计:检验链与两条命令路线
权重矩阵搞定之后,不能直接闷头跑SDM。先做检验,再选模型,最后估计和分解效应。这一节我按自己习惯的检验顺序和两条主流命令路线展开。
4.1 前置检验的顺序:LM、Hausman与Wald/LR
我通常按这样的顺序判断:先估计一个普通面板固定效应模型,做LM检验,判断残差里是否存在空间自相关;然后估计SDM,用Wald或LR检验看它是否会退化为SAR或SEM;最后用Hausman检验选择固定效应还是随机效应。
由于不同STATA版本中LM检验命令差异很大,比较通用的做法是直接在xsmle框架下比较模型:分别估计SAR、SEM、SDM,再lrtest比较。如果你手上的面板是长面板,时间维度较长,变量还有明显趋势,记得先做面板单位根检验(比如breitung检验),避免伪回归。检验链的意义在于:不是所有数据都支持SDM,如果Wald/LR检验不显著,说明SDM可以简化为SAR或SEM,硬上SDM只会增加冗余参数。
4.2 xsmle估计双向固定效应SDM
安装xsmle:
ssc install xsmle, replace核心命令:
xsmle y x1 x2, fe model(sdm) wmat(W) type(both) effectsfe表示固定效应,model(sdm)指定空间杜宾模型,wmat(W)指定刚刚生成的空间权重矩阵,type(both)表示同时控制个体和时间固定效应,effects让STATA直接输出直接效应、间接效应和总效应。如果你想用随机效应,把fe改成re。
输出里最值得看的是rho和各项效应。rho是空间自回归系数,反映邻居y对本地区y的影响强度,如果rho显著为正,说明被解释变量确实存在空间溢出。xsmle的Wald检验和LR检验可以直接用来判断SDM是否能简化成SAR或SEM,命令比手动算方便。
4.3 官方spxtregress的用法与取舍
如果你的STATA版本是15或以上,也可以走官方路线。基本步骤是:
spset province spmatrix create contiguity W_cont spxtregress y x1 x2, fe model(sdm) dvarlag(W_cont) estat impactdvarlag(W_cont)是官方命令里指定空间滞后项的方式,estat impact输出直接和间接效应。官方命令的优势是估计引擎经过优化,大型面板上的运行速度明显更快,报错信息也更友好。但它的参数命名和xsmle差异不小,新手如果两套命令混用容易搞混模型设定。
我的建议是:从xsmle入门,因为教程和论文代码存量更大;跑稳健性时再用spxtregress交叉验证一次。两套命令对同一模型的结果应该基本一致,如果出现方向性差异,优先检查权重矩阵是否在两边都正确载入。
4.4 直接效应、间接效应与总效应怎么解读
很多人拿到xsmle结果后只盯着系数和rho,其实系数本身在SDM里并不等于边际效应。原因是解释变量x既以本地区水平进入方程,又以空间滞后项Wx进入方程。本地区x变化会先影响本地区y,再通过空间传导影响其他地区y,最后这些邻居的y变化又反过来影响本地区y,形成一个反馈回路。
直接效应把这个反馈回路算进去了,间接效应才是真正意义上的溢出效应。举个例子,如果模型里的核心解释变量是研发投入,被解释变量是GDP,间接效应显著为正,说明一个地区的研发投入提高确实会通过技术溢出带动周边地区增长,这才是SDM相对普通面板模型最有价值的发现。写论文时,直接效应、间接效应、总效应三列都要完整报告。
5. 计算中的高频报错与排查经验
空间计量模型的计算链条长,报错也五花八门。这一节我把这几年被问得最多的四类问题集中写一下,每一条都对应一个真实踩坑场景。
5.1 “matrix not found”与变量不匹配
最常见的报错是matrix W not found或varlist not found。出现这类问题,九成是权重矩阵根本没有生成成功,或者生成之后换了数据集。spwmatrix生成的矩阵保存在内存里,一旦你use了另一个dta,矩阵就没了。解决办法是养成习惯:矩阵生成后马上保存成dta文件,下次使用先载入。另外,矩阵的命名和xsmle里wmat()的命名必须一致,大小写都别放错。
还有一种情况:数据里包含了权重矩阵之外的区域,或者权重矩阵里有数据里没有的区域。最直接的检查是tab id,数清楚样本里有多少个区域,再和矩阵维度对比。不一致就先处理样本,别直接跑模型。
5.2 邻接矩阵出现零行的处理
用SHP文件生成0-1邻接矩阵时,如果某个区域与任何区域都不相邻,矩阵会出现整行0,这在数学上就是不可逆的,迭代估计会直接失败。海南就是一个典型案例。
解决办法有几种:一是把邻接关系手动补上,比如将海南与广东、广西视为相邻;二是改用K近邻或反距离矩阵,让每个区域都有非零权重;三是先将该区域权重设为1再标准化。第三种会引入主观性,不太建议。最规范的还是用距离矩阵,让数据自己说话。如果论文里强调邻接矩阵的简洁性,至少要在脚注里说明孤立区域的处理方式。
5.3 面板排序错位导致的静默错误
这是一个隐蔽坑:矩阵顺序和数据顺序不一致,STATA不会报错,但结果完全不可用。我排查的方法是:先在估计前运行xtset id year,然后检查tab id的频率是否和矩阵维度匹配,再用matrix list W和tab id的前几行对比。如果发现乱序,回到第2章,用数值型id排序后重新生成矩阵。
还有一种情况是面板存在缺失年份,矩阵还是按完整N生成,但样本里某年缺少一个区域,导致该年观测数量比N小。xsmle会按非平衡面板处理,但矩阵与数据的对应关系仍然要保证没有区域被误删。
5.4 空间系数不收敛或rho离群
rho估计值大于1或者反复迭代不收敛,是新手最常见的崩溃现场。先检查权重矩阵是否按行标准化;其次看样本量,如果n只有十几个区域,空间参数的可识别性本来就弱,rho很容易飘。还有一种情况是解释变量和空间滞后项高度共线,导致信息矩阵不稳定。
我的处理顺序是:先标准化矩阵,再换用K近邻,最后考虑简化模型或去掉无效变量。如果以上都不行,建议回去看原始数据有没有异常值,比如GDP对数化之前是不是混入了负数。空间计量的估计本质上依赖权重矩阵的信息量,矩阵质量差,再高级的估计命令也救不回来。
最后再说一个我自己的习惯。权重矩阵生成好之后,我会先建一个最简单的空间滞后模型,只看rho的方向和显著性,当作“冒烟测试”。如果用一个完全没有经济学逻辑的权重矩阵,rho还异常显著,那多半是数据或矩阵有问题。这个习惯帮我挡掉过至少三次因为id错位导致的无效结果。空间杜宾模型的计算本身并不复杂,复杂的是权重矩阵和数据结构之间的微妙匹配关系。把这一步吃透,后面的结果解读才算真正站得住。
本文还有配套的精品资源,点击获取