STATA空间杜宾模型实战:从空间权重矩阵构建到SDM计算
简介一份面向空间计量经济学学习者与实证研究者的STATA操作命令文档聚焦空间权重矩阵创建与空间杜宾模型计算适合经济学、区域科学、地理信息科学等方向需要处理空间面板数据的研究生及科研人员。文档以docx格式提供整个压缩包仅1个文件大小43KB内容紧凑便于对照执行。目前已有395人学习下载。文档操作主线清晰从设置默认路径、读取shp地图数据开始详细演示shp2dta转换地图文件、生成坐标数据集并通过spmap绘制区域GDP分布图随后重点讲解利用spmat生成距离矩阵与邻接矩阵、进行行标准化并保存为stata可读格式及txt文本格式同时给出Morans 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哪个变量是区域idspmatrix 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安装xsmlessc 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错位导致的无效结果。空间杜宾模型的计算本身并不复杂复杂的是权重矩阵和数据结构之间的微妙匹配关系。把这一步吃透后面的结果解读才算真正站得住。本文还有配套的精品资源点击获取