R数据分析:有调节的中介
写今天的文章之前啊,我们先来回顾回顾啥是中介,啥是调节
调节变量会影响XY的关系
Moderation tests the influence of a third variable (Z) on the relationship between X to Y
X -> Y (depending on Z)
而中介变量会中介或者说解释XY的关系
Mediation tests a hypothetical causal chain where the effect of one variable (X) on another variable (Y) is mediated, or explained, by a third variable (M)
X -> M -> Y
有调节的中介
最简单,最直观的有调节的中介如下图
有调节的中介就是在中介关系中有第4个变量Z能够调节整个中介作用,就是说中介因子的作用被调节了,而且这个调节的路径可以是中介路径上的任意一条(a,b,c')
X -> M -> Y (depending on Z)
The moderation can occur on any and all paths in the mediation model (e.g., a path, b path, c path, or any combination of the three)
那么今天要解决的问题就是用R做一个有调节的中介模型
例子如下:
一般情况下研究生花费在学习上的时间越多毕业的offer越多,这个关系被发表的文章数量所中介。
那么这个中介关系是不是会受到学习效率的调节呢?今天我么就要解决这个问题。
那么我们做如下规定
X为自变量学习时间
Y为offer数量
M为文章数
Z为学习效率
数据模拟
a1 = -.59 #学习时间对文章数量的系数
a2 = -.17 #学习效率对文章数量的系数
a3 = .29 #学习时间和学习效率在影响文章数量时的交互项系数
b = .59 #文章数量对offer数量的系数
cdash1 = .27 #学习时间对offer的系数
cdash2 = .01 #学习效率对offer的系数
cdash3 = -.01 #学习时间和学习效率在影响offer数量时的交互项系数
n <- 200 #Set sample size
X <- rnorm(n, 7, 1)
Z <- rnorm(n, 5, 1)
M <- a1*X + a2*Z + a3*X*Z + rnorm(n, 0, .1)
Y <- cdash1*X + cdash2*Z + cdash3*X*Z + b*M + rnorm(n, 0, .1)
Success.ModMed <- data.frame(offer = Y, time = X, pubs = M, efficiency = Z)
上面的代码就模拟出了我们需要的数据,因为学习时间X和学习效率之间都是有交互项的,所以这两个变量需要中心化以避免多重共线性
Success.ModMed$time.c <- scale(Success.ModMed$time, center = TRUE, scale = FALSE)
Success.ModMed$efficiency.c <- scale(Success.ModMed$efficiency, center = TRUE, scale = FALSE)
有调节的中介
数据备好之后我们开始我们的分析,首先我们用mediation这个包。
我们需要跑两个回归,基本上和4步回归法是一样的,首先是忽略掉总效应,然后直接看自变量X对中介变量的效应,然后控制中介变量看X的直接效应(控制X看中介变量的效应b),但是因为我们做的有调节的中介,而且模拟调节效应都在a和c'的路径上,所以在做这两个回归时必须加上调节作用,具体如下:
library(mediation)
mediate <- mediation::mediate
Mod.Med.Model.1<-lm(pubs ~ time.c*efficiency.c, data = Success.ModMed)#模型1自变量对中介变量的效应,加了交互项
summary(Mod.Med.Model.1)
Mod.Med.Model.2<-lm(offer ~ time.c*efficiency.c + pubs, data = Success.ModMed)#模型二然后控制中介变量看X的直接效应,加了交互项
summary(Mod.Med.Model.2)
两个模型的输出结果如下:
从输出我们就可以看出,整个模型的中介是存在的,那么我们如何知道调节变量是如何调节了中介路径呢
接着看,我们的思想就是在调节变量的不同水平,中介路径系数是有显著差异的,此时又涉及到给调节变量划分水平的问题,之前的文章有讲,通常我们可以以一个标准差的距离划分不同水平
首先我们看看在调节变量低水平,我们的中介关系是如何表现的:
low.efficiency<-mean(Success.ModMed$efficiency.c)-sd(Success.ModMed$efficiency.c)
#进行中介检验
Mod.Med.Lowefficiency <- mediate(Mod.Med.Model.1, Mod.Med.Model.2,
covariates = list(efficiency.c = low.efficiency), boot = TRUE,
boot.ci.type = "bca", sims = 10, treat="time.c", mediator="pubs")
我们还可以给这个水平的中介作用画个图:
plot(Mod.Med.Lowefficiency, xlim = 0:1)
可以看到在这个水平上中介作用中的直接效应和间接效应都是有显著意义的。
那么接下来我们再看学习效率这个调节变量的高水平,我们的中介作用是如何变化的:
high.efficiency<-mean(Success.ModMed$efficiency.c)+sd(Success.ModMed$efficiency.c)
Mod.Med.Highefficiency <- mediate(Mod.Med.Model.1, Mod.Med.Model.2,
covariates = list(efficiency.c = high.efficiency),
#boot = TRUE,
#boot.ci.type = "bca", sims = 10,
treat="time.c", mediator="pubs")
summary(Mod.Med.Highefficiency)
plot(Mod.Med.Highefficiency, xlim = 0:1)
此时,可以看到在这个水平上中介作用中的直接效应和间接效应依然都是有显著意义的。
但是此时注意我们图中间接效应好像看起来是比上一个图大的,从图中就可以看出来有可能这个调节变量调节了这条路径。
我们做一下检验:
Mod.Med.Testefficiency <- mediate(Mod.Med.Model.1, Mod.Med.Model.2, #boot = TRUE,
boot.ci.type = "bca", sims = 10, treat="time.c", mediator="pubs")
test.modmed(Mod.Med.Testefficiency, covariates.1 = list(efficiency.c = low.efficiency),
covariates.2 = list(efficiency.c = high.efficiency), sims = 10)
通过对调节变量不同水平模型的中介间接效应和直接效应的检验,我们发现间接效应在调节变量的不同水平有显著性差异,而直接效应没有。
那么我们就可以解释说,那些效率高的学生来说,花费在学习上的时间X通过影响文章发表的数量M对offer数量Y的影响更大,这种间接关系显著的大于效率低的学生
小结
今天给大家写了有调节的中介作用是啥以及R语言做法,感谢大家耐心看完。发表这些东西的主要目的就是督促自己,希望大家关注评论指出不足,一起进步。内容我都会写的很细,用到的数据集也会在原文中给出链接,你只要按照文章中的代码自己也可以做出一样的结果,一个目的就是零基础也能懂,因为自己就是什么编程基础没有从零学Python和R的,加油。数据分析问题咨询,代处理请私信(spss,R,Mplus)。