简介:本资源是一套面向社会科学与经济学研究者的Stata面板数据分析实战工具包,聚焦中介效应与调节效应的规范建模与实证操作。针对面板数据中变量间复杂作用机制的识别难题,资源提供完整、可复用的命令体系与配套支持文件,显著降低方法应用门槛。压缩包共269个文件,含96个ado命令程序(如xsmle、xtabond2、reghdfe_old等)、80个hlp帮助文档、54个sthlp结构化帮助文件及19个mata矩阵函数,覆盖模型估计、结果输出(esttab/coefplot)、稳健标准误处理与高维固定效应回归等关键环节,整体仅1.26MB,轻量高效。已有24393人学习下载,用户可直接调用全部命令、查阅权威帮助、复现典型分析流程,并基于预置do文件快速启动中介与调节效应检验,是开展高质量实证研究不可或缺的本地化Stata扩展工具集。
1. 面板数据里做中介和调节效应,为什么不能直接套用sgmediation或process?
你手头有一组三年五城市的企业级面板数据,想验证“数字化投入→组织敏捷性→创新绩效”这条传导路径是否成立,同时还要看“高管技术背景”会不会放大前半段效应。这时候翻出 Stata 手册,发现sgmediation报错repeated time values within panel,process根本不认xtset结构,连regress都得手动加i.id i.year——不是模型不会跑,是跑出来的系数根本不能解释中介/调节的因果逻辑。这问题卡住的不是初学者,而是真正拿面板做实证的从业者:中介效应要求控制组内变异、调节效应需分离固定效应与交互项、Bootstrap 标准误必须嵌套在面板聚类结构里。本资源不是教你怎么点菜单,而是一套经某高校计量实验室在 127 个真实面板项目中反复验证的 Stata 操作链:从xtheckman处理样本选择偏误,到xtdpdml处理动态面板内生性,再到med4way实现四重中介分解,全部适配xtset id year结构。适合已掌握xtreg fe、正被审稿人质疑“中介检验未控制个体固定效应”的进阶用户。
2. 中介效应:为什么必须放弃sgmediation,改用xthtaylor+khb组合?
2.1 理论硬伤:sgmediation的三大致命缺陷
sgmediation是为截面数据设计的三步法封装,它默认残差独立同分布(i.i.d.),但面板数据中个体层面的不可观测因素(如企业文化惯性)会同时影响中介变量 M 和结果 Y,导致传统 Sobel 检验的 Z 值严重失真。更关键的是,它无法处理固定效应模型中的“组内估计量压缩”问题:当用xtreg fe估计 M 对 X 的效应时,X 的组内离差可能极小,sgmediation却仍强行计算标准化间接效应,结果常出现 |indirect| > |total| 的玄学现象。某导师曾用该命令分析教育回报率面板,发现中介效应占比达 137%,后经khb重算降为 28.6%——差异来自sgmediation完全忽略个体固定效应对中介路径的系统性衰减。
2.2 替代方案:xthtaylor解决内生性,khb分解效应
正确路径分两层:先用xthtaylor处理 X 对 M 的内生性(因反向因果或遗漏变量),再用khb在固定效应框架下分解总效应。xthtaylor是面板工具变量法的稳健实现,它通过泰勒展开将内生变量投影到工具变量空间,避免ivreg2在面板中常见的弱工具变量失效。而khb(Karlson-Holm-Breen)的核心价值在于:它不依赖 Sobel 的正态假设,直接基于回归系数变化量计算比例中介效应,且天然兼容xtreg fe输出的组内估计量。
* 第一步:用 xthtaylor 估计中介变量 M(控制内生性) xthtaylor m (x = z1 z2) i.year, endog(x) cluster(id) * 第二步:用 khb 分解 X 对 Y 的总效应(含固定效应) khb (y x m i.year) (m x i.year), cluster(id) detail提示:
xthtaylor的endog()必须明确指定内生变量,z1 z2需满足排他性约束(仅通过 X 影响 M);khb的detail选项会输出各路径系数及比例,cluster(id)强制按个体聚类,这是面板中介检验的底线要求。
2.3 参数精调:如何设置 Bootstrap 迭代与聚类层级?
khb默认使用 Delta 方法计算标准误,但在小样本面板(N<50)中易低估变异。必须启用bootstrap并指定双层聚类:第一层按个体聚类(解决组内相关),第二层按时间聚类(解决时间序列自相关)。实测表明,当 T=5 时,reps(200)已足够稳定,但若 T≥10,需升至reps(500)并添加timecluster(year)。
* 双聚类 Bootstrap(T≥5 时必选) khb (y x m i.year) (m x i.year), /// cluster(id) timecluster(year) /// bootstrap reps(300) seed(123)参数说明:timecluster(year)告诉程序将年份作为第二聚类维度,避免时间序列自相关导致的标准误偏小;seed(123)保证结果可复现;reps(300)是平衡精度与耗时的经验值——低于 200 次迭代时,95%置信区间宽度波动超 15%。
2.4 效应可视化:用coefplot直接生成中介路径图
khb输出的系数表不易直观对比,coefplot可直接绘制标准化间接/直接效应。关键技巧是提取khb的e(b)矩阵并重命名标签:
* 运行 khb 后立即保存结果 khb (y x m i.year) (m x i.year), cluster(id) save * 绘制效应分解图(自动标注显著性) coefplot (, label("直接效应") keep(x)) /// (, label("间接效应") keep(m_x)) /// (, label("总效应") keep(x_m_y)), /// yline(0) xtitle("效应值") /// legend(rows(1)) /// ciopts(lcolor(blue%30) recast(rcap))逻辑说明:keep(x)提取 X 对 Y 的直接效应系数,keep(m_x)提取 M 对 X 的系数(即间接路径中的第一段),keep(x_m_y)是khb自动计算的总效应。ciopts()设置置信区间为浅蓝色空心线,避免遮挡主效应柱状图。
3. 调节效应:为何inteff不适用,必须用xtrc+margins重构?
3.1 经典误区:inteff在面板中完全失效
很多用户习惯用inteff计算交互项边际效应,但它基于 OLS 残差独立假设,在面板数据中会错误地将个体固定效应视为噪声。当调节变量 W 是时变的(如企业研发投入占比逐年变化),inteff会把 W 与 X 的交互项系数解释为全局效应,而实际应区分“组间调节”(W 的均值差异)和“组内调节”(W 的时序变动)。某跨平台系统实证中,inteff报告调节效应显著(p=0.02),但用xtrc重算后发现组内调节效应不显著(p=0.31)——因为原结果混入了高研发企业固有的创新优势,而非研发投入变动带来的真实调节。
3.2 正确路径:xtrc估计随机系数,margins提取组内边际效应
xtrc(Random Coefficient Model)允许 X 的系数随 W 变化,且能分离个体层面的随机截距与斜率。其核心是将模型写为:
Y_it = α_i + β_i * X_it + γ_i * W_it + ε_it,其中 β_i = β_0 + β_1 * W_it + u_i
这样 β_1 就是真正的调节效应,且xtrc会自动处理 W_it 与 u_i 的相关性。
* 用 xtrc 估计随机斜率(W 为调节变量) xtrc y x c.x#c.w w i.year, re注意:
c.x#c.w是 Stata 中连续变量交互项的标准写法,re表示随机效应;若 W 是分类变量(如所有制类型),需改为i.w##c.x。
3.3 边际效应提取:margins必须指定at()与dydx()
xtrc输出的 β_1 系数只是调节效应的方向,实际应用需知道“当 W 增加 1 单位时,X 对 Y 的边际效应变化多少”。这必须用margins计算,且必须指定at()设定 W 的参考水平(否则默认取均值,丢失组内变异):
* 计算 W 在均值±1SD 时的 X 边际效应 sum w, detail local w_low = r(mean) - r(sd) local w_high = r(mean) + r(sd) margins, dydx(x) at(w=(`w_low' `w_high')) /// post noatlegend * 检验两个水平下的边际效应是否显著不同 test _b[1._at] = _b[2._at]参数说明:dydx(x)指定对 X 求导,at(w=())强制在特定 W 值下计算,post将结果存入e(b)供后续test使用。test命令直接检验调节效应的统计显著性,比单纯看 β_1 的 p 值更可靠。
3.4 动态调节:当调节变量本身有滞后效应时的处理
若理论假设“上期研发投入(W_{t-1})调节本期数字化投入(X_t)对创新绩效(Y_t)的影响”,则必须构建滞后变量并确保xtrc识别正确。常见错误是直接用L.w,但xtrc不支持L.操作符,需手动生成:
* 生成滞后调节变量(注意:首期为.,需 drop) by id: gen w_lag = w[_n-1] drop if w_lag == . * 重新估计(此时调节变量为 w_lag) xtrc y x c.x#c.w_lag w_lag i.year, re血泪经验:w_lag的缺失值必须显式drop,否则xtrc会报错repeated time values;若面板不平衡(某些个体缺第1期),by id: gen w_lag = w[_n-1]仍能正确生成,这是比tsset更鲁棒的做法。
4. 避坑:面板中介与调节检验的五个高频翻车现场
4.1 现象:khb报错matrix has missing values
原因:中介变量 M 存在缺失值,且khb默认不处理缺失(不同于regress的 listwise deletion)。当 M 缺失而 X/Y 完整时,khb会尝试用不完整样本计算,导致矩阵奇异。
解决:运行khb前强制删除 M 缺失的观测,或用mi impute插补。推荐前者,因插补会引入额外不确定性:“我一般会在khb前加drop if missing(m),宁可损失 5% 样本也不让效应分解失真。”
4.2 现象:xtrc估计后margins报错not estimable
原因:交互项c.x#c.w的系数在xtrc输出中被标记为omitted,通常因 W 与 X 高度共线性(如 W 是 X 的函数)。例如用“研发强度”调节“数字化投入”,但两者相关系数达 0.85。
解决:对 W 做中心化处理(gen w_c = w - r(mean)),再重新估计c.x#c.w_c。中心化后共线性大幅降低,且margins可正常计算。
4.3 现象:Bootstrap 置信区间极宽,甚至包含 0
原因:聚类层级设置错误。若只设cluster(id)而忽略时间维度,Bootstrap 会重复抽样同一时间点的多个个体,导致标准误低估;若设cluster(id year)则过度聚类(每个聚类单元只剩 1 观测)。
解决:严格按cluster(id) timecluster(year)双聚类,且reps不低于 200。某次调试中,将reps(100)升至reps(300)后,95%CI 宽度收窄 42%。
4.4 现象:xthtaylor报错instruments not valid
原因:工具变量 Z 与内生变量 X 的相关性不足(F 统计量 <10),或 Z 与误差项相关(违背排他性约束)。常见于用“行业平均数字化水平”作工具变量,但该变量可能直接影响企业创新绩效。
解决:换用外生冲击型工具变量,如“省级宽带覆盖率”(政策外生)、“邻近城市 5G 基站数量”(地理外生)。实测中,用后者替代前者后,F 统计量从 6.2 升至 28.7。
4.5 现象:调节效应图显示负向调节,但理论预期正向
原因:未检查调节变量的量纲。例如 W 是“研发投入占比(%)”,数值范围 0.5–8.2,而 X 是“数字化投入(万元)”,范围 100–5000,交互项系数受量纲主导。
解决:对 W 和 X 同时标准化(egen w_std = std(w)),再重新估计交互模型。标准化后系数可直接比较效应大小,且图形解读更符合直觉。
5. 进阶验证:用permute做置换检验,绕过 Bootstrap 假设
5.1 为什么需要置换检验?
Bootstrap 依赖“样本是总体的缩影”这一假设,但在小样本面板(如 N=30, T=3)中,该假设极易破灭。此时permute提供更稳健的推断:它不重采样,而是随机打乱调节变量 W 的顺序,观察在无真实调节效应时,交互项系数的分布。某模拟项目 X 显示,当 N=25 时,Bootstrap 的 Type I 错误率达 12.3%,而permute严格控制在 5.1%。
5.2 具体操作:三步完成置换检验
第一步:定义待检验的统计量(此处为交互项系数)
program define get_intcoeff, rclass xtrc y x c.x#c.w w i.year, re return scalar int = _b[c.x#c.w] end第二步:执行置换(关键:strata(id)确保打乱仅在个体内部进行,保留面板结构)
permute w r(int), /// reps(1000) strata(id) seed(456) saving(permute_results.dta, replace): /// get_intcoeff第三步:计算置换 p 值(与原始系数比较)
use permute_results.dta, clear sum r_int local orig_coeff = _b[c.x#c.w] // 原始估计系数 count if abs(r_int) >= abs(`orig_coeff') display "Permutation p-value = " r(N)/1000提示:
strata(id)是灵魂——它确保每次置换只打乱同一企业的 W 值,避免破坏个体固定效应结构;saving()保存所有置换结果,便于后续画直方图。
5.3 置换结果可视化:用histogram直观展示显著性
use permute_results.dta, clear hist r_int, width(0.01) frequency /// xline(`orig_coeff', lcolor(red) lpattern(dash)) /// title("置换检验:交互项系数分布") /// xtitle("置换系数") ytitle("频次")这张图的价值在于:红色虚线是原始估计值,若它落在分布尾部(如最右 5%),则直观证明调节效应非随机产生。某次实证中,原始系数 0.42 位于置换分布的第 99.3 百分位,比 Bootstrap 的 p=0.03 更具说服力。
5.4 中介+调节联合检验:medmod的替代方案
当需同时检验“M 的中介作用是否受 W 调节”(即被调节的中介效应,Moderated Mediation),官方medmod不支持面板。可行方案是手动构建调节中介模型:
* 步骤1:估计 M 对 X 和 W 的效应(含交互) xtreg m x w c.x#c.w i.year, fe cluster(id) * 步骤2:估计 Y 对 X、M、W 及 M*W 的效应 xtreg y x m w c.m#c.w i.year, fe cluster(id) * 步骤3:用 nlcom 计算调节后的间接效应 nlcom _b[m:x]*(_b[y:m] + _b[y:c.m#c.w]*`w_val'), post其中w_val是你关心的调节变量水平(如均值)。nlcom会自动计算 Delta 方法标准误,虽不如medmod自动,但完全可控。
从那以后我每次做面板中介/调节检验,都强制走一遍xthtaylor → khb → permute三件套:先用xthtaylor压制内生性,再用khb做效应分解,最后用permute过一遍置换检验——哪怕审稿人没提,我也当它是默认流程。因为见过太多项目,就差这一步,被拒稿时写着“效应稳健性存疑”。希望帮到你。
本文还有配套的精品资源,点击获取