本文介绍如何用利用 MSTATA 软件鼠标一键完成因果中介效应分析(Causual mediation analysis)并无脑直接生成 R 代码,非 chatGPT, 不会抽风,代码绝对正确。今后,MSTATA 软件将逐步开源所有的模块。
在统计学的学习旅程中,许多同学从最初扎扎实实地学习理论、手写代码,到后来为了省时间上网查找现成代码,再到如今通过 ChatGPT 生成代码,感受到了一种不断简化的变革。然而,尽管 ChatGPT 生成代码非常方便,但每次输出的代码往往有所不同,经常出现错误。在医学这样的领域,出错是零容忍的,因此单靠 AI 生成代码并非最佳选择。
这时,MSTATA 这样的严肃统计软件便成了理想之选。通过简单的菜单操作,您可以轻松选择统计参数,最后生成准确无误的 R 源代码,并能够直接在您的实际数据集上运行——不再依赖那些与您数据不符的示例代码。
MSTATA 提供的代码不仅绝对正确,效率也极高。此外,它还能在 R 的原始输出基础上,将数据自动整理成适合投稿的 Word 表格格式,极大提高了工作效率。
在人工智能尚未完美的今天,MSTATA 是严谨统计学中最值得信赖的工具,尤其是在医学等对精度要求极高的学科。
软件地址在 www.mstata.com,进入后左侧点击 MSTATA - 按照研究类型分类 - 中介和调节效应 - 因果中介效应分析
鼠标点选后,生成源代码,并运行源代码后自动将 R 控制台跑出来的结果截图
生成英文版及中文版的代码注释,生成数据集供下载:
最后,整理成论文投稿的word表格:
最后,软件还会自动给表格配上论文的文字部分:
R 软件做中介效应的包不少,mediation 包是近几年的明星包,功能确实强。但代码复杂,结果晦涩。没有个一周时间研究,很难上手。现在用 MSTATA,几分钟就可以解决战斗,投稿啦。
下面解析一下 mediation 包的代码:
下面将通过几个具体的例子来解释如何使用 mediation 包进行中介分析。这些案例适合临床工作者使用,他们可能对统计学知识了解有限,但通过以下简单的讲解可以轻松理解 mediate 函数的应用。
案例 1:线性结果和中介模型
这个案例使用的是线性回归模型来解释某种处理对结果的直接和间接影响。假设我们有一项研究,研究治疗(treat)对抑郁(depress2)的影响,但这影响可能通过找工作的行为(job_seek)来实现。以下是步骤:
首先,我们需要拟合两个模型:
模型1:job_seek(找工作)是中介变量,由治疗、经济困难(econ_hard)、性别(sex)和年龄(age)影响。
模型2:depress2(抑郁)是结果变量,受治疗、找工作行为、经济困难、性别和年龄的影响。
b <- lm(job_seek ~ treat + econ_hard + sex + age, data=jobs)
c <- lm(depress2 ~ treat + job_seek + econ_hard + sex + age, data=jobs)
使用 mediate 函数估计间接效应(ACME)和直接效应(ADE):
contcont <- mediate(b, c, sims=50, treat="treat", mediator="job_seek")
summary(contcont)
plot(contcont)
这里,sims=50 表示进行50次蒙特卡洛抽样以获得置信区间。mediate 函数返回治疗对结果的直接和通过中介变量产生的间接影响。
案例 2:处理-中介变量的交互效应
如果我们怀疑治疗和中介变量之间存在交互效应,我们可以在结果模型中引入交互项。比如,我们认为 treat 和 job_seek 之间存在交互作用,那么结果模型可以这样设置:
d <- lm(depress2 ~ treat + job_seek + treat:job_seek + econ_hard + sex + age, data=jobs)
contcont.int <- mediate(b, d, sims=50, treat="treat", mediator="job_seek")
summary(contcont.int)
这里,treat:job_seek 表示治疗和中介变量的交互作用。
案例 3:分年龄的调节中介分析
有时我们可能希望根据某个变量(如年龄)来调节中介分析。比如,我们想研究年龄20岁和70岁时治疗的间接效应。我们可以分别对20岁和70岁的人群进行分析:
b.int <- lm(job_seek ~ treat*age + econ_hard + sex, data=jobs)
d.int <- lm(depress2 ~ treat*job_seek*age + econ_hard + sex, data=jobs)
contcont.age20 <- mediate(b.int, d.int, sims=50, treat="treat", mediator="job_seek", covariates = list(age = 20))
contcont.age70 <- mediate(b.int, d.int, sims=50, treat="treat", mediator="job_seek", covariates = list(age = 70))
summary(contcont.age20)
summary(contcont.age70)
通过这种方法,我们可以看到治疗效应如何随年龄变化。
案例 4:二分类结果和有序中介模型
如果结果是二分类变量,中介变量是有序变量,我们可以使用有序回归模型和逻辑回归模型。例如,如果 job_disc(工作上的歧视)是一个有序变量,work1(是否有工作)是一个二分类结果变量,我们可以这样设置模型:
b.ord <- polr(job_disc ~ treat + econ_hard + sex + age, data=jobs, method="probit", Hess=TRUE)
d.bin <- glm(work1 ~ treat + job_disc + econ_hard + sex + age, data=jobs, family=binomial(link="probit"))
ordbin <- mediate(b.ord, d.bin, sims=50, treat="treat", mediator="job_disc")
summary(ordbin)
在这里,polr 用于拟合有序回归模型,而 glm 用于拟合逻辑回归模型。
案例 5:多层次模型
在多层次数据中,我们可以使用多层次模型来考虑组间差异。例如,在一个工作场所的研究中,educ 表示受教育水平,occp 表示职业,分别作为中介和结果的组变量。我们可以使用 glmer 函数进行多层次建模,并利用 mediate 函数进行中介分析:
model.m <- glmer(job_dich ~ treat + econ_hard + (1 | educ), family = binomial(link = "probit"), data = jobs)
model.y <- glmer(work1 ~ treat + job_dich + econ_hard + (1 + treat | occp), family = binomial(link = "probit"), data = jobs)
multilevel <- mediate(model.m, model.y, treat = "treat", mediator = "job_dich", sims=50, group.out="educ")
summary(multilevel)
这里我们估计了基于不同教育组的间接效应。
以上是 mediation 包在中介分析中的几个常用案例,它们展示了如何通过不同的模型设定来探究治疗、中介变量和结果之间的因果关系。这些步骤对临床研究者非常实用,帮助他们深入理解治疗如何通过某个机制影响患者的结果。