news 2026/10/16 12:51:15

面板数据中介检验与调节效应:Stata固定效应与Bootstrap实操指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
面板数据中介检验与调节效应:Stata固定效应与Bootstrap实操指南

简介:面向面板数据实证研究者的 Stata 操作资源包,聚焦中介效应与调节效应的完整分析流程。资源结合数据基础、模型设定与命令实操,覆盖 mediate 命令实现中介检验、交互项与 i. 前缀处理调节效应,以及结果解读要点,适合经济学、社会科学领域需要处理面板数据的中级用户。压缩包共 269 个文件,以 ado 程序文件、hlp 帮助文档、sthlp 语法文件为主,另含 mata 矩阵运算模块、mlib 库及少量 dta 示例数据和 do 操作脚本,大小仅 1.26MB,方便本地快速部署扩展命令。目前已有 24380 人学习下载。通过对照包内命令文档与示例数据,读者可快速掌握面板数据中介、调节效应的 Stata 实现路径,避免因命令选项误用导致结果偏误,提升实证研究的规范性与可复现性。

1. 面板数据里的中介效应和调节效应:Stata命令到底怎么跑才不是玄学

中介效应、调节效应在面板数据里怎么用Stata跑通,网上教程大多拿截面数据的例子一笔带过。真到自己动手,xtset、固定效应、交互项中心化、Bootstrap检验,每一步都可能翻车。这篇笔记要拆的是一套面板场景下可复现的Stata操作演示:从面板声明、固定效应判断,到中介三步法与Sobel/Bootstrap,再到调节效应的交互项构造和边际效应绘图,最后是五个最容易踩的坑。适合正在做面板论文、想一次性把中介调节流程跑通的硕博生和科研岗。下面统一用y表示被解释变量、x表示核心解释变量、m表示中介变量或调节变量,跑你自己的数据时替换成实际变量名即可。

2. 先把面板数据立起来:xtset 声明与固定/随机效应选择

2.1 xtset 面板声明:id、time与平衡性检查

打开面板数据第一步是xtset。常见错误是不声明面板直接跑回归,Stata会把每个观测当独立样本,标准误全是错的。正确做法先声明个体id和时间变量,再检查面板结构。

xtset id year xtdescribe xtsum x m y

xtset的id是截面个体标识,year是时间标识,两者组合起来必须唯一。如果数据里有重复的id-year组合,xtset会直接报错。xtdescribe输出平衡/非平衡面板的判定:如果你的数据结构是有缺失的,输出里会显示每个id有多少个时期,一眼就能看出哪些个体缺年份。xtsum给组间between、组内within和总体overall三个标准差,这块信息对后文判断变量能不能进固定效应模型非常关键。

我一般会在跑任何回归之前先看xtsum的结果。如果某个变量的within标准差小到接近0,说明它几乎不随时间变化,后面固定效应模型里这个变量的系数会很难估计,甚至被absorb掉。这个检查动作只要十秒钟,但能省掉后面一晚上的排查时间。

2.2 固定效应还是随机效应:Hausman检验定方向

面板中介调节的基准模型,绝大多数文献用固定效应FE,因为它能吸收不随时间变化的个体异质性。但「该用FE」不靠感觉,靠Hausman检验说话。

xtreg y x m, fe estimates store fe_m xtreg y x m, re estimates store re_m hausman fe_m re_m

这里先跑固定效应模型并存结果,再跑随机效应模型并存结果,最后用hausman比较两个模型的系数向量。Hausman原假设是随机效应与固定效应估计系统无差异,p值小于0.05就拒绝原假设,选FE;p大于等于0.05时用RE也说得过去,但很多期刊仍倾向报告FE结果。注意estimates store的两个名字不能重复,后缀改成你自己的模型标识即可。

跑面板模型时我还会顺手加上vce(cluster id),让标准误对个体聚类。面板数据里同一个体的不同年份观测必然相关,不处理聚类会把t值放得很大,这是审稿人最爱问的问题之一。加了聚类选项之后,显著性阈值要重新审视,因为聚类标准误通常比普通标准误大。

2.3 先看变异再跑模型:within标准差决定变量去留

这个判断属于「跑了才发现坑」的预防针。假设你要检验的中介变量是行业属性、地区制度这类不太随时间变化的变量,xtsum输出的within标准差会非常小。在这种情况下,xtreg y x m, fe跑出来的m系数经常不显著,但这不代表中介效应不存在,而是固定效应把m的组内变异消耗殆尽了。

xtsum x xtsum m

比较within与between的占比,如果某个变量的within占比低于10%,在FE设定下除非样本期足够长、变化足够大,否则很难估出显著系数。这不是硬性标准,但在我处理过的面板数据里相当靠谱。遇到这种情况,我一般主动改用随机效应做辅助检验,并在稳健性部分说明两种设定下结论是否一致,而不是默默删掉变量。

3. 中介效应三步走:Stata 的逐步回归、Sobel 与 Bootstrap

3.1 逐步回归法在面板里的写法与系数判读

中介效应的经典三步是:总效应c即X对Y的回归系数、路径a即X对M的回归系数、路径b与直接效应c'即X和M同时进入方程后M的系数与X的系数。面板场景下每一步都要带xtreg和fe。

xtreg y x, fe estimates store total xtreg m x, fe estimates store path_a xtreg y x m, fe estimates store path_b

三步都跑完后看三个关键系数:xtreg m x里x的系数是a路径;xtreg y x m里m的系数是b路径,x的系数是直接效应c'。a和b都显著是中介成立的前提。c'不显著而a、b显著,属于完全中介;c'显著但绝对值比第一步里的c小,属于部分中介。

这里必须提醒一个新手常犯的理解错误:第三步回归里x和m同时在方程里,两者之间的相关性会放大标准误,c'的显著性不是判断中介的唯一依据。a乘b这个间接效应的检验才更重要。有些数据a和b都显著但c'仍然显著,这时说「部分中介」完全成立;也有a显著、b不显著的情况,这时中介效应不成立,别硬撑。

3.2 Sobel 检验:手动计算与 sgmediation 的边界

Sobel检验的原假设是a乘b等于0,检验统计量的公式是z等于a乘b除以根号下b方乘sa方加a方乘sb方。Stata里不必去记公式,在第三步回归后手动算就行:

xtreg m x, fe scalar a = _b[x] scalar sa = _se[x] xtreg y x m, fe scalar b = _b[m] scalar sb = _se[m] scalar sobel_z = a * b / sqrt(b^2 * sa^2 + a^2 * sb^2) display "Sobel z = " sobel_z

这段代码利用xtreg后保存在e()里的系数和标准误,直接算出z值。|z|大于1.96说明间接效应显著。很多教程会让装sgmediation然后一条命令出结果,但sgmediation的底层是OLS回归,并不理解xtset的面板结构,直接把它用在面板数据上等于把固定效应全丢了。我一般只在审稿人明确要求报告Sobel结果时才补这个数,主检验用下面要说的Bootstrap。

3.3 Bootstrap 中介检验:面板下更稳的做法

Bootstrap不依赖a乘b的正态分布假设,是目前主流的间接效应检验方式。面板数据里我习惯自己写一个小的程序块,每次抽样都完整重跑两条xtreg路径:

capture program drop boot_med program define boot_med, rclass xtreg m x, fe scalar a = _b[x] xtreg y x m, fe scalar b = _b[m] return scalar ind = a * b end bootstrap r(ind), reps(1000) seed(2024) nodots: boot_med estat boot, bc

bootstrap后面的r(ind)告诉Stata从boot_med的返回值里抽哪个量。reps至少500,我默认用1000,太少的话置信区间每次跑都不一样,结果不可复现。seed设固定值保证任何人用同一数据跑出来的结果一致,这是论文里必须写的细节。estat boot, bc输出偏差校正置信区间,区间不含0说明间接效应显著。

Bootstrap比Sobel稳在哪?它不需要a乘b服从正态分布的假设,在小样本和中介效应较弱时更可靠。而且每次抽样都会重新跑xtreg,面板结构在抽样过程中自然被保留,比手工构造虚拟变量的Sobel更贴合面板设定。如果你的中介效应模型比较复杂,比如有多个中介变量,也可以在这个program里加一条xtreg,返回多个indicator。

4. 调节效应:交互项构造、中心化与边际效应绘图

4.1 交乘项的两种构造方式与多重共线性

调节效应在回归里就是交乘项。连续变量x与调节变量m,最简单的做法是生成x_m等于x乘m后放进回归。但直接用原始值相乘,x和x乘m之间的相关系数经常超过0.9,回归系数会被共线性折腾得符号乱跳。常见做法是先中心化再乘:

summarize x gen x_c = x - r(mean) summarize m gen m_c = m - r(mean) gen xm_c = x_c * m_c xtreg y x_c m_c xm_c, fe

r(mean)是summarize之后保存的样本均值。中心化只改变变量的位置,不改变回归的拟合优度,但交乘项系数b3的含义变得更清晰:它表示x对y的作用如何随m偏离均值而变化。嫌手动生成麻烦,也可以用因子变量写法xtreg y c.x##c.m, fe,c.x##c.m等价于x加m加x乘m三项,c.前缀声明连续变量。因子变量写法的优点是Stata自动处理交乘,缺点是不方便直接提取交乘项做后续绘图,我通常二选一,手动生成更灵活。

4.2 调节效应系数解释:不能只看交乘项显著不显著

很多新手把c.x##c.m跑出来,只看x乘m的系数b3显著就说调节效应成立。这是不完整的。调节效应的实质是x对y的边际效应随m变化:对y关于x求偏导,得到b1加b3乘m_c。b1是m_c等于0即m在样本均值处时x的效应;b3只是这个边际效应的变化斜率。

所以在报告结果时我会同时给b1和b3,并说明「m每增加一个单位,x对y的效应增加b3个单位」,而不是只写一句「调节效应显著」。还要注意另一个细节:中心化之后,b1是m在均值时的效应,这个值通常落在样本支持范围内;不中心化时b1是m等于0时的效应,如果你的m取值都在50附近,m等于0就是纯外推,b1的解释没有实际意义。这就是为什么中心化不只是为了对付共线性,更是为了让主效应有可解释的参照点。

4.3 margins 与 marginsplot:把调节方向画出来

单看表格很难判断调节方向,尤其b3为负时到底是「削弱」还是「反转」,图形最直观。标准做法是用margins算x的边际效应在m不同取值上的估计值,然后画出来:

margins, dydx(x) at(m=(20(5)40)) marginsplot graph export "margins_plot.png", width(800) replace

at(m=(20(5)40))表示m取20、25、30、35、40五个值,括号里第一个数是起点、第二个数是步长、第三个数是终点。dydx(x)表示求x对y的边际效应。marginsplot会画出边际效应及置信区间:如果斜线从显著正走向不显著再走向显著负,说明调节效应存在且发生了方向反转;如果区间始终不包括0,说明x的效应在m的整个取值范围内都显著,只是大小在变。

图形输出的宽度单位是像素,期刊插图一般要矢量图,写论文时我通常换成导出.eps。注意margins的at()语法在Stata不同版本里写法略有差异,新版本建议用at(m=(20(5)40))这种带括号的形式,旧版本写at(m=20(5)40)也行,但要确认你的版本支持哪一种。

5. 面板中介调节避坑实录:五条能救命的踩坑记录

5.1 把截面三步法硬搬到面板,中介变量被固定效应吃掉

现象:xtreg m x, fe不显著,换成xtreg m x, re立刻显著,中介路径断了。

原因:固定效应只利用组内变异,如果中介变量的within标准差太小,FE把它的解释力全吸收掉了。很多截面数据里显著的中介关系,进了面板FE模型就消失,不一定是真消失,而是数据里这个中介变量本身就不怎么随时间变。

解决:先跑xtsum m看within占比,占比过低时改用RE或系统GMM做辅助检验;两种设定结论矛盾时,在正文里报告两种结果,用Bootstrap置信区间作为最终判定依据。不要因为FE不显著就悄悄删掉中介变量,审稿人看到变量清单里缺了理论核心变量,问题比不显著更严重。

5.2 交乘项加进去后主效应符号翻转

现象:xtreg y x, fe里x系数为正,加入x乘m后x的系数变成负的。这是我在多个数据集里反复见到的情况,第一反应不是改模型,而是查共线性。

原因:原始值相乘导致x与x乘m高度共线,系数被重新分配;另一种可能是m等于0处本身就是外推区域,b1的解释没有实际意义。中心化可以缓解前者,但不能完全消除。

解决:先中心化再重跑。若翻转仍然存在,不要急着删交乘项,去看margins的边际效应图在m的合理取值范围内是否保持一致。如果图形显示x的效应在m的绝大多数取值上都是正的,那表格里b1的负号只是一个外推假象,报告时说明「在m的样本取值范围内,x的效应为正且随m递增/递减」即可。

5.3 Bootstrap 的 reps 太少或搞不清聚类

现象:bootstrap跑出来每次置信区间都不一样,reps(200)时上下界差距很大,reps(1000)才收敛。

原因:Bootstrap的抽样误差随reps增大而减小,200次对间接效应这种小方差统计量不够稳定。另一个常见问题是面板内自相关没处理,抽样时把同一个体的不同年份当独立观测。

解决:reps至少500,我一律用1000并固定seed。如果担心面板内自相关,在bootstrap命令里加cluster参数,或对整个id做block bootstrap,保证同一个体的观测被一起抽入或一起排除。

5.4 sgmediation 的面板结果被审稿人质疑

现象:用sgmediation跑出z值显著,但xtreg路径里b路径不显著,两个结果打架。这是典型的模型设定不一致造成的矛盾。

原因:sgmediation是OLS版本,既没吸收固定效应,也没考虑面板聚类。它把重复观测当作独立样本,标准误被系统性低估,z值虚高。

解决:面板里别把sgmediation当主结果。主检验用xtreg路径系数加Bootstrap;sgmediation只在审稿人明确要求报告传统Sobel时作为补充,并标注这是横截面设定下的结果,不作为结论依据。

5.5 调节变量是类别变量时交互项解释出错

现象:m是0/1虚拟变量,跑xtreg y c.x##i.m, fe后交乘项不显著,分组回归却一组显著一组不显著。

原因:交乘项的基准组选择影响显著性,分组回归只是「看起来」有差异,真正的组间差异要用全样本交互项检验,「一组显著一组不显著」本身不能证明调节效应存在。很多人踩这个坑是被「分组显著差异」的表象骗了。

解决:用因子变量i.m##c.x做全样本检验,直接看交乘项的p值。想报告分组结果,也得先保证全样本交互项显著,否则分组差异只是抽样噪声。基准组的选取会影响交互项系数符号和显著性,换一个基准组重跑一遍是必要的稳健性检查。

6. 验证与进阶:分组检验、稳健性与回归结果的呈现

6.1 分组回归与组间系数差异

调节效应的补充验证,最常见的做法是按m的中位数把样本分两组,分别跑xtreg y x, fe,然后比较x的系数。注意组间差异不能靠「一组显著、一组不显著」来证明,要回到全样本交互项:

xtreg y x m xm_c, fe test xm_c

test xm_c的p值才是组间系数差异的正式检验。我习惯把分组回归放在稳健性部分,正文主结论用交互项模型,分组结果用一张表附在文末。

6.2 稳健性:换估计量、加聚类、做滞后

面板中介调节的稳健性一般做三件事:第一,把FE换成RE,看方向是否一致;第二,加vce(cluster id)处理个体聚类;第三,把解释变量滞后一期,缓解反向因果:

xtset id year gen lx = l.x gen lxm = l.x * m_c xtreg y lx m_c lxm, fe

滞后一期会损失一年的观测,非平衡面板里尤其要确认样本量变化。x对y的作用如果靠l.x才能显现,说明当期效应可能偏弱,这本身也是信息。所有稳健性结果我习惯排成一张表,第一列放基准模型,后面放RE、加聚类、滞后期的结果,表注里写清楚每列的关键设定。

从那以后,我每次跑面板中介调节都强制走一遍「xtsum看变异 → Hausman定模型 → 三步法 → Bootstrap → margins画图 → 三组稳健性」的完整流程,这套流程帮我躲过了不少审稿意见,希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 12:49:55

Python入门篇之函数

前言 刚开始学 Python,最容易被两个问题卡住:一是「为什么要把代码写成函数」,二是「函数里的变量到底归谁管」。前者关系到代码能不能复用和维护,后者关系到你会不会在某个深夜突然收到 NameError 或 UnboundLocalError。这篇入门…

作者头像 李华
网站建设 2026/10/16 12:47:03

STM32自制飞控全攻略:从姿态解算到PID调参避坑

简介:一份基于STM32微控制器的无人机飞控开发资料,面向嵌入式开发者和无人机爱好者,适合用于课程设计、项目参考或从零理解飞控系统构建。资料共212个文件,整体约4.53MB,以C源码(.c/.h)为核心&a…

作者头像 李华
网站建设 2026/10/16 12:46:56

TOA定位算法详解:二维三维场景MATLAB仿真实现与精度分析

做无线定位有一阵子的人应该都有同感:真正让定位算法落地最难的不是推导公式,而是把公式批量跑成可视化的仿真结果。前阵子接了个模拟项目X的定位方案预研,需求很直接——设备上报信号到达时间,后端要在二维和三维两种场景里算出位…

作者头像 李华
网站建设 2026/10/16 12:46:48

Windows下Docker启动失败:虚拟化支持未检测到的完整排查指南

刚在 Windows 上装完 Docker Desktop 的人,大概率都有过这么一段经历:图标双击,小鲸鱼转了一会儿圈,任务栏图标变灰,鼠标挪上去一看——Windows 系统里弹出“Virtualization support not detected”。没头没尾&#xf…

作者头像 李华
网站建设 2026/10/16 12:46:15

恒温系统上位机源码开发:MODBUS通信与实时数据监控全流程解析

简介:恒温系统上位机源码以C#语言编写,面向工业自动化初学者和温控系统开发者,用于解决环境或设备恒温控制中上位机与下位机之间的数据采集、实时显示、命令下发及控制策略设定等问题。压缩包共40个文件,大小仅128KB,以…

作者头像 李华
网站建设 2026/10/16 12:45:52

流式输出原理与实战:SSE、前端渲染和避坑指南

流式输出这东西,说实话,我第一次意识到它有多重要,是在一次糟糕的等待体验里。那时候还不流行大模型,但已经在做类似机器翻译的接口。用户点一下按钮,要等三到五秒才看到完整结果。当时有人在页面上加了一个转圈动画&a…

作者头像 李华