中介的简单叙述就是一个变量X影响了另外一个变量M,而这个另外的变量还会去影响第三个变量Y。中介就是在尝试解释XY的关系,所以很多人做机制探索的时候就是在做中介,一个很形象的例子就是收入高的人通常活得更久,机制是什么,一种可能是收入高的人医疗保健更好,那么医疗保健就是中介。通过这么一个分析,你就似乎是找到了收入和寿命之间的作用机制。当然这个例子很浅显,但是一般中介就是这么理解。
Mediation analysis tests a hypothetical causal chain where one variable X affects a second variable M and, in turn, that variable affects a third variable Y. Mediators describe the how or why of a (typically well-established) relationship between two other variables and are sometimes called intermediary variables since they often describe the process through which an effect occurs.
中介最常规的做法就是4步回归法Baron & Kenny’s (1986) 4-step indirect effect method,网上有很详细的教程,但是这个方法的统计效能不高。
调节作用也会牵扯到第三个变量Z,这个时候我们就不是在探讨因果路径上的关系了,调节要回答的问题是什么时候XY的关系才会发生,这个调节因子是可以加强、减弱、甚至是反转XY的关系的。
moderation tests for when or under what conditions an effect occurs. Moderators can stength, weaken, or reverse the nature of a relationship.
给大家举个例子
学习自我效能可以调节考试重要性和应试焦虑之间的关系,什么意思呢,就是那些学习自我效能高的同学面对重要的考试焦虑程度比那些学习自我效能低的同学面对重要考试时的焦虑程度低,而且呀,所有的同学面对不重要考试的时候均不焦虑。
上面的例子中只有在自我效能高的同学中才会有焦虑减弱的情况,也就是说考试重要性与焦虑的关系被学习自我效能这个变量调节了,而且是个weaken的关系。
通常来讲对于调节作用的做法就是做调节变量和自变量的交互,那么交互的各种情况我之前的文章中都有介绍,有兴趣的自行翻阅。
今天就给大家写一写中介和调节的R语言一般做法。
中介分析Mediation tests whether the effects of X (the independent variable) on Y (the dependent variable) operate through a third variable, M (the mediator).
最基本,最鲜明的中介如下图:
在上图中我们有这么一种关系 c = c’ ab,也就是总效应等于直接效应加上间接效应
那么中介效应又可以分为完全中介和部分中介:完全中介就是M控制了之后X的直接效应就没了,部分中介就是说M控制了之后X的效应减弱了但还有。
Perfect mediation occurs when the effect of X on Y decreases to 0 with M in the model. Partial mediation occurs when the effect of X on Y decreases by a nontrivial amount (the actual amount is up for debate) with M in the model.
首先我们模拟出我们的数据:
N <- 100 #
X <- rnorm(N, 175, 7)
M <- 0.7*X rnorm(N, 0, 5)
Y <- 0.4*M rnorm(N, 0, 5)
Meddata <- data.frame(X, M, Y)
2.2 Method 1: Ba
4步回归法做中介:
- 先做X到Y的回归,这一步得到总效应(可以不显著)
- 做X到M的回归,这一步必须显著
- 控制X做M到Y的回归,得到路径b,b必须显著
- 做Y到X的回归,一定不显著
#1. 总效应
fit <- lm(Y ~ X, data=Meddata)
summary(fit)
#2. 路径a
fita <- lm(M ~ X, data=Meddata)
summary(fita)
#3. 路径b
fitb <- lm(Y ~ M X, data=Meddata)
summary(fitb)
#4.反向路径
fitc <- lm(X ~ Y M, data=Meddata)
summary(fitc)
到这儿我们所有的中介步骤都跑完了,我们还是用特别好用的stargazer包给大家展示一下模型结果:
library(stargazer)
stargazer(fit, fita, fitb, fitc, type = "html",
title = "Baron and Kenny Method",
out="test.html")
从输出的结果可以看到,控制了M后XY的关系不在显著了,似乎是一个完全中介,但是此时我们还是有必要对整个间接效应做一个检验,检验方法一个是the Sobel test 另一个是 bootstrapping
先进行Sobel test
library(multilevel)
library(bda)
sobel(Meddata$X, Meddata$M, Meddata$Y)
mediation.test(M,X,Y)
运行上面的代码就可以得到直接效应和间接效应以及中介的显著性检验。
Sobel test的假设为间接效应ab是正态分布的,所以大样本的时候好使,小样本的时候有可能检验效能不足,这个时候就得用到bootstrapping
再看 bootstrapping怎么做
library(mediation)
fitM <- lm(M ~ X, data=Meddata)
fitY <- lm(Y ~ X M, data=Meddata)
fitMed <- mediate(fitM, fitY, treat="X", mediator="M")
summary(fitMed)
plot(fitMed)
上面的代码中用到了mediation这个包,这个就是用bootstrapping方法检验中介的