中介效应模型的三个模型
模型1:Y=cX+e1 c:总效应
模型2:M=aX+e2
模型3:Y=c’X+bM+e3 c'直接效应 a*b间接效应
上一节分享了中介效应的理论知识,但是在看了温忠麟老师的“中介效应分析:方法和模型发展”,这一节打算以此为依据,在不违反温忠麟老师的流程的前提下,总结出自己的一套中介效应检验流程和软件操作以及结果的解读
那么首先看如下图是温忠麟提出的新的中介效应检验流程图:
文中对此图的介绍如下:
(1)第一步, 检验(模型1:Y=cX+e1)的系数 c, 如果显著, 按中介效应立论, 否则按遮掩效应立论。但无论是否显著, 都进行后续检验。
(2)第二步, 依次检验方程(模型2:M=aX+e2)的系数 a 和(模型3:Y=c’X+bM+e3)的系数 b, 如果两个都显著, 则间接效应显著, 转到第四步; 如果至少有一个不显著, 进行第三步。
(3)第三步, 用 Bootstrap 法直接检验间接效应ab, H0 : ab = 0。如果显著, 则间接效应显著, 进行第四步; 否则间接效应不显著, 停止分析。
(4)第四步, 检验(模型3:Y=c’X+bM+e3)的系数 c, 如果不显著, 即直接效应不显著, 说明只有中介效应。如果显著, 即直接效应显著, 进行第五步。
(5)第五步, 比较 ab 和 c的符号, 如果同号, 属于部分中介效应, 报告中介效应占总效应的比例ab/c。如果异号, 属于遮掩效应, 报告间接效应与直接效应的比例的绝对值|ab/c|
实际上,温忠麟在文中总结,他提出的检验流程, 综合了依次检验法和 Bootstrap 法的优点, 推荐先尝试简单的依次检验 a 和 b, 如果不显著则用 Bootstrap 法直接检验系数乘积 ab 以提高检验力。用这个流程, 无论是考虑第一类错误率、检验力还是结果的解释性, 与单纯的 Bootstrap 法检验系数乘积相比, 只会更好不会更差。
那么,由于温忠麟老师这套流程其实是综合了遮掩效应,这个效应有兴趣的可以自己进一步研究,这里我想探讨中介效应,因此参考温忠麟老师这套流程的中介效应部分,作出了自己的流程图:
图3 中介模型自己的流程图
实际上,上面的流程图只是单独提取了温忠麟老师中介效应的部分,那么下面我来解释一下,这套流程图:
流程图有5步,但总结来看可以拆分为3大部分:1前提,检验间接效应,检验直接效应。
(1)1前提:即第一步检验系数c是否显著,显著继续进行,不显著终止分析。
(2)检验间接效应:分两种情况:
第一是: a和b均显著,那么直接说明存在间接效应
第二是: a和b至少有一个不显著,也就是a不显著或b不显著或a、b均不显著,那么需要采用Bootstrap法去进一步检验ab(ab即间接效应),若不显著,不存在间接效应,终止分析;若显著,存在间接效应。
(3)检验直接效应c,若不显著,则说明中介效应为完全中介效应;
若显著,则说明中介效应为部分中介效应;
那么,理论理清了,我们接着直接进行代码实现:
本次采用的数据集介绍:
变量 | 属于 |
treat:是否治疗; | X:2分类变量 |
job_seek:求职自我效能水平评分; | M:连续变量 |
depress2:治疗后抑郁症状得分 | Y:连续变量 |
depress1:治疗前抑郁症状得分 | |
sex:性别 | 分类变量 |
age:年龄 | 连续变量 |
occp:职业 | 分类变量 |
marital:婚姻 | 分类变量 |
nonwhite:种族 | 分类变量 |
educ:文化程度 | 分类变量 |
在这个研究中,X为treat,M为job_seek,Y为depress2
在代码实现中,我们需要进行4步
(1)建立模型1:Y=cX+e1
(2)建立模型2:M=aX+e2
(3)建立模型3:Y=c’X+bM+e3
(4)Bootstrap法检验,并计算出直接效应、间接效应、间接效应占比
R代码:
.libPaths()#查看R包位置
.libPaths("D:/Program File/R/R-4.3.2/library")#定义包安装位置
setwd("F:/01陕西省疾控/010心血管高危人群/result")#设置工作空间
getwd()#加载工作空间
install.packages("mediation")
##加载R包
#中介包
library(mediation)
#载入数据
data<-jobs
# treat:是否治疗; X:2分类变量
# job_seek:求职自我效能水平评分; M:连续变量
# depress2:治疗后抑郁症状得分 Y:连续变量
data$X<-data$treat#定义自变量
data$M<-data$job_seek#定义中介变量
data$Y<-data$depress2#定义因变量
#(1)建立模型1:Y=cX+e1
model1<- lm(Y ~ X + sex + age+occp+marital+nonwhite+educ, data=data)
#(2)建立模型2:M=aX+e2
model2<- lm(M ~ X + sex + age+occp+marital+nonwhite+educ, data=data)
#(3)建立模型3:Y=c’X+bM+e3
model3<- lm(Y ~X + M + sex + age+occp+marital+nonwhite+educ, data=data)
summary(model1)
summary(model2)
summary(model3)
上面其实就是逐步检验的结果:我们可以依次查看系数c、a、b的显著性来判断是否存在中介效应,再根据系数c’的显著性判断是完全中介还是部分中介
#中介效应分析
set.seed(1000)#设置随机种子
result <-mediate(model2, model3, #填模型2和模型3
treat="X", #自变量
mediator="M", #中介变量
sims=500, #重复抽样500次
robustSE = T)
summary(result) ### summary模型回归结果
#ACME :间接效应,即中介效应
#ADE :直接效应
#Total Effect:总效应
#Prop. Mediated:中介效应占比
上述结果是Bootstraps的结果,我们也可以直接看这里的结果;
(1)看总效应c显著,才能进行下一步
(2)看间接效应是否显著;若间接效应显著,再进行下一步
(3)再看直接效应是否显著,直接效应显著,则为部分中介;直接不显著,则完全中介效应
plot(result1) ###绘制模型回归结果图
#敏感性分析
sens.out <- medsens(result,
rho.by = 0.1,
effect.type = "indirect",
sims = 1000)
summary(sens.out)
### Rho为灵敏度参数,Rho=0表示没有混杂效应
### Rho值越大表示混杂效应越强,此时对应的中介效应结果越可靠
### 上述结果给出了不同Rho下的中介效应的区间与拟合优度R^2
#敏感性分析可视化
par(mfrow = c(1,2))
plot(sens.out, sens.par = "rho", main = "Sensitive analysis", ylim = c(-0.8, 0.8))
plot(sens.out, sens.par = "R2", r.type = "total", sign.prod = "positive")
图1 Y轴表示中介效应值,X轴表示敏感度关于rho。
图一的总结是:rho的绝对值越高,中介效应越可靠
今天先分享到这里,这一期的中介变量和Y变量都是连续变量,下期分享以下三种情况,R如何构建中介模型:
中介变量 | 因变量 |
连续变量 | 2分类变量 |
2分类变量 | 连续变量 |
2分类变量 | 2分类变量 |
连续变量 | 生存时间/2分类变量 |
2分类变量 | 生存时间/2分类变量 |
所以留个疑问:中介变量如果是多分类怎么办呢?