(本文章部分学习自https://www.zhihu.com/tardis/zm/art/376007591?source_id=1005)
1 简单中介效应
如图,c是X对Y的作用,
c'是X对Y的直接作用,
a是X对M的作用,
b是M对Y的作用,
a*b是X对Y的间接作用。
若X通过M对Y起影响,则称M为一个中介。
判断M是否是一个中介的标准,就是判断回归系数a*b的显著性。
此外,若c显著,c'不显著,且a*b显著,则认为M是一个完全中介;
若c'显著,a*b显著,则认为M是一个部分中介。
2 多重中介效应
2.1 平行中介
多个中介变量并行的模型,X对Y的总间接效应为a*b+c*d,直接效应为c'。
2.2 链式中介
多个中介变量串行的模型,X对Y的总间接效应为abc+ae+dc,直接效应为c'。
3 代码
3.1 bruceR
bruceR包整合了mediation包进行中介效应分析、interactions包进行简单斜率分析、lavaan包进行链式多重中介分析,其中PROCESS()函数具有计算调节效应、中介效应和有调节的中介效应的能力,支持连续或二分类的自变量X、中介变量M、因变量Y,无限多个平行的中介变量M、最多4个链式的中介变量M、最多2个调节变量W,无限多个、不同类型的控制变量/协变量,具有上手简单,功能丰富的特点。
#数据获取
library(bruceR)
?mediation::student
data=mediation::student %>%
dplyr::select(SCH_ID, free, smorale, pared, income,
gender, work, attachment, fight, late, score)
names(data)[2:3]=c("SCH_free", "SCH_morale")
names(data)[4:7]=c("parent_edu", "family_inc", "gender", "partjob")
data$gender01=1-data$gender # 0 = female, 1 = male
data$gender=factor(data$gender01, levels=0:1, labels=c("Female", "Male"))
head(data)
#包含以下变量:
#SCH_ID=学校编号
#SCH_free=学校提供免费午餐力度的等级
#SCH_smorale=该学校学生道德素质
#parent_edu=父母教育水平
#family_income=家庭收入
#gender=性别
#partjob=兼职情况
#attachment=是否喜欢学校
#fight=是否打过架
#late=迟到频次
#score=数学成绩
SCH_ID SCH_free SCH_morale parent_edu family_inc gender partjob attachment fight late score gender01
1 1 3 5 0 10 Female 0 0 0 1 46 0
2 1 3 5 0 9 Male 0 0 1 5 48 1
3 1 3 5 1 13 Female 0 1 1 3 72 0
4 1 3 5 0 12 Male 1 1 0 1 57 1
5 1 3 5 0 11 Male 0 1 0 2 51 1
6 1 3 5 0 7 Male 1 1 0 2 52 1
简单中介:
#简单中介
#研究parent_edu是否通过family_income对score产生影响
PROCESS(data=data,y='score',x='parent_edu',meds='family_inc',covs='gender',ci='boot',nsim=1000,seed=0)
#meds为中介变量
#cov为协变量
#ci是评估间接效应的CI的方法,默认为bootstrap自举法
#nsim是bootstrap模拟的次数
结果:
从结果中可以发现,直接效应和简介效应都显著,因此family_inc是parent_edu对score的一个部分部分中介。
平行中介:
#并行中介
PROCESS(data=data,y='score',x='parent_edu',meds=c('family_inc','late','fight'),covs=c('gender','partjob'),ci='boot',nsim=1000,seed=0)
结果:
从结果可以发现,fight,family_inc,late都是parent_edu对score的中介因素,且为部分中介
链式中介:
PROCESS(data=data,y="score",x="parent_edu",meds=c("family_inc", "late"),covs=c("gender","partjob"),med.type="serial",ci="boot",nsim=1000,seed=0)
#多一个参数med.type
结果:
从结果可以发现,family_inc和late都是parent_edu对score的中介,但late单独的中介效应不显著。
3.2 mma
也可用mma包的mma()函数进行多重中介效应模型的拟合,该函数特点是能从指定的变量集中找出中介变量。
#mma
library(mma)
x=data[,c(1:3,5:10)]
pred=data[,4]
y=data[,11]
mmodel <- mma(x,y,pred=pred,mediator=1:ncol(x),alpha=0.1,alpha2=0.1,n=5,n2=5)
#自变量pred,因变量y,x是从中找出中介变量的数据集,mediator是可能的中介变量的个数向量即1:ncol(x),
#alpha为检测是否中介的p阈值,alpha2为检测中介变量是否和自变量有关的p阈值,n为计算间接效应时的取样次数,n2为bootstrap模拟次数
summary(mmodel)
结果: