R数据分析:中介作用与调节作用的分析与解释
什么是中介和调节
中介的简单叙述就是一个变量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方法检验中介的
从图中可以看到,自助抽样1000次后间接效应依然显著,直接效应不显著,我们可以很放心的说这个是一个完全中介了。
当然,输出中还有这个中介效应图:
调节效应分析
Moderation tests whether a variable (Z) affects the direction and/or strength of the relation between an IV (X) and a DV (Y). In other words, moderation tests for interactions that affect WHEN relationships between variables occur.
看上面的英文解释,调节要回答的什么时候某种XY之间的关系才会出现
最基本,最鲜明的调节作用如下图
我们依然用模拟数据来说明一切
N <- 100
X <- abs(rnorm(N, 6, 4))
X1 <- abs(rnorm(N, 60, 30))
Z <- rnorm(N, 30, 8)
Y <- abs((-0.8*X) * (0.2*Z) - 0.5*X - 0.4*X1 + 10 + rnorm(N, 0, 3))
Moddata <- data.frame(X, X1, Z, Y)
我们模拟出来了两个自变量XX1还有一个调节变量Z,如果把调节变量也算作自变量的话就是3个自变量。
对于调节作用的一般检验就是做交互,为了避免多重共线性,必须将交互的两个变量中心化。
因为你都是要放在一个回归方程中的嘛,所以得考虑多重共线性问题
那么,我们准备讨论XZ之间的交互,所以先将它两中心化:
Xc <- c(scale(X, center=TRUE, scale=FALSE)) #Centering IV; hours of sleep
Zc <- c(scale(Z, center=TRUE, scale=FALSE))
然后跑回归
library(gvlma)
fitMod <- lm(Y ~ Xc + Zc + Xc*Zc)
summary(fitMod)
跑出来的回归结果:
我们还可以可视乎交互作用:
library(rockchalk)
ps <- plotSlopes(fitMod, plotx="Xc", modx="Zc", xlab = "X", ylab = "Y", modxVals = "std.dev")
这个可视化又令我回忆起之前写的交互简单斜率图的画法的文章,因为我们的调节变量为连续变量所以有个参数modxVals,在这儿我将其设置为了modxVals = "std.dev",就是说在调节变量的加减一个标准差的水平上画简单斜率图。
和之前文章一样的,有兴趣可以去翻翻
至于这个调节作用的解释也很清晰了,就是在Z的不同水平X和Y的关系不一样,Z的水平越高XY的关系越积极
小结
我觉得这篇文章把R做中介和调节写的很明白了,感谢大家耐心看完。发表这些东西的主要目的就是督促自己,希望大家关注评论指出不足,一起进步。内容我都会写的很细,用到的数据集也会在原文中给出链接,你只要按照文章中的代码自己也可以做出一样的结果,一个目的就是零基础也能懂,因为自己就是什么编程基础没有从零学Python和R的,加油。数据分析问题咨询,代处理请私信(spss,R,Mplus)。