
从CSDN那篇提问帖到现在的十几篇论文我见过太多人在空间面板模型这堵墙上撞得头破血流。明明普通面板跑得飞起一加上空间两个字就各种报错、结果诡异、显著性全部消失。这问题我太熟了这两年帮人改过不少这类实证分析今天把Stata里空间面板数据模型的完整实现路径一次性说清楚从权重矩阵构造到模型选择再到结果解读每一步该做什么、为什么要这么做、哪些坑绝对不能踩全部摊开讲。1. 空间面板模型解决什么问题从普通面板到空间面板的思维跃迁1.1 普通面板模型忽略的空间依赖陷阱先说一个最容易被忽视的问题为什么你的普通面板回归结果总被人质疑内生性很多时候问题不在变量选取而在模型设定。普通的固定效应或随机效应模型隐含假设是各省份之间、各城市之间、各企业之间是完全独立的。但这个假设在经济地理数据里几乎不成立。隔壁省份的环保政策会影响本省的产业转移长三角某市的房价会传导到周边城市某地区的基础设施投资会通过溢出效应带动邻近地区产出——这些空间交互如果存在却不处理误差项就会空间自相关标准误被低估显著性被高估结论的可靠性直接崩盘。空间面板模型的核心价值就是把这种邻居效应显式地放进模型结构里。这不是锦上添花的进阶操作而是面对区域数据、宏观经济数据、房地产数据等强空间关联场景时的刚需。我自己常用的判断方法是如果你的样本单位是省、市、县这类地理单元而且研究主题涉及政策评估、要素流动、产业集聚、环境规制那么不做空间面板检验就直接下结论十有八九会被审稿人追问。1.2 三类核心空间模型SAR、SEM和SDM到底什么区别空间面板模型家族庞大但95%的应用场景绕不开下面这三个空间滞后模型SAR/SLM把被解释变量的空间滞后项 WY 放入回归方程刻画的是邻居的Y如何影响本地的Y。适合研究竞争效应、传染效应、示范效应。比如研究地方政府竞争下的财政支出决策某省提高支出邻省也会跟进。空间误差模型SEM把空间结构放进误差项刻画的是不可观测的冲击具有空间传导性。适合处理遗漏变量存在空间相关、测量误差空间溢出等情形。比如研究土地出让价格遗漏的地质条件、历史文化禀赋往往存在空间聚集就适合用SEM。空间杜宾模型SDM同时包含 WY 和 WX即邻居的X也会影响本地的Y。这是目前推荐度最高的起点模型因为它不设先验约束SAR和SEM其实都是SDM的特例。做实证时我会建议先跑SDM再用LR检验判断能否退化成SAR或SEM而不是一上来就拍脑袋选模型。除此之外还有动态空间面板加入被解释变量的时间滞后项、空间面板Tobit、空间面板Logit等扩展形式但这些不是主流真正的核心是先把静态三兄弟搞清楚。2. Stata环境准备与数据预处理版本选择、命令安装与数据整理规范2.1 版本兼容性与必备外部命令Stata空间计量实操里最基础也最关键的问题是命令生态。Stata 17及以上版本内置了空间计量命令组包括spmatrix、spset、spregress、spxtregress不需要额外安装外部命令而且后续绘图、权重矩阵可视化都有配套工具。如果你还在用Stata 15或16也不是不能做但需要安装第三方命令最常用的有ssc install splagvar // 生成空间滞后变量旧版本常用 ssc install moran // 莫兰指数计算 ssc install xsmle // 空间面板最大似然估计 ssc install xsmle2 // xsmle的更新版 ssc install spatgsa // 全局空间自相关检验 ssc install spatwmat // 权重矩阵生成辅助需要明确一点xsmle这套命令在Stata 17之后依然能用而且部分场景下甚至比官方spxtregress更灵活比如更方便提取直接效应和间接效应。但我个人建议新用户直接学官方命令体系spmatrixspxtregress原因有三个官方命令的报错机制更友好、可视化支持更好、不需要担心第三方命令更新停滞的问题。研究生产率溢出、区域经济收敛这类问题用老命令做出来发了很多好文章不是说不能用只是新用户上手成本高。2.2 面板数据结构的强制性规范空间面板对数据结构的洁癖程度远高于普通面板。普通面板哪怕ID和年份排列有点乱xtreg也能跑空间面板不行spxtregress对数据排序和唯一性极其敏感。实操中我遇到过至少三个真实案例都是因为下面这些问题导致命令直接报错或结果莫名其妙第一面板ID必须使用数值型变量字符串形式的省份代码必须先encode转为数值型。第二每个ID, year组合必须唯一不能有重复观测。第三数据必须按ID和time排序且中间无断档否则空间权重矩阵和样本无法匹配。第四截面个体在样本期内的空间位置必须不变即你用2020年的经纬度去匹配2010年的面板数据直接把2010年的样本污染了这种错误在省级数据里不常见但用到区县数据时经常发生行政区划调整会导致ID变动。正式建模之前我强烈建议先跑一句xtset id year xtdescribextdescribe输出结果里必须显示strongly balanced或者至少没有大的断档。如果你的数据是平衡面板一切好说如果不平衡需要确认每个截面单元至少有两期以上的观测否则后面的空间固定效应估计会崩。别嫌这一步繁琐我见过太多人在这一步偷懒最后权重矩阵标准化时被 Stata 一句weights not positive卡死重新整理数据浪费了半天。2.3 空间权重矩阵的数据格式要求Stata官方命令要求权重矩阵以spmatrix对象形式存在可以通过三种方式创建直接创建邻接矩阵、从外部文件导入、从距离数据生成。外部文件导入时矩阵行列顺序必须完全对应面板数据中截面单位顺序矩阵的行列名建议直接命名为ID变量的取值。这个对应关系是最大的坑——很多人从GeoDa里导出权重矩阵没注意样本顺序已经被GeoDa按自己的ID排过一遍结果Stata这边按自己的ID排两边顺序对不上最终算出来的莫兰指数和空间回归系数全是错的。3. 空间权重矩阵的构造这一步做不好后面全白搭3.1 三种常用权重矩阵的选择逻辑空间权重矩阵 W 是整个空间计量模型的灵魂W 设定错了后面所有结果都是错的。这个矩阵的每个元素 w_ij 表示单元j对单元i的交互强度自己和自己不产生空间交互所以对角元一律为0。矩阵类型的选择不是哪个高级用哪个而是哪个符合你的研究机制邻接矩阵Contiguityw_ij 1 表示i和j有共同边界否则为0。优点是简洁、解释直观、对边界依赖性强缺点是会把距离近但不接壤的单元隔海相望、隔河相望也算作无交互经济意义上可能存在偏误。最典型的例子是研究长三角城市群上海和南通并不直接接壤隔长江口但两地经济联系极为密切纯邻接矩阵会低估这种联系。距离倒数矩阵Inverse Distancew_ij 1/d_ijd_ij 为两地之间距离可用质心经纬度计算。优点是没有一刀切的断点符合距离衰减规律缺点是距离度量标准直线距离 vs 通行时间需要论证而且如果样本范围很大会导致所有单元都高度相关。经济距离矩阵Economic Distance用GDP差额倒数、贸易流强度、人口流动规模等经济指标作为权重。优点是与研究机制高度契合比如研究FDI技术溢出时用双边投资强度做权重再合理不过缺点是被质疑先验性——如果权重本身是内生的那么空间回归结果也会被质疑。我一直坚持的方法是主回归用邻接矩阵或地理距离矩阵外生性最强、最好辩护稳健性检验换经济距离矩阵和其他距离阈值矩阵。审稿人最反感的是你只报一个矩阵的结果这会让空间计量的结论显得极其脆弱。至少报两个矩阵才能说明你的结果不是权重矩阵设定巧合。3.2 Stata主推的矩阵生成方式spmatrix在Stata 17后spmatrix的使用方式十分简洁核心是先spset声明地理信息* 假设数据里有经度变量 lon 和纬度变量 lat spset id coord(longitude lon latitude lat) modify replace * 创建基于边界的邻接矩阵需要先有shp文件或通过spmap工具构建 spmatrix create contiguity Wc * 创建距离倒数矩阵 spmatrix create idistance Wd * 查看矩阵基本信息 spmatrix summarize Wc spmatrix summarize Wd * 矩阵标准化行标准化保证每行和为1 spmatrix normalize Wc, normalize(row)spmatrix create contiguity一定要确认你的spset已经设定了坐标系统。如果你的数据里没有经纬度但有地理编码如行政区划代码也可以基于shapefile构建空间关系先spset的gpset模块结合shp文件再创建邻接矩阵。但实际经验是直接给经纬度 idistance最灵活省事。还有一个容易踩的细节权重矩阵必须在模型估计之前就完成标准化。spmatrix normalize的row选项表示按行标准化即每个元素除以所在行元素之和。为什么要行标准化因为这样空间滞后项 WY 就成了邻居Y的加权平均参数的解释就变成了邻居平均变化一个单位对本地的效应比较直观。如果不做标准化WY的值取决于每个单元的邻居数量参数解释会很拧巴。3.3 自建权重矩阵并在Stata中使用如果你的权重矩阵构建逻辑比较复杂比如网络分析、贸易矩阵无法直接通过上面指令生成也可以自己准备一个n × n的Excel或CSV矩阵文件然后用命令导入* 先通过import excel或import delimited读入矩阵 import excel wmatrix.xlsx, sheet(Sheet1) firstrow clear * 声明变量名和行名注意顺序 mkmat v1-v50, matrix(Wraw) * 把矩阵存入空间矩阵对象 spmatrix frommatrix W Wraw, replace spmatrix summarize W这里有个坑spmatrix frommatrix要求矩阵的列顺序和数据中截面单位的顺序严格一致。如果ID是省份代码矩阵第一行第一列必须对应代码最小的那个省而不是Excel里你随手排的顺序。我会在读入前先执行sort id并且用spmatrix summarize W输出矩阵对角元是否为0、行和是否为1来反向验证矩阵读入是否正确。4. 从检验到选型的完整决策链LM、LR与Hausman怎么配合用4.1 第一步空间自相关性检验Morans I 怎么读建模前必须先回答一个问题数据里到底有没有空间效应没有的话老老实实跑普通面板就好没必要硬上空间模型。最常用的指标是莫兰指数Morans I。全局莫兰指数的取值范围理论上接近 [-1, 1]显著为正表示高值和高值相邻正向空间自相关显著为负表示高值和低值相邻负向空间自相关接近0则表示随机分布。Stata里要算面板数据的莫兰指数多数人用这种两步走方式* 先估计一个不带空间项的普通面板模型 xtreg y x1 x2 x3 fe * 提取残差 predict e, e * 加载权重矩阵对象 spmatrix summarize Wd * 官方不支持直接对残差算moran这里用全局莫兰指数外部命令 ssc install moran moran e, weight(Wd) // 变量e与权重矩阵行数要一致需要提醒的是如果直接算莫兰指数的命令处理不了面板结构可以分年度逐年计算莫兰指数观察各年度的空间自相关是否稳定显著。这里推荐一个简便做法先把面板数据拆分成年份截面逐年用moran或者spatgsa命令计算全局莫兰指数。检验原假设通常是无空间自相关。拒绝原假设p 0.05说明数据存在显著的空间效应可以考虑空间面板模型。不过Morans I也有局限——它能检测是否有空间自相关但不能确定是应该用空间滞后还是空间误差形式这就要用到LM检验。4.2 第二步LM检验决定SAR还是SEM空间依赖可能通过两种渠道进入模型一种是被解释变量本身的溢出用SAR解决另一种是误差项的空间相关用SEM解决。怎么选经典做法是Anselin提出的LM检验框架。Stata里的实现通常是基于非空间模型残差构造LM统计量。操作流程* 先估计普通面板模型 xtreg y x1 x2 x3, fe predict e, e * 构造残差的空间滞后 spmatrix create idistance Wd estat moran // 官方可能不支持 * 使用外部命令逐步检验 lmspatial, weight(Wd) // 需要安装 lmspatial官网已有regress后执行estat moran等命令但对于面板更通用的是用xsmle前自带的检验或直接使用sppostestimation* 如果已经估计了SDM或SAR模型 spxtregress y x1 x2 x3, fe estat lmestat lm会输出多种LM统计量LM-Lag、LM-Error、稳健LM-Lag、稳健LM-Error。决策逻辑如下如果LM-Lag显著、LM-Error不显著选SAR如果LM-Error显著、LM-Lag不显著选SEM如果两者都显著看稳健形式哪边稳健LM更显著选哪边如果两者都不显著本质上没有足够证据用空间模型回到普通面板这一层选择不是终点因为SDM可能才是更好的起点。LM检验能帮你在SAR和SEM之间区分但SDM的适用性需要另外用LR或Wald检验来判断。4.3 第三步固定效应还是随机效应面板模型绕不开Hausman检验。空间面板和普通面板在这里逻辑一致但Stata的实现方式略有差异。如果你用spxtregress固定效应是默认支持的* 固定效应空间滞后模型 spxtregress y x1 x2 x3, fe lag(Wd) estat hausman // 空间面板的豪斯曼检验如果用的是xsmle操作稍复杂一点需要估计固定效应模型和随机效应模型然后手动对比* 固定效应SDM xsmle y x1 x2 x3, wmat(Wd) model(sdm) fe type(ind) nolog est store fe_sdm * 随机效应SDM xsmle y x1 x2 x3, wmat(Wd) model(sdm) re type(ind) nolog est store re_sdm * Hausman检验 hausman fe_sdm re_sdmHausman检验的原假设是随机效应模型更有效率且一致如果p值小于0.05拒绝原假设应该用固定效应。但有个实战中常见的坑有时候Hausman检验得出负值或报错这通常是因为两个模型的方差矩阵差异不是正定矩阵。这时不要慌换用hausman fe, alleqs或者直接用xtoverid命令做过度识别检验也能得到类似结论。实际应用里如果你的样本覆盖了全国所有省份总体本身就是研究的全部对象固定效应是更自然的选择不需要过度纠结检验结果。4.4 第四步SDM是否会退化成SAR或SEMSDM是最安全的起点但如果你发现空间杜宾模型可以简化成SAR或SEM就应该选择更精简的模型因为浪费自由度会降低估计效率。检验方法用LR检验似然比检验。在Stata中可以这样操作* 估计SDM固定效应模型 xsmle y x1 x2 x3, wmat(Wd) model(sdm) fe type(ind) nolog est store sdm_fe * 估计SAR固定效应模型 xsmle y x1 x2 x3, wmat(Wd) model(sar) fe type(ind) nolog est store sar_fe * 估计SEM固定效应模型 xsmle y x1 x2 x3, wmat(Wd) model(sem) fe type(ind) nolog est store sem_fe * LR检验 H0: SDM可以退化为SAR lrtest sdm_fe sar_fe * LR检验 H0: SDM可以退化为SEM lrtest sdm_fe sem_fe如果两个LR检验都被拒绝p 0.05说明空间自变量的效应确实存在SDM不能被简化。如果SAR简化形式不能被拒绝说明没有空间自变量的需求用SAR就够同理SEM简化形式不能被拒绝用SEM就够。两个都不能被拒绝时优先选SAR或SEM中拟合优度更高的一方后续用BIC进行比较也行。关于选型顺序我有一条实操经验不要一上来就直接放SAR或SEM的结论。完整的实证过程应该是Morans I → LM/稳健LM → 确定SAR或SEM方向 → 跑SDM做LR检验 → 用Hausman选择固定随机 → 根据检验结果锁定最终模型 → 做一系列稳健性检验换矩阵、换估计方法、动态面板。虽然这个过程会多跑不少回归但最终模型经得起审稿人的追问。5. 动态空间面板模型与效应分解进阶但必须掌握的核武器5.1 动态空间面板模型stata指令与设定如果研究问题是过去的Y是否会影响现在的Y如经济增长收敛、环境库兹涅茨曲线那么需要用动态空间面板模型。动态空间面板在静态模型基础上加入被解释变量的时间滞后项有时还加入 WY 的时间滞后项形式是y_it τ y_i,t-1 ρ W y_it η W y_i,t-1 x_it β W x_it θ α_i γ_t ε_it这个模型的Stata实现没有直接的内置命令但可以用官方spxtregress的扩展方式或者借助广义矩估计方法。比较尴尬的是xsmle不支持动态项但有两类常用替代方案方案一先把 y 的时间滞后项用L.y生成然后作为普通自变量放入spxtregress或xsmle中。这种方法严格来说不是完整的动态空间面板忽略了 W y_i,t-1但作为初步试探可以接受。方案二用xtabond2Arellano-Bond差分GMM或xtdpdsys系统GMM配合空间滞后变量手动构造矩条件。这意味着你需要手动生成W*y的空间滞后再放进 GMM 框架。操作复杂但结果更稳健。实操中生成空间滞后项的方法* 生成非滞后的空间滞后 spmatrix create idistance Wd spset id coord(longitude lon latitude lat) generate Wy . * 对每一个年份单独计算空间滞后 forvalues t 2010/2020 { spxtregress y if year t, lag(Wd) // 不适合直接算滞后 }其实标准做法是通过spmatrix生成空间滞后变量再配合L.spmatrix create idistance Wd spmatrix dir // 查看已有矩阵 * 生成空间滞后变量针对被解释变量 spgenerate Wy Wd * y * 生成时间滞后和空间时间滞后 gen L_y L.y gen L_Wy L.Wy不过上面的spgenerate需要特定版本支持。如果不支持可以手动用矩阵乘法运算先mkmat展开变量矩阵计算后再collapse回来相对繁琐但其逻辑很直白。5.2 空间效应分解直接效应、间接效应与总效应跑完模型很多人就直接报系数了。但空间模型的系数解释和普通面板完全不同。在非空间模型中x 的系数 β 就是边际效应但在空间模型中因为存在反馈效应feedback loopsx_it 的变化不仅直接影响 y_it还通过空间乘数矩阵 (I - ρW)^(-1) 传导到其他地区其他地区的变化又反过来影响本地。Stata里分解直接效应和间接效应的命令* 若使用 xsmle 估计 xsmle y x1 x2 x3, wmat(Wd) model(sdm) fe type(ind) nolog estat direct, ind estat indirect, ind estat total, ind * 若使用官方 spxtregress 估计 spxtregress y x1 x2 x3, fe lag(Wd) estat impact, summaryestat impact输出包含三块直接效应direct、间接效应indirect和总效应total。举个例子研究数字金融对城乡收入差距的影响如果间接效应显著而直接效应不显著说明数字金融辐射了周边地区进而影响了本地的收入差距这个政策含义完全不一样。总效应直接效应间接效应这个分解结果才是空间面板文章的核心看点。很多期刊现在明确要求报告空间效应分解不报告容易被打回。5.3 直接效应、间接效应结果解读的常见误区误区一把回归系数直接当作边际效应报告。这在空间模型里是不对的解释时必须用分解后的效应。误区二只报告显著性不报告方向。间接效应的方向可能和直接效应相反这是常见现象你需要解释背后的经济逻辑。误区三忽略反馈环。即使W被标准化反馈效应仍然存在直接效应并不等于系数本身因为邻居的影响会绕一圈回来。在Stata里使用estat impact时它会自动用蒙特卡洛模拟计算置信区间如果置信区间上下界跨0别急着下结论说不显著看看它是直接效应还是间接效应分别做分析。6. 从实际项目复盘踩过的坑命令报错、权重矩阵错位与结果异常6.1 权重矩阵无法导入或维数不一致这个错误几乎每个人都会遇到一次。现象用spmatrix frommatrix导入外部矩阵结果报错matrix not conformable或者time variable not set。大部分原因就一个矩阵的维度或行列顺序和面板数据不匹配。解决办法是维护一个专门的ID对应表——在数据文件里每个ID一行按sort id后的顺序导出ID列表在矩阵文件里同样按ID升序排列行列。两边对了再导入。另外要注意如果面板数据经过xtset后存在缺失年度Stata 的spmatrix对象和估计命令会尝试匹配子样本匹配不上就报错。最稳妥的办法是先把面板数据xtbalance化为平衡面板再导入权重矩阵。6.2 莫兰指数的变量单位和权重矩阵标准化问题很多人用moran计算莫兰指数时得到一个巨大的正数比如0.9觉得太好了空间效应很强。但这里面可能有一个低级错误权重矩阵没有做行标准化。如果矩阵每一行的元素不是归一化的Morans I 的值会受矩阵量纲影响不具解释意义。标准操作创建完矩阵后顺手spmatrix normalize W, normalize(row)然后再算莫兰指数或跑回归。同一个权重矩阵对象在多个模型里被反复使用时务必确认它是否已经被标准化、未被后续命令意外覆盖。Stata 的spmatrix对象可以被replace覆盖我甚至见过有人把 contiguity 矩阵误存进 idistance 的对象名里跑出来的结果居然没报错——因为维数一样。所以在建模前一定要spmatrix summarize检查矩阵是否对称、对角元是否为0、行和是否为1。6.3 回归结果中ρ不显著但LM检验显著这种情况经常让人困惑莫兰指数和LM检验都显著但空间滞后项系数 ρ 或空间误差系数 λ 不显著。原因可能有两个。第一空间效应实际上通过 WX 进入模型也就是SDM形式而不是 WY 或误差项而你只估计了SAR或SEM导致空间参数不显著。解决办法跑一个完整的SDM用LR检验判断是否需要 WX项。第二多重共线性问题如果 WX 和 X 高度相关SDM估计时系数标准误会增大显著性下降。解决办法检查 VIF但空间计量的 VIF 不好直接算可以观察加入 WX 项后系数变化如果估计结果很不稳定考虑换一个标准化方式或矩阵类型。我自己踩过的坑是面积加权矩阵研究区县数据时用了面积倒数权重矩阵结果 ρ 一直不显著。后来发现区县面积差异太大矩阵被深圳南山、北京海淀这种小面积高密度区主导了。换成经济距离矩阵后结果立刻变显著。矩阵的构建要贴合研究问题的实际机制不要机械套模板。6.4 面板数据时间维少于空间维度时的稳定性问题如果T年份远小于N省份/地区空间面板固定效应模型的估计会遇到Nuisance parameter问题——个体固定效应数量多而时间变化信息少参数估计的一致性受损。实操中省级面板数据常常是 N31、T15 左右问题不算严重。但如果是 N280 个地级市、T5就需要谨慎。遇到N大T小时我的建议是优先用随机效应模型或者考虑压缩固定效应——比如用时间趋势项代替逐年固定效应或者把空间单元聚合到更高层级地级市聚合成省级再做空间面板。另外也可以考虑xsmle中的type(both)选项表示同时包含空间固定效应和时间固定效应但要先检验时间固定效应是否必要。7. 实证结果汇报建议与学术写作规范7.1 论文/报告中的必备表格与顺序一篇空间面板实证论文推荐的报表顺序是变量描述性统计表包含观测值数量、均值、标准差、最小值和最大值莫兰指数表逐年报告还要报告期望值、标准差、z值、p值模型选型检验表LM检验和稳健LM检验结果如果做了SDM的LR检验也要列主回归结果表对比普通面板、SAR、SEM、SDM这一步非常讨喜展示空间效应分解稳健性检验表替换权重矩阵地理距离矩阵换成经济距离矩阵、替换核心解释变量、缩尾处理、动态面板回归主回归结果表的格式建议每一列一个模型SAR FE、SEM FE、SDM FE、SDM RE每一行一个变量空间参数ρ或λ单独放在表格下方。要明确标出效应分解结果是在哪个模型的哪个选项下得到的不能混为一谈。7.2 粘贴Stata结果到Word/LaTeX的自动化从Stata导出结果时可以用* 先安装esttab ssc install esttab, replace * 保存多个模型结果 est store m1 est store m2 est store m3 * 输出到Word esttab m1 m2 m3 using results.rtf, replace /// b(%9.3f) se(%9.3f) star(* 0.10 ** 0.05 *** 0.01) /// stats(N r2 r2_a) /// mtitles(SAR-FE SEM-FE SDM-FE) /// title(空间面板模型估计结果)star选项可以自定义显著性标记期刊要求不同就调节starlevels(*** 0.01 ** 0.05 * 0.1)。在LaTeX写作时可以用esttab ... using results.tex直接输出表格代码避免手抄数字导致录入错误。每次修改模型设定后重新执行一遍脚本并重新生成表格不要手动改Word里的数字否则很容易出现报告数字和模型结果对不上的低端失误。7.3 空间模型与因果推断的边界说明最后说一句容易被忽视的空间面板模型的系数不直接等同于因果效应。空间滞后项的显著性只能说明变量之间存在条件相关要建立因果链条还需要借助外生冲击、工具变量、自然实验等手段。现在很多顶刊文章把空间计量当作描述性证据因果识别另行设计。写论文时主动承认这一点反而更可信别为了审稿人高兴硬往因果上靠。我个人习惯是在稳健性检验部分加入排除反向因果的讨论比如把核心解释变量滞后一期作为工具变量虽然空间模型的IV处理比较复杂但做一步GMM形式的空间IV总比什么都不做强。8. 完整可复现的实证代码生成一个最小工作示例为了让你快速上手我整理一个可以直接运行的完整流程示例。假设数据文件data_spatial.dta包含id省份编码、year、y被解释变量、x1核心解释变量、x2控制变量、lon经度、lat纬度。8.1 从清洗到空间权重矩阵* 打开数据 use data_spatial.dta, clear * 数据清洗与面板设定 encode province, gen(id) // 如果id是字符串 destring lon lat, replace force xtset id year xtdescribe * 平衡面板处理非必需但推荐 xtbalance, range(2010 2020) * 空间权重矩阵的创建 spset id coord(longitude lon latitude lat) modify replace spmatrix create contiguity Wcontig spmatrix create idistance Wdist spmatrix normalize Wcontig, normalize(row) spmatrix normalize Wdist, normalize(row) spmatrix summarize Wcontig spmatrix summarize Wdist8.2 从检验到模型选择* 普通面板模型作为参考 xtreg y x1 x2, fe est store ols_fe predict e_ols, e * 计算残差的莫兰指数 * 方法一分年份算 forvalues t 2010/2020 { preserve keep if year t moran e_ols, weight(Wdist) restore } * 空间面板模型估计 * 由于 spxtregress 现在支持fe我们用官方命令 spxtregress y x1 x2, fe lag(Wdist) est store sar_fe spxtregress y x1 x2, fe error(Wdist) est store sem_fe * 如果还想用 xsmle先安装 * ssc install xsmle xsmle y x1 x2, wmat(Wdist) model(sdm) fe type(ind) nolog est store sdm_fe * 简化检验LR检验 xsmle y x1 x2, wmat(Wdist) model(sar) fe type(ind) nolog est store sar_fe_xsmle lrtest sdm_fe sar_fe_xsmle xsmle y x1 x2, wmat(Wdist) model(sem) fe type(ind) nolog est store sem_fe_xsmle lrtest sdm_fe sem_fe_xsmle * Hausman检验用xsmle的随机效应sdm和固定效应sdm对比 xsmle y x1 x2, wmat(Wdist) model(sdm) re type(ind) nolog est store sdm_re hausman sdm_fe sdm_re * 效应分解 estat direct, ind estat indirect, ind estat total, ind * 结果汇总输出 esttab sar_fe sem_fe sdm_fe using spatial_results.rtf, replace /// b(%9.3f) se(%9.3f) star(* 0.10 ** 0.05 *** 0.01) /// stats(N r2 r2_a) /// mtitles(SAR-FE SEM-FE SDM-FE)8.3 动态空间面板的最简实现使用GMM方案做一个简化动态模型* 生成空间滞后项 spgenerate Wy Wdist * y gen L_y L.y gen L_Wy L.Wy * 用xtabond2做系统GMM需要先安装xtabond2 ssc install xtabond2 xtabond2 y L_y Wy x1 x2, gmm(L.y x1 x2, collapse) iv(Wy L_Wy) /// two step robust small这个方案的思路是把动态项和空间滞后项当作变量放入GMM框架不完全等于理论上的动态空间面板模型但在工程实现上最容易落地也常被用于初步识别方向。审稿人如果要求严格动态空间模型建议找专门的统计软件如MATLAB的空间计量工具包、R的splm包做交叉验证。9. 遇到结果不合理时的排查清单这两年帮人排查空间面板模型问题总结了下面这张体检清单任何一步出现问题都可能导致结果异常检查项症状解决方向权重矩阵未标准化莫兰指数异常大、ρ值不稳定spmatrix normalize W, normalize(row)权重矩阵与数据顺序错位回归系数方向反常识、空间参数不显著核对矩阵行列与ID排序用spmatrix summarize检查对角元面板数据未设为平衡面板估计过程中样本丢失报错conformabilityxtbalance或xtset后重新检查时间固定效应缺失空间参数被时间趋势吸收显著性下降在spxtregress或xsmle中加入time效应type(both)权重矩阵选择不合理ρ、λ均不显著换矩阵类型距离矩阵换成邻接矩阵或经济矩阵共线性过强空间滞后项与自变量系数方差膨胀检查WX与X相关考虑简化模型截面单位太少空间参数估计不稳定N小于20时慎用空间计量或考虑用省级以上数据聚合Stata版本过旧官方spxtregress不可用升级Stata 17或改用xsmle这张表不是空话每个项目至少能对上两三条。空间面板的最大特点就是牵一发而动全身权重矩阵的微小改动可能完全改变显著性结论因此任何一步操作都要留下可复现的日志和矩阵快照。实操层面还有一个好习惯建模脚本里每个spmatrix create后面紧跟spmatrix summarize每个模型估计后立即est store存储结果每个检验后立即记录p值。这样万一后续结果异常可以通过倒推定位是本步骤的问题还是上游权重矩阵的问题不需要全部重跑。我自己之所以从普通面板转向空间面板就是因为一篇区域经济文章被审稿人追问你如何处理空间溢出。当时用了一个星期把空间面板从零到一跑通回头再看这个东西的难度不在数学推导而在于Stata命令生态的碎片化和权重矩阵构造的潜规则。一旦理清检验顺序和命令逻辑剩下的事情其实就是按部就班地跑代码、写稳健性检验、解释效应分解。愿你少走这些弯路。