ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Stata空间计量模型实证全流程:权重矩阵、模型选择与效应分解

Stata空间计量模型实证全流程:权重矩阵、模型选择与效应分解

做空间计量这几年,被问得最多的一句话是:“我的数据里有地区维度,是不是就该直接上空间模型?”说实话,这句话背后藏着两种极端:一种是把空间计量当成高级玩具,不管三七二十一先跑一个带 W 矩阵的回归,图个“方法先进”;另一种是老老实实跑完 OLS,看到残差里有点空间聚集就开始慌,觉得自己漏了什么。这两种做法都不太对。Stata 空间计量模型实证全过程,本质上是一条从“为什么要引入空间”到“怎么把效应说清楚”的完整推理链,中间的每一步都有它的前置条件和后置影响,跳步基本等于白做。

这篇内容我想拆的是整条实证链条:从权重矩阵怎么构造、空间自相关怎么检验、模型怎么选、命令怎么敲、效应怎么分解,到跑完之后结果不对劲该往哪儿查。适合已经会基本的 Stata 回归、手里有面板或截面地区数据、准备把空间维度加进模型的人看。零基础也能跟,但最好先把regress和xtreg玩熟,不然下面很多细节会卡住。

需要先说明一点:空间计量的门槛不在命令,而在判断。Stata 里跑一个空间滞后模型可能只要一行代码,但“这个 W 矩阵合不合理”“这个 ρ 系数能不能解释成溢出”“固定效应和空间项打架了怎么办”,这些才是真正花时间的地方。下面我按实际做项目的顺序往下走,中间穿插我自己踩过的坑。

1. 空间计量到底在补什么漏洞:从残差的空间聚集说起

1.1 普通回归在地区数据上为什么会失真

先说清楚一件事:空间计量不是为了显得高级,而是因为普通最小二乘在地区数据上经常违反假设。你拿几十个地区、若干年的数据跑regress y x1 x2,绝大多数情况下残差不会是白噪声。相邻地区之间在气候、产业基础、政策环境、交通条件上高度相似,这些没法全部塞进自变量,最后都沉到残差里。残差一聚集,标准误就估小了,t 值虚高,本来不显著的变量变得显著,论文写得漂亮,结论经不起推敲。

更麻烦的是另一层:一个地区的被解释变量本身可能直接受邻居影响。比如相邻地区的人均产出、房价、污染排放,存在实打实的相互带动或者相互挤压。这时候“邻居的 y”本身就是解释变量的一部分,你把它忽略掉,等于把系统性信息扔进了残差,估计量有偏且不一致。这就是空间滞后模型要处理的问题。

所以判断要不要上空间模型,我一般看两个信号:一是残差在地图上有明显的连片分布,Moran's I 检验显著;二是理论上能说清楚“邻居的 y 会影响我的 y”或者“邻居的 x 会影响我的 y”。前者是统计信号,后者是机制信号。两个都占,做空间计量就名正言顺;只有一个,就得谨慎,尤其是只有统计信号没有机制解释的时候,很容易写成“为了用方法而用方法”。

1.2 SAR、SEM、SDM 三种设定各自对应什么现实故事

Stata 里常见的空间设定有三类,名字听着像天书,其实对应三种不同的现实叙事,理解了这个,选模型就不靠背口诀了。

空间自回归模型(SAR,也叫空间滞后模型),形式是 y = ρWy + Xβ + ε。它讲的故事是:我的结果受邻居结果的影响。系数 ρ 衡量这种溢出强度。典型场景是区域间竞争、技术扩散、消费攀比。它的隐含假设是空间依赖只通过 y 传递,x 没有溢出。

空间误差模型(SEM),形式是 y = Xβ + u,u = λWu + ε。它讲的故事不一样:我的结果和邻居的结果看起来相关,但这不是真的相互影响,而是大家共享了一些没被观测到的、空间上聚集的因素。λ 衡量的是这些遗漏因素的传递强度。典型场景是气候带、地形、历史文化圈这类很难量化的共同背景。

空间杜宾模型(SDM),形式是 y = ρWy + Xβ + WXθ + ε。它把两个故事合起来:邻居的 y 影响我,邻居的 x 也影响我。θ 就是邻居自变量对我的影响。这个设定最宽松,也最不容易设定错误,代价是参数多、解释复杂。

实际做的时候有个非常实用的路径:先跑 SDM,然后用似然比检验或者 Wald 检验去检验两个约束——θ = 0(退化成 SAR)和 θ = -ρβ(退化成 SEM)。两个都拒绝,就留在 SDM;拒绝其中一个,就往对应的简化模型走。这个流程比一上来凭感觉选模型靠谱得多,也是审稿人最认的思路。我见过不少人直接跑 SAR,问为什么不检验,答“文献都这么做的”,这种回答在答辩现场基本过不了。

1.3 有个容易被忽略的前提:空间依赖性得有“传导介质”

这一点很少有人在教程里强调。空间计量模型成立,前提是地区之间存在某种可识别的交互通道——地理相邻、贸易往来、通勤联系、信息流动。如果你的样本是一堆地理上八竿子打不着、经济上也没啥往来的单位,硬套一个邻接矩阵,跑出来的 ρ 就算显著也是伪相关。

我遇到过一次典型情况:样本里有些地区是飞地,地理上不挨着任何其他样本单位,邻接矩阵里那一行全是 0。这种“孤岛”样本在行标准化时会出现除以 0 的问题,Stata 通常会报错或者给出奇怪的结果。解决方案要么是把这类样本剔掉,要么改用距离衰减矩阵而不是邻接矩阵。这个细节在动手前就得想清楚,别等跑出结果才发现矩阵里有一行是空的。

2. 空间权重矩阵:整个实证里最容易翻车的一步

2.1 邻接、反距离、经济距离三类矩阵的构造逻辑

权重矩阵 W 是空间计量的地基,它决定了“谁是谁的邻居”。构造方式直接改变结果,甚至改变结论方向。常见的三类:

邻接矩阵(contiguity),两个地区有共同边界就记 1,否则记 0。优点是直观、可解释,缺点是所有邻居一视同仁,隔一条街和隔一千公里没区别。对于行政区划规整的样本(比如地级市、县),这是默认首选。

反距离矩阵(inverse distance),用两地质心距离的倒数或者倒数的平方作为权重,距离越近权重越大。它处理了“邻居强度不一样”的问题,适合那些交互强度随距离衰减明显的场景,比如通勤、物流、污染扩散。缺点是距离的度量方式(质心直线距离 vs 路网距离)会显著影响结果,得在稳健性检验里交代清楚。

经济距离矩阵,用两地经济指标(比如人均 GDP 的倒数差、产业结构相似度)构造权重。它假设“经济上相近的地区交互更强”,适合研究创新扩散、产业转移这类不以地理邻近为前提的现象。争议也最大,因为经济距离和地理距离往往高度相关,审稿人容易质疑内生性。

我的建议是主回归用一种理论上最贴合机制的矩阵,稳健性检验换一到两种其他矩阵重跑。如果结论在三种矩阵下都稳,说服力就上来了;如果换个矩阵符号就变,那要老实交代,别藏。

2.2 行标准化做不做,什么时候做

这个问题我被问过太多次。行标准化的意思是把矩阵每一行除以该行元素之和,让每行权重加起来等于 1。做了之后,Wy 的含义变成“邻居 y 的加权平均”,系数解释起来特别顺;不做的话,Wy 是“邻居 y 的加权和”,系数大小会随邻居数量变化,跨样本比较很麻烦。

大部分情况下我推荐做行标准化,尤其是邻接矩阵。原因很实在:不做标准化时,一个有三五个邻居的地区和一个只有一两个邻居的地区,Wy 的量级差好几倍,ρ 的估计会被邻居多的样本主导,结果不可比。

但有两种情况要注意。第一种是反距离矩阵,做不做标准化都行,因为距离权重本身已经带了强度信息,标准化之后反而把“远近距离的绝对差异”压平了。第二种是当你想保留“邻居数量”这个信息的时候,不做标准化。比如研究“邻居越多溢出越强”,这时候标准化会把邻居数量的效应抹掉。

Stata 15 之后官方命令spmatrix create contiguity默认就带normalize(row),老命令spatwmat用standardize选项。代码层面是这样:

* 新版官方命令(Stata 15+) spmatrix create contiguity W_contig, normalize(row) spmatrix create idistance W_dist, normalize(row) * 老版本用户命令 spatwmat using "W_contig.dta", name(W) standardize

2.3 把 W 落到 Stata 里:矩阵文件、维度核对与常见报错

权重矩阵最常见的报错来源是维度对不上。Stata 的spmatrix要求矩阵的行列顺序和数据里的地区编码严格一致。我的做法是先用一个独立的 do 文件专门生成矩阵,并且把地区编码、地区名称、矩阵行列顺序三者对齐,导出成文本文件留档。

* 生成并检查矩阵 spmatrix create contiguity W_contig, normalize(row) spmatrix summarize W_contig spmatrix export W_contig using "W_contig.txt", replace * 检查是否有孤立点(某行权重全为0) matrix list e(W_contig) // 或者用 mata 逐行检查

spmatrix summarize会给出矩阵的维度、非零元素个数、每行最小最大权重等。如果发现某行的最大权重是 0,基本就是孤立点,得回去处理。另外,行标准化之后再去看矩阵,每行非零元素的权重应该相等(邻接矩阵情形),如果不等,说明标准化没成功。

还有一个坑:如果你的数据里有地区在样本期内撤并或者新增,导致不同年份的矩阵不一样,那就得按年份分别构造矩阵,工作量会大很多。这种情况我一般建议先用平衡面板做基准回归,把样本期调整一致,别一上来就啃非平衡的硬骨头。

3. 空间自相关检验:先证明“这活儿值得干”

3.1 全局 Moran's I 的算法与实际判读

Moran's I 是检验空间自相关最常用的指标,公式是:

I = (n / S₀) × [Σᵢ Σⱼ wᵢⱼ(xᵢ - x̄)(xⱼ - x̄)] / [Σᵢ(xᵢ - x̄)²]

其中 n 是地区数,S₀ 是所有权重之和,wᵢⱼ 是矩阵元素。直觉上它就是在算“邻居的值和我自己的值的协方差”相对于“总体方差”的比例。取值范围大约在 -1 到 1 之间,正值表示高值与高值、低值与低值聚集,负值表示高低交错,接近 0 就是随机分布。

Stata 里跑:

* 新版 estat moran // 在 spregress 之后可用 * 老版用户命令 spatgsa y, weights(W) moran

判读的时候别只看 p 值。我见过 I 只有 0.08、p 值 0.03 就被拿来说“存在显著空间自相关”,这种弱相关在实际解释上基本没意义。经验上,I 在 0.3 以上才算有点分量,0.5 以上就比较明显了。当然这跟样本的空间尺度有关,省级数据通常比县级数据的 I 大,因为省级单位内部差异被平均掉了。

还有个细节:Moran's I 对权重矩阵的选择很敏感。换个矩阵 I 变一大截是正常的,别把它当成一个绝对真理。我在报告里一般会把主矩阵和备选矩阵的 I 都列出来,让读者自己判断。

3.2 局部 LISA 图能告诉你全局指标看不到的东西

全局 Moran's I 只能告诉你整体上有没有聚集,看不出聚集在哪里、是什么类型。比如一个省里有三个高值聚集区、两个低值洼地,全局指标可能互相抵消,看着像没聚集。这时候就得看局部指标。

LISA(局部空间关联指标)把每个地区分成四类:高-高(自身高、邻居也高)、低-低(自身低、邻居也低)、高-低(自身高、邻居低,即离群点)、低-高(自身低、邻居高)。前两类是聚集,后两类是异常。

spatlsa y, weights(W) moran graph(moran) // 老命令

这一步的实战价值在于:它帮你发现离群点。如果某个地区是显著的高-低点,说明它和周围环境格格不入,这种样本在回归里往往是强影响点,可能把系数拉偏。我一般会把这些点单独标记出来,跑一次剔除后的稳健性回归,看看结论有没有变。这比笼统地说“做了稳健性检验”实在得多。

3.3 LM 检验三个版本的结果怎么对应到模型选择

Moran's I 证明“有空间自相关”,但没告诉你是滞后型还是误差型。这一步靠拉格朗日乘数(LM)检验,Stata 在 OLS 之后用spatdiag输出四个统计量:LM-lag、Robust LM-lag、LM-error、Robust LM-error。

判读逻辑我整理成一张表,实际操作时对着看就行:

检验结果组合模型选择建议
LM-lag 显著,LM-error 不显著选 SAR
LM-error 显著,LM-lag 不显著选 SEM
两者都显著,Robust LM-lag 更显著选 SAR
两者都显著,Robust LM-error 更显著选 SEM
四个都显著考虑 SDM,再用 LR/Wald 检验简化
regress y x1 x2 spatdiag, weights(W) // 老版本写法

这里有个坑要提前说:spatdiag对样本量和矩阵维度要求很严,如果报错说矩阵维度不匹配,八成是 W 是在另一个数据集里生成的,行的地区顺序和你当前数据不一致。解决办法是先spatwmat从同一份数据的地区列表生成矩阵,或者在导入矩阵后手动做order对齐。

另外一个经验:LM 检验是基于 OLS 残差做的,如果 OLS 本身就存在严重的异方差或者遗漏变量,LM 检验的结论会失真。所以我一般会在 OLS 阶段跑一下estat imtest, white和 Ramsey 检验,确认基本设定没大问题,再看 LM 结果。省得后面用空间模型去掩盖一个本来该用非线性或者加变量的设定错误。

4. 估计命令与参数取舍:截面和面板是两套打法

4.1 截面数据:spregress 一行命令背后的选项含义

截面数据相对简单,Stata 15 之后官方spregress覆盖了 SAR、SEM、SDM 和 SAC 四种设定,靠dvarlag()、errorlag()、ivarlag()三个选项组合控制。

* SAR spregress y x1 x2, gs2(W_contig) ml * SEM spregress y x1 x2, gs2(W_contig) ml errorlag(W_contig) * SDM spregress y x1 x2, gs2(W_contig) ml dvarlag(W_contig) ivarlag(W_contig)

ml是极大似然估计,还有个gs2是广义空间两阶段最小二乘(GS2SLS),两者在大多数情况下结论接近,ML 效率高一点但对分布假设更敏感。我一般主用 ML,遇到收敛问题或者残差明显非正态时切到 GS2SLS 对比一下。

ivarlag(W)这个选项容易搞混,它表示把 WX 作为工具变量处理,跟dvarlag结合就是 SDM。写的时候注意ivarlag(W_contig)后面不加变量名,表示所有解释变量都加空间滞后;如果只想让某几个变量有滞后项,写成ivarlag(W_contig: x1 x2)。这个细节不注意会跑出完全不同的模型。

4.2 面板数据:xsmle 和 spxtregress 该怎么选

面板是主流场景,但 Stata 官方和用户命令分成两派,很多人卡在这儿。

spxtregress是 Stata 15 之后官方面板命令,支持固定效应和随机效应,语法和spregress一脉相承:

xtset region_id year spxtregress y x1 x2, fe dvarlag(W_contig) estat impact

它底层用的是 ML,支持dvarlag、errorlag、ivarlag的多种组合。缺点是它只支持平衡面板,数据里一旦有缺失导致的非平衡,直接报错。

xsmle是用户贡献的命令,功能更全,支持非平衡面板、支持双向固定效应(个体 + 时间),语法稍复杂:

xsmle y x1 x2, wmat(W_contig) model(sdm) fe type(both) nolog estat impact

model()里可以填sar、sem、sdm、sac,type()里ind是个体固定、time是时间固定、both是双向。这个命令的灵活性是我一直用它的原因,尤其是要加时间固定效应的时候,官方命令得绕一圈,xsmle一个选项搞定。

两者结果的差异一般不大,但如果差得多,多半是固定效应的处理方式不一样。spxtregress, fe在去均值的时候对空间滞后项的处理有一套专门流程,而xsmle的实现细节不同。做稳健性的时候把两个命令都跑一遍,结果一致就放心了。

4.3 固定效应和空间滞后项为什么会“打架”

这是个理论上的老问题。固定效应模型靠组内去均值消除个体异质性,但 Wy 这一项去均值之后,Wiȳ 里的 ȳ 已经被去均值了,和原来的 Wy 不再等价。换句话说,去均值破坏了空间滞后项的结构。这就是所谓的“incidental parameter problem”在空间面板里的表现。

实践中表现为:加了固定效应之后,ρ 的估计值明显变小甚至不显著,跟随机效应的结果差很远。遇到这种情况,别急着下结论说“空间溢出在控制个体异质性后消失了”,先想想是不是估计方法的问题。

我的处理思路有三条,按优先级排:一是用xsmle的type(both)加双向固定效应,看看结果稳不稳;二是换spxtregress, fe交叉验证;三是如果样本时间维度够长(T 大于 15 左右),可以尝试偏差校正的方法,不过这个对一般应用者来说太复杂,用前两条基本能判断出结论的稳健性。

还有一个常被忽略的问题:随机效应模型在空间面板里假设个体效应与解释变量不相关,这个假设比普通面板更苛刻。Hausman 检验在xsmle之后可以跑,如果拒绝随机效应,就老老实实用固定效应,别硬撑。

5. 效应分解:空间计量真正值钱也最容易写错的部分

5.1 直接效应、间接效应和总效应的数学来源

普通回归里,系数 β 就是 x 对 y 的边际影响。但在空间模型里,这个解释失效了。拿 SAR 来说,y = ρWy + Xβ + ε,稍微推一下得到 y = (I - ρW)⁻¹Xβ + (I - ρW)⁻¹ε。对 xₖ 求偏导,得到的是一个矩阵:

∂y/∂xₖ = (I - ρW)⁻¹ βₖ

这个矩阵的对角线元素是各地区自身 x 对自身 y 的影响,也就是直接效应;非对角线元素是本地区 x 对别的地区 y 的影响,也就是间接效应(空间溢出)。实际报告的时候通常取对角线元素的平均值作为直接效应,非对角元素的平均值(按行或按列求和再平均)作为间接效应,两者相加就是总效应。

SDM 的公式更复杂一点:

∂y/∂xₖ = (I - ρW)⁻¹ (βₖI + θₖW)

这里多了一项 θₖW,表示邻居的 x 对自身的影响。分解的时候同样取对角和非对角。

关键点在于:直接效应不等于 βₖ。因为有反馈回路——我的 x 影响邻居的 y,邻居的 y 又反过来影响我的 y。这个反馈在 ρ 不为零时一定存在。很多人写论文直接把 βₖ 当直接效应报,是错误的,审稿人一眼就能看出来。

5.2 用 estat impact 拿到分解结果,以及它的置信区间

Stata 在spregress、spxtregress、xsmle之后都支持estat impact:

spregress y x1 x2, gs2(W_contig) ml dvarlag(W_contig) ivarlag(W_contig) estat impact * 如果想让标准误更稳健,可以加模拟或 delta 方法选项 estat impact, simulation(1000)

输出的表分三列:Direct、Indirect、Total,每列都有系数、标准误、z 值和置信区间。simulation()选项用蒙特卡洛模拟计算标准误,比默认的 delta 方法在非线性变换下更稳。

这里有一个必须提醒的问题:estat impact在xsmle之后的输出格式和官方命令略有差异,而且早期版本的xsmle对双向固定效应的效应分解支持不太好,报错或者结果异常是常事。我的做法是先用xsmle跑出模型系数看显著性,效应分解单独用spxtregress或者spregress做一遍交叉验证。如果两边结果差太多,就得回去检查是不是 W 矩阵的行顺序不对,或者模型设定有出入。

5.3 溢出效应的显著性怎么解释才不被人挑刺

estat impact给出间接效应的显著性,但很多人不会解释。间接效应显著为正,说明“本地区 x 提高会带动邻居的 y 提高”;显著为负,说明“存在虹吸效应,本地区 x 提高会挤压邻居的 y”。这两种解释在政策含义上完全相反,写的时候一定要说清楚方向。

还有一个坑:间接效应是“所有邻居影响的平均值”,它掩盖了邻居之间的异质性。如果某个地区只有一个邻居,另一个地区有八个邻居,平均下来的间接效应没法反映这种差异。如果想做得细一点,可以手动计算每个地区收到的溢出,然后按经济区域分组汇报。这个工作量大,但做出来文章质量会上一个档次。

最后提醒一句:间接效应的数值经常比直接效应还大,这不一定说明溢出很强,可能是 (I - ρW)⁻¹ 在 ρ 接近 1 时的放大效应。如果 ρ 估计值超过 0.8,就要警惕了,这时候矩阵求逆的数值稳定性下降,效应分解的结果可能不可靠。我的经验线是 ρ 超过 0.85 就回头检查模型设定,看看是不是遗漏了重要的解释变量。

6. 走完一整条实证链:从数据到结果的推进顺序

6.1 数据准备阶段我固定做的四件事

第一件事是确认地区编码的唯一性和一致性。矩阵的构造依赖地区编码,一旦编码在不同年份有变化(比如某地撤县设区),矩阵就会错位。我会先用duplicates report region_id year和tab region_id if year==2010对照检查。

第二件事是检查面板平衡性。xtdescribe看每个地区的时间覆盖情况。如果非平衡严重(比如超过 20% 的样本缺失),考虑先做平衡化处理,或者改用xsmle而不是spxtregress。

第三件事是变量的量纲处理。空间模型对量纲很敏感,尤其是 (I - ρW)⁻¹ 求逆时,如果变量数值特别大或者特别小,数值精度会出问题。我习惯把连续变量做标准化或者取对数,让系数落在合理范围。

第四件事是准备至少两套权重矩阵文件,一套行标准化,一套不标准化,方便后面做对比。文件统一命名,加上生成日期,避免版本混乱。

6.2 从 OLS 到 SDM 的逐步推进模板

我常用的推进顺序是这样的,每一步都保留结果,方便后面回头看:

* 第一步:基准 OLS,看基础关系 regress y x1 x2, robust estat imtest, white * 第二步:空间自相关诊断 spatdiag, weights(W_contig) * 第三步:全局与局部自相关 spatgsa y, weights(W_contig) moran spatgsa y, weights(W_contig) geary * 第四步:空间面板估计 xtset region_id year xsmle y x1 x2, wmat(W_contig) model(sdm) fe type(both) nolog * 第五步:模型简化检验 * 检验 theta=0(SDM 退化为 SAR) test [Wx]x1 = 0 test [Wx]x2 = 0 * 第六步:效应分解 estat impact

这个顺序的好处是每一步都有明确的检验对象。OLS 建立基线,诊断决定要不要做空间,SDM 建立最宽松的模型,检验决定能不能简化。如果 SDM 的 WX 项整体不显著,就退到 SAR;如果 ρ 不显著而 λ 显著,就退到 SEM。

6.3 稳健性检验的三个必做方向

方向一:换权重矩阵。邻接、反距离、经济距离各跑一遍,看核心变量的效应方向和显著性有没有变。这个是最基本的要求。

方向二:换估计方法。ML 和 GS2SLS 各跑一遍,固定效应和随机效应各跑一遍。如果结果差很多,说明模型对方法敏感,得在文章里老实交代。

方向三:剔除强影响点。把 LISA 图里识别出的离群点剔除后重跑,看结论稳不稳。这一步很多人不做,但真做了经常能发现结论其实是被几个特殊地区撑起来的。

7. 跑不出结果时往哪儿查:几个高频报错的实际排查路径

7.1 矩阵维度不匹配和孤立点的处理

报错信息通常是matrix dimension does not match或者W has rows with all zeros。前者是 W 的行数或行顺序和数据不一致,后者是矩阵里有孤立点。

排查路径:先spmatrix summarize W_contig,看维度是不是等于样本里的地区数;再用tab region_id输出地区列表,和矩阵文件的地区顺序逐行对照。孤立点的问题可以在老命令里用spatwmat的eigenval选项检查,或者直接用 Mata 遍历每一行求和。

修复办法:如果只是顺序问题,重新生成矩阵即可;如果是孤立点,考虑改用反距离矩阵(距离再远也有非零权重),或者把孤立样本从数据里剔除并说明原因。

7.2 面板非平衡导致的估计失败

spxtregress报panel data must be balanced是高频问题。解决办法有两个:一是用xsmle代替,它支持非平衡;二是手动平衡化,用xtbalance或者keep if逻辑筛掉缺失严重的地区。

非平衡化处理会影响结果,因为空间溢出依赖邻居的完整性。如果某个地区某一年缺失,它和邻居之间的溢出关系就断了。我一般会在文章里报告平衡和非平衡两套结果,作为稳健性的一部分。

7.3 收敛失败与 ρ 异常值的诊断思路

收敛失败的表现是迭代超过上限、报convergence not achieved,或者 ρ 估计值跑到 ±1 之外。后一种情况说明模型设定有问题,因为 ρ 的理论范围是 (-1, 1)。

常见原因有三个:一是 W 矩阵没有行标准化,导致 ρ 的取值范围理论上可以超过 1;二是模型里遗漏了关键解释变量,ρ 在强行吸收残差里的空间结构;三是样本量太小、空间单元太少,ML 估计不稳定。

处理方式:先做行标准化再重跑;再用ml maximize, iterate(100)提高迭代上限;还不行的话,简化模型(先把 SDM 退到 SAR),看看是不是 WX 项太多导致参数空间过大。

提示:如果 ρ 稳定在 0.9 以上,不要高兴太早,这不一定是“溢出很强”,很可能是模型设定错误的信号。回去检查是不是漏了变量,或者 W 矩阵的尺度不合适。

7.4 效应分解结果和系数符号不一致怎么办

这种情况经常发生:β 显著为正,但estat impact的直接效应显著为负。乍看像 bug,其实是数学上的正常现象。直接效应里包含了反馈回路的影响,当 ρ 为负或者 (I - ρW)⁻¹ 的非对角元素有正有负时,反馈可能抵消甚至反转原始系数。

遇到这种情况不要慌,先手算一下:取一个简单的 3×3 矩阵,手工算一次 (I - ρW)⁻¹β,看看能不能复现 Stata 的结果。如果手算对得上,说明是模型的正常表现,解释的时候要专门说明反馈机制;如果对不上,再回去查矩阵的行顺序和数据对齐。

我个人的经验是,只要 ρ 和 β 的估计是稳的,效应分解出了问题九成出在矩阵的标准化方式或者行顺序上,尤其是从外部导入矩阵的时候,Stata 不会自动帮你对齐地区编码,这个坑几乎每个新手都会踩一次。


最后分享一个我做了很多遍才养成的小习惯:每次跑完主回归,把 W 矩阵、do 文件、结果日志三样东西打包存一个文件夹,命名带上日期和模型版本。空间计量的复现成本比普通回归高得多,隔一个月回头看,你大概率记不住当时用的是哪套矩阵、哪个命令。留档这件事看着笨,但真能省下大量返工时间。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进