空间计量这几年在实证圈子里热度一直往上走,尤其是做区域经济、产业集聚、环境规制这类带地理属性的题目,审稿人越来越不满足于普通面板回归,总会追问一句"考虑空间溢出了吗"。空间杜宾模型(SDM)就是应对这类追问的主力工具之一,它同时纳入了解释变量的空间滞后项和被解释变量的空间滞后项,能刻画"本地解释变量影响本地被解释变量""邻居的解释变量影响本地被解释变量""邻居的被解释变量影响本地被解释变量"这三条通道。听起来复杂,但落到Stata操作上,其实是一条相当固定的流水线:设定空间权重、做空间自相关检验、跑LM检验选模型、估计SDM、分解直接效应与间接效应、最后解读。这篇就把我平时带新手走这条流水线的完整过程摊开讲,重点放在那些教程里不写、但实操中一定会卡住的地方。
1. 开工前的整体设计与思路拆解
1.1 为什么是SDM而不是SAR或SEM
很多人一上来就问该用哪个空间模型,其实这个问题不该由偏好决定,而该由检验结果决定。空间滞后模型(SAR)只放被解释变量的空间滞后项,假设空间溢出只通过被解释变量的传导发生;空间误差模型(SEM)则把空间相关性塞进误差项,认为溢出源于遗漏的、具有空间结构的不可观测因素。SDM把两者合到一起,同时放入WY和WX,形式上最"贪心"。
选SDM的底层逻辑是:如果你不确定溢出到底走哪条通道,SDM是一个相对稳健的起点,因为它嵌套了SAR和SEM(在参数约束下可退化)。更实际的一点是,LeSage和Pace那套观点影响很深——他们主张直接估计SDM,再用似然比检验看能否简化成SAR或SEM,而不是先做一堆LM检验再二选一。我个人的习惯是两条路都走一遍:LM检验用来给审稿人一个交代,LR检验用来确认SDM是否真的有必要保留WX项。这样无论审稿人偏好哪套流程,你都有对应的结果垫底。
需要提醒的是,SDM不是万能药。它对权重矩阵设定非常敏感,权重一换结论可能就变;而且它参数多,小样本下估计不稳。所以整个流程里,权重矩阵的构造和稳健性检验,重要性一点不亚于模型本身。
1.2 整条流水线的骨架
把流程拆成可执行的步骤,大致是这样一条链:
- 数据准备:面板结构、地理坐标或邻接关系、缺失值处理
- 构造空间权重矩阵:邻接型或距离型,标准化处理
- 空间自相关检验:全局Moran's I,看被解释变量有没有空间聚集
- 模型选择检验:LM-lag、LM-error、稳健版本,必要时加LR检验
- 估计SDM:固定效应还是随机效应,用Hausman定夺
- 效应分解:直接效应、间接效应、总效应
- 稳健性:换权重、换估计方法、缩尾处理
这条链里,第2步和第6步是最容易出问题的地方。权重矩阵构造错了,后面全盘皆输;效应分解不做,SDM的系数解读就是错的——这是新手最常犯的硬伤,后面会专门讲。
1.3 工具与命令的选型考量
Stata里做空间计量,主流是两条命令线:官方的spregress系列(Stata 15以后内置)和第三方老牌的spatreg、spmat、xsmle。我一般推荐新手先用spmat管权重、xsmle跑估计,原因是xsmle对面板SDM支持成熟、效应分解直接输出、文档案例多,社区里问问题也容易找到答案。spregress虽然官方维护、语法干净,但早期版本对面板固定效应的效应分解支持不如xsmle顺手。
提示:命令选型没有绝对对错,关键是团队内部统一、结果可复现。如果你所在的环境只能用官方命令,那就把
spregress的用法吃透,逻辑是一样的。
选xsmle还有一个现实理由:它输出的结果表里直接带直接效应、间接效应、总效应,省去手工用nlcom算偏导的麻烦。手工算不是不行,但矩阵求逆那一步很容易抄错,尤其变量一多,出错概率陡增。
2. 核心细节解析与实操要点
2.1 空间权重矩阵:整个模型的地基
权重矩阵W是空间计量的灵魂,它定义了"谁是谁的邻居"。常见两类:邻接型(contiguity)和距离型(distance)。邻接型里又分Rook(共边算邻居)和Queen(共边或共点都算)。距离型一般用地理距离的倒数、倒数平方,或者设一个距离阈值内的反距离。
构造邻接矩阵,Stata里常用spmat配合spmat contiguity,需要先有shapefile或者邻接关系表。如果没有地理信息文件,也可以手工维护一张"地区-邻居"对照表,用spmat的from选项导入。距离型则用spmat的idistance或vinverse,需要经纬度坐标。
这里有个关键操作:行标准化。做法是把每行的元素除以该行之和,使每行加起来等于1。为什么必须做?因为不标准化的话,一个邻居多的地区,其WY项的量级会天然偏大,系数估计会被邻居数量"污染",解释起来毫无意义。行标准化之后,WY的含义变成"邻居被解释变量的加权平均",这才有经济解释力。
* 假设已有邻接关系文件,构造邻接矩阵并行标准化 spmat use W using "contiguity_matrix.spmat", replace spmat summarize W * 行标准化 spmat normalize W, row注意:行标准化会让矩阵不再对称,这会影响某些检验的渐近性质,但实践中绝大多数文献都这么做,属于行业惯例。如果你坚持用对称矩阵,需要在文中说明理由。
2.2 全局Moran's I:先看有没有空间聚集
在跑模型之前,先确认被解释变量本身存在空间自相关。全局Moran's I是最常用的指标,取值大致在-1到1之间,大于0表示正相关(高值聚集高值、低值聚集低值),小于0表示负相关,接近0表示随机分布。
Stata里用spatgsa或estat moran(配合spregress)。用spatgsa的话:
spatgsa y, weights(W) moran输出会给Moran's I值、期望值、标准差和p值。p值显著且I为正,说明存在空间正相关,做空间模型有依据。如果I不显著,理论上普通回归也能接受,但审稿人可能仍会要求你报告空间模型作为稳健性。
实操心得:Moran's I对权重矩阵很敏感。同一份数据,邻接矩阵和距离矩阵算出来的I可能差不少。我的做法是主回归用一种权重,稳健性检验换另一种,两种都报告,结论一致才踏实。
2.3 LM检验与模型选择:给审稿人一个交代
LM检验分四个:LM-lag、LM-error、Robust LM-lag、Robust LM-error。经典判据是Anselin那套:先看两个非稳健LM,哪个显著选哪个;如果都显著,再看两个稳健版本,稳健LM-lag显著选SAR,稳健LM-error显著选SEM。
* 用spregress做LM检验(需先设定空间权重) spregress y x1 x2, gs2sls dvarlag(W) ivarlag(W: x1 x2) estat moran不过说实话,LM检验在SDM语境下有点尴尬——它本质是帮你在SAR和SEM之间二选一,而SDM是"两个都要"。所以更贴合SDM流程的做法是:先估计SDM,再用LR检验看WX项是否联合为零(能否退化为SAR),以及看WY项是否为零(能否退化为SEM)。两个约束都不被拒绝,才说明SDM是合适的。
* 估计SDM xsmle y x1 x2, wmat(W) model(sdm) fe type(both) nolog * 检验WX项是否联合为零(退化为SAR) test [Wx]x1 [Wx]x2提示:LR检验需要嵌套模型,
xsmle估计后可以用lrtest对比SDM与SAR、SDM与SEM。记得保存两次估计结果。
2.4 固定效应还是随机效应
面板SDM同样面临FE和RE的选择。Hausman检验是标准做法,但空间面板下的Hausman实现起来各家命令略有差异。xsmle支持hausman选项直接输出。经验上,区域经济类数据几乎都选固定效应,因为个体效应(比如某地固有的资源禀赋)大概率与解释变量相关,RE的 orthogonality 假设很难成立。
选FE之后还有个小问题:个体固定还是双向固定(个体+时间)。如果样本期较长、存在共同冲击(比如宏观政策周期),双向固定更稳妥。xsmle里用type(both)指定双向。
3. 实操过程与核心环节实现
3.1 数据准备与面板设定
先确保数据是平衡或非平衡面板,地区ID和时间ID齐全。空间权重矩阵的维度必须和截面单位数严格对应,顺序也要一致——这是新手翻车的高发区。矩阵里第3行对应的是地区A,你的面板数据里第3个地区也必须是A,错位一位,结果全废。
* 设定面板 xtset region_id year * 检查面板结构 xtdescribe缺失值处理要格外小心。空间模型对缺失敏感,因为WY项需要邻居的值,邻居缺失会传导。我的习惯是先做完整案例筛选,把关键变量缺失的观测删掉,再构造权重矩阵,确保矩阵维度和清洗后的截面数一致。
3.2 权重矩阵与数据的对齐
这一步我单独拎出来讲,因为踩过太多次坑。假设你有30个省份,权重矩阵是30×30。构造矩阵时,spmat会按它读入的顺序排列。而你的面板数据里,region_id的排序未必和矩阵一致。解决办法是:构造一个"地区-矩阵序号"对照表,用merge把矩阵序号贴到面板数据上,再按序号排序,确保xtset后的截面顺序与矩阵一致。
* 假设W已构造好,导出其行列标签 spmat export W, format(full) replace * 核对标签顺序与数据中的地区编码是否一致如果实在对不齐,一个笨但可靠的办法是:把权重矩阵导出成Excel,手工核对行列标签,再在Stata里用matrix命令重新录入。慢,但不会错。
3.3 SDM估计的完整命令与参数说明
* 主回归:双向固定效应SDM xsmle y x1 x2 x3, wmat(W) model(sdm) fe type(both) nolog * 效应分解(xsmle默认输出,若需单独提取) xsmle y x1 x2 x3, wmat(W) model(sdm) fe type(both) effects nolog参数逐个说:wmat(W)指定权重矩阵;model(sdm)指定模型类型;fe固定效应;type(both)双向;effects要求输出直接、间接、总效应;nolog压掉迭代日志。
估计方法上,xsmle默认用拟极大似然(QML)。样本量不大时QML表现尚可,但如果截面数很少(比如20个以下),可以考虑gs2sls(广义空间两阶段最小二乘)作为稳健性对照。两种方法结论一致,说服力更强。
3.4 效应分解:SDM解读的核心
这是全文最该划重点的地方。SDM的回归系数不能直接解读为边际效应。因为模型里有WY项,一个地区解释变量变动,会通过"本地→邻居→本地"的反馈回路影响自身,也会通过"本地→邻居"影响邻居。所以系数要分解成:
- 直接效应:本地x变动对本地y的平均影响(含反馈回路)
- 间接效应(空间溢出):本地x变动对邻居y的平均影响
- 总效应:两者之和
xsmle的effects选项会直接给出这三组结果。如果没有,可以用nlcom基于系数和W矩阵手工算,但矩阵求逆那步极易出错,强烈建议用命令自带输出。
注意:直接效应不等于原始系数。很多人直接把
xsmle主表里的系数当边际效应写进论文,这是硬伤。审稿人一眼就能看出来。务必报告效应分解表。
效应分解的显著性检验也要报告。xsmle输出的效应表带标准误和p值,直接引用即可。间接效应显著,才谈得上"存在空间溢出",否则只能说"未发现显著溢出"。
3.5 稳健性检验的三板斧
第一板斧:换权重矩阵。邻接换距离,或者距离阈值调一调,看核心结论是否稳定。第二板斧:换估计方法。QML换GS2SLS。第三板斧:缩尾处理。对连续变量做1%或5%缩尾,排除极端值驱动结论的可能。
* 缩尾示例 winsor2 y x1 x2, cuts(1 99) replace * 重新估计 xsmle y x1 x2, wmat(W) model(sdm) fe type(both) nolog三板斧砍完结论还在,基本可以放心写。如果某一板斧下去结论翻了,那要老实交代,并在文中讨论原因,而不是藏起来。
4. 常见问题与排查技巧实录
4.1 报错与不收敛的排查
xsmle最常见的报错是矩阵奇异或不收敛。原因通常有三:权重矩阵有全零行(某个地区没有任何邻居,比如岛屿地区),或者矩阵维度与数据不匹配,或者解释变量存在完全共线。
全零行的处理:要么把该地区从样本中剔除,要么给它人为指定一个最近邻居。我一般选后者,并在文中注明处理方式。矩阵维度不匹配,回到3.2节对齐。共线问题用corr或vif先排查。
不收敛的话,试试调大迭代次数iterate(500),或者换初始值。有时候是数据量级差异太大,先做标准化再估计。
4.2 效应分解结果与主表系数"对不上"
新手常问:为什么直接效应和主表系数不一样?这不是bug,是SDM的数学性质决定的。主表系数是偏效应的一部分,直接效应包含了反馈回路,两者本就不等。只要效应分解表逻辑自洽(直接+间接=总效应),就没问题。
4.3 常见问题速查表
| 问题现象 | 可能原因 | 排查与解决 |
|---|---|---|
| 矩阵奇异报错 | 权重矩阵有全零行 | 检查每行和,剔除或补邻居 |
| 估计不收敛 | 迭代次数不足或量级差异 | 调大iterate,变量标准化 |
| Moran's I不显著 | 权重设定不当或确无聚集 | 换权重矩阵重试,或改用普通面板 |
| 效应分解缺失 | 未加effects选项 | 命令补effects,或手工nlcom |
| 截面顺序错位 | 矩阵与数据排序不一致 | 建对照表merge后重排 |
| Hausman报错 | 样本量小或矩阵问题 | 改用FE并说明理由 |
4.4 几个容易忽略的细节
第一,时间固定效应的加入会改变WY的解读。双向固定下,WY捕捉的是剔除共同时间趋势后的空间依赖,解释时要相应调整措辞。第二,非平衡面板下,权重矩阵仍是截面维度的,不随时间变,这点要在方法部分写清楚。第三,报告结果时,权重矩阵的构造方式、标准化方法、距离阈值(如果用了)必须交代到能让别人复现的程度,这是审稿人必查项。
我在实际带新手的过程中发现,卡住人的往往不是模型本身,而是权重矩阵对齐和效应分解这两步。前者靠细心和对照表,后者靠记住"系数不等于边际效应"这一条铁律。把这两关过了,SDM这条流水线跑起来其实很顺。后续如果要做动态空间面板或者空间门槛模型,也是在这套地基上往上搭,权重矩阵和效应分解的逻辑一脉相承。