空间面板数据模型这几年在国内计量经济学实证里几乎成了“标配”。不管是区域经济、城市经济、环境经济,还是创新管理、数字金融,论文评审一看到你用普通面板回归,大概率会追问一句:不考虑空间溢出效应吗?很多朋友一听到“空间面板”就头大,觉得要学GeoDa、要学MATLAB,或者要折腾一堆地理信息处理软件。其实在Stata里完全可以实现,而且从数据准备到模型估计再到结果解读,链路比想象中清爽。这篇博文就用我的实际经验,把用Stata实现空间面板数据模型的完整流程、命令代码、模型选择逻辑和踩过的坑,一次性讲清楚。内容适合刚接触空间计量的硕博生,也适合想在论文里补充空间分析的实务研究者。
1. 空间面板数据模型到底在解决什么问题
1.1 为什么普通面板回归不够用
传统的面板数据模型假设不同地区之间是相互独立的,也就是某个地区的解释变量只会影响本地区的被解释变量,不会跨地区传导。这个假设在真实世界里经常站不住脚。举一个非常直白的例子:某个城市加大了对科技创新的财政补贴,周边的城市可能因为人才流动、产业配套、知识溢出等原因,创新产出也会跟着变化。这种“邻居”之间的相互影响,就是空间依赖性。
这种依赖关系在统计上带来两个直接后果。第一个后果是遗漏变量问题:如果你没把空间相互作用放进模型,残差里就藏着空间结构,导致估计结果有偏。第二个后果是信息浪费:普通面板只告诉你“本地要素对本地产出”的影响,但政策制定者往往更关心本地政策能不能辐射到周边,也就是空间溢出效应。空间面板数据模型的核心价值,就是同时解决这两个问题,让研究者能够既控制空间依赖,又识别空间溢出的方向和强度。
我经常用一个生活化类比来帮助理解:普通面板模型像是在只观察自己的院子,空间面板模型则会去关注邻居家的草长得怎么样、邻居用的除草剂是什么牌子,因为这两者很可能互相影响。理解了这一点,你就知道空间面板不是“炫技”,而是对现实空间相互作用的一种建模逼近。
1.2 三类主流模型:SAR、SEM、SDM怎么选
空间面板模型的基本框架是在普通面板回归的基础上,加入空间结构。核心模型主要有三个:
- 空间自回归模型(SAR),也叫空间滞后模型。它假设被解释变量之间存在空间依赖,即本地的Y会受到邻近地区Y的影响。模型形式可以写成:( Y_{it} = \rho W Y_{it} + X_{it}\beta + \mu_i + \varepsilon_{it} ),其中W是空间权重矩阵,ρ是空间自回归系数。
- 空间误差模型(SEM)。它假设空间依赖发生在误差项中,也就是一些不可观测的因素存在空间传导。模型形式为:( Y_{it} = X_{it}\beta + \mu_i + u_{it} ),其中 ( u_{it} = \lambda W u_{it} + \varepsilon_{it} )。
- 空间杜宾模型(SDM)。它在SAR的基础上进一步假设解释变量X也存在空间溢出,也就是说周边的X也会影响本地的Y。模型形式是:( Y_{it} = \rho W Y_{it} + X_{it}\beta + W X_{it}\theta + \mu_i + \varepsilon_{it} )。
选哪个模型,最稳妥的思路是从“一般到特殊”开始。先估计SDM,然后通过LR检验或Wald检验,检验两个原假设:( H_0: \theta = 0 )(退化为SAR)和 ( H_0: \theta + \rho\beta = 0 )(退化为SEM)。如果两个原假设都被拒绝,就保留SDM;如果其中一个不能被拒绝,就选择对应的简化模型。这个流程在后面实操部分会详细展示。
1.3 固定效应还是随机效应:空间面板的“老问题”
面板模型绕不开固定效应和随机效应的选择,空间面板同样如此。普通面板一般用Hausman检验来决定,空间面板里也有对应的做法。不过在空间计量里,很多文献会直接选择双向固定效应,也就是同时控制个体效应和时间效应,理由是空间单元之间往往存在较强的异质性,固定效应更稳健。
固定效应有两个好处:一是能够吸收不随时间变化的地区特征,比如地形、气候、文化传统;二是配合时间固定效应,可以吸收共同的宏观冲击,比如经济周期。代价是自由度损耗和无法估计那些不随时间变化的变量。随机效应则更有效率,但需要较强的假设条件。
我在实际操作中的体会是:如果样本覆盖面比较广,比如全国地级市、全国省份,首选时空双向固定效应;如果样本是特定行业或者特定区域的小样本,再考虑随机效应,并用空间Hausman检验来支撑结论。用Stata做空间面板时,无论选哪种效应,命令层级的差异并不大,但解释时要特别注意。
2. 用Stata实现空间面板的完整流程
2.1 数据准备:从数据整理到面板结构设定
用Stata做空间面板数据模型,第一步是确保数据本身就是面板结构。每一条观测必须唯一对应一个“空间单元+时间”的组合,比如一个城市在某一年的数据只能有一行。常见的问题是ID变量重复、年份变量缺失、数据类型不一致,这些都会在后续报错时让人崩溃。
数据清洗完成后,用xtset命令设定面板结构。假设你的数据里有id(地区代码)和year(年份)两个变量:
xtset id year执行后Stata会告诉你面板类型,是平衡面板还是非平衡面板。如果数据不是按id和year排序,xtset会自动帮你排序。这一步完成后,我建议顺手跑一条xtdescribe,检查每个id有多少个时间观测。经常有人的数据在某一年缺失,如果不处理,后面做空间矩阵匹配时会出现“空间权重矩阵与观测不匹配”的报错,这点务必提前排查。
2.2 空间权重矩阵的构建:三类主流方式与标准化
空间权重矩阵是整个空间面板分析的地基,它刻画了地区之间的空间关系。Stata 15及以上版本提供了官方的spmatrix命令,可以直接创建、查看、标准化权重矩阵。比较常见的权重矩阵有三种:
- 邻接矩阵:两个地区有共同边界就取1,否则取0。
- 距离矩阵:基于地理距离的倒数或者距离阈值的倒数。
- 经济距离矩阵:基于GDP、贸易流、人口流动等经济变量的差距。
其中邻接矩阵最常用,也最容易解释。用Stata官方命令创建邻接矩阵时,需要先设置空间数据。如果你的数据里含经纬度坐标变量(比如经度long、纬度lat),可以用spset把数据设定为空间数据:
spset id, coord(long lat)如果手头有shapefile文件,可以用spset配合shp文件路径来设定。设定好空间数据后,创建邻接矩阵:
spmatrix create contiguity W创建完成后,可以用spmatrix summarize W查看矩阵的基本信息,用spmatrix export导出,也可以直接在下文的空间面板回归中使用。很多教程会提醒:空间权重矩阵要“行标准化”(row-standardization),也就是让每行的权重之和等于1。这个操作的意义在于让权重具有“平均化”解释,使得空间滞后项可以被理解为邻居变量的加权平均。在Stata里,创建矩阵时加一个选项即可:
spmatrix create contiguity W, standardize我强烈建议做空间分析时养成“创建后立即标准化”的习惯。不标准化带来的一个常见问题是:当某个地区的邻居数量非常多时,空间滞后项的值会被放大很多倍,回归系数变得难以解释,甚至导致收敛失败。
2.3 核心估计命令与选项说明
Stata官方提供的空间面板估计命令是spxtregress,它在Stata 15之后被引入,支持固定效应、随机效应和极大似然估计。语法结构大致是:
spxtregress depvar indepvars, fe dvarlags(W) [ivarlags(W: varlist)]其中:
fe表示固定效应,re表示随机效应,ml表示极大似然。dvarlags(W)表示在模型中加入被解释变量的空间滞后项,对应SAR模型。ivarlags(W: varlist)表示加入解释变量的空间滞后项,配合dvarlags(W)使用时就是SDM模型。- 如果要估计空间误差模型SEM,可以加入
error(W)选项。不同版本对error支持情况略有差异,如果报错,可以把spxtregress更新到最新版,或者用外部命令xsmle配合spatwmat构建的矩阵来估计SEM。
需要留意的是,spxtregress需要权重矩阵存在当前Stata的内存里,也就是通过spmatrix create创建的矩阵对象。不是所有外部命令生成的矩阵都能直接被spxtregress识别。如果你的空间权重矩阵是用ArcGIS、GeoDa等软件导出的,先导入Stata并转换成spmatrix格式,再回归。这个转换可以借助spmatrix import等方式完成。
3. 一个完整案例:数字经济对区域创新的空间溢出效应
3.1 案例设定与基本模型形式
为了把上面的流程串起来,我构造一个典型的实证场景:研究数字经济对区域创新的影响。被解释变量是区域创新能力(patent,取对数),核心解释变量是数字经济发展指数(digi),另外加入控制变量:经济发展水平(pgdp,取对数)、人力资本(hum)、城市化率(urban)。数据是虚构的200个地区10年面板,已经整理成一个名为spdata.dta的文件。
研究目标是回答三个问题:
- 本地数字经济是否显著提高本地创新能力?
- 数字经济是否产生了空间溢出,即周边地区的数字经济是否影响本地的创新能力?
- 创新本身是否存在空间正向相关,即“强强联合”还是“虹吸效应”?
理论预期上,数字经济具有网络外部性和知识溢出特征,空间溢出很可能是正向的。基础模型从SDM设定开始。
3.2 空间自相关检验:Moran's I和LM检验怎么做
在正式跑空间面板回归之前,需要先验证数据里是否真的存在空间自相关。最常见的指标是莫兰指数(Moran's I)。在Stata里,有两种常用方式:
- 方式一:在
spxtregress估计后,用estat moran直接检验残差的空间自相关。 - 方式二:先对变量做普通面板回归(不考虑空间项),再用
spatdiag等外部命令计算Moran's I。
如果你还没有建立任何回归模型,只是先看看某个变量本身是否存在空间聚集,可以用spmatrix配合绘图和自相关统计量来观察,不过更常规的做法还是做回归后的残差检验。我的习惯是:先估计一个不含空间项的普通面板模型,然后立刻检验残差:
xtreg patent digi pgdp hum urban, fe estat moran如果Moran's I显著为正,说明残差存在正向空间依赖,值得进一步使用空间面板模型。随后进行LM检验,判断遗漏的是空间滞后项还是空间误差项。常见的LM检验命令组合是把普通面板回归残差与空间权重矩阵结合,用spatdiag来实现:
reg patent digi pgdp hum urban spatdiag, wmat(W)注意,spatdiag里的权重矩阵W需要用spatwmat或spmat的方式生成。如果手头只有spmatrix格式的W,可以先导出再导入到spatwmat能识别的格式。这一步在不同Stata版本里会有些绕,但逻辑是一致的:利用LM检验的稳健公式判断SAR还是SEM更合适。经验法则是:如果稳健LM-lag比稳健LM-error更显著,优先考虑SAR/SDM;反之则考虑SEM。
3.3 模型估计与比较:从SDM出发做LR检验
在确认存在空间依赖后,开始估计空间面板模型。首先估计SDM固定效应模型,同时加入被解释变量和核心解释变量的空间滞后项:
spxtregress patent digi pgdp hum urban, fe dvarlags(W) ivarlags(W: digi pgdp hum urban) est store sdm_fe然后估计SAR模型,去掉解释变量的空间滞后项:
spxtregress patent digi pgdp hum urban, fe dvarlags(W) est store sar_fe再估计SEM模型,使用误差项的空间滞后:
spxtregress patent digi pgdp hum urban, fe error(W) est store sem_fe接下来用LR检验判断SDM是否会退化为SAR或SEM。这个检验可以直接用lrtest,将估计结果存储在同一个模型框架下:
lrtest sdm_fe sar_fe lrtest sdm_fe sem_fe如果lrtest因为模型嵌套设置问题无法执行,也可以手动计算LR统计量:两倍的对数似然值之差,再与卡方临界值比较。自由度等于SDM相比简化模型多出来的参数个数。实际操作中,我经常看到LR检验结果两个原假设都被拒绝,说明SDM是更合适的模型;偶尔遇到不能拒绝SAR的情况,那就可以转用更简洁的SAR。
3.4 直接效应、间接效应与总效应:别只盯着系数看
空间面板模型里的回归系数不能直接当成边际效应解释,这一点是所有新手最容易翻车的地方。因为空间滞后项的存在,某个地区解释变量变化会通过空间传导链条影响所有地区,再反作用于本地,形成“反馈效应”。比如digi的系数β_digi只表示“本地数字经济发展对本地创新的直接路径”,但digi的空间滞后项和空间自回归项会让这个边际效应发生变化。
Stata里计算正确边际效应的命令是estat impact。它可以分别输出短期和长期的平均直接效应、平均间接效应(溢出效应)、平均总效应:
spxtregress patent digi pgdp hum urban, fe dvarlags(W) ivarlags(W: digi pgdp hum urban) estat impact解读时的核心是看间接效应。如果digi的间接效应显著为正,说明周边地区的数字经济提升会显著促进本地区的创新产出,这就是空间溢出的证据。如果间接效应为负,可能是虹吸效应,比如资源向数字经济发展好的地区集中。记住:主回归表里的系数只是“局部效应”,论文里要汇报效应分解的结果,这才是空间计量的“卖点”。
3.5 稳健性与内生性处理的补充思路
空间面板模型同样面临内生性问题,如果核心解释变量与误差项相关,估计结果不可靠。常用的应对方法是用iv选项加入工具变量,或者改用空间两阶段最小二乘方法。在Stata里,spxtregress对工具变量也有支持,配合iv()选项实现。
工具变量的选取思路和普通IV回归一致,要满足相关性和外生性。空间计量里经常使用解释变量的空间滞后项作为工具变量,比如用周边地区的数字经济指数作为本地数字经济的工具变量。背后的逻辑是:周边地区的数字经济发展水平会影响本地数字经济发展,但同时一般不直接决定本地的创新能力。这种做法虽然常见,但需要谨慎论证外生性。
4. 常见问题与排查技巧实录
4.1 收敛失败:多数时候是权重矩阵的锅
spxtregress在估计时偶尔会报“convergence not achieved”或者迭代不收敛。根据我的经验,最常见的原因是空间权重矩阵没有标准化,或者权重矩阵里有大量孤岛节点(没有任何邻居的地区)。邻接矩阵里,如果一个地区与任何其他地区都没有公共边界,它的行全是0,行标准化时会出问题。解决办法:一是检查spmatrix summarize W的输出,看有没有全零行;二是对孤岛节点做处理,比如改为距离权重,或者直接把这些样本排除在分析之外。
另外,极大似然估计对初值比较敏感。如果收敛困难,可以尝试用re随机效应模型先跑通,再回到fe;或者把绝对数值过大的变量做标准化处理。数字经济的量纲如果很大,估算时容易出现数值溢出。
4.2 权重矩阵的维度匹配错误
报错“variables must be in same order”或者“matrix not found”往往是权重矩阵的行列顺序和面板数据的id顺序不一致。spxtregress要求权重矩阵的行列名称必须与面板数据里的id取值严格对应。你在用spmatrix create时,权重矩阵的标签源自spset设定的id变量。如果之前xtset id year时id编码和spset的id编码不一致,就会对不上。
我的经验是:在xtset之前,先运行spset id, coord(long lat),让Stata把空间信息与面板id绑定,然后再xtset id year,这样内部记录是一致的。尽量别用两个不同的id变量来管理空间信息和面板信息。
4.3 结果解读里的坑:系数显著不等于溢出显著
很多初学者在主回归表里看到一个正显著的系数,就急着写“说明存在正向空间溢出效应”。这里有两个坑。
第一个坑:没有做效应分解。正如前面所说,空间面板模型的系数不能直接解释为边际效应,必须用estat impact的结果来表述。
第二个坑:混淆了“被解释变量的空间自回归系数ρ”和“解释变量的空间溢出”。ρ显著为正,只能说明区域创新本身存在空间依赖,不能说明数字经济的空间溢出;要谈数字经济的溢出,必须看digi的间接效应是否显著。
我审稿时经常看到有作者把ρ的描述写成“数字经济存在显著溢出效应”,这是不严谨的。准确的写法是:rho显著为正,说明区域创新产出存在显著的正向空间依赖;digi的间接效应显著为正,说明数字经济发展具有显著的空间溢出效应。
4.4 快速排查速查表
| 常见报错/问题 | 可能原因 | 解决办法 |
|---|---|---|
| xtset后数据顺序错乱 | 原始数据没有按id+year排序 | xtset会自动排序,观察描述性统计确认 |
| spmatrix create报错 | 未先spset或缺乏坐标变量 | 用spset设定空间信息,确保有经纬度坐标 |
| 收敛失败 | 权重矩阵未标准化/存在孤岛节点 | 创建时加standardize,剔除全零行地区 |
| 矩阵维度不匹配 | 面板id与矩阵行列名不对应 | 统一id变量,检查spmatrix summarize输出 |
| lrtest不能执行 | 模型未嵌套或存储结构不完整 | 改用手动计算LR统计量,卡方临界值查表 |
| estat impact报错 | 使用了re但效应分解不支持 | 换用fe,或检查估计命令是否为spxtregress |
4.5 外部命令的版本管理问题
xsmle、spatwmat、spatdiag这些命令都是外部命令,需要提前安装。我个人在Stata 15以上版本里更推荐官方命令spmatrix和spxtregress,因为官方命令的权重矩阵管理更统一,报错信息也更明确。但如果你需要估计空间误差模型SEM,或者想用sac模型(同时包含空间滞后和空间误差),官方命令在某些版本里选择有限,这时用xsmle会更方便。
安装外部命令的方法很简单:
ssc install xsmle ssc install spatwmat ssc install spatdiag需要特别提醒的是,这些外部命令依赖的矩阵格式与传统spmat格式不完全一样。xsmle通常要求你用spatwmat生成矩阵,再放到wmat()选项里。如果之前用官方spmatrix创建的矩阵,记得先导出,再用spatwmat导入。这个转换过程会花一点时间,但实际做完一次后就会发现规律很简单。
5. 关于这套流程的一些个人体会
用Stata做空间面板数据模型,最关键的不是记住命令,而是理解整个分析链条的每一步为什么这么做:为什么先做Moran's I,为什么从SDM出发做LR检验,为什么结果要看estat impact而不是主回归系数。把这些逻辑理顺了,换数据、换变量、换权重矩阵都不会慌。
我个人在实际操作中的一个小技巧是:在开始正式分析前,先做一遍“全流程预演”——用同一份数据,从spset、spmatrix、xtreg、spxtregress到estat impact全部跑通,哪怕结论不完美。这样能提前暴露数据污染、id不匹配、权重矩阵全零行等问题,避免在真正写论文赶结果的时候才发现错误。
最后再分享一个扩展方向:如果你后续想研究政策冲击的空间效应,可以尝试在空间面板框架里加入DID设计,即空间DID模型,检验某项政策是否不仅影响了本地、也影响了邻近地区。Stata里也可以通过交互项和空间滞后项的组合来实现。这套空间面板的基础流程跑通之后,做这些进阶模型会顺畅很多。