简介:面向开展中介效应检验的实证研究者,这份DOCX文档系统整理了中介效应的核心概念与常见检验路径:逐步检验法、Sobel检验与Bootstrap检验。内容从变量中心化处理讲起,逐一给出回归方程、判定依据和STATA操作命令,并说明总效应、直接效应、间接效应的关系以及中介效应占比的计算方式;结合Sobel统计量p值、Bootstrap置信区间等输出,解释如何判断显著性与中介类型。资源共1个DOCX文件,压缩包约154KB,适合社会学、心理学、市场营销等方向的本硕学生及科研人员快速搭建方法框架。目前已有596人学习下载。文档围绕温忠麟等人提出的检验思路展开,既含公式推导又含命令示例,能帮助读者避开逐步检验法中的常见误判,直接掌握关键结果的解读要点,可作为论文方法部分写作与复现分析的参考模板。
1. 被误读的"三步回归":中介效应检验到底卡在哪
某研究者的退修意见里只有一句话:请报告间接效应的检验结果。他跑的是经典三步回归,X显著预测M,M显著预测Y,X对Y的预测不显著,研究结论写着"完全中介"。可补了Sobel检验之后,z=1.92,p=0.055,边缘不显著,原本"完全中介"的解释一下就不成立了。这个画面在量化研究里反复出现——问题不在跑不跑回归,而在于"三步回归只做了系数估计,没做乘积ab的显著性检验"。中介效应(逐步检验法与Sobel检验)正是围绕这个缺口展开的:前者是判定路径是否存在的入门框架,后者是对间接效应做显著性检验的经典工具。这篇笔记把这些方法拆开讲清楚,适合正在跑机制检验、或者被审稿人要求补中介检验的从业者。
2. 先立住判定逻辑:逐步检验法的三步与Sobel检验的分工
2.1 从总效应到间接效应:为什么是"三步"
中介效应的定义本身规定了检验步骤:X要通过M来影响Y,就必须满足"X能影响M"和"M能影响Y且X的影响被削弱"。这是一个链条式因果假设,所以早期方法把它拆成三步回归是顺理成章的。
严格来说,三步对应三个方程。方程一:Y = cX + e1,这里c是总效应,它回答"X对Y到底有没有作用";方程二:M = aX + e2,回答"X对M有没有作用";方程三:Y = c'X + bM + e3,这里b回答"控制X之后,M对Y有没有独立作用",c'是X的直接效应。三个系数放在一起,间接效应就是a乘b,总效应c与直接效应c'的关系是c = c' + ab。这个恒等式在普通最小二乘回归里严格成立,所以检验间接效应本质上就是检验"乘积ab是不是显著不等于0"。
很多教程把这三步念成"X显著、M显著、Y显著",这是把判定逻辑简化成了"几个p值小于0.05"。实际上,第二步和第三步缺一不可:只有第二步显著,说明X确实能驱动M;只有第三步显著,说明M对Y的作用不是靠X撑起来的。两个条件都满足,链条才成立。而第三步里X系数c'的变化才是判断中介类型的依据——这是下文判定规则的核心,也是新手最常读错的地方。
2.2 Sobel检验在补什么短板:正态假设与标准误
逐步检验法的逻辑线清晰,但它有个盲区:它可以告诉你a显著、b显著,却没法直接回答"a×b这个乘积本身显著吗"。a显著和b显著都不等于乘积显著——两个效应的抽样波动叠加之后,乘积的置信区间可能比单看任何一个系数都宽。所以需要Sobel检验来补这一步。
Sobel检验的思路非常直接:把间接效应除以它的标准误,构造一个z统计量。问题在于标准误怎么算。间接效应是a和b的乘积,而a和b来自两个不同的回归方程,它们各自的抽样误差会同时传导到乘积上。利用Delta方法(一阶泰勒展开),可以推出间接效应的标准误近似为sqrt(b²·SEa² + a²·SEb²)。这个公式不需要死记,它的结构有直觉:SEa衡量a的不确定性,这个不确定性传递到乘积时会被b放大,所以贡献项是b²·SEa²;同理,SEb的贡献被a放大,是a²·SEb²。两路误差独立,方差相加。
这个公式假设a和b的乘积近似服从正态分布。当样本量足够大(实际操作中一般看几百以上)且间接效应分布不偏时,z检验是合理的;但中介效应的乘积分布天然是偏态的——两个正态变量的乘积并不正态,尤其在小样本里,这个问题会直接体现在p值上。这就是为什么近些年在正式论文里,Sobel检验更多被Bootstrap置信区间取代,后文专门讲这个替换的时机。理解了这个短板,你才算真正看懂了Sobel检验在整套流程里的位置。
2.3 两类方法的适用边界:什么场景Sobel还够用
先厘清分工:逐步检验法是"判定流程",Sobel检验是"显著性检验"。在一份研究里,它们是配套的——先跑三步回归,再对间接效应补Sobel检验;而不是二选一。
适用边界上,我一般看三点。第一,样本量。样本超过200且间接效应分布没有明显偏态时,Sobel检验的结论和Bootstrap基本一致;样本小于100时,Sobel的z值经常虚高,会漏报真实存在的中介效应。第二,模型复杂度。逐步检验只能处理一个中介变量、连续结局的简单模型;如果你的模型里有多个中介、有交互项、或者结局是二分类,Sobel的手算公式就不够用了。第三,报告方的要求。有些期刊或导师仍然认Sobel检验这个经典做法,你需要在论文里报告z值和p值;这种情况下照着经典流程跑,再补一个Bootstrap结果作为稳健性证据,是成本最低的应对方式。
顺带提醒一个常见误用:有人把"三步都显著"等同于"中介效应成立",直接不跑Sobel。这个做法在审稿人那里是有风险的,因为第三步里M的系数b显著,只能说明"控制X后M依然解释Y",并不能代替"X通过M的那条路径显著"。真正能代表那条路径的,是a×b的乘积检验。
3. 用SPSS和R跑通逐步检验法:三次回归与判定规则
3.1 数据准备:变量类型、缺失值和"要不要标准化"
动手跑之前,先花十分钟检查数据结构,这一步能省掉后面大量返工。X、M、Y必须是数值型变量。如果你用的是问卷数据,注意确认没有把反向计分的题目直接加总——这属于数据清理问题,跟中介检验本身无关,但会影响所有后续结果。
缺失值处理要看你的样本量。如果缺失比例低于5%,SPSS默认的列表删除(listwise deletion)问题不大;如果缺失超过10%,建议在跑回归前先做多重插补,而不是让三次回归各自删除不同的样本——那样三次回归的样本量不一致,a、b、c'来自不同的人群,间接效应的计算就失去了意义。
关于标准化:纯中介模型不需要对X和M做标准化,用原始分跑OLS,回归系数就是可解释的原始单位。只有在两种情况下我建议标准化:一是X和M量纲差异太大(比如X是年龄、M是满意度得分),你希望报告中直接比较路径系数大小;二是后续要做有调节的中介,需要中心化处理交互项。如果不做调节、不做标准化,结果解释起来最直接:a、b、c'都是"每增加一个单位"的效应。
3.2 第一步与第二步:总效应回归和X到M的路径回归
SPSS菜单路径是:Analyze → Regression → Linear。第一次:Dependent里放Y,Independent(s)里放X,点击OK。输出里只需要读Coefficients表:X那一行的B就是总效应c,Std. Error是它的标准误,Sig.是p值。第二步:Dependent换成M,Independent(s)不变,X那一行的B就是路径系数a。
这两步的作用不同。第一步回答"X对Y有没有总效应",第二步回答"X能不能驱动M"。注意:在中介效应的经典三步里,第一步要求c显著;但在近些年的检验流程里,这一步的要求已经放宽了——因为存在两个方向相反的间接效应互相抵消的情况,总效应不显著不代表没有间接效应,这个细节后面第5章专门讲。
3.3 第三步:加入M之后的回归,系数怎么读
第三步还是Analyze → Regression → Linear,Dependent放Y,Independent(s)里同时放入X和M。重点读两个系数:M那一行的B就是路径系数b——它代表控制X之后,M每变化一个单位,Y变化多少;X那一行的B就是直接效应c'——它代表控制M之后,X对Y的剩余影响。
第三步是整个流程里最容易读错的一步。我见过不止一次有人把第三步里X的系数当成总效应c拿去算间接效应占比,算出来的比例完全对不上。记住:总效应c从第一步取,直接效应c'从第三步取,间接效应是a×b;c和c'的差,理论上也等于a×b,这是你快速核对结果是否一致的好办法。如果你算出来|c - c' - ab|明显不等于0(比如超过了0.01),先回头查数据,大概率是三次回归因缺失值导致样本没对齐。
用R跑这三步更直接,代码贴在下面,每一步对应一个回归对象,系数用名字索引,不容易取错行。
# 逐步检验法:三步回归的R实现 # dat是数据框,x为自变量,m为中介变量,y为因变量 fit_total <- lm(y ~ x, data = dat) # 第一步:总效应c fit_mediator <- lm(m ~ x, data = dat) # 第二步:X对M的路径a fit_full <- lm(y ~ x + m, data = dat) # 第三步:X+M对Y c_total <- coef(fit_total)["x"] # 总效应 a_path <- coef(fit_mediator)["x"] # 中介路径前半段 b_path <- coef(fit_full)["m"] # 中介路径后半段 c_direct <- coef(fit_full)["x"] # 直接效应 ab <- a_path * b_path # 间接效应 cat("总效应c =", round(c_total, 4), "直接效应c' =", round(c_direct, 4), "间接效应ab =", round(ab, 4), "\n") cat("校验:c - c' - ab =", round(c_total - c_direct - ab, 6), "\n")代码逻辑很简单,但有两个参数说明值得强调。coef()返回的是带名字的命名向量,用["x"]、["m"]按变量名取值,比用索引[2]、[3]安全得多,因为回归对象里的系数顺序受公式写法影响,索引容易取错。最后一行校验c - c' - ab理论上应为0,如果不是,优先检查data里有没有缺失值导致三次回归样本量不同。
3.4 判定规则:完全中介、部分中介与效应量
跑完三次回归后,按下面的规则做判定,这张表可以当作逐步检验法的速查卡:
| 判断对象 | 判定条件 | 结论 |
|---|---|---|
| 第一步c | 显著 | X对Y存在总效应,具备检验中介的前提 |
| 第二步a | 显著 | X对M的路径成立 |
| 第三步b | 显著 | 控制X后M对Y的路径成立 |
| 第三步c' | 不显著 | 提示"完全中介" |
| 第三步c' | 显著且a×b显著 | 部分中介 |
完全中介和部分中介的措辞要谨慎。完全中介意味着c'在统计上不显著,但"不显著"不等于"没有效应"——它可能只是效应量太小、检验功效不够。近些年的主流意见是:不要只用p值判断完全/部分中介,而是报告间接效应的置信区间和效应量。效应量最常用的报告形式是间接效应占总效应的比例ab/c。如果比例算出来超过100%,或者出现负值,说明你的模型里有方向相反的路径,直接报告比例没有意义,改用仅报告ab及其置信区间。
4. Sobel检验的手算路径:标准误公式、计算器与R实现
4.1 Sobel检验的标准误公式与三种变体
Sobel检验在逐步检验法之后补一个乘积显著性检验。它利用Delta方法推导间接效应a·b的标准误,构造z统计量。主流文献里出现过三个版本的标准误公式,差别只在交叉项的取舍上:
| 变体 | 标准误公式 | 特点 |
|---|---|---|
| Sobel一阶 | sqrt(b²·SEa² + a²·SEb²) | 最常用,忽略高阶项 |
| Aroian二阶 | sqrt(b²·SEa² + a²·SEb² + SEa²·SEb²) | 加了一项交叉项,稍保守 |
| Goodman | sqrt(b²·SEa² + a²·SEb² - SEa²·SEb²) | 减了一项交叉项,稍激进 |
实际操作里,三个公式算出来的z值差异很小——除非你的SEa或SEb大到与系数本身同量级,那说明模型本来就有问题。所以不要纠结用哪个,统一报Sobel一阶即可,审稿人不会因为没报Aroian版本而质疑。真正需要注意的是这个检验的前提:a·b的抽样分布被近似为正态分布。这个前提在大样本下尚可成立,在小样本或间接效应明显偏态时,Sobel检验的结果会偏离设定值,这是它后来被Bootstrap替代的根本原因。
4.2 用在线计算器和SPSS跑Sobel检验
Sobel检验需要的输入只有四个数:路径系数a、b,以及各自的标准误SEa、SEb。前两步回归跑完后,从第3章的SPSS输出里把这些值抄出来:a和SEa来自X→M回归,b和SEb来自X+M→Y回归。注意b的标准误要取M那一行,别拿X那一行。
有了四个数,有两种快速算法。第一种是找在线Sobel检验计算器,填入后它会返回z值和p值;第二种是在Excel里按公式手算。Excel的做法是把a、b、SEa、SEb分别填入四个单元格,然后在一个空单元格里写公式:= (A1A2)/SQRT(A2^2A3^2+A1^2*A4^2),其中A1是a、A2是b、A3是SEa、A4是SEb。我个人更推荐先用在线计算器验证一次自己的手算,因为格式填错的概率不低——尤其是把b和SEb填成第三步里X的系数,这类错误在实操里很常见。核对方法很简单:手算结果和计算器结果一致,才算通过。
顺便说一句,SPSS本身没有内置Sobel检验的菜单,外部宏倒是可以补,但现在更普遍的做法是用R或在线工具完成这一步,再把结果贴回论文。下面给R的完整实现。
4.3 用R手写Sobel检验:代码与输出解读
如果你的数据已经在R里跑完了第3章的三步回归,Sobel检验只需要几行代码:
# 基于第3章的回归对象,手写Sobel检验 a <- coef(fit_mediator)["x"] # X -> M 的路径系数 b <- coef(fit_full)["m"] # M -> Y 的路径系数 se_a <- summary(fit_mediator)$coefficients["x", "Std. Error"] se_b <- summary(fit_full)$coefficients["m", "Std. Error"] ab <- a * b # 间接效应 se_ab <- sqrt(b^2 * se_a^2 + a^2 * se_b^2) # Sobel标准误 z <- ab / se_ab # z统计量 p_val <- 2 * (1 - pnorm(abs(z))) # 双侧p值 cat("间接效应ab =", round(ab, 4), "SE =", round(se_ab, 4), "z =", round(z, 3), "p =", round(p_val, 4), "\n")代码要点:summary()$coefficients是回归系数的完整矩阵,行列名对应变量名和统计量名,所以用"x"、"m"、"Std. Error"三个字符串索引,准确又不容易错。p值用标准正态分布的双侧概率,2*(1-pnorm(abs(z)))是双侧检验的通式。
输出解读分三种典型情形:z大于1.96且p小于0.05,说明间接效应成立,可以配合逐步检验法报告"部分中介"或"完全中介";z在临界值附近(比如1.8到2.0之间),说明结论边缘,结合样本量判断是否要换Bootstrap做最终结论;z远小于1且p值很大,说明路径证据不足,这时候要回头检视第二步或第三步哪一个系数不显著,中介链条在哪一环断掉了。
4.4 Sobel检验的结果报告写法
论文里报告Sobel检验,建议写成这样一段话:中介效应的间接效应估计值为ab,Sobel检验的z值为z,p值为p,表明间接效应显著或不显著。同时附上标准误或置信区间。如果审稿人要求更严格的报告,把a、b、SEa、SEb、效应量一起放进表注,方便读者自行复核。
关于Sobel检验的推断结论,有一点必须提醒:不显著不等于"没有中介"。它只表示在当前样本量和分布假设下,乘积ab没有通过检验。样本量不足时,Sobel检验的功效远低于Bootstrap,所以遇到"逐步检验法路径显著但Sobel不显著"的情况,先不要急着推翻自己的理论假设,按第5章的做法补一个Bootstrap再看结论。
5. 中介效应检验的五个常见坑与排查清单
5.1 总效应不显著就停手:你可能漏了遮掩效应
现象:第一步回归里X对Y的总效应c不显著,于是直接判定"不存在中介效应",整个检验流程停在这一步。
原因:总效应c = c' + ab。如果直接效应和间接效应方向相反、大小接近,两者会互相抵消,c看起来就不显著,但间接效应本身可能存在甚至很强。这类情况在心理和管理数据里并不少见,叫遮掩效应。
解决:不要因为c不显著就终止检验,继续跑第二步和第三步,计算ab并用Bootstrap检验其置信区间;如果ab的置信区间不包含0,就报告"存在遮掩效应",说明X对Y的影响被一条相反方向的路径遮蔽了。这个坑是近年新检验流程明确强调的,经典三步法没提,但审稿人现在会问。
5.2 三步符号冲突:间接效应和直接效应方向相反
现象:a和b的乘积为正,但c'为负,或者ab与c'符号相反,报告里不知道该怎么解释"部分中介"。
原因:中介模型允许直接路径和间接路径方向不同。比如工作压力既通过情绪耗竭增加离职意愿,正向路径成立;同时压力本身也可能通过其他渠道降低离职意愿(比如高压力伴随高报酬),使直接效应为负。两条路径叠加后,总效应可能变弱甚至变负。
解决:分别报告两条路径的方向和显著性,不要强行解释成"部分中介"。间接效应为正、直接效应为负时,ab/c的占比可能小于0或大于100%,这时直接报告ab及其置信区间即可,不要报告中介比例。
5.3 小样本下Sobel检验的p值不靠谱
现象:跑完Sobel检验,z值刚好在1.9到2.0之间,p值在0.05上下,结论非常脆弱;换一个Bootstrap结果,置信区间却不包含0。
原因:Sobel检验假设ab的抽样分布正态,但两个回归系数的乘积在小样本下通常右偏,标准误估计偏大,p值被高估,检验功效低。
解决:把样本量作为第一道过滤器。样本少于200时,Sobel检验的结果只作参考,最终结论以Bootstrap置信区间为准。如果两种方法结论不一致,在论文里以Bootstrap为主报告,并注明"Sobel检验得到边缘显著结果,Bootstrap置信区间确认间接效应存在"。这是我逢人必提的一条血泪经验——早期吃过一次亏,"Sobel不显著"把一个本应成立的中介效应压了大半年。
5.4 中介变量或结果是分类变量时,别硬套线性回归
现象:X连续、Y是二分类(比如是否离职),M连续,直接跑三步线性回归,到第三步时模型设定和系数尺度都对不上,ab没法直接算。
原因:中介效应公式基于OLS。因变量或中介变量换成分类变量后,回归使用logit或probit链接函数,各步骤的系数尺度不一致,a和b相乘没有统计意义。
解决:二分类Y时不要再手算Sobel,改用针对分类结局的中介检验方案,比如在潜在变量框架下处理binary outcome;处理起来最省事的是走Bootstrap框架,因为置信区间不依赖正态近似,也能绕开标度问题。如果你的中介变量M是分类变量,则需要用Logistic回归拟合第二步,并在第三步中用对应的系数转化后再讨论。
5.5 完全中介的判定太严:用置信区间替代"不显著"
现象:第三步里c'不显著,就高高兴兴宣布"完全中介",后续审稿人追问"移除X的路径后效应真的为零吗",答不上来。
原因:"不显著"只是检验功效不够,不代表参数为0。c'的置信区间可能还很宽,点估计也可能并不小。完全中介是一个强假设,用"p > 0.05"去证明它,等于用证据的缺席当缺席的证据。
解决:报告c'的效应量和置信区间。如果c'的点估计接近0且置信区间很窄,才可以说"数据与完全中介一致";否则就报告部分中介,同时给出ab/c比例。一句话:完全中介靠的是区间估计,不是显著性检验。
6. 从小样本到大样本:Bootstrap替代方案与一个选择习惯
6.1 Process宏Model 4与R的mediation包
当Sobel检验的正态假设撑不住时,最靠谱的替代是Bootstrap。操作上主流是两个方案。如果你用SPSS,装好Process宏之后,选Model 4,把X、M、Y拖进去,Bootstrap Samples设5000,置信区间95%,输出里看"Indirect effect(s)"的BootLLCI和BootULCI两个值:区间不包含0,说明间接效应成立。
如果你用R,mediation包是最省事的:
library(mediation) set.seed(20240806) # 固定随机种子,确保Bootstrap结果可复现 med_out <- mediate(fit_mediator, fit_full, treat = "x", mediator = "m", boot = TRUE, sims = 5000) summary(med_out)mediate()的treat参数填自变量变量名,mediator填中介变量名,这两个名字必须和数据框里的列名一致,写错会直接报错。boot = TRUE表示用非参数Bootstrap,sims是抽样次数,5000是现在论文里的常见默认;想结果更稳,可以调到10000,代价是等待时间变长。输出里的ACME(average causal mediation effect)就是平均间接效应,看它的95%置信区间是否包含0即可。
6.2 什么时候必须放弃Sobel、改用Bootstrap
我的选择习惯很简单,按三句话判断。样本量小于200,直接用Bootstrap,Sobel只用来做稳健性对照;中介变量或结局是分类变量,直接用Bootstrap,不做Sobel;两条路径符号相反(有遮掩迹象),用Bootstrap并报告置信区间,关心中介比例容易踩坑。反过来说,样本量足、模型简单、期刊要求传统报告方式的时候,Sobel检验依然是快速且中规中矩的选择,把两种结果同时报告,反而给审稿人留下更稳的印象。
这套做法延续到现在,我处理中介效应数据时的默认流程是:先跑三步回归看路径方向和系数量级,再跑Bootstrap看置信区间,最后根据期刊习惯补Sobel作对照。判断从来不在"哪个统计量更高级",而在"你的样本量和模型能不能支撑这个检验的假设"。希望这些踩过的坑能帮你少走一段弯路,祝顺利。
本文还有配套的精品资源,点击获取