☰
Stata空间面板数据模型实操:从权重矩阵到SAR/SEM/SDM全解析
2026/10/6 13:14:39 网站建设 项目流程

做区域经济、城市管理、公共政策这块研究的人,十有八九会遇到一个尴尬局面:手里的数据明明是按省、按市、按县排的面板数据,结果画个地图一看,变量分布根本不独立——隔壁省的投资冲高,本地就业跟着动;本地的环境规制收紧,邻接地区污染反而加重。这种空间上的相互影响,普通面板模型根本解释不了,硬跑出来的系数也经不起推敲。

空间面板数据模型就是为解决这类问题存在的。它把“空间依赖”这个被传统面板忽略的维度纳入计量框架,核心关注的是一个地区的行为如何通过空间传导机制影响其他地区。这篇文章我会从空间权重矩阵的构建,到静态空间面板的SAR、SEM、SDM三类主流模型,再到Stata里的具体实现命令和结果解读,完整过一遍。适合正在写实证论文、或者工作中需要处理区域面板数据的朋友,尤其是对Stata命令体系还不太熟,想直接照着跑通的读者。

1. 空间面板模型到底在解决什么问题

1.1 从一句话看懂空间依赖

传统面板模型的基本假设是每个观测值相互独立,也就是说北京的经济增长不会影响河北,河北的环境污染也不会传导到山东。但现实显然不是这样。要素流动、技术扩散、政策模仿、贸易往来,都会让地区之间产生关联,计量经济学把这叫空间依赖或空间自相关。

空间依赖的实质可以理解为:一个地区的被解释变量不仅受本地区解释变量的影响,还受到其他地区解释变量和被解释变量的影响。比如研究产业结构升级对经济增长的影响,本地产业结构调整会产生增长效应,同时邻近地区产业结构调整也会通过供应链、人才流动、市场联动传导过来。如果回归方程里完全没有这一项,这些空间溢出效应就会被归入误差项,导致遗漏变量偏误,系数估计值可能是偏的。

1.2 三类主力模型:SAR、SEM、SDM

空间面板模型家族里,实证用得最多的是三个:

第一是空间自回归模型(SAR),核心是在解释变量中加入被解释变量的空间滞后项。它表达的是“邻居的y会影响我的y”,比如邻省经济增长会通过需求拉动带动本省增长。SAR模型在Stata中对应dvarlag(W)选项,估计的核心参数是空间自回归系数rho,这个系数显著为正,说明存在正向空间溢出。

第二是空间误差模型(SEM),认为空间依赖来自遗漏的、随空间变化的因素,也就是误差项存在空间相关。它的经济含义是:影响y的不可观测因素本身有空间聚集性,比如文化传统、气候条件、制度环境。SEM的检验重点在空间误差系数lambda上。

第三是空间杜宾模型(SDM),在SAR的基础上还加入了解释变量的空间滞后项,既允许y存在空间溢出,也允许x通过空间渠道影响其他地区的y。比如本地研发投入不仅对本地产出有影响,还通过技术扩散影响邻省产出。SDM在Stata中用ivarlag(W: 自变量列表)实现,是当前实证中最受推荐的模型,因为它既能捕捉实际数据生成过程,又不轻易丢失信息。

1.3 为什么选择空间面板而不是横截面空间模型

早期空间计量多用横截面数据,比如某一年各省的截面数据跑一个空间模型。但截面数据最大的问题是只能捕捉一个时间点上的空间关系,无法控制地区固定效应。一个省的产业结构、历史禀赋、政策传统都会影响y,如果没有地区固定效应,这些因素很容易和核心解释变量混淆,导致空间溢出效应被高估或低估。

空间面板数据同时引入了时间和个体两个维度,可以在控制地区固定效应和时间效应的前提下估计空间参数。这样不仅解决了遗漏地区特征的问题,还扩大了样本量,让模型估计更稳定。这也是为什么近十年高质量实证论文里,空间面板模型基本成了区域研究标配。

2. 一切的前提:空间权重矩阵构建

2.1 权重矩阵的本质与三种常见类型

空间面板模型和普通面板的本质区别就是引入了空间权重矩阵(W矩阵)。W矩阵是一个N×N的方阵,N是地区个数,矩阵中第i行第j列的元素表示地区j对地区i的空间影响强度。它本质上是研究者对“地区之间如何相互影响”的先验设定,直接影响所有空间参数的估计结果,是整个建模过程中需要最慎重对待的一步。

三种最常用的权重矩阵类型:邻接矩阵(contiguity)是最简单的,相邻地区取值为1,不相邻为0,适用于地区间影响主要发生在行政边界邻近的场景,比如环境污染扩散、产业转移;距离倒数矩阵(inverse distance)用地理距离的倒数表示影响强度,距离越近影响越大,适用于经济联系、贸易往来的研究,因为现实中远距离地区也可能发生要素流动;经济距离矩阵则用GDP差距、贸易强度、人口流动等经济变量构建,类似1/|GDP_i - GDP_j|,适合研究经济发展水平相近地区之间的互动。

2.2 Stata中创建权重矩阵:spmatrix

Stata从15版本开始把空间计量的相关功能整合进了官方命令,最核心的就是spmatrix。创建一个邻接矩阵只需要一行命令:

spmatrix create contiguity W, normalize(row)

前提是数据中已经包含空间信息。如果使用的是中国省级或市级shp文件,导入之后才能识别地理邻接关系。如果没有shp文件,但有每个地区的经纬度坐标变量,可以用idistance创建距离倒数矩阵:

spset lon lat, coordinates(lon lat) spmatrix create idistance W, npt(15) normalize(row)

npt(15)的意思是每个地区最多只和距离最近的15个地区产生空间关联,这样做的好处是避免距离非常远的地区之间出现非零权重,同时减轻矩阵稀疏性问题。normalize(row)则是对矩阵做行标准化,让每一行权重之和为1。行标准化之后,空间滞后项W·y的含义就变成了“邻居y的加权平均值”,这在经济学解释上更直观,也更容易做效应分解。

2.3 导入自定义经济距离矩阵

很多研究不用地理距离,而是用经济距离或社交网络关系来构建权重矩阵。这需要预先在Excel或Stata中计算好一个N×N的矩阵,再导入。

假设经济距离定义为两地区人均GDP差的绝对值的倒数,可以在Stata中先把数据整理成宽格式,然后计算两两配对值,再导出成矩阵格式:

* 假设有year, id, gdp三个变量,只提取某一年的gdp preserve keep if year == 2020 keep id gdp rename gdp gdp_i cross using `= _N' // 生成两两配对

实际操作用cross指令或者先用joinby构造配对数据集,再生成距离变量。矩阵构造完成后,把它保存为spmatrix格式:

spmatrix import W using myweight.dta, replace

这里要求myweight.dta中第一个变量是地区id,后面N列是对应的权重值,且变量顺序必须与面板数据中地区标识的顺序严格一致。这个顺序问题是新手最容易踩的坑,后面会专门讲。

2.4 行标准化与特征值检查

无论用哪种方式创建权重矩阵,几乎都要做行标准化。行标准化不只是为了权重加总为1方便解释,还有一个重要的技术原因是:它让空间矩阵的特征值分布在可控范围内,直接影响模型的可识别性和估计稳定性。

Stata里检查矩阵基本情况可以这样操作:

spmatrix summarize W spmatrix eigenvalue W

summarize会显示矩阵的维度、是否有缺失值、稀疏程度等;eigenvalue显示特征值分布。如果发现大量缺失值或者特征值异常,就要回到权重矩阵构造逻辑上去排查,常见原因是地区id编码不一致或shp文件与数据表匹配失败。

权重矩阵一旦设定错了,后面所有估计结果都会跟着错,而且不会报错。这一点务必在建模前反复确认。

3. 动手前的检验:模型形式与效应选择

3.1 Moran's I:空间相关性到底有没有

跑空间面板模型前,先要确认数据中确实存在空间自相关,否则强行用空间模型是自找麻烦。最常用的检验是Moran's I指数,它和相关系数类似,取值一般在-1到1之间,正值表示正空间自相关,负值表示负空间自相关。计算公式本质上是用变量离差和空间权重矩阵做交叉乘。

Stata里对面板数据做Moran检验,一种常见做法是分年份做全局Moran指数。可以逐年提取变量,配合spmat或相关矩阵命令来算。更省事的方式是先安装spatwmat和spatgsa这两个用户命令:

ssc install spatwmat ssc install spatgsa spatwmat using Wmatrix.dta, name(W) spatgsa y, weights(W) moran

逐年重复这个操作,如果多数年份Moran指数为正且显著,就说明空间自相关确实存在,有进一步做空间面板模型的必要。注意spatwmat和官方spmatrix是两套体系,它们的矩阵格式不通用,这一点在Stata里经常让人混乱,我用下来一般是Moran检验阶段用spatwmat,正式建模阶段切回官方spmatrix。

3.2 LM检验:SAR还是SEM

确认存在空间自相关后,下一步是判断核心机制到底来自被解释变量的空间滞后(SAR)还是误差项的空间相关(SEM)。对此最直接的判断工具是LM检验和稳健LM检验。思路是先估计一个不含空间项的普通面板模型,然后对残差做空间依赖检验。

传统做法是安装spatdiag命令:

ssc install spatdiag xtreg y x1 x2, fe predict e, e spatdiag, weights(W)

spatdiag会输出LM-lag、LM-error以及对应的稳健版本。判断逻辑是这样:如果LM-lag显著而LM-error不显著,倾向SAR;反过来则倾向SEM;如果两者都显著,就看稳健版本,稳健更显著的那个优先;如果稳健版本也都显著,建议直接上SDM。SDM兼有空间滞后和空间误差的设定,在这种情况下是一种更稳妥的折中。

3.3 LR检验:SDM能否退回为SAR或SEM

SDM虽然灵活,但代价是参数更多,解释起来更复杂。如果数据支持简化为SAR或SEM,模型会更简洁。总可以构造一个LR检验:在SDM的估计结果上,用estat或手动跑受限模型来检验原假设。原假设H0是“所有解释变量的空间滞后项系数联合为0”,如果无法拒绝,说明SDM可以退化为SAR;另一个检验原假设是“解释变量空间滞后项系数等于负的rho乘对应系数”,如果无法拒绝,说明可以退化为SEM。

实际操作上,更常见的判断顺序是:先估计SDM,再看SDM中ivarlag项的系数是否显著。如果空间滞后解释变量的系数都不显著,而空间滞后被解释变量系数显著,那SAR就够用了;如果加了空间滞后解释变量后rho发生明显变化,说明确实有必要用SDM。这种基于系数显著性的判断虽不够严格,但在实践中效率很高。

3.4 Hausman检验:固定效应还是随机效应

面板模型绕不开固定效应和随机效应的选择。空间面板模型同样如此。固定效应假设地区特质与解释变量相关,随机效应则假设不相关。选择的标准做法还是Hausman检验。

在spxtregress等官方命令中,直接比较fe和re两个估计结果的系数向量用hausman检验。原理和普通面板Hausman检验一样:如果固定效应和随机效应的估计系数差异显著,说明随机效应模型的假设不成立,应选固定效应;差异不显著,随机效应更有效率。

就我看到的实证论文而言,区域研究的数据基本都来自行政地区,地区固定效应几乎总是需要的,所以大多数情况下可以直接用固定效应模型,Hausman检验更多是作为补充证据。

4. 静态空间面板模型的Stata实操

4.1 数据准备与面板设定

空间面板模型的数据结构要求是:每个地区在每个时期各有一条观测,且必须是平衡面板。不平衡面板用spxtregress会直接报错,需要先处理缺漏样本。

第一个关键步骤是声明面板结构,同时确保观测单位与空间权重矩阵的地区一一对应:

xtset id year

id必须是空间面板中的地区标识,也就是N个观测单位;year是时间标识。如果数据里id不是数字变量,需要先encode转成数字。

然后是确保空间权重矩阵已存在于当前Stata会话中:

spmatrix dir

这个命令会列出所有已创建的权重矩阵。如果前面的spmatrix create或spmatrix import没有执行成功,这里会看不到W,后续建模就会报错。

4.2 三种模型的命令写法及参数含义

准备好数据和矩阵后,可以分别跑SAR、SEM、SDM三种模型。以研究数字经济发展对区域创新的影响为例,y是区域创新产出,x1是数字经济发展指数,x2是控制变量。

空间自回归模型SAR:

spxtregress y x1 x2, fe dvarlag(W)

dvarlag(W)表示把W乘y产生的空间滞后项放入回归方程,对应空间自回归项的估计。这里fe表示地区固定效应。如果数据跨时长且趋势明显,还可以加上时间固定效应fe加i.year的做法,不过更规范的写法是用re配合时间效应或者用双固定效应的设定。

空间误差模型SEM:

spxtregress y x1 x2, fe error(W)

error(W)表示误差项存在空间相关,模型通过空间误差结构来捕捉不可观测因素的空间依赖。

空间杜宾模型SDM:

spxtregress y x1 x2, fe dvarlag(W) ivarlag(W: x1 x2)

ivarlag(W: x1 x2)是把x1和x2的空间滞后项放入方程。这个模型的经济含义相当直白:不仅邻居的创新产出会影响本地产出,邻居的数字经济发展水平也会通过溢出效应影响本地产出。

默认估计方法是极大似然估计(ML),Stata会自动处理空间权重带来的雅可比项。样本量较大时,模型可能跑得比较慢,这是正常的。若担心异方差问题,可以加vce(robust)选项。

4.3 回归结果的正确解读方法

跑完模型之后,第一件事是看空间自回归系数rho是否显著。SAR和SDM结果中的rho是核心参数之一,它衡量的是被解释变量的空间溢出强度。rho在0到1之间且显著为正,说明地区间确实存在正向的扩散效应,这个结果也可以作为空间依赖存在的直接证据。

但要注意,在SDM中x1的系数不能再直接解读为全效应,因为x1还会通过空间滞后项间接影响其他地区的y,而其他地区的y又会反馈回来影响本地区的y,形成复杂的反馈循环。这就是空间计量与传统计量在解释上的最大区别:系数值本身只是一个局部效应,要理解完整影响需要看效应分解。

4.4 使用estat impact解读直接效应与间接效应

Stata提供了estat impact来分解效应。在SDM估计完成后输入:

estat impact, summary

输出结果包含三个核心表格:直接效应(direct)、间接效应(indirect)、总效应(total)。直接效应衡量的是自变量对本地区因变量的平均影响,但它已经包含了从邻居反馈回来的部分;间接效应才是真正的空间溢出效应,比如“邻居的数字经济发展水平提高一个单位,平均来说对本地区创新产出带来的影响”。总效应等于两者之和。

这个分解是空间面板实证里论文的核心结果。比如x1的直接效应显著为正,说明本地数字经济发展能带动本地创新;间接效应也显著为正,说明数字经济存在跨区域辐射效应。这部分结果比单一回归系数的信息量丰富得多,也是审稿人和导师最关注的内容。建议分组解释,别混在一起。

5. 动态空间面板模型:用xsmle实现

5.1 xsmle的安装与基本语法

官方spxtregress不支持动态设定,比如被解释变量的一期滞后项进入方程。如果研究问题本身存在惯性效应,比如创新投入受往年创新水平影响,就需要用第三方命令xsmle。这个命令由Belotti等人编写,是学术界跑动态空间面板最常用的工具。

安装非常简单:

ssc install xsmle

基本语法是:

xsmle y x1 x2, wmat(W) model(sdm) fe type(both)

wmat(W)指定空间权重矩阵,model()可以填sar、sem、sdm、sac等,fe表示固定效应,type(both)表示同时控制个体固定效应和时间固定效应,type(ind)只控制个体效应,type(time)只控制时间效应。

5.2 动态模型的设定方式

要在xsmle中实现动态空间面板,核心是把被解释变量的滞后项加到解释变量列表中。比如研究经济增长的收敛性,经典动态设定是:

gen ly = l.y xsmle y ly x1 x2, wmat(W) model(sdm) fe type(both) durbin(x1 x2)

这里ly是y的一期滞后,系数衡量的是经济发展的惯性。如果想进一步考察时空滞后效应,也就是邻居上一期行为对本地当期的影响,可以在动态框架下构造W*ly,不过这类高阶设定需要谨慎,过度复杂反而难以解释。

durbin(x1 x2)的作用是指定SDM模型中哪些解释变量需要放空间滞后项。如果不写durbin(),model(sdm)会对所有解释变量都加上空间滞后,系数太多不利于解释,建议按研究设计明确指定关键的变量。

5.3 动态模型的参数解读

xsmle的输出结果和spxtregress类似,会给出rho和模型系数的估计结果。对它而言,直接效应、间接效应、总效应的计算逻辑依然相同,只是在动态模型中效应会随时间累积。短期效应和长期效应的区分对动态模型很重要,xsmle在effects选项中可以给出不同类型的效应分解。

有一点需要提醒:动态空间面板对数据时间长度有要求。如果T太短(比如不足10期),时间滞后项和空间滞后的联合估计会面临严重的小样本偏误,推荐使用偏差校正之后的估计方法,不过这种方法在Stata实现上更复杂,一般研究用xsmle默认的ML估计就够了。

6. 实操中的高频问题与避坑技巧

6.1 spxtregress常见报错排查

实操中第一个高频报错是“variable W not found”。一般是spmatrix create没有成功执行,或者矩阵名打错了。用spmatrix dir确认矩阵是否存在,尤其注意矩阵名是区分大小写的,W和w是两个不同对象。

第二个高频报错是“panels must be strongly balanced”。这不是spxtregress的锅,而是面板数据本身存在缺失。解决方法是检查数据完整性,可以用xtdes查看面板结构,把缺漏年份补齐或删除不平衡地区。注意删除地区要同时把权重矩阵中对应的行列删掉,否则又会引发维度不匹配的报错。

还有一个情况是结果报“matrix W contains zero rows”。这出现在某些地区没有邻居的场景,比如一些孤立岛屿,在邻接矩阵里可能没有任何相邻地区。处理办法是改用距离矩阵,或者手工在权重矩阵里给该地区指定最近的邻居作为补救。

6.2 权重矩阵与面板匹配问题

权重矩阵与数据顺序不匹配是最隐蔽的错误。Stata的spxtregress不会报错,但估计结果就是错的或者异常。权重矩阵的行和列,必须和面板数据中id的取值及顺序一一对应。比如id=1的北京对应矩阵第1行,id=2的天津对应第2行,不能错位。

最稳妥的检查方法是对比id列表和矩阵行列名的顺序。创建一个N×N的邻接矩阵时,先看地区数量是否一致:

tab id spmatrix summarize W

再看维度是否对得上。如果是自定义导入的矩阵,导入前一定要在Excel里把地区排序和Stata中xtset的id排序调成一致,这个步骤虽然繁琐,但值得花时间确认。我处理省际数据时习惯先按省份代码排序,再导出矩阵,这样可以最大程度避免混乱。

6.3 结果解读的三个典型误区

空间计量的结果解读有几个经典错误。第一个误区是只看rho不看效应分解。rho显著只能说明存在空间溢出,但它不能回答“数字经济发展对创新产出的空间溢出有多大”这个问题,回答这个问题必须看间接效应。

第二个误区是把SDM的直接效应直接等同于普通面板回归系数。直接效应已经包含了反馈效应,所以它的含义与普通面板回归中的系数有微妙差别。严格解释时应该用效应分解表格里的数字,而不是回归表里那一列原始系数。

第三个误区是忽视权重矩阵对结果的敏感性。很多论文只汇报用一种权重矩阵的结果,这并不够严谨。规范的做法是至少用邻接矩阵和距离矩阵各跑一遍,把主要结果放在附录或稳健性检验里,向读者证明核心结论不依赖于权重矩阵的特定选择。

6.4 几个能救命的小技巧

分享几个实操中的小经验。第一,预估时间。空间面板模型的ML估计在样本量和矩阵维度变大后会指数级变慢。如果跑一个300个地区、20期数据的模型几分钟没出结果,不要干等着,可以先减少迭代的nolog选项或者检查矩阵稀疏性。可以用nolog选项关掉迭代过程显示,能显著加快运行速度。

第二,学好estat impact的其他选项。有时候想算某个解释变量在特定取值下的边际效应,可以用at()配合变量名和数值来指定。这比手动计算简单得多,也能避免算出错误的反馈效应。

第三,重要的事说三遍:保存权重矩阵。spmatrix export可以把权重矩阵导出为dta文件,模型跑完、数据清空后依然可以重新导入继续分析。不然每次打开Stata都要重新构建矩阵,反复操作不仅浪费时间,还容易出现版本不一致的混乱。导出命令很简单:

spmatrix export W using Wfinal.dta, replace

第四,面板数据里有缺失值时,尽量不要用直接删除整条记录的方式补齐,因为空间面板模型对平衡性要求极高,一条缺失可能导致整个地区被剔除,损失大量信息。优先用插补方法或者保留平衡子样本。

这个内容后续还可以扩展的方向是时变空间权重矩阵的处理,也就是W随时间变化的情况,这种设定在官方spxtregress里实现不了,但是如果你有明确的动态网络数据,可以用自己在循环里逐期构造矩阵再拼接的方式来实现。我自己在实操中最大的体会是:空间面板模型的难点不在命令,而在对空间关系的设计和对结果的谨慎解读,权重矩阵才是真正的建模决策点,前期多花时间想清楚权重矩阵,比后期试图用更复杂的模型参数补救要有用得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询